{
  "schemaVersion": "1.0",
  "item": {
    "slug": "asana-agent-skill",
    "name": "Asana",
    "source": "tencent",
    "type": "skill",
    "category": "AI 智能",
    "sourceUrl": "https://clawhub.ai/L-U-C-K-Y/asana-agent-skill",
    "canonicalUrl": "https://clawhub.ai/L-U-C-K-Y/asana-agent-skill",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/asana-agent-skill",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=asana-agent-skill",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "AGENTS.md",
      "README.md",
      "SKILL.md",
      "references/REFERENCE.md",
      "scripts/asana.mjs"
    ],
    "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/asana-agent-skill"
    },
    "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/asana-agent-skill",
    "agentPageUrl": "https://openagent3.xyz/skills/asana-agent-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/asana-agent-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/asana-agent-skill/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": "Asana",
        "body": "This skill provides a dependency-free Node.js CLI that calls the Asana REST API (v1) using a Personal Access Token (PAT).\n\nScript: {baseDir}/scripts/asana.mjs\nAuth: ASANA_PAT (preferred) or ASANA_TOKEN\nOutput: JSON only (stdout), suitable for agents and automation"
      },
      {
        "title": "Setup",
        "body": "Create an Asana PAT in your Asana account (Developer Console is not required for PAT usage).\nProvide the token to OpenClaw/Clawdbot as ASANA_PAT."
      },
      {
        "title": "Common injection patterns",
        "body": "Shell env (local testing):\nexport ASANA_PAT=\"...\"\n\n\nOpenClaw config (recommended): set skills.entries.asana.apiKey (or env.ASANA_PAT) so the secret is injected only for the agent run."
      },
      {
        "title": "Configure via OpenClaw CLI (recommended)",
        "body": "This is the safest way to set the PAT because it keeps secrets out of prompts and ad-hoc shell history.\n\nRecommended (apiKey → ASANA_PAT):\n\nopenclaw config set skills.entries.asana.enabled true\nopenclaw config set skills.entries.asana.apiKey \"ASANA_PAT_HERE\"\n\nskills.entries.asana.apiKey is a convenience field: for skills that declare metadata.openclaw.primaryEnv, OpenClaw injects apiKey into that env var for the agent run (this skill’s primary env is ASANA_PAT).\n\nAlternative (explicit env):\n\nopenclaw config set skills.entries.asana.enabled true\nopenclaw config set skills.entries.asana.env.ASANA_PAT \"ASANA_PAT_HERE\"\n\nVerify what is stored:\n\nopenclaw config get skills.entries.asana\nopenclaw config get skills.entries.asana.enabled\nopenclaw config get skills.entries.asana.apiKey\n\nRemove a stored token:\n\nopenclaw config unset skills.entries.asana.apiKey\n# or\nopenclaw config unset skills.entries.asana.env.ASANA_PAT\n\nImportant: sandboxed runs\n\nWhen a session is sandboxed, skill processes run inside Docker and do not inherit the host environment. In that case, skills.entries.*.env/apiKey applies to host runs only.\n\nSet Docker env via:\n\nagents.defaults.sandbox.docker.env (or per-agent agents.list[].sandbox.docker.env)\nor bake the env into your sandbox image"
      },
      {
        "title": "First calls (sanity + discovery)",
        "body": "Who am I:\nnode {baseDir}/scripts/asana.mjs me\n\n\nList workspaces:\nnode {baseDir}/scripts/asana.mjs workspaces\n\n\n(Recommended) Set a default workspace once:\nnode {baseDir}/scripts/asana.mjs set-default-workspace --workspace <workspace_gid>"
      },
      {
        "title": "ID resolution",
        "body": "When the user provides names (project/task/user), resolve to GIDs using one of:\n\ntypeahead --workspace <gid> --resource_type project|task|user --query \"...\" (fast, best default)\nprojects --workspace <gid> --all (enumerate)\nusers --workspace <gid> --all (enumerate)\n\nAvoid guessing a GID when multiple matches exist."
      },
      {
        "title": "List tasks assigned to a user (personal productivity)",
        "body": "node {baseDir}/scripts/asana.mjs tasks-assigned --assignee me --workspace <workspace_gid> --all"
      },
      {
        "title": "List tasks in a project",
        "body": "node {baseDir}/scripts/asana.mjs tasks-in-project --project <project_gid> --all"
      },
      {
        "title": "Search tasks (Advanced Search API)",
        "body": "Canonical primitive: search-tasks (supports many filters; preferred over adding narrow “search helper” commands).\n\nOne-liner example (search within a project):\n\nnode {baseDir}/scripts/asana.mjs search-tasks --workspace <gid> --project <project_gid> --text \"...\" --all\n\nUseful filters:\n\n--assignee me|<gid|email> (maps to assignee.any)\n--completed true|false\n--created_at.after <iso> / --modified_at.after <iso>\n--due_on.before YYYY-MM-DD / --due_at.before <iso>\n--is_blocked true|false / --is_blocking true|false"
      },
      {
        "title": "Create / update / complete",
        "body": "Create:\nnode {baseDir}/scripts/asana.mjs create-task --workspace <gid> --name \"...\" --projects <project_gid> --assignee me\n\n\nUpdate:\nnode {baseDir}/scripts/asana.mjs update-task <task_gid> --name \"...\" --due_on 2026-02-01\n\n\nComplete:\nnode {baseDir}/scripts/asana.mjs complete-task <task_gid>"
      },
      {
        "title": "Project manager workflows",
        "body": "This skill supports the workflows commonly expected from a PM in Asana:\n\nKeep a project brief up to date (upsert-project-brief)\nWrite status updates (create-status-update)\nWork with timelines (start/due dates) and shift schedules safely\nUse custom fields as first-class metadata\nInterpret blockers and dependency graphs (project-blockers, dependencies, dependents)"
      },
      {
        "title": "Project brief",
        "body": "Read:\nnode {baseDir}/scripts/asana.mjs project-brief <project_gid>\n\n\nUpsert (create or update):\nnode {baseDir}/scripts/asana.mjs upsert-project-brief <project_gid> --title \"Project brief\" --html_text \"<body>...</body>\""
      },
      {
        "title": "Status updates",
        "body": "Create:\nnode {baseDir}/scripts/asana.mjs create-status-update --parent <project_gid> --status_type on_track --text \"Weekly update...\"\n\n\nList:\nnode {baseDir}/scripts/asana.mjs status-updates --parent <project_gid> --all"
      },
      {
        "title": "Sections and moving tasks",
        "body": "List sections:\nnode {baseDir}/scripts/asana.mjs sections --project <project_gid> --all\n\n\nCreate section:\nnode {baseDir}/scripts/asana.mjs create-section --project <project_gid> --name \"Blocked\"\n\nAdd a task to a project\n\nCommand: add-task-to-project\n\nCalls POST /tasks/{task_gid}/addProject and supports optional section placement and ordering.\n\nExamples:\n\nnode {baseDir}/scripts/asana.mjs add-task-to-project <task_gid> --project <project_gid>\n\nWith section + ordering:\n\nnode {baseDir}/scripts/asana.mjs add-task-to-project <task_gid> --project <project_gid> --section <section_gid> --insert_before null --insert_after null\n\n(--section, --insert_before, and --insert_after are optional; when provided they are passed through in the request body.)\n\nRemove a task from a project\n\nCommand: remove-task-from-project\n\nCalls POST /tasks/{task_gid}/removeProject.\n\nExample:\n\nnode {baseDir}/scripts/asana.mjs remove-task-from-project <task_gid> --project <project_gid>"
      },
      {
        "title": "Custom fields",
        "body": "Custom fields are critical for reliable PM automation.\n\nList a project’s custom fields:\nnode {baseDir}/scripts/asana.mjs project-custom-fields <project_gid> --all\n\n\nRead a custom field definition:\nnode {baseDir}/scripts/asana.mjs custom-field <custom_field_gid>\n\n\nSet task custom fields on create/update:\nnode {baseDir}/scripts/asana.mjs update-task <task_gid> --custom_fields '{\"<custom_field_gid>\":\"<value>\"}'\n\nNotes:\n\nFor enums, the value is typically the enum option GID.\nFor numbers, send a JSON number."
      },
      {
        "title": "Rich text, mentions, and reliability",
        "body": "Asana rich text fields are XML-valid HTML fragments wrapped in a <body> root element. The API rejects invalid XML or unsupported tags.\n\nKey points:\n\nUse html_notes for task descriptions.\nUse html_text for comments/stories and status updates.\nAvoid unsupported tags like <p> and <br>; prefer literal newlines (\\n) and <hr/> separators.\nFor mentions/links, use <a data-asana-gid=\"...\"></a> (or a self-closing <a .../>)."
      },
      {
        "title": "Mention notifications",
        "body": "Creating a mention link does not guarantee notification delivery if the user is not already assigned or following.\n\nFor reliable pings, do one of:\n\nAssign the user first, then post the comment, OR\nAdd the user as a follower, wait a few seconds, then post the comment\n\nThis skill supports the “add follower + wait” pattern:\n\nnode {baseDir}/scripts/asana.mjs comment <task_gid> --html_text \"<body>Hi <a data-asana-gid=\\\"<user_gid>\\\"/>...</body>\" --ensure_followers <user_gid> --wait_ms 2500\n\nPlain text comments (--text) do not create real @-mentions via the API; they remain plain text."
      },
      {
        "title": "Attachments, uploads, and inline images",
        "body": "Upload a file attachment to a task:\nnode {baseDir}/scripts/asana.mjs upload-attachment --parent <task_gid> --file /path/to/file.png\n\n\nEmbed an existing image attachment inline (tasks + project briefs only):\nnode {baseDir}/scripts/asana.mjs append-inline-image --attachment <attachment_gid> --task <task_gid>"
      },
      {
        "title": "Activity feed / “inbox-like” workflows",
        "body": "Asana does not provide a single universal “inbox” API for all notifications. The closest stable primitive is the Events endpoint scoped to a specific resource (project, task, etc.).\n\nUse:\n\nevents --resource <gid> to pull incremental changes on a project (or a user's \"My Tasks\" project)\nThe command stores a sync token locally so subsequent runs fetch only changes"
      },
      {
        "title": "Timeline shifting",
        "body": "Shift one task (optionally include subtasks):\nnode {baseDir}/scripts/asana.mjs shift-task-dates <task_gid> --delta_days 7 --dry_run true\n\n\nShift an entire project’s tasks:\nnode {baseDir}/scripts/asana.mjs shift-project-tasks --project <project_gid> --delta_days -3 --dry_run true --all\n\nRun with --dry_run true first, then re-run with --dry_run false."
      },
      {
        "title": "Out of scope",
        "body": "Portfolios (premium) are intentionally omitted.\n“Bot personality” is not embedded here; configure behavior in your agent prompt."
      }
    ],
    "body": "Asana\n\nThis skill provides a dependency-free Node.js CLI that calls the Asana REST API (v1) using a Personal Access Token (PAT).\n\nScript: {baseDir}/scripts/asana.mjs\nAuth: ASANA_PAT (preferred) or ASANA_TOKEN\nOutput: JSON only (stdout), suitable for agents and automation\nSetup\nCreate an Asana PAT in your Asana account (Developer Console is not required for PAT usage).\nProvide the token to OpenClaw/Clawdbot as ASANA_PAT.\nCommon injection patterns\n\nShell env (local testing):\n\nexport ASANA_PAT=\"...\"\n\nOpenClaw config (recommended): set skills.entries.asana.apiKey (or env.ASANA_PAT) so the secret is injected only for the agent run.\n\nConfigure via OpenClaw CLI (recommended)\n\nThis is the safest way to set the PAT because it keeps secrets out of prompts and ad-hoc shell history.\n\nRecommended (apiKey → ASANA_PAT):\n\nopenclaw config set skills.entries.asana.enabled true\nopenclaw config set skills.entries.asana.apiKey \"ASANA_PAT_HERE\"\n\n\nskills.entries.asana.apiKey is a convenience field: for skills that declare metadata.openclaw.primaryEnv, OpenClaw injects apiKey into that env var for the agent run (this skill’s primary env is ASANA_PAT).\n\nAlternative (explicit env):\n\nopenclaw config set skills.entries.asana.enabled true\nopenclaw config set skills.entries.asana.env.ASANA_PAT \"ASANA_PAT_HERE\"\n\n\nVerify what is stored:\n\nopenclaw config get skills.entries.asana\nopenclaw config get skills.entries.asana.enabled\nopenclaw config get skills.entries.asana.apiKey\n\n\nRemove a stored token:\n\nopenclaw config unset skills.entries.asana.apiKey\n# or\nopenclaw config unset skills.entries.asana.env.ASANA_PAT\n\nImportant: sandboxed runs\n\nWhen a session is sandboxed, skill processes run inside Docker and do not inherit the host environment. In that case, skills.entries.*.env/apiKey applies to host runs only.\n\nSet Docker env via:\n\nagents.defaults.sandbox.docker.env (or per-agent agents.list[].sandbox.docker.env)\nor bake the env into your sandbox image\nFirst calls (sanity + discovery)\n\nWho am I:\n\nnode {baseDir}/scripts/asana.mjs me\n\nList workspaces:\n\nnode {baseDir}/scripts/asana.mjs workspaces\n\n(Recommended) Set a default workspace once:\n\nnode {baseDir}/scripts/asana.mjs set-default-workspace --workspace <workspace_gid>\n\nID resolution\n\nWhen the user provides names (project/task/user), resolve to GIDs using one of:\n\ntypeahead --workspace <gid> --resource_type project|task|user --query \"...\" (fast, best default)\nprojects --workspace <gid> --all (enumerate)\nusers --workspace <gid> --all (enumerate)\n\nAvoid guessing a GID when multiple matches exist.\n\nCore: tasks\nList tasks assigned to a user (personal productivity)\n\nnode {baseDir}/scripts/asana.mjs tasks-assigned --assignee me --workspace <workspace_gid> --all\n\nList tasks in a project\n\nnode {baseDir}/scripts/asana.mjs tasks-in-project --project <project_gid> --all\n\nSearch tasks (Advanced Search API)\n\nCanonical primitive: search-tasks (supports many filters; preferred over adding narrow “search helper” commands).\n\nOne-liner example (search within a project):\n\nnode {baseDir}/scripts/asana.mjs search-tasks --workspace <gid> --project <project_gid> --text \"...\" --all\n\nUseful filters:\n\n--assignee me|<gid|email> (maps to assignee.any)\n--completed true|false\n--created_at.after <iso> / --modified_at.after <iso>\n--due_on.before YYYY-MM-DD / --due_at.before <iso>\n--is_blocked true|false / --is_blocking true|false\nCreate / update / complete\n\nCreate:\n\nnode {baseDir}/scripts/asana.mjs create-task --workspace <gid> --name \"...\" --projects <project_gid> --assignee me\n\nUpdate:\n\nnode {baseDir}/scripts/asana.mjs update-task <task_gid> --name \"...\" --due_on 2026-02-01\n\nComplete:\n\nnode {baseDir}/scripts/asana.mjs complete-task <task_gid>\n\nProject manager workflows\n\nThis skill supports the workflows commonly expected from a PM in Asana:\n\nKeep a project brief up to date (upsert-project-brief)\nWrite status updates (create-status-update)\nWork with timelines (start/due dates) and shift schedules safely\nUse custom fields as first-class metadata\nInterpret blockers and dependency graphs (project-blockers, dependencies, dependents)\nProject brief\n\nRead:\n\nnode {baseDir}/scripts/asana.mjs project-brief <project_gid>\n\nUpsert (create or update):\n\nnode {baseDir}/scripts/asana.mjs upsert-project-brief <project_gid> --title \"Project brief\" --html_text \"<body>...</body>\"\n\nStatus updates\n\nCreate:\n\nnode {baseDir}/scripts/asana.mjs create-status-update --parent <project_gid> --status_type on_track --text \"Weekly update...\"\n\nList:\n\nnode {baseDir}/scripts/asana.mjs status-updates --parent <project_gid> --all\n\nSections and moving tasks\n\nList sections:\n\nnode {baseDir}/scripts/asana.mjs sections --project <project_gid> --all\n\nCreate section:\n\nnode {baseDir}/scripts/asana.mjs create-section --project <project_gid> --name \"Blocked\"\n\nAdd a task to a project\n\nCommand: add-task-to-project\n\nCalls POST /tasks/{task_gid}/addProject and supports optional section placement and ordering.\n\nExamples:\n\nnode {baseDir}/scripts/asana.mjs add-task-to-project <task_gid> --project <project_gid>\n\nWith section + ordering:\n\nnode {baseDir}/scripts/asana.mjs add-task-to-project <task_gid> --project <project_gid> --section <section_gid> --insert_before null --insert_after null\n\n(--section, --insert_before, and --insert_after are optional; when provided they are passed through in the request body.)\n\nRemove a task from a project\n\nCommand: remove-task-from-project\n\nCalls POST /tasks/{task_gid}/removeProject.\n\nExample:\n\nnode {baseDir}/scripts/asana.mjs remove-task-from-project <task_gid> --project <project_gid>\n\nCustom fields\n\nCustom fields are critical for reliable PM automation.\n\nList a project’s custom fields:\n\nnode {baseDir}/scripts/asana.mjs project-custom-fields <project_gid> --all\n\nRead a custom field definition:\n\nnode {baseDir}/scripts/asana.mjs custom-field <custom_field_gid>\n\nSet task custom fields on create/update:\n\nnode {baseDir}/scripts/asana.mjs update-task <task_gid> --custom_fields '{\"<custom_field_gid>\":\"<value>\"}'\n\nNotes:\n\nFor enums, the value is typically the enum option GID.\nFor numbers, send a JSON number.\nRich text, mentions, and reliability\n\nAsana rich text fields are XML-valid HTML fragments wrapped in a <body> root element. The API rejects invalid XML or unsupported tags.\n\nKey points:\n\nUse html_notes for task descriptions.\nUse html_text for comments/stories and status updates.\nAvoid unsupported tags like <p> and <br>; prefer literal newlines (\\n) and <hr/> separators.\nFor mentions/links, use <a data-asana-gid=\"...\"></a> (or a self-closing <a .../>).\nMention notifications\n\nCreating a mention link does not guarantee notification delivery if the user is not already assigned or following.\n\nFor reliable pings, do one of:\n\nAssign the user first, then post the comment, OR\nAdd the user as a follower, wait a few seconds, then post the comment\n\nThis skill supports the “add follower + wait” pattern:\n\nnode {baseDir}/scripts/asana.mjs comment <task_gid> --html_text \"<body>Hi <a data-asana-gid=\\\"<user_gid>\\\"/>...</body>\" --ensure_followers <user_gid> --wait_ms 2500\n\nPlain text comments (--text) do not create real @-mentions via the API; they remain plain text.\n\nAttachments, uploads, and inline images\n\nUpload a file attachment to a task:\n\nnode {baseDir}/scripts/asana.mjs upload-attachment --parent <task_gid> --file /path/to/file.png\n\nEmbed an existing image attachment inline (tasks + project briefs only):\n\nnode {baseDir}/scripts/asana.mjs append-inline-image --attachment <attachment_gid> --task <task_gid>\n\nActivity feed / “inbox-like” workflows\n\nAsana does not provide a single universal “inbox” API for all notifications. The closest stable primitive is the Events endpoint scoped to a specific resource (project, task, etc.).\n\nUse:\n\nevents --resource <gid> to pull incremental changes on a project (or a user's \"My Tasks\" project)\nThe command stores a sync token locally so subsequent runs fetch only changes\nTimeline shifting\n\nShift one task (optionally include subtasks):\n\nnode {baseDir}/scripts/asana.mjs shift-task-dates <task_gid> --delta_days 7 --dry_run true\n\nShift an entire project’s tasks:\n\nnode {baseDir}/scripts/asana.mjs shift-project-tasks --project <project_gid> --delta_days -3 --dry_run true --all\n\nRun with --dry_run true first, then re-run with --dry_run false.\n\nOut of scope\nPortfolios (premium) are intentionally omitted.\n“Bot personality” is not embedded here; configure behavior in your agent prompt."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/L-U-C-K-Y/asana-agent-skill",
    "publisherUrl": "https://clawhub.ai/L-U-C-K-Y/asana-agent-skill",
    "owner": "L-U-C-K-Y",
    "version": "0.2.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/asana-agent-skill",
    "downloadUrl": "https://openagent3.xyz/downloads/asana-agent-skill",
    "agentUrl": "https://openagent3.xyz/skills/asana-agent-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/asana-agent-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/asana-agent-skill/agent.md"
  }
}