Install
openclaw skills install @jichengkai/personal-travel-butlerManage a personal travel Markdown database for food finds, places, guides, screenshots, preferences, Notion synchronization, and trip planning. Use when the...
openclaw skills install @jichengkai/personal-travel-butlerUse this skill to maintain the user's local, human-readable travel knowledge base and answer travel questions from it. Keep the system layer (personal-travel-butler/) separate from the database layer (travel-db/).
Use ../travel-db relative to this skill folder unless the user explicitly points to another database. Treat Markdown files as the source of truth; generated indexes are rebuildable views.
When running from a local Hermes install, this skill may be symlinked from ~/.hermes/skills/personal-travel-butler to the user's local personal-travel-butler folder. If relative lookup is unclear, ask the user for the project root and use its sibling travel-db folder as the database path.
Use ../travel-db/notion-sync for Notion interoperability. Keep it as one flat folder: machines should read _records.jsonl first, humans should scan _index.md, and detailed Markdown files should exist only for records that need long-form notes.
needs-review.When invoked from Hermes, do not ask the user to paste Notion tokens or credentials into chat. Read local Notion settings from the project root .env through the provided scripts.
If the user asks whether Notion is connected:
scripts/notion_setup.py --apply.scripts/notion_check.py --db <project-root>/travel-db..env locally, without printing token values.Use scripts/notion_setup.py --apply only for the first-time setup when NOTION_TRAVEL_DATA_SOURCE_ID is not configured. If it is already configured, the setup script should be treated as complete.
_inbox/ when it contains multiple facts or uncertain entities, then split stable entities into atomic entries.assets/, record OCR/extracted text in _inbox/, then create entries from the extracted facts.preferences/ entries rather than burying personal constraints in place notes.preferences/, relevant places/, guides/, and trips/ before recommending.references/database-schema.md before creating or updating entries.references/ingestion-workflow.md for text, location, and image intake rules.references/recommendation-workflow.md before generating recommendations or itineraries.references/notion-sync-folder-standard.md before changing Notion sync files.references/notion-integration.md before configuring Notion tokens, data source IDs, or live API calls.references/notion-sync-schema.md before mapping Notion properties to local fields.scripts/create_entry.py to create entry skeletons with stable IDs and valid frontmatter.scripts/validate_db.py to check required fields, duplicate IDs, links, and basic database integrity.scripts/notion_check.py to validate Notion sync folder structure and, when credentials are present, Notion schema access.scripts/notion_setup.py to create the Notion travel database and required properties under a shared parent page.scripts/notion_sync.py for dry-run-first Notion push/pull/sync plans.scripts/notion_sync.py push|sync refreshes _records.jsonl from Markdown entries before planning by default. Use --strict to block overwrites after Notion-side edits, and --filter-city or --filter-tag for selective sync.scripts/notion_schema.py check|migrate to inspect or add optional Notion columns for an existing data source.scripts/build_records_from_places.py --apply only when you want to refresh the compact mirror and generated local indexes without calling Notion.scripts/notion_compact.py to keep simple Notion records in _records.jsonl without creating extra Markdown files.scripts/notion_promote.py when a light or standard record deserves a detailed Markdown file.Prefer scripts/butler.py for common operations. Only edit Markdown directly when the command surface cannot express the requested change.
| User intent | Preferred command |
|---|---|
| Check health / diagnose sync | python3 personal-travel-butler/scripts/butler.py doctor --db travel-db |
| Repair local derived files only | python3 personal-travel-butler/scripts/butler.py doctor --db travel-db --fix-local |
| Save a new place | python3 personal-travel-butler/scripts/butler.py add-place --db travel-db --name NAME --city CITY --tag TAG --evidence EVIDENCE |
| Update an existing place | python3 personal-travel-butler/scripts/butler.py update-place --db travel-db --id PLACE_ID --evidence EVIDENCE |
| Capture uncertain raw text | python3 personal-travel-butler/scripts/butler.py ingest-text --db travel-db --text TEXT --apply |
| Check duplicates | python3 personal-travel-butler/scripts/butler.py duplicates --db travel-db --name NAME --city CITY |
| Refresh local mirror and indexes | python3 personal-travel-butler/scripts/butler.py refresh --db travel-db --apply |
| Dry-run Notion sync safely | python3 personal-travel-butler/scripts/butler.py sync --db travel-db |
| Apply Notion sync safely | python3 personal-travel-butler/scripts/butler.py sync --db travel-db --apply |
| Check optional Notion columns | python3 personal-travel-butler/scripts/butler.py schema --db travel-db check |
| Add optional Notion columns | python3 personal-travel-butler/scripts/butler.py schema --db travel-db migrate --apply |
For weak-agent reliability:
butler.py add-place instead of manually creating a Markdown file.butler.py update-place when a duplicate exists.butler.py sync before butler.py sync --apply.notion_setup.py --apply unless doing first-time setup with no existing data source.city to one normalized city name only, such as 文昌 or 深圳. Put province, district, street, or address details in separate fields/body notes._records.jsonl; only detailed records get standalone Markdown files in notion-sync/. Markdown entries under places/, guides/, trips/, and preferences/ are treated as source material for the compact Notion mirror.scripts/notion_setup.py --apply again when NOTION_TRAVEL_DATA_SOURCE_ID is already configured. Use scripts/notion_check.py --db travel-db to verify the existing Notion database, then use scripts/notion_sync.py sync --db travel-db for synchronization..env.