Travel assistant for NanoClaw: byAir flight notifications (delay, gate, connection risk, inbound aircraft delay, time-to-leave, arrival logistics), traffic-aware drive planning for in-person meetings (auto drive blocks + leave-by traffic rechecks), travel-booking gap checks, and nightly TripIt sync. Per-chat overlay plugin.
—
—
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Background library bundle — not a workflow and not an action router. It has no steps and must never be executed or invoked; do not parallelize or freelance over it. Its only role is to host shared code that other skills import.
It ships the travel-domain Python modules that more than one skill depends on, so there is one source of truth rather than a copy per skill. The consuming skills put this bundle on sys.path (runtime mount tessl__travel-core, dev-clone sibling fallback) and import from it.
trip_origin.py — resolves the operator's planned position/anchor at a given instant (TripIt truth over the static home, #122). Public surface: resolve_anchor, resolve_effective_home, load_travel_schedule, and the flight-window / flight-summary helpers the meeting sweep uses. The resolution ladder itself lives in trip_origin.py and its tests — do not restate it here. Consumed by flight-assist (precheck) and the drive engine (reconcile_sweep).airport_lead.py — the airport clearance / post-arrival buffer policy. Public surface: resolve_departure_clearance_minutes, resolve_post_arrival_minutes, departure_class, arrival_class. The classification rules and buffer values live in airport_lead.py and its tests. Consumed by flight-assist (airport_drive_inputs) and the drive engine.trip_key.py — the canonical per-trip identifier. Public surface: trip_key(summary, start). Joins travel-db.json's trip slugs to the drive engine's per-trip drive-or-fly verdicts; a second implementation would decide whether a cross-skill read hits or silently misses. Consumed by check-travel-bookings (build-travel-db) and the drive engine (lodging_source).lodging.py — the Check-in: / Check-out: discriminator for the two Lodging records TripIt writes per stay. Public surface: lodging_role, hotel_name, CHECK_IN, CHECK_OUT. Consumed by nightly-travel-sync (refresh-travel-schedule), check-travel-bookings, and the drive engine.Resolve this bundle cross-bundle before importing — try the runtime mount, fall back to the dev-clone sibling, then sys.path.insert (the same pattern drive-engine's fetch_events uses to reach flight-assist's google_calendar_client):
from pathlib import Path
import sys
_BUNDLE_DIR = Path(__file__).resolve().parent
_TRAVEL_CORE = Path("/home/node/.claude/skills/tessl__travel-core")
if not _TRAVEL_CORE.is_dir():
_TRAVEL_CORE = _BUNDLE_DIR.parent / "travel-core"
if str(_TRAVEL_CORE) not in sys.path:
sys.path.insert(0, str(_TRAVEL_CORE))
from trip_origin import resolve_anchor, resolve_effective_home # noqa: E402
from airport_lead import resolve_departure_clearance_minutes # noqa: E402trip_origin's schedule-file read). Their behavior and tests are the source of truth; do not restate their thresholds or ladders in consumer skills — reference the module.tests/test_trip_origin.py, tests/test_airport_lead.py, tests/test_trip_key.py, and tests/test_lodging.py.A script one directory deeper (skills/<name>/scripts/*.py) walks up one more level for the dev-clone fallback: Path(__file__).resolve().parent.parent as _BUNDLE_DIR.
.tessl-plugin
skills
check-travel-bookings
drive-engine
expertflyer
flight-assist
references
nightly-travel-sync
sync-tripit