Todo
Todo 是自然语言适配层。任务数据保存在 .agent-tasks/tasks/*.md,确定性读写全部交给本 Skill 自带的 Node CLI。
第一性原则:状态服务于用户的时间主权
Todo 的目标不是让任务机械地穿过一组状态,而是帮助用户从持续盯守、重复确认和不可预期的等待中释放出来,同时保留对成本、进度和启动时机的掌控。
执行任何状态变更前,先以终为始地确认:
- 用户最终想获得的结果和工作状态是什么,而不只是当前说出的流程动作。
- 当前状态能为用户减少什么负担,提供什么新的确定性。
- 接下来是否存在昂贵的时间、注意力、额度或外部副作用;用户是否已经看见并接受。
- 是否存在更便宜、更快、同样能推进最终目标的路径。
- 当前动作是在推进用户的终局,还是只是在完成 Skill 自己的流程。
决策优先级固定为:
用户终局 → 时间与注意力 → 成本与风险透明 → 用户掌控点 → 最小流程 → 工具
流程、状态和工具都只是手段。一旦它们与用户希望“减少等待、释放注意力、把控整体进度”的核心诉求冲突,必须调整手段,不能以“已经严格执行流程”为完成依据。
硬约束
- 禁止直接编辑任务文件、YAML、
index.md或归档目录。 - 新增、修改、查询、移动、归档和正文更新都必须调用 CLI。
- 未明确指定范围时始终使用全局
~/.agent-tasks/,即使当前位于 Git 仓库。 - 只有用户明确说“当前项目”或提供项目路径时才使用项目级目录。
- 用户只要求记录、查看或修改任务时,不得执行任务本身。
list只查询,不调研、不实现、不创建额外上下文文件。index.md是生成视图,tasks/*.md是唯一数据源。
CLI 调用
Skill 内调用:
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" <command> [options]
如果宿主没有注入 CLAUDE_SKILL_DIR,使用当前 SKILL.md 所在目录的绝对路径。不要假设系统已经存在全局 todo 命令。
人工安装全局命令、依赖检查和 Web 启动方法见 references/setup-guide.md。
作用域
| 用户表达 | CLI 参数 | 存储位置 |
|---|---|---|
| “添加待办”“全局待办”或未说明 | 无 | ~/.agent-tasks/ |
| “当前项目待办” | --current-project |
{当前 git-root}/.agent-tasks/ |
| “某项目待办”并提供路径 | --project <path> |
{指定 git-root}/.agent-tasks/ |
明确项目无法解析时报告错误,不静默写入全局。
意图映射
新增任务
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" add "<标题>" \
--status idea \
--json
添加当前项目任务时追加 --current-project。添加指定项目任务时追加 --project <git-root>。
创建后向用户返回:
task_id- 标题和状态
- 实际文件路径
查询任务
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" list
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" list --status canDurable
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" show <TSK-ID>
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" stats --format yaml
修改 YAML
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" set <TSK-ID> \
--project-name "<项目名>" \
--workspace "<路径>"
Reference 使用逗号分隔:
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" set <TSK-ID> \
--references "references/设计.md,OBA-w8s3k7p2"
修改 Markdown 章节
Skill 更新上下文时使用标准输入,避免 shell 引号破坏正文:
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" section set <TSK-ID> "目标"
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" section append <TSK-ID> "关键决定"
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" section show <TSK-ID> "当前进度"
将正文通过标准输入传入。set 替换指定二级章节,append 保留旧内容后追加;两者不得影响其他章节。
修改状态
常规状态流:
idea → shaping → canDurable → doing → done
↘ waitingHuman ↗
waitingHuman 是例外分支,不是每个阶段后的默认步骤。状态可以按真实进展前后调整,不强制线性迁移。
| 状态 | 含义 |
|---|---|
idea |
只有想法,尚未明确执行目标 |
shaping |
正在补齐目标、最终产物或权限边界 |
canDurable |
已满足无人值守执行条件,但尚未启动 |
doing |
正在持续执行;中间文档、报告、决策与普通失败不改变此状态;已获得的 Durable 标记继续保留 |
waitingHuman |
最终可回归产物已经就绪,或遇到必须由用户提供新权限/关键输入的真实阻塞;Durable 标记继续保留 |
done |
自动验收已通过,并且不需要额外人工回归;或最终人工回归已确认;Durable 标记作为历史能力证据保留 |
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" status <TSK-ID> shaping
进入 canDurable 必须记录判断依据:
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" status <TSK-ID> canDurable \
--basis human-confirmed
合法依据:
poc-passedhuman-confirmedai-assessed
durable_basis 是任务的长程能力标记,不是临时状态附属字段。任务从 canDurable 进入 doing、waitingHuman 或 done 时必须保留;只有退回 idea / shaping 才自动移除。
Durable 准备与执行授权
状态服务于用户安排时间,不能由 Agent 把“准备好”擅自解释成“立刻开工”:
| 用户意图 | 应做什么 | 最终状态 |
|---|---|---|
| “进入 Durable 状态”“把它变成可 Durable”“准备成 Durable” | 补齐目标、权限、最终验收与执行预估;达到条件后停止 | canDurable |
| “开始 Durable”“执行这个 Durable”“今晚跑起来” | 在已经满足 Durable 条件后启动长程执行 | doing |
| 同时明确要求“准备好并立即执行” | 先完成准备度检查,再开始执行 | doing |
硬约束:
- 进入
canDurable后默认停止。 不得紧接着自动改为doing,也不得开始实现、POC 或浏览器回归。 - 执行必须单独获得授权。 用户提供账号、凭据、生产环境权限或技术方案,只解决执行条件,不等于授权立即启动。
- 进入
canDurable前给出执行预估。 在任务正文记录## Durable 执行预估,至少包含预计耗时范围、主要阶段、最大不确定性和可能需要人工处理的最终节点。 - 状态反馈必须说清是否已启动。 例如:“已进入
canDurable,尚未执行;预计无人值守运行 8–12 小时。”
Durable 判断
canDurable 表示任务已经适合用户离线、夜间或不值守时持续执行。判断重点不是“文档写得是否足够多”,而是:
- 最终目标和范围已经稳定。
- 用户最终要回归的产物类型、入口和验收动作已经提前约定。
- Agent 具备独立完成任务所需的环境、能力和权限。
- 普通实现选择存在安全默认值,失败时存在重试或回退路径。
- 当前没有已知的高风险授权、关键凭据或产品方向选择阻塞执行。
满足以上条件即可进入 canDurable:
- 用户已认可最终验收契约:使用
human-confirmed。 - 可执行 POC 已证明关键路径:使用
poc-passed。 - 用户不在场,但最终产物、权限和回退路径都明确:使用
ai-assessed。 - 只有缺失信息会明显改变最终结果或导致任务根本无法启动时,才保持
shaping。
POC 只用于消除真正影响长程执行的技术不确定性,不得把“邀请用户参与 POC”变成 Durable 的固定前置步骤。
POC 时间成本与确认门
POC 是 shaping 内的可选验证活动,不是进入 Durable 的默认动作。POC 可能消耗大量时间、调用额度并产生真实环境副作用,因此不得由 Agent 自行启动。
启动 POC 前必须先向用户展示一份简短确认信息:
- 为什么需要:它要消除哪一个阻止进入
canDurable的关键不确定性。 - 预计耗时:给出区间,并标明主要耗时来自哪里。
- 验证边界:本次会做什么、明确不做什么,以及停止条件。
- 环境与副作用:是否登录真实账号、创建数据、发送消息、占用远端设备或修改外部状态。
- 替代路径:说明跳过 POC 后能否用
human-confirmed或ai-assessed进入canDurable,以及可靠性差异。
随后必须得到用户对本次 POC 的明确确认,例如“开始 POC”或“按这个时间预算执行”。以下内容都不构成 POC 授权:
- 用户只说希望任务进入 Durable;
- 用户提供了凭据或生产账号;
- 用户同意最终目标或验收标准;
- Agent 判断 POC 更稳妥。
POC 执行规则:
- 未确认时保持
shaping,只完善任务上下文,不执行 POC。 - 选择能消除关键不确定性的最小闭环,先使用便宜、只读、可逆的证据。
- 到达预估上限、验证范围扩大或出现新的外部副作用时,停止并重新给出预估,不能静默延长。
- POC 通过后可以使用
poc-passed进入canDurable,但仍然停止;只有用户另行要求启动,才进入doing。 - 在任务正文使用
## POC 计划和## POC 结果记录预算、停止条件与结论,避免后续 Agent 重复昂贵验证。
无人值守执行与人工等待阈值
硬约束
- 中间文档不设人工门。 需求文档、研究报告、设计稿说明、决策矩阵、阶段总结、日志和其他辅助材料完成后,保存为 Reference 并继续执行。
- 阶段结束不等于暂停。 只要下一阶段仍在既定目标、权限和验收契约内,保持
doing并自动继续。 - 普通问题不等待。 可逆实现选择、低风险分歧、依赖故障、测试失败和工具切换由 Agent 诊断、记录、重试或采用安全替代方案。
- 文档类任务默认自动完成。 若用户明确要求的最终产物就是文档,完成结构、链接、事实与格式检查后直接
done,提供可点击文件;除非用户明确要求逐段审阅,否则不进入waitingHuman。 - 不得为了流程完整而制造人工检查点。 “请确认继续下一阶段”“请阅读长报告后验收”不属于有效阻塞。
只有以下情况可以进入 waitingHuman
- 全部实现与自动验证已经完成,最终产物必须由人体验才能判断,而且已提供可直接回归的入口。
- 继续执行需要用户授予新的高风险权限、提供缺失凭据,或选择会明显改变最终产品结果的方向。
- 已耗尽安全的诊断、重试和替代路径,外部状态不变化就无法继续。
如果只是希望用户“有空看看”,不进入 waitingHuman;保持 doing 继续工作,或在自动完成后设为 done。
最终验收契约
Durable 任务在开始前应在正文记录 ## 最终验收,至少说明:
- 最终产物是什么;
- 用户从哪里进入;
- 用户需要执行的最短回归动作;
- Agent 会先完成哪些自动验证;
- 哪些情况才算失败。
按产物类型选择回归入口:
- 网页/应用:部署可点击 URL;无法部署时提供一条启动命令、固定本地 URL 和 3–5 步回归路径。
- E2E:保存真实点击步骤、自动化结果、录屏视频和视频报告;用户主要看视频回归,不要求重跑整套过程。
- Skill:提供可直接复制的触发提示词、预期行为和最小测试输入;用户通过实际调用 Skill 验收。
- CLI/API:提供可复制命令或请求、预期输出和机器可读测试结果。
- 文档/研究:提供可点击最终文件和自动检查结果,任务直接完成,不把阅读长文设为等待门。
完整模板和例子见 references/durable-acceptance.md。
执行记录
Durable 执行期间在任务正文持续维护 ## 执行记录,只记录可复用的工作证据,不暴露隐藏推理:
- 使用了哪些 Skills/工具,以及它们承担什么工作。
- 关键决策、假设和选择理由。
- 遇到的问题、诊断证据、重试与解决办法。
- 自动测试、构建、浏览器回归、录屏等验证结果。
- 下次可以怎样减少调用、并行处理、复用缓存或提前发现失败。
记录的目的,是让后续 Agent 能恢复任务并审计效率;它不能成为要求用户阅读的中间验收物。
移动、归档与检查
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" move <TSK-ID> \
--to-current-project
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" delete <TSK-ID> --yes
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" index
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" doctor
delete 实际移动到 archive/,不永久删除。
Web 看板
当用户要求打开或启动 Todo 看板时:
node "${CLAUDE_SKILL_DIR}/bin/todo.mjs" web
项目级看板显式追加作用域参数。Web 只监听 127.0.0.1,与 CLI 读取同一份 Markdown 数据。
渐进式资料
- 需要完整命令参数时读
references/commands.md。 - 需要任务 YAML、正文和目录格式时读
references/file-format.md。 - 需要安装、依赖或 Web 启动排查时读
references/setup-guide.md。 - 需要产品范围和验收条件时读
references/poc-spec.md。 - 需要判断人工等待阈值或设计最终回归入口时读
references/durable-acceptance.md。
错误处理
- CLI 返回非零退出码时报告真实错误,不绕过 CLI 直接改文件。
- Task ID 必须是
TSK-xxxxxxxx;标题不能代替 ID。 canDurable缺少合法依据时不得强行写入。doctor报告非法 YAML、重复 ID、文件名不一致或 Reference 失效时,先修复数据再继续。- 旧格式只通过
migrate尽力转换;迁移失败不阻塞新系统使用。 waitingHuman不得用于中间文档验收或例行阶段确认;不满足人工等待阈值时改回doing或done。