{
  "schemaVersion": "1.0",
  "item": {
    "slug": "trein-plus",
    "name": "Trein extended",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/Timvandervoord/trein-plus",
    "canonicalUrl": "https://clawhub.ai/Timvandervoord/trein-plus",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/trein-plus",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=trein-plus",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "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-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-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/trein-plus"
    },
    "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/trein-plus",
    "agentPageUrl": "https://openagent3.xyz/skills/trein-plus/agent",
    "manifestUrl": "https://openagent3.xyz/skills/trein-plus/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/trein-plus/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": "trein - Dutch Railways CLI",
        "body": "A CLI for the NS (Dutch Railways) API with real-time train departures, train trip planning, disruptions, and station search."
      },
      {
        "title": "Install",
        "body": "npm (recommended):\n\nnpm i -g trein\n\nOr download a standalone binary from GitHub Releases."
      },
      {
        "title": "Setup",
        "body": "Get an API key from https://apiportal.ns.nl/ and set it:\n\nexport NS_API_KEY=\"your-api-key\"\n\nOr create ~/.config/trein/trein.config.json:\n\n{ \"apiKey\": \"your-api-key\" }"
      },
      {
        "title": "Departures",
        "body": "trein departures \"Amsterdam Centraal\"\ntrein d amsterdam\ntrein d amsterdam --json  # structured output"
      },
      {
        "title": "Trip Planning",
        "body": "trein trip \"Utrecht\" \"Den Haag Centraal\"\ntrein t utrecht denhaag --json\ntrein t amsterdam rotterdam --via utrecht  # route via specific station\ntrein t hoofddorp \"den haag\" --arrive-by 09:30 --json  # arrive by 09:30 TODAY\ntrein t hoofddorp \"den haag\" --depart-at 09:00 --json  # depart at 09:00 TODAY\ntrein t utrecht amsterdam --date 2026-02-05 --depart-at 14:30 --json  # specific FUTURE date and time"
      },
      {
        "title": "Disruptions",
        "body": "trein disruptions\ntrein disruptions --json"
      },
      {
        "title": "Station Search",
        "body": "trein stations rotterdam\ntrein s rotterdam --json"
      },
      {
        "title": "Aliases (shortcuts)",
        "body": "trein alias set home \"Amsterdam Centraal\"\ntrein alias set work \"Rotterdam Centraal\"\ntrein alias list\ntrein d home  # uses alias"
      },
      {
        "title": "When to Use This Skill",
        "body": "This skill should be used when users ask about TRAIN TRAVEL in the Netherlands:\n\n\"When does the next train to [station] leave?\"\n\"How do I get from [A] to [B] by train?\"\n\"I need to be in [station] at [time], which train should I take?\"\n\"Are there any train disruptions?\"\n\"What time should I leave to arrive by train at [time]?\"\n\"What's the train station code for [name]?\"\n\"Which platform does the train to [station] leave from?\"\n\"How long does it take to travel by train from [A] to [B]?\""
      },
      {
        "title": "Command Selection Guide",
        "body": "First: Confirm the user wants TRAIN travel. If they want car/bus/other transport, do NOT use this skill.\n\nThen select the appropriate command:\n\nUser wants real-time train departures from ONE station → use departures\nUser wants to travel from A to B by train → use trip\nUser mentions a specific arrival/departure time for train → use trip with --arrive-by or --depart-at\nUser asks about train delays or disruptions → use disruptions\nUser gives partial train station name → use stations first to resolve\nUser mentions future date for train travel → use trip with --date"
      },
      {
        "title": "Trip Planning Response",
        "body": "{\n  \"trips\": [{\n    \"departure\": \"08:05\",\n    \"arrival\": \"08:35\",\n    \"duration\": \"30 min\",\n    \"transfers\": 0,\n    \"status\": \"ON_TIME\",\n    \"legs\": [{\n      \"from\": \"Schiphol Airport\",\n      \"to\": \"Den Haag Centraal\",\n      \"trainType\": \"IC\",\n      \"platform\": \"5\"\n    }]\n  }]\n}"
      },
      {
        "title": "Departures Response",
        "body": "{\n  \"departures\": [{\n    \"time\": \"14:23\",\n    \"delay\": \"0 min\",\n    \"destination\": \"Amsterdam Centraal\",\n    \"platform\": \"3\",\n    \"trainType\": \"IC\"\n  }]\n}"
      },
      {
        "title": "Disruptions Response",
        "body": "{\n  \"disruptions\": [{\n    \"title\": \"Werkzaamheden Amsterdam-Utrecht\",\n    \"type\": \"MAINTENANCE\",\n    \"routes\": [\"Amsterdam Centraal\", \"Utrecht Centraal\"],\n    \"active\": true,\n    \"expectedEnd\": \"2026-02-05 23:59\"\n  }]\n}"
      },
      {
        "title": "Best Practices for AI Agents",
        "body": "VERIFY train travel intent - Only use this skill if user explicitly wants train travel, not car/bus/other transport\nAlways use --json for machine-readable output\nValidate station names first if user input is ambiguous using stations command\nUse fuzzy matching - don't require exact station names from users\nQuote station names containing spaces (e.g., \"Den Haag Centraal\") to prevent argument parsing errors\nCheck for errors in JSON response before presenting results to user\nInterpret times in 24-hour format (HH:mm)\nDefault to current date - omit --date flag for today's travel; only add --date for future dates\nHandle Dutch station names - many contain special characters or multiple words\nParse JSON carefully - some fields may be null or missing depending on circumstances"
      },
      {
        "title": "Example 1: \"I need to be in Amsterdam at 9:30\"",
        "body": "Determine current location (ask user if unclear)\nCheck if user means today or a future date\nRun: trein t hoofddorp amsterdam --arrive-by 09:30 --json (today)\nOR: trein t hoofddorp amsterdam --date 2026-02-05 --arrive-by 09:30 --json (future date)\nParse JSON and present earliest suitable option with departure time"
      },
      {
        "title": "Example 2: \"When does the next train to Rotterdam leave?\"",
        "body": "Determine current location\nRun: trein d <current-station> --json\nFilter results for trains going to Rotterdam\nPresent next departure with platform and time"
      },
      {
        "title": "Example 3: \"Plan my trip tomorrow at 2pm from Utrecht to Den Haag\"",
        "body": "Run: trein t utrecht \"den haag\" --date 2026-02-04 --depart-at 14:00 --json\nParse response and present journey options with transfers and duration"
      },
      {
        "title": "Example 4: \"Are there delays on my usual route?\"",
        "body": "First get the trip: trein t amsterdam utrecht --json\nThen check disruptions: trein disruptions --json\nCross-reference routes and inform user of relevant disruptions"
      },
      {
        "title": "Common Errors & Solutions",
        "body": "\"Station not found\" → Use trein stations <query> --json to find correct name\n\"API key missing\" → Verify NS_API_KEY environment variable is set\nEmpty results → Check if date/time is in the past\n\"No trips found\" → Try without --via, route may not be possible via that station"
      },
      {
        "title": "Tips",
        "body": "Use --json flag for all commands to get structured output for parsing\nStation names support fuzzy matching (e.g., \"adam\" -> \"Amsterdam Centraal\")\nAliases are stored in the config file and can be used in place of station names\nUse --via with trip planning to specify a specific route through an intermediate station\nUse --depart-at HH:mm to plan trips departing at a specific time (defaults to TODAY)\nUse --arrive-by HH:mm to plan trips arriving before a specific time (defaults to TODAY)\n--date YYYY-MM-DD is OPTIONAL - only needed for future dates (omit for today)"
      }
    ],
    "body": "trein - Dutch Railways CLI\n\nA CLI for the NS (Dutch Railways) API with real-time train departures, train trip planning, disruptions, and station search.\n\nInstall\n\nnpm (recommended):\n\nnpm i -g trein\n\n\nOr download a standalone binary from GitHub Releases.\n\nSetup\n\nGet an API key from https://apiportal.ns.nl/ and set it:\n\nexport NS_API_KEY=\"your-api-key\"\n\n\nOr create ~/.config/trein/trein.config.json:\n\n{ \"apiKey\": \"your-api-key\" }\n\nCommands\nDepartures\ntrein departures \"Amsterdam Centraal\"\ntrein d amsterdam\ntrein d amsterdam --json  # structured output\n\nTrip Planning\ntrein trip \"Utrecht\" \"Den Haag Centraal\"\ntrein t utrecht denhaag --json\ntrein t amsterdam rotterdam --via utrecht  # route via specific station\ntrein t hoofddorp \"den haag\" --arrive-by 09:30 --json  # arrive by 09:30 TODAY\ntrein t hoofddorp \"den haag\" --depart-at 09:00 --json  # depart at 09:00 TODAY\ntrein t utrecht amsterdam --date 2026-02-05 --depart-at 14:30 --json  # specific FUTURE date and time\n\nDisruptions\ntrein disruptions\ntrein disruptions --json\n\nStation Search\ntrein stations rotterdam\ntrein s rotterdam --json\n\nAliases (shortcuts)\ntrein alias set home \"Amsterdam Centraal\"\ntrein alias set work \"Rotterdam Centraal\"\ntrein alias list\ntrein d home  # uses alias\n\nWhen to Use This Skill\n\nThis skill should be used when users ask about TRAIN TRAVEL in the Netherlands:\n\n\"When does the next train to [station] leave?\"\n\"How do I get from [A] to [B] by train?\"\n\"I need to be in [station] at [time], which train should I take?\"\n\"Are there any train disruptions?\"\n\"What time should I leave to arrive by train at [time]?\"\n\"What's the train station code for [name]?\"\n\"Which platform does the train to [station] leave from?\"\n\"How long does it take to travel by train from [A] to [B]?\"\nCommand Selection Guide\n\nFirst: Confirm the user wants TRAIN travel. If they want car/bus/other transport, do NOT use this skill.\n\nThen select the appropriate command:\n\nUser wants real-time train departures from ONE station → use departures\nUser wants to travel from A to B by train → use trip\nUser mentions a specific arrival/departure time for train → use trip with --arrive-by or --depart-at\nUser asks about train delays or disruptions → use disruptions\nUser gives partial train station name → use stations first to resolve\nUser mentions future date for train travel → use trip with --date\nJSON Output Examples\nTrip Planning Response\n{\n  \"trips\": [{\n    \"departure\": \"08:05\",\n    \"arrival\": \"08:35\",\n    \"duration\": \"30 min\",\n    \"transfers\": 0,\n    \"status\": \"ON_TIME\",\n    \"legs\": [{\n      \"from\": \"Schiphol Airport\",\n      \"to\": \"Den Haag Centraal\",\n      \"trainType\": \"IC\",\n      \"platform\": \"5\"\n    }]\n  }]\n}\n\nDepartures Response\n{\n  \"departures\": [{\n    \"time\": \"14:23\",\n    \"delay\": \"0 min\",\n    \"destination\": \"Amsterdam Centraal\",\n    \"platform\": \"3\",\n    \"trainType\": \"IC\"\n  }]\n}\n\nDisruptions Response\n{\n  \"disruptions\": [{\n    \"title\": \"Werkzaamheden Amsterdam-Utrecht\",\n    \"type\": \"MAINTENANCE\",\n    \"routes\": [\"Amsterdam Centraal\", \"Utrecht Centraal\"],\n    \"active\": true,\n    \"expectedEnd\": \"2026-02-05 23:59\"\n  }]\n}\n\nBest Practices for AI Agents\nVERIFY train travel intent - Only use this skill if user explicitly wants train travel, not car/bus/other transport\nAlways use --json for machine-readable output\nValidate station names first if user input is ambiguous using stations command\nUse fuzzy matching - don't require exact station names from users\nQuote station names containing spaces (e.g., \"Den Haag Centraal\") to prevent argument parsing errors\nCheck for errors in JSON response before presenting results to user\nInterpret times in 24-hour format (HH:mm)\nDefault to current date - omit --date flag for today's travel; only add --date for future dates\nHandle Dutch station names - many contain special characters or multiple words\nParse JSON carefully - some fields may be null or missing depending on circumstances\nCommon Workflows\nExample 1: \"I need to be in Amsterdam at 9:30\"\nDetermine current location (ask user if unclear)\nCheck if user means today or a future date\nRun: trein t hoofddorp amsterdam --arrive-by 09:30 --json (today) OR: trein t hoofddorp amsterdam --date 2026-02-05 --arrive-by 09:30 --json (future date)\nParse JSON and present earliest suitable option with departure time\nExample 2: \"When does the next train to Rotterdam leave?\"\nDetermine current location\nRun: trein d <current-station> --json\nFilter results for trains going to Rotterdam\nPresent next departure with platform and time\nExample 3: \"Plan my trip tomorrow at 2pm from Utrecht to Den Haag\"\nRun: trein t utrecht \"den haag\" --date 2026-02-04 --depart-at 14:00 --json\nParse response and present journey options with transfers and duration\nExample 4: \"Are there delays on my usual route?\"\nFirst get the trip: trein t amsterdam utrecht --json\nThen check disruptions: trein disruptions --json\nCross-reference routes and inform user of relevant disruptions\nCommon Errors & Solutions\n\"Station not found\" → Use trein stations <query> --json to find correct name\n\"API key missing\" → Verify NS_API_KEY environment variable is set\nEmpty results → Check if date/time is in the past\n\"No trips found\" → Try without --via, route may not be possible via that station\nTips\nUse --json flag for all commands to get structured output for parsing\nStation names support fuzzy matching (e.g., \"adam\" -> \"Amsterdam Centraal\")\nAliases are stored in the config file and can be used in place of station names\nUse --via with trip planning to specify a specific route through an intermediate station\nUse --depart-at HH:mm to plan trips departing at a specific time (defaults to TODAY)\nUse --arrive-by HH:mm to plan trips arriving before a specific time (defaults to TODAY)\n--date YYYY-MM-DD is OPTIONAL - only needed for future dates (omit for today)"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/Timvandervoord/trein-plus",
    "publisherUrl": "https://clawhub.ai/Timvandervoord/trein-plus",
    "owner": "Timvandervoord",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/trein-plus",
    "downloadUrl": "https://openagent3.xyz/downloads/trein-plus",
    "agentUrl": "https://openagent3.xyz/skills/trein-plus/agent",
    "manifestUrl": "https://openagent3.xyz/skills/trein-plus/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/trein-plus/agent.md"
  }
}