{
  "schemaVersion": "1.0",
  "item": {
    "slug": "buslah",
    "name": "buslah",
    "source": "tencent",
    "type": "skill",
    "category": "通讯协作",
    "sourceUrl": "https://clawhub.ai/abhayjb/buslah",
    "canonicalUrl": "https://clawhub.ai/abhayjb/buslah",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/buslah",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=buslah",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "bus-arrival.sh",
      "config.json"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/buslah"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/buslah",
    "agentPageUrl": "https://openagent3.xyz/skills/buslah/agent",
    "manifestUrl": "https://openagent3.xyz/skills/buslah/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/buslah/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "ArriveLah - Singapore Bus Arrivals",
        "body": "Natural language bus lookup for Singapore."
      },
      {
        "title": "Trigger Format",
        "body": "bus from <source location> to <destination location>\n\nExamples:\n\n\"bus from Silat Road Sikh Temple to Queens condo\"\n\"bus from Tanjong Pagar MRT to VivoCity\"\n\"bus from my office to home\""
      },
      {
        "title": "Step 1: Geocode source location",
        "body": "Use web_fetch to resolve the source location to coordinates via OneMap API:\n\nhttps://www.onemap.gov.sg/api/common/elastic/search?searchVal=<source>&returnGeom=Y&getAddrDetails=Y&pageNum=1\n\nExtract LATITUDE and LONGITUDE from the first result."
      },
      {
        "title": "Step 2: Find nearest bus stops to source",
        "body": "Fetch the full Singapore bus stop list and find stops closest to source coordinates:\n\nhttps://busrouter.sg/data/2/bus-stops.json\n\nThis returns a JSON object where each key is a bus stop code, with fields: description, road, lat, lng.\n\nCompute distance using: sqrt((lat2-lat1)^2 + (lng2-lng1)^2) (approximate is fine for short distances).\nPick the 3 nearest stops within ~300m."
      },
      {
        "title": "Step 3: Geocode destination location",
        "body": "Same as Step 1 for the destination. Extract its coordinates."
      },
      {
        "title": "Step 4: Find which buses go from source stops toward destination",
        "body": "For each of the 3 nearest source stops, fetch arrivals:\n\nhttps://arrivelah2.busrouter.sg/?id=<stop_code>\n\nThen for each bus service at those stops, check if it passes near the destination using:\n\nhttps://busrouter.sg/data/2/routes.json\n\nThis maps bus service numbers to arrays of stop codes in order. Cross-reference with bus-stops.json to get coordinates of each stop on the route, and check if any stop is within ~400m of the destination coordinates.\n\nKeep only buses that:\n\nHave the source stop before the destination stop in their route (correct direction)\nPass within ~400m of the destination"
      },
      {
        "title": "Step 5: Fetch live arrival times",
        "body": "For each matching bus at the source stop, get from the arrivelah2 response:\n\nnext.duration_ms → minutes until next bus\nsubsequent.duration_ms → minutes until bus after that\nnext.load → seat availability: SEA = Seats Available, SDA = Standing Available, LSD = Limited Standing\nnext.feature → WAB = Wheelchair accessible\nnext.type → DD = Double decker, SD = Single deck, BD = Bendy"
      },
      {
        "title": "Step 6: Format and return",
        "body": "🚌 Buses from [Source Stop Name] → [Destination]\n\nBus [XX]\n  ⏰ Next: X min | Then: Y min\n  💺 [Seats Available / Standing / Limited Standing]\n  🚌 [Double Decker / Single Deck]\n\nBus [YY]\n  ⏰ Next: X min | Then: Y min\n  💺 [Seats Available / Standing / Limited Standing]\n\n📍 Stop: [Stop Description], [Road Name] (Stop code: XXXXX)\n\nIf no direct bus found, say so and suggest nearest MRT or alternative."
      },
      {
        "title": "Load Code Reference",
        "body": "SEA = Seats Available 🟢\nSDA = Standing Available 🟡\nLSD = Limited Standing 🔴"
      },
      {
        "title": "Bus Type Reference",
        "body": "DD = Double Decker\nSD = Single Deck\nBD = Bendy Bus\nWAB = Wheelchair Accessible Bus"
      },
      {
        "title": "API Endpoints (no auth needed)",
        "body": "OneMap geocode: https://www.onemap.gov.sg/api/common/elastic/search\nBus stops: https://busrouter.sg/data/2/bus-stops.json\nRoutes: https://busrouter.sg/data/2/routes.json\nLive arrivals: https://arrivelah2.busrouter.sg/?id=<stop_code>"
      }
    ],
    "body": "ArriveLah - Singapore Bus Arrivals\n\nNatural language bus lookup for Singapore.\n\nTrigger Format\nbus from <source location> to <destination location>\n\n\nExamples:\n\n\"bus from Silat Road Sikh Temple to Queens condo\"\n\"bus from Tanjong Pagar MRT to VivoCity\"\n\"bus from my office to home\"\nStep-by-Step Workflow\nStep 1: Geocode source location\n\nUse web_fetch to resolve the source location to coordinates via OneMap API:\n\nhttps://www.onemap.gov.sg/api/common/elastic/search?searchVal=<source>&returnGeom=Y&getAddrDetails=Y&pageNum=1\n\n\nExtract LATITUDE and LONGITUDE from the first result.\n\nStep 2: Find nearest bus stops to source\n\nFetch the full Singapore bus stop list and find stops closest to source coordinates:\n\nhttps://busrouter.sg/data/2/bus-stops.json\n\n\nThis returns a JSON object where each key is a bus stop code, with fields: description, road, lat, lng.\n\nCompute distance using: sqrt((lat2-lat1)^2 + (lng2-lng1)^2) (approximate is fine for short distances). Pick the 3 nearest stops within ~300m.\n\nStep 3: Geocode destination location\n\nSame as Step 1 for the destination. Extract its coordinates.\n\nStep 4: Find which buses go from source stops toward destination\n\nFor each of the 3 nearest source stops, fetch arrivals:\n\nhttps://arrivelah2.busrouter.sg/?id=<stop_code>\n\n\nThen for each bus service at those stops, check if it passes near the destination using:\n\nhttps://busrouter.sg/data/2/routes.json\n\n\nThis maps bus service numbers to arrays of stop codes in order. Cross-reference with bus-stops.json to get coordinates of each stop on the route, and check if any stop is within ~400m of the destination coordinates.\n\nKeep only buses that:\n\nHave the source stop before the destination stop in their route (correct direction)\nPass within ~400m of the destination\nStep 5: Fetch live arrival times\n\nFor each matching bus at the source stop, get from the arrivelah2 response:\n\nnext.duration_ms → minutes until next bus\nsubsequent.duration_ms → minutes until bus after that\nnext.load → seat availability: SEA = Seats Available, SDA = Standing Available, LSD = Limited Standing\nnext.feature → WAB = Wheelchair accessible\nnext.type → DD = Double decker, SD = Single deck, BD = Bendy\nStep 6: Format and return\n🚌 Buses from [Source Stop Name] → [Destination]\n\nBus [XX]\n  ⏰ Next: X min | Then: Y min\n  💺 [Seats Available / Standing / Limited Standing]\n  🚌 [Double Decker / Single Deck]\n\nBus [YY]\n  ⏰ Next: X min | Then: Y min\n  💺 [Seats Available / Standing / Limited Standing]\n\n📍 Stop: [Stop Description], [Road Name] (Stop code: XXXXX)\n\n\nIf no direct bus found, say so and suggest nearest MRT or alternative.\n\nLoad Code Reference\nSEA = Seats Available 🟢\nSDA = Standing Available 🟡\nLSD = Limited Standing 🔴\nBus Type Reference\nDD = Double Decker\nSD = Single Deck\nBD = Bendy Bus\nWAB = Wheelchair Accessible Bus\nAPI Endpoints (no auth needed)\nOneMap geocode: https://www.onemap.gov.sg/api/common/elastic/search\nBus stops: https://busrouter.sg/data/2/bus-stops.json\nRoutes: https://busrouter.sg/data/2/routes.json\nLive arrivals: https://arrivelah2.busrouter.sg/?id=<stop_code>"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/abhayjb/buslah",
    "publisherUrl": "https://clawhub.ai/abhayjb/buslah",
    "owner": "abhayjb",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/buslah",
    "downloadUrl": "https://openagent3.xyz/downloads/buslah",
    "agentUrl": "https://openagent3.xyz/skills/buslah/agent",
    "manifestUrl": "https://openagent3.xyz/skills/buslah/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/buslah/agent.md"
  }
}