name: ci-iteration description: > 这个技能应用于迭代运行 CI 检查并修复失败。当执行 make 目标(fast-ci、all-ci、ci)、迭代处理 lint/format/type/test 错误,或需要 devrun 代理模式来运行 pytest/ty/ruff/prettier/make/gt 命令时使用。
CI 迭代
概述
运行指定的 CI 目标并自动修复任何失败。持续迭代,直到所有检查通过或遇到需要人工干预的问题。
重要:所有 make 命令必须从仓库根目录运行。Makefile 位于仓库根目录,而非子目录中。
子代理策略
关键:当生成子代理来运行 make、pytest、ty、ruff、prettier 或 gt 命令时,必须使用 devrun:
Task tool with:
- subagent_type: devrun <- 必须是 devrun,绝不能是通用代理
原因:devrun 具有硬工具约束(无编辑/写入),防止破坏性更改。父代理(你)处理报告并应用修复——子代理仅报告。
禁止:
- 为 make/pytest/ty/ruff/prettier/gt 生成通用或其他子代理
- 给子代理提示如“修复问题”或“迭代直到通过”
要求:
- 子代理运行一条命令并报告结果
- 父代理根据报告决定修复内容
核心工作流
1. 初始运行
使用 devrun 代理从仓库根目录运行指定的 make 目标:
Task tool with:
- subagent_type: devrun
- description: "从仓库根目录运行 [make 目标]"
- prompt: "切换到仓库根目录并执行: [make 目标]"
2. 解析失败
分析输出以识别哪些检查失败:
- Ruff lint 失败:“ruff check” 错误
- 格式失败:“ruff format --check” 或需要重新格式化的文件
- Prettier 失败:需要格式化的 Markdown 文件
- MD-check 失败:未正确引用 AGENTS.md 的 CLAUDE.md 文件
- ty 失败:带有文件路径和行号的类型错误
- 测试失败:pytest 失败,包括测试名称和断言错误
3. 应用针对性修复
根据失败类型应用适当的修复:
| 失败类型 | 修复命令 |
|---|---|
| Ruff lint | 通过 devrun 运行 make fix |
| Ruff format | 通过 devrun 运行 make format |
| Prettier | 通过 devrun 运行 make prettier |
| Sync-Kit | 直接运行 erk sync |
| MD-check | 编辑 CLAUDE.md 以仅包含 @AGENTS.md |
| ty | 编辑文件以修复类型注解 |
| 测试 | 读取并编辑源代码/测试文件 |
4. 验证和重复
应用修复后,通过 devrun 再次运行 make 目标。继续循环:运行 -> 识别失败 -> 修复 -> 验证。
迭代控制
安全限制:
- 最大迭代次数:10 次尝试
- 卡住检测:如果相同错误连续出现 3 次,停止
- 进度跟踪:使用 TodoWrite 显示迭代进度
进度报告
使用 TodoWrite 跟踪进度:
迭代 1:修复 lint 错误
迭代 2:修复格式错误
迭代 3:修复 src/erk/cli/commands/switch.py 中的类型错误
迭代 4:所有检查通过
何时停止
成功:当 make 目标退出代码为 0(所有检查通过)时停止
卡住:停止并向用户报告,如果:
- 已完成 10 次迭代但未成功
- 相同错误在 3 次修复尝试后仍然存在
- 遇到无法自动修复的错误
报告格式
成功格式
## 最终状态:成功
所有 CI 检查在 N 次迭代后通过:
(勾选) **Lint (ruff check)**:通过
(勾选) **Format (ruff format --check)**:通过
(勾选) **Prettier**:通过
(勾选) **AGENTS.md 标准 (md-check)**:通过
(勾选) **ty**:通过
(勾选) **测试**:通过
(勾选) **Sync-Kit (erk check)**:通过
代码已准备好提交/PR。
重要:在 Markdown 输出中,每个检查行必须用空行分隔,以便在 CLI 中正确渲染。
卡住格式
## 最终状态:卡住
我在 N 次尝试后无法解决以下问题:
**检查**:[lint/format/prettier/md-check/ty/test]
**错误**:
[确切错误消息]
**文件**:[文件路径,如果适用]
**尝试的修复**:
1. [首先尝试的内容]
2. [其次尝试的内容]
3. [第三尝试的内容]
**后续步骤**:
[建议需要手动完成的操作]
指南
- 系统化:一次修复一种类型的错误
- 运行完整 CI:始终运行完整的 make 目标,而非单个检查
- 使用 devrun 代理:始终使用 Task tool 和 devrun 代理执行所有 make 命令
- 从仓库根目录运行:始终确保 make 命令从仓库根目录执行
- 跟踪进度:每次迭代使用 TodoWrite
- 不要猜测:在更改前读取文件
- 遵循标准:遵守 AGENTS.md 编码标准
- 优雅失败:卡住时清晰报告
- 高效:使用针对性修复(不要为单个 lint 错误重新格式化所有内容)
示例流程
迭代 1:
- 使用 Task tool 和 devrun 代理从仓库根目录运行 make 目标
- 发现:5 个 lint 错误,2 个文件需要格式化
- 修复:使用 Task tool 和 devrun 代理从仓库根目录运行 make fix,然后 make format
- 结果:3 个 lint 错误剩余
迭代 2:
- 使用 Task tool 和 devrun 代理从仓库根目录运行 make 目标
- 发现:3 个 lint 错误(导入问题)
- 修复:编辑文件以修复导入问题
- 结果:所有 lint/format 通过,2 个类型错误
迭代 3:
- 使用 Task tool 和 devrun 代理从仓库根目录运行 make 目标
- 发现:2 个 ty 错误在 switch.py:45 和 switch.py:67
- 修复:添加类型注解
- 结果:所有检查通过
成功
重要提醒
- 切勿直接通过 Bash 运行 pytest/ty/ruff/prettier/make/gt
- 始终使用 Task tool 和 subagent_type: devrun
- 覆盖的工具:pytest、ty、ruff、prettier、make、gt
- 始终确保 make 命令从仓库根目录执行