{"id":"3ca09444-8645-4274-baa4-86a73e915e99","entityType":"agent","slug":"clawhub-k0nkupa-asana","name":"Asana","canonicalUrl":"https://www.xpersona.co/agent/clawhub-k0nkupa-asana","canonicalPath":"/agent/clawhub-k0nkupa-asana","generatedAt":"2026-10-09T23:53:42.361Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"description":"Integrate Asana with Clawdbot via the Asana REST API. Use when you need to list/search/create/update Asana tasks/projects/workspaces, or to set up Asana OAuth (authorization code grant) for a personal local-only integration (OOB/manual code paste). Skill: Asana Owner: k0nkupa Summary: Integrate Asana with Clawdbot via the Asana REST API. Use when you need to list/search/create/update Asana tasks/projects/workspaces, or to set up Asana OAuth (authorization code grant) for a personal local-only integration (OOB/manual code paste). Tags: latest:1.0.0 Version history: v1.0.0 | 2026-01-26T02:59:51.460Z | user - Updated skill. Archive index: Archive v1.0.0: 8 files,","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 2.7K downloads reported by the source. Last updated 4/15/2026.","installCommand":"clawhub skill install kn7b69bxtkr2s9fv7wte391nan7zz874:asana","sourceUrl":"https://clawhub.ai/k0nkupa/asana","homepage":"https://clawhub.ai/k0nkupa/asana","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/k0nkupa/asana","kind":"source"}],"safetyScore":84,"overallRank":62,"popularityScore":69,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Integrate Asana with Clawdbot via the Asana REST API. Use when you need to list/search/create/update Asana tasks/projects/workspaces, or to set up Asana OAuth ("},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"stars":null,"forks":null,"downloads":2707,"packageName":null,"latestVersion":"1.0.0","tractionLabel":"2.7K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-02-28T18:20:01.810Z","emptyReason":null},"lastUpdatedAt":"2026-04-15T00:45:39.800Z","lastCrawledAt":"2026-02-28T18:20:01.810Z","lastIndexedAt":null,"nextCrawlAt":"2026-03-01T18:20:01.810Z","lastVerifiedAt":null,"highlights":[{"version":"1.0.0","createdAt":"2026-01-26T02:59:51.460Z","changelog":"- Updated skill.","fileCount":8,"zipByteSize":12031}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install kn7b69bxtkr2s9fv7wte391nan7zz874:asana","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-k0nkupa-asana/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-k0nkupa-asana/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-k0nkupa-asana/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-k0nkupa-asana/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-k0nkupa-asana/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-k0nkupa-asana/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T23:53:42.361Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-k0nkupa-asana/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-k0nkupa-asana/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-k0nkupa-asana/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-k0nkupa-asana/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"readme":"Skill: Asana\n\nOwner: k0nkupa\n\nSummary: Integrate Asana with Clawdbot via the Asana REST API. Use when you need to list/search/create/update Asana tasks/projects/workspaces, or to set up Asana OAuth (authorization code grant) for a personal local-only integration (OOB/manual code paste).\n\nTags: latest:1.0.0\n\nVersion history:\n\nv1.0.0 | 2026-01-26T02:59:51.460Z | user\n\n- Updated skill.\n\nArchive index:\n\nArchive v1.0.0: 8 files, 12031 bytes\n\nFiles: README.md (4746b), references/asana-endpoints.md (602b), scripts/asana_api.mjs (12135b), scripts/asana_chat.mjs (2852b), scripts/configure.mjs (1501b), scripts/oauth_oob.mjs (4171b), SKILL.md (4347b), _meta.json (124b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: asana\ndescription: \"Integrate Asana with Clawdbot via the Asana REST API. Use when you need to list/search/create/update Asana tasks/projects/workspaces, or to set up Asana OAuth (authorization code grant) for a personal local-only integration (OOB/manual code paste).\"\n---\n\n# Asana (Clawdbot skill)\n\nThis skill is designed for a **personal local-only** Asana integration using **OAuth** with an **out-of-band/manual code paste** flow.\n\n## What this skill provides\n- A small Node CLI to:\n  - generate the Asana authorize URL\n  - exchange an authorization code for access/refresh tokens\n  - auto-refresh the access token\n  - make basic API calls (e.g. `/users/me`, `/workspaces`, tasks)\n\n## Setup (OAuth, OOB/manual code)\n\n### 0) Create an Asana app\nIn Asana Developer Console (My apps):\n- Create app\n- Enable scopes you will need (typical: `tasks:read`, `tasks:write`, `projects:read`)\n- Set redirect URI to the OOB value (manual code):\n  - `urn:ietf:wg:oauth:2.0:oob`\n\n### 1) Provide credentials (two options)\n\n**Option A (recommended for Clawdbot):** save to a local credentials file:\n```bash\nnode scripts/configure.mjs --client-id \"...\" --client-secret \"...\"\n```\nThis writes `~/.clawdbot/asana/credentials.json`.\n\n**Option B:** set environment variables (shell/session):\n- `ASANA_CLIENT_ID`\n- `ASANA_CLIENT_SECRET`\n\n### 2) Run OAuth\nFrom the repo root:\n\n1) Print the authorize URL:\n```bash\nnode scripts/oauth_oob.mjs authorize\n```\n2) Open the printed URL, click **Allow**, copy the code.\n3) Exchange code and save tokens locally:\n```bash\nnode scripts/oauth_oob.mjs token --code \"PASTE_CODE_HERE\"\n```\n\nTokens are stored at:\n- `~/.clawdbot/asana/token.json`\n\n## Chat usage (support both explicit + natural language)\n\nYou can use either:\n- **Explicit commands**: start the message with `/asana ...`\n- **Natural language**: e.g. “list tasks assigned to me”\n\nFor Clawdbot, implement the mapping by translating the user request into the appropriate `asana_api.mjs` command.\n\nExamples:\n- `/asana tasks-assigned` → `tasks-assigned --assignee me`\n- “list tasks assigned to me” → `tasks-assigned --assignee me`\n- “list all tasks in <project>” → resolve `<project>` to a project gid, then `tasks-in-project --project <gid>`\n- “list tasks due date from 2026-01-01 to 2026-01-15” → `search-tasks --assignee me --due_on.after 2026-01-01 --due_on.before 2026-01-15`\n\n(Optional helper) `scripts/asana_chat.mjs` can map common phrases to a command skeleton.\n\n## Using the API helper\n\nSanity check (who am I):\n```bash\nnode scripts/asana_api.mjs me\n```\n\nList workspaces:\n```bash\nnode scripts/asana_api.mjs workspaces\n```\n\nSet a default workspace (optional):\n```bash\nnode scripts/asana_api.mjs set-default-workspace --workspace <workspace_gid>\n```\nAfter that, you can omit `--workspace` for commands that support it.\n\nList projects in a workspace (explicit):\n```bash\nnode scripts/asana_api.mjs projects --workspace <workspace_gid>\n```\nList projects using the default workspace:\n```bash\nnode scripts/asana_api.mjs projects\n```\n\nList tasks in a project:\n```bash\nnode scripts/asana_api.mjs tasks-in-project --project <project_gid>\n```\n\nList tasks assigned to me (workspace required by Asana):\n```bash\nnode scripts/asana_api.mjs tasks-assigned --workspace <workspace_gid> --assignee me\n```\nOr using the default workspace:\n```bash\nnode scripts/asana_api.mjs tasks-assigned --assignee me\n```\n\nSearch tasks (advanced search):\n```bash\nnode scripts/asana_api.mjs search-tasks --workspace <workspace_gid> --text \"release\" --assignee me\n# also supports convenience: --project <project_gid>\n```\n\nView a task:\n```bash\nnode scripts/asana_api.mjs task <task_gid>\n```\n\nMark a task complete:\n```bash\nnode scripts/asana_api.mjs complete-task <task_gid>\n```\n\nUpdate a task:\n```bash\nnode scripts/asana_api.mjs update-task <task_gid> --name \"New title\" --due_on 2026-02-01\n```\n\nComment on a task:\n```bash\nnode scripts/asana_api.mjs comment <task_gid> --text \"Update: shipped\"\n```\n\nCreate a task:\n```bash\nnode scripts/asana_api.mjs create-task --workspace <workspace_gid> --name \"Test task\" --notes \"from clawdbot\" --projects <project_gid>\n```\n\n## Notes / gotchas\n- OAuth access tokens expire; refresh tokens are used to obtain new access tokens.\n- If you later want multi-user support, replace OOB with a real redirect/callback.\n- Don’t log tokens.\n\nFile v1.0.0:README.md\n\n# clawdbot-asana-skill\n\nAsana OAuth (local-only) + task/project commands for Clawdbot.\n\nThis repo contains a small **Asana skill** (an AgentSkill folder) that you can:\n- use locally on your Clawdbot host\n- publish/share so other Clawdbot users can install and run it\n\nIt uses **Asana OAuth 2.0 Authorization Code Grant** with an **out-of-band (OOB) / manual code paste** redirect URI:\n\n- `urn:ietf:wg:oauth:2.0:oob`\n\nNo public callback server is required.\n\n---\n\n## What you get\n\nCommands (via Node scripts):\n- Auth helpers: generate authorize URL, exchange code, refresh access token\n- List workspaces, list projects, list tasks\n- View task, update task, mark complete, comment\n\nTokens and config are stored locally under:\n- `~/.clawdbot/asana/credentials.json` (client id + secret)\n- `~/.clawdbot/asana/token.json` (OAuth tokens)\n- `~/.clawdbot/asana/config.json` (default workspace)\n\n---\n\n## Prerequisites\n\n- Node.js 22+\n- An Asana account with access to the workspace(s) you want\n\n---\n\n## 1) Create an Asana “Custom App” (Developer Console)\n\n1. Open the Asana Developer Console:\n   - https://app.asana.com/0/my-apps\n2. Create a new app.\n3. **Distribution (important):**\n   - Your OAuth app must be **available in the workspace** the user is authorizing from.\n   - In the developer console, configure **Manage distribution** so the app is available to the target workspace(s).\n   - If distribution/workspace availability is misconfigured, authorization can fail even if the URL is correct.\n4. OAuth settings:\n   - **Redirect URI:**\n     - `urn:ietf:wg:oauth:2.0:oob`\n   - Copy the **Client ID** and **Client Secret**.\n\n### Scopes (must match what you request)\n\nIn the Asana Developer Console, go to **OAuth → Permission scopes** and enable the scopes you plan to request.\n\nImportant rules:\n- The scopes you request in the authorize URL **must be a subset of** the scopes enabled in the console.\n- If you request a scope that is not enabled, you’ll get a `forbidden_scopes` error.\n\nRecommended “full task management” scope set:\n\n- `tasks:read` `tasks:write` `tasks:delete`\n- `projects:read` `projects:write`\n- `attachments:read` `attachments:write`\n- `custom_fields:read` `custom_fields:write`\n- `tags:read` `tags:write`\n- `task_custom_types:read`\n- `teams:read`\n- `users:read`\n- `workspaces:read`\n\n---\n\n## 2) Configure credentials locally\n\nSave your Asana OAuth client id/secret to a local file:\n\n```bash\nnode scripts/configure.mjs \\\n  --client-id \"YOUR_CLIENT_ID\" \\\n  --client-secret \"YOUR_CLIENT_SECRET\"\n```\n\nThis writes:\n- `~/.clawdbot/asana/credentials.json`\n\n(Alternative: you can set `ASANA_CLIENT_ID` and `ASANA_CLIENT_SECRET` as environment variables, but the credentials file is recommended for Clawdbot.)\n\n---\n\n## 3) Authorize (OOB) and save tokens\n\n### 3.1 Generate the authorize URL\n\n```bash\nnode scripts/oauth_oob.mjs authorize \\\n  --scope \"tasks:read tasks:write projects:read\"\n```\n\nOpen the printed URL in your browser, click **Allow**, then copy the code.\n\n### 3.2 Exchange the code for tokens\n\n```bash\nnode scripts/oauth_oob.mjs token --code \"PASTE_CODE_HERE\"\n```\n\nThis writes:\n- `~/.clawdbot/asana/token.json`\n\n---\n\n## 4) (Optional) set a default workspace\n\nList workspaces:\n\n```bash\nnode scripts/asana_api.mjs workspaces\n```\n\nSet default workspace:\n\n```bash\nnode scripts/asana_api.mjs set-default-workspace --workspace <workspace_gid>\n```\n\nThis writes:\n- `~/.clawdbot/asana/config.json`\n\nCommands that require a workspace will use the default if `--workspace` is omitted.\n\n---\n\n## 5) Common commands\n\nWho am I:\n```bash\nnode scripts/asana_api.mjs me\n```\n\nList projects (default workspace):\n```bash\nnode scripts/asana_api.mjs projects\n```\n\nList tasks assigned to me:\n```bash\nnode scripts/asana_api.mjs tasks-assigned --assignee me\n```\n\nList all tasks in a project:\n```bash\nnode scripts/asana_api.mjs tasks-in-project --project <project_gid>\n```\n\nView a task:\n```bash\nnode scripts/asana_api.mjs task <task_gid>\n```\n\nMark complete:\n```bash\nnode scripts/asana_api.mjs complete-task <task_gid>\n```\n\nComment:\n```bash\nnode scripts/asana_api.mjs comment <task_gid> --text \"Update: shipped\"\n```\n\nAdvanced search (workspace required; default is used if set):\n```bash\nnode scripts/asana_api.mjs search-tasks --text \"release\" --assignee me\n```\n\n---\n\n## Install into Clawdbot (local)\n\nIf your Clawdbot workspace is `/Users/tony/clawd`, copy the skill folder into:\n\n- `/Users/tony/clawd/skills/asana/`\n\nand restart Clawdbot if needed.\n\n---\n\n## Notes\n\n- Access tokens expire; the scripts will refresh using the refresh token.\n- Keep `credentials.json` and `token.json` secret.\n- If you publish this, document that users must configure **distribution** + **scopes** in the Asana console to match what they request in `authorize`.\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7b69bxtkr2s9fv7wte391nan7zz874\",\n  \"slug\": \"asana\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1769396391460\n}\n\nFile v1.0.0:references/asana-endpoints.md\n\n# Asana endpoints (quick reference)\n\nAuth:\n- Authorize: `GET https://app.asana.com/-/oauth_authorize`\n- Token exchange / refresh: `POST https://app.asana.com/-/oauth_token`\n- Revoke: `POST https://app.asana.com/-/oauth_revoke`\n\nAPI:\n- Base: `https://app.asana.com/api/1.0`\n\nCommon:\n- `GET /users/me`\n- `GET /workspaces`\n- `GET /projects?workspace=<gid>`\n- `GET /tasks` (requires filters)\n- `GET /workspaces/{workspace_gid}/tasks/search` (advanced search; can be premium-only)\n- `POST /tasks`\n\nNotes:\n- OAuth scopes are required with OAuth apps (examples: `tasks:read`, `tasks:write`, `projects:read`).","readmeExcerpt":"Skill: Asana Owner: k0nkupa Summary: Integrate Asana with Clawdbot via the Asana REST API. Use when you need to list/search/create/update Asana tasks/projects/workspaces, or to set up Asana OAuth (authorization code grant) for a personal local-only integration (OOB/manual code paste). Tags: latest:1.0.0 Version history: v1.0.0 | 2026-01-26T02:59:51.460Z | user - Updated skill. Archive index: Archive v1.0.0: 8 files, ","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"node scripts/configure.mjs --client-id \"...\" --client-secret \"...\""},{"language":"bash","snippet":"node scripts/oauth_oob.mjs authorize"},{"language":"bash","snippet":"node scripts/oauth_oob.mjs token --code \"PASTE_CODE_HERE\""},{"language":"bash","snippet":"node scripts/asana_api.mjs me"},{"language":"bash","snippet":"node scripts/asana_api.mjs workspaces"},{"language":"bash","snippet":"node scripts/asana_api.mjs set-default-workspace --workspace <workspace_gid>"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: asana\ndescription: \"Integrate Asana with Clawdbot via the Asana REST API. Use when you need to list/search/create/update Asana tasks/projects/workspaces, or to set up Asana OAuth (authorization code grant) for a personal local-only integration (OOB/manual code paste).\"\n---\n\n# Asana (Clawdbot skill)\n\nThis skill is designed for a **personal local-only** Asana integration using **OAuth** with an **out-of-band/manual code paste** flow.\n\n## What this skill provides\n- A small Node CLI to:\n  - generate the Asana authorize URL\n  - exchange an authorization code for access/refresh tokens\n  - auto-refresh the access token\n  - make basic API calls (e.g. `/users/me`, `/workspaces`, tasks)\n\n## Setup (OAuth, OOB/manual code)\n\n### 0) Create an Asana app\nIn Asana Developer Console (My apps):\n- Create app\n- Enable scopes you will need (typical: `tasks:read`, `tasks:write`, `projects:read`)\n- Set redirect URI to the OOB value (manual code):\n  - `urn:ietf:wg:oauth:2.0:oob`\n\n### 1) Provide credentials (two options)\n\n**Option A (recommended for Clawdbot):** save to a local credentials file:\n```bash\nnode scripts/configure.mjs --client-id \"...\" --client-secret \"...\"\n```\nThis writes `~/.clawdbot/asana/credentials.json`.\n\n**Option B:** set environment variables (shell/session):\n- `ASANA_CLIENT_ID`\n- `ASANA_CLIENT_SECRET`\n\n### 2) Run OAuth\nFrom the repo root:\n\n1) Print the authorize URL:\n```bash\nnode scripts/oauth_oob.mjs authorize\n```\n2) Open the printed URL, click **Allow**, copy the code.\n3) Exchange code and save tokens locally:\n```bash\nnode scripts/oauth_oob.mjs token --code \"PASTE_CODE_HERE\"\n```\n\nTokens are stored at:\n- `~/.clawdbot/asana/token.json`\n\n## Chat usage (support both explicit + natural language)\n\nYou can use either:\n- **Explicit commands**: start the message with `/asana ...`\n- **Natural language**: e.g. “list tasks assigned to me”\n\nFor Clawdbot, implement the mapping by translating the user request into the appropriate `asana_api.mjs` command.\n\nExamples:\n- `/asana tasks-assigned` → `tasks-assigned --assignee me`\n- “list tasks assigned to me” → `tasks-assigned --assignee me`\n- “list all tasks in <project>” → resolve `<project>` to a project gid, then `tasks-in-project --project <gid>`\n- “list tasks due date from 2026-01-01 to 2026-01-15” → `search-tasks --assignee me --due_on.after 2026-01-01 --due_on.before 2026-01-15`\n\n(Optional helper) `scripts/asana_chat.mjs` can map common phrases to a command skeleton.\n\n## Using the API helper\n\nSanity check (who am I):\n```bash\nnode scripts/asana_api.mjs me\n```\n\nList workspaces:\n```bash\nnode scripts/asana_api.mjs workspaces\n```\n\nSet a default workspace (optional):\n```bash\nnode scripts/asana_api.mjs set-default-workspace --workspace <workspace_gid>\n```\nAfter that, you can omit `--workspace` for commands that support it.\n\nList projects in a workspace (explicit):\n```bash\nnode scripts/asana_api.mjs projects --workspace <workspace_gid>\n```\nList projects using the default workspace:\n```bash\nnode scripts/asana_ap"},{"path":"README.md","content":"# clawdbot-asana-skill\n\nAsana OAuth (local-only) + task/project commands for Clawdbot.\n\nThis repo contains a small **Asana skill** (an AgentSkill folder) that you can:\n- use locally on your Clawdbot host\n- publish/share so other Clawdbot users can install and run it\n\nIt uses **Asana OAuth 2.0 Authorization Code Grant** with an **out-of-band (OOB) / manual code paste** redirect URI:\n\n- `urn:ietf:wg:oauth:2.0:oob`\n\nNo public callback server is required.\n\n---\n\n## What you get\n\nCommands (via Node scripts):\n- Auth helpers: generate authorize URL, exchange code, refresh access token\n- List workspaces, list projects, list tasks\n- View task, update task, mark complete, comment\n\nTokens and config are stored locally under:\n- `~/.clawdbot/asana/credentials.json` (client id + secret)\n- `~/.clawdbot/asana/token.json` (OAuth tokens)\n- `~/.clawdbot/asana/config.json` (default workspace)\n\n---\n\n## Prerequisites\n\n- Node.js 22+\n- An Asana account with access to the workspace(s) you want\n\n---\n\n## 1) Create an Asana “Custom App” (Developer Console)\n\n1. Open the Asana Developer Console:\n   - https://app.asana.com/0/my-apps\n2. Create a new app.\n3. **Distribution (important):**\n   - Your OAuth app must be **available in the workspace** the user is authorizing from.\n   - In the developer console, configure **Manage distribution** so the app is available to the target workspace(s).\n   - If distribution/workspace availability is misconfigured, authorization can fail even if the URL is correct.\n4. OAuth settings:\n   - **Redirect URI:**\n     - `urn:ietf:wg:oauth:2.0:oob`\n   - Copy the **Client ID** and **Client Secret**.\n\n### Scopes (must match what you request)\n\nIn the Asana Developer Console, go to **OAuth → Permission scopes** and enable the scopes you plan to request.\n\nImportant rules:\n- The scopes you request in the authorize URL **must be a subset of** the scopes enabled in the console.\n- If you request a scope that is not enabled, you’ll get a `forbidden_scopes` error.\n\nRecommended “full task management” scope set:\n\n- `tasks:read` `tasks:write` `tasks:delete`\n- `projects:read` `projects:write`\n- `attachments:read` `attachments:write`\n- `custom_fields:read` `custom_fields:write`\n- `tags:read` `tags:write`\n- `task_custom_types:read`\n- `teams:read`\n- `users:read`\n- `workspaces:read`\n\n---\n\n## 2) Configure credentials locally\n\nSave your Asana OAuth client id/secret to a local file:\n\n```bash\nnode scripts/configure.mjs \\\n  --client-id \"YOUR_CLIENT_ID\" \\\n  --client-secret \"YOUR_CLIENT_SECRET\"\n```\n\nThis writes:\n- `~/.clawdbot/asana/credentials.json`\n\n(Alternative: you can set `ASANA_CLIENT_ID` and `ASANA_CLIENT_SECRET` as environment variables, but the credentials file is recommended for Clawdbot.)\n\n---\n\n## 3) Authorize (OOB) and save tokens\n\n### 3.1 Generate the authorize URL\n\n```bash\nnode scripts/oauth_oob.mjs authorize \\\n  --scope \"tasks:read tasks:write projects:read\"\n```\n\nOpen the printed URL in your browser, click **Allow**, then copy the code.\n\n### 3.2 Exchange the code"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7b69bxtkr2s9fv7wte391nan7zz874\",\n  \"slug\": \"asana\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1769396391460\n}"},{"path":"references/asana-endpoints.md","content":"# Asana endpoints (quick reference)\n\nAuth:\n- Authorize: `GET https://app.asana.com/-/oauth_authorize`\n- Token exchange / refresh: `POST https://app.asana.com/-/oauth_token`\n- Revoke: `POST https://app.asana.com/-/oauth_revoke`\n\nAPI:\n- Base: `https://app.asana.com/api/1.0`\n\nCommon:\n- `GET /users/me`\n- `GET /workspaces`\n- `GET /projects?workspace=<gid>`\n- `GET /tasks` (requires filters)\n- `GET /workspaces/{workspace_gid}/tasks/search` (advanced search; can be premium-only)\n- `POST /tasks`\n\nNotes:\n- OAuth scopes are required with OAuth apps (examples: `tasks:read`, `tasks:write`, `projects:read`)."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Integrate Asana with Clawdbot via the Asana REST API. Use when you need to list/search/create/update Asana tasks/projects/workspaces, or to set up Asana OAuth (authorization code grant) for a personal local-only integration (OOB/manual code paste). Skill: Asana Owner: k0nkupa Summary: Integrate Asana with Clawdbot via the Asana REST API. Use when you need to list/search/create/update Asana tasks/projects/workspaces, or to set up Asana OAuth (authorization code grant) for a personal local-only integration (OOB/manual code paste). Tags: latest:1.0.0 Version history: v1.0.0 | 2026-01-26T02:59:51.460Z | user - Updated skill. Archive index: Archive v1.0.0: 8 files,","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":900,"uniquenessScore":47,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T23:53:42.361Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}