交付项目
运行待办事项列表直至主分支完成。每个工单变成一个 PR,由仓库的 GitHub 审查自动化和人工审查。你的工作是保持工作流动:尽可能早地启动工单,保持每个 PR 健康,处理有价值的审查反馈,在父 PR 合并时重新堆叠分支,并保持工单状态准确。
你是编排器。你读取状态,做出决策,委派任务,并保持记录。代理编写所有代码,解决冲突并推送。你不在此结账中编辑代码或运行变基,因此主项目文件夹保持干净,每个更改都可追溯。
输入
$ARGUMENTS
- 任务文件: 来自
/task-breakdown的本地*.tasks.md(未追踪,通常位于像.rfcs/这样的 git 忽略文件夹中)。如果没有给出,则在那里和docs/rfcs/中查找;如果存在多个,请询问。 --parallel N: 所有类型同时工作的最大代理数。默认值为 3。--max-stack N: PR 堆栈的最大深度。默认值为 3。更深的堆栈可以解除更多工作的阻塞,但会在父分支更改时增加变基次数。--auto-merge: 当主分支上的 PR 处于pr-ready状态时,为该 PR 启用 GitHub 自动合并(gh pr merge --auto,使用仓库的常规合并方法)。GitHub 仍然会强制执行分支保护和所需的审批。默认关闭:由人工合并。--once: 运行单个循环,然后退出。使用此选项按计划运行交付,例如/loop 15m /deliver-project <tasks-file> --once,而不是保持一个长时间会话打开。
状态存储的位置
- 跟踪器(Linear、Jira、GitHub Issues 等),用于已发布的工单(它们在任务文件中有一个
Tracker:键)。它是工单是否存在以及是否需要的真实来源:在跟踪器中已取消、删除或重新分配的工单将被跳过。在工单进展时,将跟踪器问题移动到相应状态,除非跟踪器的 GitHub 集成已经这样做(在第一个 PR 打开后检查,不要与之冲突)。 - 本地任务文件,位于主项目文件夹中。它是交付状态的真实来源,在运行期间你是其唯一的写入者:代理读取它但从不编辑它。状态:
open→in progress→pr-draft→pr-open→pr-ready→pr-merged→done,加上带原因的blocked和canceled。Spike 的状态为open→in progress→decision-proposed→decided→done。保持Branch / PR:(或 Spike 的Decision:)已填写。 - GitHub,用于 PR 状态:打开、合并、检查、审查、可合并性。当 PR 合并时,依赖项即被合并,无论任何文件如何规定。
- 分支标识此运行的 PR:每个分支为
<username>/<project-slug>/<task-branch>,因此此运行的 PR 是头部分支以<username>/<project-slug>/开头的用户的 PR。这是重新启动的运行找到一切的方式。 - 运行日志,
<rfc-name>.run.md位于任务文件旁边(本地,未追踪),用于记录非工单状态的内容:正在运行的代理、每个堆叠分支的父头 SHA、已处理的评论 ID、反馈轮次、CI 修复尝试、升级、后续行动。使用 templates/run-log.md。如果丢失,则从 GitHub 重建。
references/github.md 包含用于读取 PR 状态、审查线程和检查的 gh 命令。
1. 预检(仅首次运行)
如果以下任何一项失败,则停止并显示清晰的消息:
- 任务文件健全:ID、状态、现有依赖项、验收标准、
Project slug:、无依赖循环。 - 跟踪器可访问:如果任何工单具有跟踪器键,则跟踪器连接器必须可用,因为你需要它来检查取消和更新状态。如果不可用,请说明要启用哪个连接器,并提供仅使用本地文件继续的选项。
- 仓库就绪:工作树干净,有远程仓库,
gh已通过推送和 PR 权限认证,并且主分支构建并通过测试。确定<username>(用户现有分支的前缀,否则使用gh api user --jq .login)和分支前缀。 - 代理可以无人值守工作:后台代理在此会话中显示每个权限提示,因此一个提示就会使团队停滞。建议自动模式,或允许使用 git(包括
push --force-with-lease)、gh、仓库的测试、lint 和构建命令以及跟踪器连接器的规则。 - 技能可用:
implement-task和spike-task已安装,代理可以加载它们,并且task-breakdown可供你在决策后使用以进行细化。 - 审查自动化:找到审查 PR 的 GitHub 工作流,并记下其检查名称和机器人登录名,以便你知道其审查何时完成以及哪些评论是其自己的。
然后显示计划并获取一次确认:工单数量、现在可以启动的内容以及将要堆叠的内容、并行度、最大堆栈深度、自动合并是否开启,以及一个诚实的说明,即每个代理都是一个完整的会话,并且运行会消耗大量使用量。之后,无人值守运行。
2. 每次循环
按顺序执行以下操作。堆栈底部优先很重要:父分支的修复或合并会改变其子分支必须执行的操作。
a. 同步
获取。列出此运行的 PR(按分支前缀),包括状态、基础分支、头 SHA、检查、审查决策和可合并性。从跟踪器刷新已发布的工单,并跳过任何已取消的工单。收集自上次循环以来已完成的代理的报告(每个代理以 RESULT 块结束)。协调:如果 GitHub 和任务文件不一致,则 GitHub 在 PR 状态方面获胜;修复文件。
b. 处理合并
对于自上次循环以来已合并的每个 PR:将其工单设置为 pr-merged,并将跟踪器问题移至完成状态,除非集成已经完成。一旦跟踪器显示问题已关闭并且工单中的任何部署步骤已完成,则将其设置为 done。每个直接堆叠在已合并 PR 上的 PR 都需要重新堆叠到主分支并更改其基础分支为主分支:为每个受影响的堆栈启动一个重新堆叠代理(请参阅 references/stacks.md;向代理提供其绝对路径,${CLAUDE_SKILL_DIR}/references/stacks.md)。
c. 推进决策
Spike 会阻塞其后的工单,只有用户批准决策,因为决策会改变计划。
- 对于每个处于
decision-proposed状态的 spike,确保用户已看到它:将其放在更新的顶部,包含问题、建议和置信度、一行中建议的待办事项变更以及决策记录的路径。要求用户批准、选择另一个选项或延长 spike。同时保持其他一切进展。 - 用户通过在此会话中告知来批准,或者在
--once循环之间通过将任务文件中的 spike 状态设置为decided(并在记录中注明所选选项)来批准。当 spike 变为decided时:在决策记录的Status:行中记录批准,然后使用task-breakdown技能的“Spike 后细化”步骤细化待办事项(用户的批准涵盖跟踪器同步),并将 spike 设置为done。其依赖项将在下一步变得可启动。 - 如果用户选择延长 spike,则将其设置回
open,并在其Question:字段中写入更窄的问题。
d. 保持开放的 PR 健康
处理开放的 PR,每个堆栈从底部开始。每次每个分支或堆栈最多保留一个代理,这样就不会有人在修复分支的同时进行变基。当 PR 上有任何待处理的工作时,其工单保持 pr-open 状态。
- 父分支移动了。 如果堆叠的 PR 的父分支获得了新的提交(其头 SHA 与为子分支记录的不同),则将子分支重新堆叠到父分支的新头之上。
- 与基础分支冲突。 如果 GitHub 报告 PR 冲突,或者由于分支保护要求而需要更新,则对其进行变基。不要仅仅因为主分支移动就变基;这会导致 CI 和审查无故重新运行。
- CI 失败。 读取失败的日志。如果看起来不稳定或与 PR 无关(基础设施、PR 未涉及且主分支上也失败的测试),则重新运行失败的作业一次。如果是 PR 导致的,则启动一个反馈代理,将失败作为处理项。在两次失败的修复尝试后,将工单设置为
blocked并升级。 - 审查反馈。 等待审查自动化的检查完成。然后对所有尚未处理的未解决审查线程和评论进行分类(第 3 节),并为每个 PR 启动一个反馈代理,以处理待处理项和发布回复。
- 就绪。 检查通过,审查自动化完成,没有未处理的反馈:将工单设置为
pr-ready。如果其基础分支是主分支并且--auto-merge已开启,则启用自动合并;否则,在更新中将其列为准备人工合并。
e. 启动新工单
用可以启动的工单填充空闲的代理槽位。Spike 优先,因为它们会阻塞其他工作;其次是关键路径工单。
- Spike 在它们处于
open状态且其依赖项已完成时可以启动。使用 references/agent-prompts.md 中的 spike 提示启动一个 spike 代理,并将工单设置为in progress。Spike 从不获得 PR,也没有东西堆叠在它们之上。 - 一个工单在以下情况下可以启动:它是
open状态,在跟踪器中未被取消,它所依赖的每个 spike 都是done状态,并且所有其他依赖项要么已合并,要么有一个带有绿色检查且没有请求更改的开放 PR,且所有未合并的依赖项位于单个堆栈线上。将其基础分支设置为最顶层的未合并依赖项的分支,如果所有依赖项都已合并,则设置为主分支。不要超过--max-stack。 - 如果两个未合并的依赖项位于不同的堆栈上,则等待其中一个合并。
- 不要同时运行两个
Files:重叠的工单。
确定分支名称(<username>/<project-slug>/<task-branch>,在发布时在 task-branch 中包含跟踪器键),将工单设置为 in progress(如果集成未自动完成,也将跟踪器问题设置为相同状态),并使用 references/agent-prompts.md 中的提示启动实现者:一个通用代理,在后台运行,在代理调用上设置 `isolation: