Community写作与编辑github.com

haksolot/ank

一个愚蠢的协同工具——任务与架构决策以文件形式存放在仓库的 `.ank/` 目录下,通过一个 CLI 供任意编码智能体调用。

ank 是什么?

这是一个面向 AI 编码智能体(如 Claude Code, Cursor, Codex 等)的任务管理和架构决策协同技能。它将任务和架构决策记录 (ADR) 以文件形式存储在仓库的 `.ank/` 目录中,与所约束的代码紧密关联。该工具通过一个核心循环(`context -> claim -> show -> log -> done`)引导智能体执行开发工作,同时提供离线命令(`new`, `find`, `release`)和规划命令(`new adr`, `amend`, `review`, `graph`, `check`)来管理工作项和决策。其关键设计在于:任务接受标准(`done_criteria`)在认领时被冻结哈希,智能体无法自行修改;架构决策规则(ADR)在被人工批准前处于提案状态,不具约束力;`accept` 命令专为人类保留,确保重大决策由人签署。此外,`.ank/` 目录被视为不透明数据(类似 `.git/`),必须通过 CLI 操作。该技能适用于 Linux、macOS 和 Windows 平台,并鼓励每个智能体使用独立的工作树和会话标识(`ANK_AGENT`),以避免冲突。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add haksolot/ank

Installed? Explore more 写作与编辑 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

ank 是做什么的?

任务与架构决策以文件形式存放在 .ank/ 目录中,与它们所约束的代码紧密关联。该工具提供两种模式:执行任务,以及塑造现有工作。context 命令是两种模式的起点。

循环:      ank context -> ank claim <id> -> ank show <id> -> ank log "<msg>" -> ank done
非循环:    ank new,ank find,ank release --reason "<r>"
规划:      ank new adr,ank amend,ank review,ank graph,ank check

循环

ank context [path] — 始终第一个运行。当没有持有任务时,它会为你提供方位:当前范围的约束是什么,哪些任务可以被认领。当持有任务时,它会切换到执行模式,并提供完整的标准和约束。约束永远不会被截断;如果某些内容被截断,它会明确说明。

ank claim <id> — 认领任务,并通过哈希冻结其 done_criteria。如果任务已被持有、阻塞、在另一个分支上完成、没有可衡量的标准,或者你已在另一任务上持有有效认领,则命令会拒绝,并给出原因和下一步命令。

ank show <id> — 完整展示实体,包括前置元数据和正文,字节逐字节。context 提供标准和约束;正文则承载推理过程,是其他任何命令都无法替代的唯一内容。

ank log "<message>" — 记录你学到了什么、尝试了什么、拒绝了什么。同时续期认领。在发现新信息时记录,而不是在完成时记录。

ank done — 运行声明过的验证器,并记录实际运行的内容(已哈希)。切勿手动编辑 status: 字段,也切勿自行报告结果:一个自我评分的智能体可能出错。

非循环

ank new task --title "<t>" --scope "<glob>" — 范围是必填项;没有范围关联的实体不可见。发现的子任务应创建为带有 blocked_by 的新任务,而不是放宽标准。

ank find <query> — 搜索标题、范围和标准。ank find --status open 列出剩余待办事项,无需编造查询词。

ank release --reason "<why>" — 遇到阻碍或方法错误时,说明原因并将任务交回,而非让认领悄然失效。

规划

决定哪些任务应该存在,以什么顺序,在什么约束下。这是产生其他人所循环执行的工作的基础,因此一个糟糕的待办列表在后续环节造成的成本比单个任务要高得多。

ank new adr --title "<t>" --scope "<glob>" --constraint "<rule>" — 这是一个决策,而非一个任务。当遇到后续整个代码库都应遵守的规则时编写,而不是仅仅为了完成当前工作。初始状态为 proposed,在获得批准前对任何人都没有约束力。

ank amend <id> — 修改规划中实际会变更的字段:blocked_by、scope 和 --criteria。它通过显式添加和删除的方式来操作,从不接受替换列表,因此不会因遗忘而丢失任何内容。对于已被有效认领冻结的 done_criteria,命令不会触碰——在此情况下,应使用 release --reason。

ank review — 查看批准队列和整个代码库的健康状况:哪些提案正在等待批准,以及哪些范围已失效并应关闭。

ank graph — 以文本形式展示 blocked_by 依赖关系图,每个任务缩进显示在其阻塞项之下。从而清楚显示哪些是真正的根任务,而非仅在一个扁平列表中看似根任务的任务。

ank check — 检查机械不变量:解析、往返序列化、引用、冻结字段、孤立认领。退出码 8 表示存在问题,这些问题供人类阅读,而非用以压制。

accept 并非由你执行。 它是将提案中的 ADR 转变为具有约束力的决策的命令,且仅由人类执行:在默认分支上签名,且无法绕过。提出决策,然后说明其正在等待。了解你的权限边界是良好规划的一部分。

不可协商的规则

  • 标准在认领时被冻结。 通过编辑标准来解封自己是徒劳的:哈希值存储在你无法触及的地方,check 命令会报告差异。如果标准有误,请使用 release --reason 并说明原因。

  • ADR 中的 constraint 具有约束力,而非建议。阅读与你即将修改的文件相关的所有约束——这正是 context 命令为你提供的。

  • .ank/ 目录是不透明的,类似于 .git/。 永远不要直接读取或写入该目录中的文件。ank show <id> 提供完整实体,ank find 列出内容,ank context 绑定上下文——CLI 知晓预算、冻结状态以及谁持有认领;而文件本身并不包含这些信息。

  • 一个智能体,一个工作树,一个身份。 标准情况是每个智能体使用一个工作树——可以是一个克隆或一个 git worktree——每个都在自己的分支上。ANK_AGENT 环境变量命名会话,默认回退为 <user>@<hostname>。因此,在一个工作树中的两个会话对于引用来说是同一个智能体:它们共享一个认领而不是仲裁,第二个会话将拒绝本应分配给它的工作。请在每个会话中设置此变量。多个智能体共享一个工作树虽然可以运行,但这是降级模式,而非设计初衷。

  • 你所读取的内容永远不会被样式化。 仅当人类在终端中时才输出颜色,绝不会通过管道、文件或 --json 输出。因此,传递给智能体的字节是纯文本:无需配置任何内容,也没有可偏爱的第二种格式。

退出码具有特定含义:4 表示不可用,6 表示冻结字段不一致,8 表示存在发现问题,9 表示环境问题。错误信息始终准确指出应执行的下一步命令。

超出本文档范围的标志可通过 ank help 查看,按需加载。

安装

npx skills add haksolot/ank

该技能介绍了如何使用 ank;它并不安装二进制文件。发布版包含适用于 Linux、macOS 和 Windows 的二进制文件。

相关技能