{
  "schemaVersion": "1.0",
  "item": {
    "slug": "airfrance-afkl",
    "name": "Air France - KLM",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/iclems/airfrance-afkl",
    "canonicalUrl": "https://clawhub.ai/iclems/airfrance-afkl",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/airfrance-afkl",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=airfrance-afkl",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "scripts/aircraft_intel.mjs",
      "scripts/afkl_watch_flight.mjs",
      "scripts/afkl_flightstatus_query.mjs",
      "scripts/afkl_http.mjs",
      "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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.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/airfrance-afkl"
    },
    "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/airfrance-afkl",
    "agentPageUrl": "https://openagent3.xyz/skills/airfrance-afkl/agent",
    "manifestUrl": "https://openagent3.xyz/skills/airfrance-afkl/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/airfrance-afkl/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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Quick start (one-off status)",
        "body": "Create an API key (and optional secret)\n\nRegister on: https://developer.airfranceklm.com\nSubscribe to the Open Data product(s) you need (at least Flight Status API)\nGenerate credentials (API key; some accounts also provide an API secret)\n\nProvide API credentials (do not print them):\n\nPreferred: env vars AFKL_API_KEY (and optional AFKL_API_SECRET)\nOr files in your state dir (CLAWDBOT_STATE_DIR or ./state):\n\nafkl_api_key.txt (chmod 600)\nafkl_api_secret.txt (chmod 600, optional)\n\nQuery flight status:\n\nRun: node skills/airfrance-afkl/scripts/afkl_flightstatus_query.mjs --carrier AF --flight 7 --origin JFK --dep-date 2026-01-29\n\nNotes:\n\nSend Accept: */* (API returns application/hal+json).\nKeep within limits: <= 1 request/sec. When making multiple calls, sleep ~1100ms between them."
      },
      {
        "title": "Start monitoring (watcher)",
        "body": "Use when the user wants proactive updates.\n\nRun: node skills/airfrance-afkl/scripts/afkl_watch_flight.mjs --carrier AF --flight 7 --origin JFK --dep-date 2026-01-29\n\nWhat it does:\n\nFetches the operational flight(s) for the date window.\nEmits a single message only when something meaningful changes.\nAlso follows the previous-flight chain (flightRelations.previousFlightData.id) up to a configurable depth and alerts if a previous segment is delayed/cancelled.\n\nPolling strategy (default):\n\n36h before departure: at most every 60 min\n\n\n36h→12h: every 30 min\n12h→3h: every 15 min\n3h→departure: every 5–10 min (stay under daily quota)\nAfter departure: every 30 min until arrival\n\nImplementation detail: run cron every 5–15 min, but the script self-throttles using a state file so it won’t hit the API when it’s not time. The watcher prints no output when nothing changed (so cron jobs can send only when stdout is non-empty)."
      },
      {
        "title": "Input shorthand",
        "body": "Preferred user-facing format:\n\nAF7 demain / AF7 jeudi\n\nInterpretation rule:\n\nThe day always refers to the departure date (not arrival).\n\nImplementation notes:\n\nConvert relative day words to a departure date in the user’s timezone unless the origin timezone is explicitly known.\nWhen ambiguous (long-haul crossing midnight), prefer the departure local date at the origin if origin is known.\n\n(For scripts, still pass --origin + --dep-date YYYY-MM-DD.)"
      },
      {
        "title": "Interpret “interesting” fields",
        "body": "See references/fields.md for:\n\nflightRelations (prev/next)\nplaces.* (terminal/gate/check-in zone)\ntimes.* (scheduled/estimated/latest/actual)\naircraft (type, registration)\n“parking position” / stand-type hints (when present)\nWi‑Fi hints and how to reason about cabin recency"
      },
      {
        "title": "Cabin recency / upgrade heuristics",
        "body": "When aircraft registration is available:\n\nUse tail number to infer sub-fleet and likely cabin generation.\nIf data suggests older config (or no Wi‑Fi), upgrading can be more/less worth it.\n\nBe conservative:\n\nOpen Data often doesn’t expose exact seat model; treat this as best-effort."
      }
    ],
    "body": "Air France (AFKL Open Data) flight tracker\nQuick start (one-off status)\nCreate an API key (and optional secret)\nRegister on: https://developer.airfranceklm.com\nSubscribe to the Open Data product(s) you need (at least Flight Status API)\nGenerate credentials (API key; some accounts also provide an API secret)\nProvide API credentials (do not print them):\nPreferred: env vars AFKL_API_KEY (and optional AFKL_API_SECRET)\nOr files in your state dir (CLAWDBOT_STATE_DIR or ./state):\nafkl_api_key.txt (chmod 600)\nafkl_api_secret.txt (chmod 600, optional)\nQuery flight status:\nRun: node skills/airfrance-afkl/scripts/afkl_flightstatus_query.mjs --carrier AF --flight 7 --origin JFK --dep-date 2026-01-29\n\nNotes:\n\nSend Accept: */* (API returns application/hal+json).\nKeep within limits: <= 1 request/sec. When making multiple calls, sleep ~1100ms between them.\nStart monitoring (watcher)\n\nUse when the user wants proactive updates.\n\nRun: node skills/airfrance-afkl/scripts/afkl_watch_flight.mjs --carrier AF --flight 7 --origin JFK --dep-date 2026-01-29\n\nWhat it does:\n\nFetches the operational flight(s) for the date window.\nEmits a single message only when something meaningful changes.\nAlso follows the previous-flight chain (flightRelations.previousFlightData.id) up to a configurable depth and alerts if a previous segment is delayed/cancelled.\n\nPolling strategy (default):\n\n36h before departure: at most every 60 min\n\n36h→12h: every 30 min\n12h→3h: every 15 min\n3h→departure: every 5–10 min (stay under daily quota)\nAfter departure: every 30 min until arrival\n\nImplementation detail: run cron every 5–15 min, but the script self-throttles using a state file so it won’t hit the API when it’s not time. The watcher prints no output when nothing changed (so cron jobs can send only when stdout is non-empty).\n\nInput shorthand\n\nPreferred user-facing format:\n\nAF7 demain / AF7 jeudi\n\nInterpretation rule:\n\nThe day always refers to the departure date (not arrival).\n\nImplementation notes:\n\nConvert relative day words to a departure date in the user’s timezone unless the origin timezone is explicitly known.\nWhen ambiguous (long-haul crossing midnight), prefer the departure local date at the origin if origin is known.\n\n(For scripts, still pass --origin + --dep-date YYYY-MM-DD.)\n\nInterpret “interesting” fields\n\nSee references/fields.md for:\n\nflightRelations (prev/next)\nplaces.* (terminal/gate/check-in zone)\ntimes.* (scheduled/estimated/latest/actual)\naircraft (type, registration)\n“parking position” / stand-type hints (when present)\nWi‑Fi hints and how to reason about cabin recency\nCabin recency / upgrade heuristics\n\nWhen aircraft registration is available:\n\nUse tail number to infer sub-fleet and likely cabin generation.\nIf data suggests older config (or no Wi‑Fi), upgrading can be more/less worth it.\n\nBe conservative:\n\nOpen Data often doesn’t expose exact seat model; treat this as best-effort."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/iclems/airfrance-afkl",
    "publisherUrl": "https://clawhub.ai/iclems/airfrance-afkl",
    "owner": "iclems",
    "version": "1.0.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/airfrance-afkl",
    "downloadUrl": "https://openagent3.xyz/downloads/airfrance-afkl",
    "agentUrl": "https://openagent3.xyz/skills/airfrance-afkl/agent",
    "manifestUrl": "https://openagent3.xyz/skills/airfrance-afkl/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/airfrance-afkl/agent.md"
  }
}