skills/itinerary-builder/SKILL.md
Build day-by-day travel itineraries with drag-drop scheduling, time estimates, and PDF export
npx skillsauth add ticruz38/skills skills/itinerary-builderInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Build detailed day-by-day travel itineraries with activity scheduling, time estimates between locations, and export to PDF.
cd skills/itinerary-builder
npm install
npm run build
# Create a new trip
npm run cli -- create-trip "Japan Adventure" "Tokyo, Japan" 2024-04-01 2024-04-10
# List all trips
npm run cli -- list-trips
# Get trip details
npm run cli -- get-trip 1
# Add activities
npm run cli -- add-activity 1 1 "Visit Senso-ji Temple" \
--start 09:00 --duration 120 --category sightseeing --location "Asakusa"
npm run cli -- add-activity 1 1 "Lunch at Sushi Dai" \
--start 12:00 --duration 90 --category food --location "Tsukiji"
# View day-by-day schedule
npm run cli -- schedule 1
# Reorder activities
npm run cli -- reorder 1 1 3 1 2
# Move activity to different day
npm run cli -- move 5 2
# Export to HTML (PDF-ready)
npm run cli -- export 1 ./my-trip.html
# Show statistics
npm run cli -- stats
import { ItineraryBuilder } from '@openclaw/itinerary-builder';
const builder = new ItineraryBuilder();
// Create a trip
const trip = await builder.createTrip({
name: 'Japan Adventure',
destination: 'Tokyo, Japan',
startDate: '2024-04-01',
endDate: '2024-04-10',
description: 'Cherry blossom season trip'
});
// Add activities
const activity = await builder.addActivity({
tripId: trip.id!,
dayNumber: 1,
title: 'Visit Senso-ji Temple',
startTime: '09:00',
duration: 120,
category: 'sightseeing',
location: 'Asakusa, Tokyo'
});
// Get full itinerary
const itinerary = await builder.exportItinerary(trip.id!);
console.log(`Total activities: ${itinerary.summary.totalActivities}`);
console.log(`Estimated cost: $${itinerary.summary.estimatedCost}`);
// Generate day schedule
const schedule = await builder.generateSchedule(trip.id!);
for (const day of schedule) {
console.log(`Day ${day.dayNumber}:`);
for (const activity of day.activities) {
console.log(` ${activity.startTime} - ${activity.title}`);
}
}
// Export to HTML
const htmlPath = await builder.exportToHTML(trip.id!, './my-itinerary.html');
await builder.close();
interface Trip {
id?: number;
name: string;
destination: string;
startDate: string; // YYYY-MM-DD
endDate: string; // YYYY-MM-DD
description?: string;
createdAt: string;
updatedAt: string;
}
interface Activity {
id?: number;
tripId: number;
dayNumber: number;
title: string;
description?: string;
startTime?: string; // HH:MM format
endTime?: string; // HH:MM format
duration?: number; // minutes
location?: string;
address?: string;
category: 'transport' | 'sightseeing' | 'food' | 'shopping' |
'entertainment' | 'relaxation' | 'accommodation' | 'other';
cost?: number;
currency?: string;
notes?: string;
bookingRef?: string;
orderIndex: number;
}
| Command | Description |
|---------|-------------|
| create-trip <name> <dest> <start> <end> | Create new trip |
| list-trips | List all trips |
| get-trip <id> | View trip details |
| update-trip <id> [--name <n>] [--destination <d>] ... | Update trip |
| delete-trip <id> | Delete trip |
| Command | Description |
|---------|-------------|
| add-activity <tripId> <day> <title> [options] | Add activity |
| list-activities <tripId> | List activities for trip |
| get-activity <id> | View activity details |
| update-activity <id> [options] | Update activity |
| delete-activity <id> | Delete activity |
| reorder <tripId> <day> <id1> <id2> ... | Reorder activities |
| move <activityId> <newDay> [--order <n>] | Move to different day |
| Command | Description |
|---------|-------------|
| schedule <tripId> | Show day-by-day schedule |
| export <tripId> [path] | Export to HTML |
| stats | Show statistics |
| health | Check system health |
Itineraries are exported as professionally styled HTML files ready for PDF conversion:
const html = builder.generateHTML(itinerary);
const filePath = await builder.exportToHTML(tripId, './itinerary.html');
HTML features:
Convert to PDF using browser print or tools like puppeteer.
Data is stored in SQLite at ~/.openclaw/skills/itinerary-builder/itineraries.db:
sqlite3 - Database storagetesting
Suggest recipes based on dietary preferences, available ingredients, and cuisine preferences
development
Extract data from receipt photos using Google Vision API
business
QuickBooks Online integration for accounting sync - sync customers, invoices, and transactions with two-way sync and conflict resolution
testing
QuickBooks OAuth adapter for QuickBooks Online accounting integration. Built on top of auth-provider for secure token management with automatic refresh, multi-profile support, sandbox/production toggle, and health checks.