Asana (PAT)技能使用说明
Asana
此技能提供了一个无依赖的Node.js命令行界面,通过使用个人访问令牌来调用Asana REST API (v1)
- 。
脚本: - {baseDir}/scripts/asana.mjs
认证:ASANA_PAT(首选)或 - ASANA_TOKEN输出:仅限JSON
(标准输出),适用于代理和自动化
- 设置在您的Asana账户中创建一个Asana个人访问令牌(使用个人访问令牌无需
- 开发者控制台)。
将该令牌提供给OpenClaw/Clawdbot,作为ASANA_PAT
。
-
常见的注入模式

Shell环境变量(本地测试): -
OpenClaw 配置(推荐):设置
skills.entries.asana.apiKey(或env.ASANA_PAT),这样密钥仅在代理运行时注入。
通过 OpenClaw CLI 配置(推荐)
这是设置 PAT 最安全的方式,因为它能将密钥排除在提示和临时 shell 历史记录之外。
推荐方式(apiKey → ASANA_PAT):
openclaw config set skills.entries.asana.enabled true
openclaw config set skills.entries.asana.apiKey "ASANA_PAT_HERE"
skills.entries.asana.apiKey是一个便捷字段:对于声明了metadata.openclaw.primaryEnv的技能,OpenClaw 会在代理运行时将apiKey注入到该环境变量中(此技能的主环境变量是ASANA_PAT)。
替代方案(显式环境变量):
openclaw config set skills.entries.asana.enabled true
openclaw config set skills.entries.asana.env.ASANA_PAT "ASANA_PAT_HERE"
验证存储的内容:
openclaw config get skills.entries.asana
openclaw config get skills.entries.asana.enabled
openclaw config get skills.entries.asana.apiKey
移除存储的令牌:
openclaw config unset skills.entries.asana.apiKey
# or
openclaw config unset skills.entries.asana.env.ASANA_PAT
重要提示:沙盒化运行
当会话在沙盒中运行时,技能进程会在 Docker 内部运行,并且不继承主机环境。在这种情况下,skills.entries.*.env/apiKey仅适用于主机运行。
通过以下方式设置Docker环境变量:
agents.defaults.sandbox.docker.env(或按代理设置agents.list[].sandbox.docker.env)- 或者将环境变量构建到你的沙箱镜像中
首次调用(完整性检查 + 发现)
-
我是谁:
node {baseDir}/scripts/asana.mjs me -
列出工作空间:
node {baseDir}/scripts/asana.mjs workspaces -
(推荐)设置一次默认工作空间:
node {baseDir}/scripts/asana.mjs set-default-workspace --workspace <workspace_gid>
ID解析
当用户提供名称(项目/任务/用户)时,使用以下方法之一解析为GID:
typeahead --workspace <gid> --resource_type project|task|user --query "..."(快速,最佳默认)项目 --工作区 <gid> --全部(枚举)用户 --工作区 <gid> --全部(枚举)
当存在多个匹配项时,避免猜测 GID。
核心:任务
列出分配给用户的任务(个人效率)
node {baseDir}/scripts/asana.mjs 任务-分配 --分配对象 我 --工作区 <工作区_gid> --全部
列出项目中的任务
node {baseDir}/scripts/asana.mjs 项目中的任务 --项目 <项目_gid> --全部
搜索任务(高级搜索 API)
规范原语:搜索-任务(支持多种过滤器;优于添加狭窄的“搜索助手”命令)。
单行命令示例(在项目内搜索):
node {baseDir}/scripts/asana.mjs 搜索-任务 --工作区 <gid> --项目 <项目_gid> --文本 "..." --全部
有用的过滤器:
--分配对象 我|<gid|邮箱>(映射至assignee.any)--completed true|false--created_at.after <iso>/--modified_at.after <iso>--due_on.before YYYY-MM-DD/--due_at.before <iso>--is_blocked true|false/--is_blocking true|false
创建 / 更新 / 完成
-
创建:
node {baseDir}/scripts/asana.mjs create-task --workspace <gid> --name "..." --projects <project_gid> --assignee me -
更新:
node {baseDir}/scripts/asana.mjs update-task <task_gid> --name "..." --due_on 2026-02-01 -
完成:
node {baseDir}/scripts/asana.mjs complete-task <task_gid>
项目经理工作流程
此技能支持项目经理在Asana中常用的工作流程:
- 保持项目简报最新(
更新/插入项目简报) - 撰写状态更新(
创建状态更新) - 安全地处理时间线(开始/截止日期)和班次安排
- 将自定义字段作为一等元数据使用
- 解读阻碍因素和依赖关系图(
项目阻碍因素、依赖项、被依赖项)
项目简报
-
阅读:
node {baseDir}/scripts/asana.mjs project-brief <project_gid> -
更新或插入(创建或更新):
node {baseDir}/scripts/asana.mjs upsert-project-brief <project_gid> --title "项目简报" --html_text "<body>...</body>"
状态更新
-
创建:
node {baseDir}/scripts/asana.mjs create-status-update --parent <project_gid> --status_type on_track --text "每周更新..." -
列表:
node {baseDir}/scripts/asana.mjs status-updates --parent <project_gid> --all
分区与移动任务
-
列出分区:
node {baseDir}/scripts/asana.mjs sections --project <project_gid> --all -
创建分区:
node {baseDir}/scripts/asana.mjs create-section --project <project_gid> --name "受阻"
向项目添加任务
命令:add-task-to-project
调用POST /tasks/{task_gid}/addProject并支持可选的分区放置和排序。
示例:
node {baseDir}/scripts/asana.mjs add-task-to-project <task_gid> --project <project_gid>
包含分区及排序:
node {baseDir}/scripts/asana.mjs add-task-to-project <task_gid> --project <project_gid> --section <section_gid> --insert_before null --insert_after null
(--section、--insert_before和--insert_after是可选的;当提供时,它们会被传递到请求体中。)
从项目中移除任务
命令:remove-task-from-project
调用POST /tasks/{task_gid}/removeProject。
示例:
node {baseDir}/scripts/asana.mjs remove-task-from-project <task_gid> --project <project_gid>
自定义字段
自定义字段对于可靠的PM自动化至关重要。
-
列出项目的自定义字段:
node {baseDir}/scripts/asana.mjs project-custom-fields <project_gid> --all -
读取自定义字段定义:
node {baseDir}/scripts/asana.mjs custom-field <custom_field_gid> -
在创建/更新时设置任务自定义字段:
node {baseDir}/scripts/asana.mjs update-task <task_gid> --custom_fields '{"<custom_field_gid>":"<value>"}'
注意事项:
- 对于枚举类型,值通常是枚举选项的GID。
- 对于数字类型,发送JSON数字。
富文本、提及和可靠性
Asana的富文本字段是符合XML规范的HTML片段包裹在<body>根元素内。API会拒绝无效的XML或不支持的标签。
关键点:
- 使用
html_notes用于任务描述。 - 使用
html_text用于评论/故事和状态更新。 - 避免使用不支持的标签,如
<p>和<br>;更推荐使用字面换行符(\n)和<hr/>分隔符。 - 对于提及/链接,使用
<a data-asana-gid="..."></a>(或自闭合的<a .../>)。
提及通知
创建提及链接并不能保证通知的送达,如果用户尚未被分配或未关注。
为了可靠地发送提醒,请执行以下操作之一:
- 先分配用户,再发布评论,或者
- 添加用户为关注者,等待几秒钟,然后发布评论
此技能支持“添加关注者 + 等待”模式:
node {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
纯文本评论 (--text) 通过 API不会创建真正的 @ 提及;它们会保持为纯文本。
附件、上传和行内图片
-
向任务上传文件附件:
node {baseDir}/scripts/asana.mjs upload-attachment --parent <task_gid> --file /path/to/file.png -
将现有图片附件嵌入为行内图片(仅限任务和项目简介):
node {baseDir}/scripts/asana.mjs append-inline-image --attachment <attachment_gid> --task <task_gid>
活动动态 / “类似收件箱”的工作流
Asana 并未为所有通知提供统一的“收件箱”API。最接近的稳定底层接口是事件端点,其作用范围限定于特定资源(项目、任务等)。
使用:
events --resource <gid>来获取项目(或用户的“我的任务”项目)的增量变更。- 该命令会在本地存储同步令牌,确保后续运行仅获取变更内容。
时间线调整
-
调整单个任务(可选择包含子任务):
node {baseDir}/scripts/asana.mjs shift-task-dates <task_gid> --delta_days 7 --dry_run true -
调整整个项目的任务:
node {baseDir}/scripts/asana.mjs shift-project-tasks --project <project_gid> --delta_days -3 --dry_run true --all
先使用--dry_run true运行,然后使用--dry_run false重新运行。
超出范围
- 投资组合(高级功能)已特意省略。
- 此处未嵌入“机器人个性”;请在您的代理提示中配置行为。


微信扫一扫,打赏作者吧~