Finds the best public transport route in Hong Kong by combining Google Maps directions with real-time bus ETAs. Routes are ranked by effective total time (real-time wait + travel duration), not just schedule data.
| Requirement | Details |
|---|---|
| --- | --- |
GOOGLE_MAPS_API_KEY | Google Maps API key with Directions API enabled |
node >= 18 | Runtime for the bundled script |
This skill makes network requests to:
| Endpoint | Purpose | Credentials |
|---|---|---|
| --- | --- | --- |
maps.googleapis.com (Google Directions API) | Transit route planning | GOOGLE_MAPS_API_KEY |
| HK government & operator APIs via hk-bus-eta (DATA.GOV.HK, KMB, CTB, etc.) | Real-time bus arrival times | None (public APIs) |
No other network calls are made. The ETA database is cached locally at ~/.cache/hk-route/etaDb.json (refreshed every 24h).
The bundled scripts/hk-route.cjs is built from readable TypeScript source at github.com/7ito/hkroute. Build command: esbuild src/index.ts --bundle --platform=node --format=cjs.
node /path/to/skill/scripts/hk-route.cjs \
--origin "<origin>" \
--destination "<destination>"
> The scripts/hk-route.cjs bundle is self-contained — no npm install needed. Just node >= 18.
--departure-time "" — plan a future trip (e.g., --departure-time "2026-03-26T08:00:00+08:00")"22.2822,114.1875" (lat,lng — no space after comma)"Causeway Bay", "Hong Kong Airport", "Stanley Market"User: "How do I get from Causeway Bay to Stanley?"
→ Run the CLI with --origin "Causeway Bay" --destination "Stanley", format the output.
/hkroute22.2822,114.1875) or text (e.g., "Tin Hau MTR")If the user provides invalid input at any step, ask them to try again with a valid location.
Activate this skill when the user asks about getting somewhere in Hong Kong by public transport, even without using /hkroute. Look for intent like "how do I get to...", "best way to...", "bus from...", etc., in a Hong Kong context.
The CLI outputs JSON to stdout. Format it for the user as follows:
🚌 **Routes from {origin} to {destination}**
⭐ **Route 1 (Recommended)** — {effective_total_min} min
{for each leg:}
🚶 Walk {duration_seconds/60} min — {instructions}
🚌 Bus {route_number} from {departure_stop} — **Next bus: {etas[0] formatted as relative time}** (then {etas[1]})
{num_stops} stops → {arrival_stop}
🚇 MTR {route_number} from {departure_stop}
{num_stops} stops → {arrival_stop}
⛴️ Ferry ...
🚊 Light Rail / Tram ...
📍 Route 2 — {effective_total_min} min
{same leg format}
📍 Route 3 — {effective_total_min} min
{same leg format}
actionable: true is the one that determines when the user needs to leave. Call it out prominently: "Next bus in X min — leave now!" or "Next bus in X min — you have time."eta_source is "unavailable", show "ETA unavailable (scheduled: {departure_time})" instead of a real-time ETA.eta_source is "schedule", show the scheduled departure time without a real-time label.If the CLI returns error: true:
NO_TRANSIT_ROUTES: Tell the user no transit routes were found. Suggest trying a different departure time or considering a taxi.GOOGLE_API_ERROR: Tell the user there was an issue fetching routes. Suggest trying again.INVALID_INPUT: Tell the user what was wrong with their input.共 1 个版本