[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FVCPSVFGVMR8JPVPYTFA2E":3,"skill-same:01M6FVCPSVFGVMR8JPVPYTFA2E":90},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":52,"install":53,"resources":65},"01M6FVCPSVFGVMR8JPVPYTFA2E","asana",null,"Manage Asana tasks, projects, briefs, status updates, custom fields, dependencies, attachments, events, and timelines via Personal Access Token (PAT).","kbarbel640-del\u002Fskills","kbarbel640-del","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F255315490?v=4","01M6CJPPQGCCESXMG3K7BBGQ5J","01M6CJPPX2PB2BCZERFVM2C2B3",1,"MIT","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fl-u-c-k-y\u002Fasana-agent-skill\u002FSKILL.md",[],[5,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],"status updates","briefs","via","events","token","dependencies","manage","pat","personal","projects","access","attachments","https","tasks","status","docs","2026-11-10 10:12:30",false,"---\nname: asana\ndescription: \"Manage Asana tasks, projects, briefs, status updates, custom fields, dependencies, attachments, events, and timelines via Personal Access Token (PAT).\"\nhomepage: https:\u002F\u002Fdevelopers.asana.com\u002Fdocs\u002Fpersonal-access-token\nuser-invocable: true\nmetadata: {\"openclaw\":{\"requires\":{\"env\":[\"ASANA_PAT\"]},\"primaryEnv\":\"ASANA_PAT\",\"homepage\":\"https:\u002F\u002Fdevelopers.asana.com\u002Fdocs\u002Fpersonal-access-token\"}}\n---\n\n# 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\n- Script: `{baseDir}\u002Fscripts\u002Fasana.mjs`\n- Auth: `ASANA_PAT` (preferred) or `ASANA_TOKEN`\n- Output: **JSON only** (stdout), suitable for agents and automation\n\n## Setup\n\n1. Create an Asana PAT in your Asana account (Developer Console is **not** required for PAT usage).\n2. Provide the token to OpenClaw\u002FClawdbot as `ASANA_PAT`.\n\n### Common injection patterns\n\n- Shell env (local testing):\n\n  `export ASANA_PAT=\"...\"`\n\n- OpenClaw config (recommended): set `skills.entries.asana.apiKey` (or `env.ASANA_PAT`) so the secret is injected only for the agent run.\n\n### Configure 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\n**Recommended (apiKey → ASANA_PAT):**\n\n```bash\nopenclaw config set skills.entries.asana.enabled true\nopenclaw config set skills.entries.asana.apiKey \"ASANA_PAT_HERE\"\n```\n\n`skills.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\n**Alternative (explicit env):**\n\n```bash\nopenclaw config set skills.entries.asana.enabled true\nopenclaw config set skills.entries.asana.env.ASANA_PAT \"ASANA_PAT_HERE\"\n```\n\n**Verify what is stored:**\n\n```bash\nopenclaw config get skills.entries.asana\nopenclaw config get skills.entries.asana.enabled\nopenclaw config get skills.entries.asana.apiKey\n```\n\n**Remove a stored token:**\n\n```bash\nopenclaw config unset skills.entries.asana.apiKey\n# or\nopenclaw config unset skills.entries.asana.env.ASANA_PAT\n```\n\n#### Important: 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\u002FapiKey` applies to host runs only.\n\nSet Docker env via:\n\n- `agents.defaults.sandbox.docker.env` (or per-agent `agents.list[].sandbox.docker.env`)\n- or bake the env into your sandbox image\n\n## First calls (sanity + discovery)\n\n- Who am I:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs me`\n\n- List workspaces:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs workspaces`\n\n- (Recommended) Set a default workspace once:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs set-default-workspace --workspace \u003Cworkspace_gid>`\n\n## ID resolution\n\nWhen the user provides names (project\u002Ftask\u002Fuser), resolve to GIDs using one of:\n\n- `typeahead --workspace \u003Cgid> --resource_type project|task|user --query \"...\"` (fast, best default)\n- `projects --workspace \u003Cgid> --all` (enumerate)\n- `users --workspace \u003Cgid> --all` (enumerate)\n\nAvoid guessing a GID when multiple matches exist.\n\n## Core: tasks\n\n### List tasks assigned to a user (personal productivity)\n\n`node {baseDir}\u002Fscripts\u002Fasana.mjs tasks-assigned --assignee me --workspace \u003Cworkspace_gid> --all`\n\n### List tasks in a project\n\n`node {baseDir}\u002Fscripts\u002Fasana.mjs tasks-in-project --project \u003Cproject_gid> --all`\n\n### Search 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\n`node {baseDir}\u002Fscripts\u002Fasana.mjs search-tasks --workspace \u003Cgid> --project \u003Cproject_gid> --text \"...\" --all`\n\nUseful filters:\n- `--assignee me|\u003Cgid|email>` (maps to `assignee.any`)\n- `--completed true|false`\n- `--created_at.after \u003Ciso>` \u002F `--modified_at.after \u003Ciso>`\n- `--due_on.before YYYY-MM-DD` \u002F `--due_at.before \u003Ciso>`\n- `--is_blocked true|false` \u002F `--is_blocking true|false`\n\n### Create \u002F update \u002F complete\n\n- Create:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs create-task --workspace \u003Cgid> --name \"...\" --projects \u003Cproject_gid> --assignee me`\n\n- Update:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs update-task \u003Ctask_gid> --name \"...\" --due_on 2026-02-01`\n\n- Complete:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs complete-task \u003Ctask_gid>`\n\n## Project manager workflows\n\nThis skill supports the workflows commonly expected from a PM in Asana:\n\n- Keep a **project brief** up to date (`upsert-project-brief`)\n- Write **status updates** (`create-status-update`)\n- Work with **timelines** (start\u002Fdue dates) and shift schedules safely\n- Use **custom fields** as first-class metadata\n- Interpret **blockers** and dependency graphs (`project-blockers`, `dependencies`, `dependents`)\n\n### Project brief\n\n- Read:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs project-brief \u003Cproject_gid>`\n\n- Upsert (create or update):\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs upsert-project-brief \u003Cproject_gid> --title \"Project brief\" --html_text \"\u003Cbody>...\u003C\u002Fbody>\"`\n\n### Status updates\n\n- Create:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs create-status-update --parent \u003Cproject_gid> --status_type on_track --text \"Weekly update...\"`\n\n- List:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs status-updates --parent \u003Cproject_gid> --all`\n\n### Sections and moving tasks\n\n- List sections:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs sections --project \u003Cproject_gid> --all`\n\n- Create section:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs create-section --project \u003Cproject_gid> --name \"Blocked\"`\n\n#### Add a task to a project\n\nCommand: `add-task-to-project`\n\nCalls `POST \u002Ftasks\u002F{task_gid}\u002FaddProject` and supports optional section placement and ordering.\n\nExamples:\n\n`node {baseDir}\u002Fscripts\u002Fasana.mjs add-task-to-project \u003Ctask_gid> --project \u003Cproject_gid>`\n\nWith section + ordering:\n\n`node {baseDir}\u002Fscripts\u002Fasana.mjs add-task-to-project \u003Ctask_gid> --project \u003Cproject_gid> --section \u003Csection_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\n#### Remove a task from a project\n\nCommand: `remove-task-from-project`\n\nCalls `POST \u002Ftasks\u002F{task_gid}\u002FremoveProject`.\n\nExample:\n\n`node {baseDir}\u002Fscripts\u002Fasana.mjs remove-task-from-project \u003Ctask_gid> --project \u003Cproject_gid>`\n\n## Custom fields\n\nCustom fields are critical for reliable PM automation.\n\n- List a project’s custom fields:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs project-custom-fields \u003Cproject_gid> --all`\n\n- Read a custom field definition:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs custom-field \u003Ccustom_field_gid>`\n\n- Set task custom fields on create\u002Fupdate:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs update-task \u003Ctask_gid> --custom_fields '{\"\u003Ccustom_field_gid>\":\"\u003Cvalue>\"}'`\n\nNotes:\n- For enums, the value is typically the enum option GID.\n- For numbers, send a JSON number.\n\n## Rich text, mentions, and reliability\n\nAsana rich text fields are **XML-valid HTML fragments** wrapped in a `\u003Cbody>` root element. The API rejects invalid XML or unsupported tags.\n\nKey points:\n- Use `html_notes` for task descriptions.\n- Use `html_text` for comments\u002Fstories and status updates.\n- Avoid unsupported tags like `\u003Cp>` and `\u003Cbr>`; prefer literal newlines (`\\n`) and `\u003Chr\u002F>` separators.\n- For mentions\u002Flinks, use `\u003Ca data-asana-gid=\"...\">\u003C\u002Fa>` (or a self-closing `\u003Ca ...\u002F>`).\n\n### Mention 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- Assign the user first, then post the comment, OR\n- Add the user as a follower, wait a few seconds, then post the comment\n\nThis skill supports the “add follower + wait” pattern:\n\n`node {baseDir}\u002Fscripts\u002Fasana.mjs comment \u003Ctask_gid> --html_text \"\u003Cbody>Hi \u003Ca data-asana-gid=\\\"\u003Cuser_gid>\\\"\u002F>...\u003C\u002Fbody>\" --ensure_followers \u003Cuser_gid> --wait_ms 2500`\n\nPlain text comments (`--text`) do **not** create real @-mentions via the API; they remain plain text.\n\n## Attachments, uploads, and inline images\n\n- Upload a file attachment to a task:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs upload-attachment --parent \u003Ctask_gid> --file \u002Fpath\u002Fto\u002Ffile.png`\n\n- Embed an existing image attachment inline (tasks + project briefs only):\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs append-inline-image --attachment \u003Cattachment_gid> --task \u003Ctask_gid>`\n\n## Activity feed \u002F “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- `events --resource \u003Cgid>` to pull incremental changes on a project (or a user's \"My Tasks\" project)\n- The command stores a sync token locally so subsequent runs fetch only changes\n\n## Timeline shifting\n\n- Shift one task (optionally include subtasks):\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs shift-task-dates \u003Ctask_gid> --delta_days 7 --dry_run true`\n\n- Shift an entire project’s tasks:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs shift-project-tasks --project \u003Cproject_gid> --delta_days -3 --dry_run true --all`\n\nRun with `--dry_run true` first, then re-run with `--dry_run false`.\n\n## Out of scope\n\n- Portfolios (premium) are intentionally omitted.\n- “Bot personality” is not embedded here; configure behavior in your agent prompt.\n","# 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\n- Script: `{baseDir}\u002Fscripts\u002Fasana.mjs`\n- Auth: `ASANA_PAT` (preferred) or `ASANA_TOKEN`\n- Output: **JSON only** (stdout), suitable for agents and automation\n\n## Setup\n\n1. Create an Asana PAT in your Asana account (Developer Console is **not** required for PAT usage).\n2. Provide the token to OpenClaw\u002FClawdbot as `ASANA_PAT`.\n\n### Common injection patterns\n\n- Shell env (local testing):\n\n  `export ASANA_PAT=\"...\"`\n\n- OpenClaw config (recommended): set `skills.entries.asana.apiKey` (or `env.ASANA_PAT`) so the secret is injected only for the agent run.\n\n### Configure 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\n**Recommended (apiKey → ASANA_PAT):**\n\n```bash\nopenclaw config set skills.entries.asana.enabled true\nopenclaw config set skills.entries.asana.apiKey \"ASANA_PAT_HERE\"\n```\n\n`skills.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\n**Alternative (explicit env):**\n\n```bash\nopenclaw config set skills.entries.asana.enabled true\nopenclaw config set skills.entries.asana.env.ASANA_PAT \"ASANA_PAT_HERE\"\n```\n\n**Verify what is stored:**\n\n```bash\nopenclaw config get skills.entries.asana\nopenclaw config get skills.entries.asana.enabled\nopenclaw config get skills.entries.asana.apiKey\n```\n\n**Remove a stored token:**\n\n```bash\nopenclaw config unset skills.entries.asana.apiKey\n# or\nopenclaw config unset skills.entries.asana.env.ASANA_PAT\n```\n\n#### Important: 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\u002FapiKey` applies to host runs only.\n\nSet Docker env via:\n\n- `agents.defaults.sandbox.docker.env` (or per-agent `agents.list[].sandbox.docker.env`)\n- or bake the env into your sandbox image\n\n## First calls (sanity + discovery)\n\n- Who am I:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs me`\n\n- List workspaces:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs workspaces`\n\n- (Recommended) Set a default workspace once:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs set-default-workspace --workspace \u003Cworkspace_gid>`\n\n## ID resolution\n\nWhen the user provides names (project\u002Ftask\u002Fuser), resolve to GIDs using one of:\n\n- `typeahead --workspace \u003Cgid> --resource_type project|task|user --query \"...\"` (fast, best default)\n- `projects --workspace \u003Cgid> --all` (enumerate)\n- `users --workspace \u003Cgid> --all` (enumerate)\n\nAvoid guessing a GID when multiple matches exist.\n\n## Core: tasks\n\n### List tasks assigned to a user (personal productivity)\n\n`node {baseDir}\u002Fscripts\u002Fasana.mjs tasks-assigned --assignee me --workspace \u003Cworkspace_gid> --all`\n\n### List tasks in a project\n\n`node {baseDir}\u002Fscripts\u002Fasana.mjs tasks-in-project --project \u003Cproject_gid> --all`\n\n### Search 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\n`node {baseDir}\u002Fscripts\u002Fasana.mjs search-tasks --workspace \u003Cgid> --project \u003Cproject_gid> --text \"...\" --all`\n\nUseful filters:\n- `--assignee me|\u003Cgid|email>` (maps to `assignee.any`)\n- `--completed true|false`\n- `--created_at.after \u003Ciso>` \u002F `--modified_at.after \u003Ciso>`\n- `--due_on.before YYYY-MM-DD` \u002F `--due_at.before \u003Ciso>`\n- `--is_blocked true|false` \u002F `--is_blocking true|false`\n\n### Create \u002F update \u002F complete\n\n- Create:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs create-task --workspace \u003Cgid> --name \"...\" --projects \u003Cproject_gid> --assignee me`\n\n- Update:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs update-task \u003Ctask_gid> --name \"...\" --due_on 2026-02-01`\n\n- Complete:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs complete-task \u003Ctask_gid>`\n\n## Project manager workflows\n\nThis skill supports the workflows commonly expected from a PM in Asana:\n\n- Keep a **project brief** up to date (`upsert-project-brief`)\n- Write **status updates** (`create-status-update`)\n- Work with **timelines** (start\u002Fdue dates) and shift schedules safely\n- Use **custom fields** as first-class metadata\n- Interpret **blockers** and dependency graphs (`project-blockers`, `dependencies`, `dependents`)\n\n### Project brief\n\n- Read:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs project-brief \u003Cproject_gid>`\n\n- Upsert (create or update):\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs upsert-project-brief \u003Cproject_gid> --title \"Project brief\" --html_text \"\u003Cbody>...\u003C\u002Fbody>\"`\n\n### Status updates\n\n- Create:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs create-status-update --parent \u003Cproject_gid> --status_type on_track --text \"Weekly update...\"`\n\n- List:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs status-updates --parent \u003Cproject_gid> --all`\n\n### Sections and moving tasks\n\n- List sections:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs sections --project \u003Cproject_gid> --all`\n\n- Create section:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs create-section --project \u003Cproject_gid> --name \"Blocked\"`\n\n#### Add a task to a project\n\nCommand: `add-task-to-project`\n\nCalls `POST \u002Ftasks\u002F{task_gid}\u002FaddProject` and supports optional section placement and ordering.\n\nExamples:\n\n`node {baseDir}\u002Fscripts\u002Fasana.mjs add-task-to-project \u003Ctask_gid> --project \u003Cproject_gid>`\n\nWith section + ordering:\n\n`node {baseDir}\u002Fscripts\u002Fasana.mjs add-task-to-project \u003Ctask_gid> --project \u003Cproject_gid> --section \u003Csection_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\n#### Remove a task from a project\n\nCommand: `remove-task-from-project`\n\nCalls `POST \u002Ftasks\u002F{task_gid}\u002FremoveProject`.\n\nExample:\n\n`node {baseDir}\u002Fscripts\u002Fasana.mjs remove-task-from-project \u003Ctask_gid> --project \u003Cproject_gid>`\n\n## Custom fields\n\nCustom fields are critical for reliable PM automation.\n\n- List a project’s custom fields:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs project-custom-fields \u003Cproject_gid> --all`\n\n- Read a custom field definition:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs custom-field \u003Ccustom_field_gid>`\n\n- Set task custom fields on create\u002Fupdate:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs update-task \u003Ctask_gid> --custom_fields '{\"\u003Ccustom_field_gid>\":\"\u003Cvalue>\"}'`\n\nNotes:\n- For enums, the value is typically the enum option GID.\n- For numbers, send a JSON number.\n\n## Rich text, mentions, and reliability\n\nAsana rich text fields are **XML-valid HTML fragments** wrapped in a `\u003Cbody>` root element. The API rejects invalid XML or unsupported tags.\n\nKey points:\n- Use `html_notes` for task descriptions.\n- Use `html_text` for comments\u002Fstories and status updates.\n- Avoid unsupported tags like `\u003Cp>` and `\u003Cbr>`; prefer literal newlines (`\\n`) and `\u003Chr\u002F>` separators.\n- For mentions\u002Flinks, use `\u003Ca data-asana-gid=\"...\">\u003C\u002Fa>` (or a self-closing `\u003Ca ...\u002F>`).\n\n### Mention 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- Assign the user first, then post the comment, OR\n- Add the user as a follower, wait a few seconds, then post the comment\n\nThis skill supports the “add follower + wait” pattern:\n\n`node {baseDir}\u002Fscripts\u002Fasana.mjs comment \u003Ctask_gid> --html_text \"\u003Cbody>Hi \u003Ca data-asana-gid=\\\"\u003Cuser_gid>\\\"\u002F>...\u003C\u002Fbody>\" --ensure_followers \u003Cuser_gid> --wait_ms 2500`\n\nPlain text comments (`--text`) do **not** create real @-mentions via the API; they remain plain text.\n\n## Attachments, uploads, and inline images\n\n- Upload a file attachment to a task:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs upload-attachment --parent \u003Ctask_gid> --file \u002Fpath\u002Fto\u002Ffile.png`\n\n- Embed an existing image attachment inline (tasks + project briefs only):\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs append-inline-image --attachment \u003Cattachment_gid> --task \u003Ctask_gid>`\n\n## Activity feed \u002F “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- `events --resource \u003Cgid>` to pull incremental changes on a project (or a user's \"My Tasks\" project)\n- The command stores a sync token locally so subsequent runs fetch only changes\n\n## Timeline shifting\n\n- Shift one task (optionally include subtasks):\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs shift-task-dates \u003Ctask_gid> --delta_days 7 --dry_run true`\n\n- Shift an entire project’s tasks:\n\n  `node {baseDir}\u002Fscripts\u002Fasana.mjs shift-project-tasks --project \u003Cproject_gid> --delta_days -3 --dry_run true --all`\n\nRun with `--dry_run true` first, then re-run with `--dry_run false`.\n\n## Out of scope\n\n- Portfolios (premium) are intentionally omitted.\n- “Bot personality” is not embedded here; configure behavior in your agent prompt.\n",{"name":5,"homepage":39,"metadata":40,"description":7,"user-invocable":45},"https:\u002F\u002Fdevelopers.asana.com\u002Fdocs\u002Fpersonal-access-token",{"openclaw":41},{"homepage":39,"requires":42,"primaryEnv":44},{"env":43},[44],"ASANA_PAT",true,"main","e7e336ac628c3e3bd771aff1aaa469c93778f94a","skills\u002Fl-u-c-k-y\u002Fasana-agent-skill",0,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del","2026-08-23 22:39:37",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":45},[55,58,61],{"tool":56,"command":57},"npx","npx skills add kbarbel640-del\u002Fskills --skill asana",{"tool":59,"command":60},"bunx","bunx skills add kbarbel640-del\u002Fskills --skill asana",{"tool":62,"command":63},"pnpm","pnpm dlx skills add kbarbel640-del\u002Fskills --skill asana","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fl-u-c-k-y\u002Fasana-agent-skill\u002FSKILL.md",[66,72,76,80,84],{"path":67,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":70,"sourceHtmlUrl":71},"_meta.json","REFERENCE","参考文档",277,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fl-u-c-k-y\u002Fasana-agent-skill\u002F_meta.json",{"path":73,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":74,"sourceHtmlUrl":75},"AGENTS.md",4254,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fl-u-c-k-y\u002Fasana-agent-skill\u002FAGENTS.md",{"path":77,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":78,"sourceHtmlUrl":79},"README.md",6145,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fl-u-c-k-y\u002Fasana-agent-skill\u002FREADME.md",{"path":81,"resourceType":68,"resourceTypeDesc":69,"sizeBytes":82,"sourceHtmlUrl":83},"references\u002FREFERENCE.md",2647,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fl-u-c-k-y\u002Fasana-agent-skill\u002Freferences\u002FREFERENCE.md",{"path":85,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":88,"sourceHtmlUrl":89},"scripts\u002Fasana.mjs","SCRIPT","脚本",74109,"https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fl-u-c-k-y\u002Fasana-agent-skill\u002Fscripts\u002Fasana.mjs",[91,121,150,170,176,195],{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":102,"publishedAt":34},"01M6G8J55967D6281ACMKAKTEQ","crowd-prompting","A marketplace where AI agents improve prompts, system instructions, tool descriptions, and other text-based content with domain expertise from real-world operations — and earn tokens for valuable contributions.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzzadrian\u002Fcrowd-prompting\u002FSKILL.md",[97],{"categoryNo":98,"categoryName":99,"taxonomyType":100,"taxonomyTypeDesc":101},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,30,119,120],"crowd prompting","prompting","api","with","tokens","domain","world","prompts","operations","instructions","text","tool","system","improve","productivity","marketplace","content","ai agents",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":132,"publishedAt":34},"01M6G8J0PKPAYVET6BWE8W4C26","dilemm-ai","Compete in DilemmAI, the prisoner's dilemma AI arena at dilemm.ai. Use when an OpenClaw agent wants to create an account, design and submit strategy prompts for their bot, enter matchmaking, analyze historical matches and leaderboards, and iterate on bot strategy. Requires headless browser automation (no API available yet).","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzyori\u002Fdilemm-ai\u002FSKILL.md",[127],{"categoryNo":128,"categoryName":129,"taxonomyType":130,"taxonomyTypeDesc":131},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[133,105,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,110,149],"dilemm ai","arena","analyze","browser","openclaw agent","create","automation","browser automation","bot","openclaw","design","strategy","headless","compete","submit","matchmaking","use",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":159,"publishedAt":34},"01M6G8HWAF3K9SW7NP3Z83CPJ6","arxiv-paper-reviews","Interact with arXiv Crawler API to fetch papers, read reviews, and submit comments. Use when working with arXiv papers, fetching paper lists by date\u002Fcategory\u002Finterest, viewing paper details with comments, or submitting paper reviews via API at http:\u002F\u002F150.158.152.82:8000.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Fweak-accept\u002FSKILL.md",[156],{"categoryNo":157,"categoryName":158,"taxonomyType":130,"taxonomyTypeDesc":131},"01JBSEEDCAT000000000000021","资料检索与研究",[160,161,162,163,164,165,166,106,167,147,149,168,105,169,20],"arxiv paper reviews","reviews","arxiv","paper","crawler","papers","comments","fetch","read","http",{"skillNo":171,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":175,"publishedAt":34},"01M6G8HQJ7N7WMY6YV7D7SSJ16","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzxrys\u002Farxiv-paper-reviews\u002FSKILL.md",[174],{"categoryNo":157,"categoryName":158,"taxonomyType":130,"taxonomyTypeDesc":131},[163,162,161,160,20,165,166,106,164,147,149,167,168,105,169],{"skillNo":177,"name":178,"nameZh":6,"description":179,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":180,"categories":181,"keywords":182,"publishedAt":34},"01M6G8HM95Y64JNVFC2HN4E2BG","git-summary","Get a quick summary of the current Git repository including status, recent commits, branches, and contributors.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fzweack\u002Fgit-summary\u002FSKILL.md",[],[183,184,185,186,187,188,32,189,190,191,192,193,194],"git","summary","git summary","commits","repository","win32","linux","contributors","true","quick","get","branches",{"skillNo":196,"name":197,"nameZh":6,"description":198,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":199,"categories":200,"keywords":205,"publishedAt":34},"01M6G8HGEGF05CNEJCGVYFSC4R","agent-constitution","Interact with AgentConstitution governance contracts on Base Sepolia. Check compliance, read rules, log actions, query governance state.","https:\u002F\u002Fgithub.com\u002Fkbarbel640-del\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fztsalexey\u002Fagent-constitution\u002FSKILL.md",[201,202],{"categoryNo":128,"categoryName":129,"taxonomyType":130,"taxonomyTypeDesc":131},{"categoryNo":203,"categoryName":204,"taxonomyType":100,"taxonomyTypeDesc":101},"01JBSEEDCAT000000000000037","律师与法务",[206,207,208,209,106,210,211,46,212,168,213,214,27,215,216,30,217,218,219],"agent constitution","constitution","contracts","tree","query","base","log","check","Rules","compliance","actions","state","governance","github"]