@tea-agent/loop-agent 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. package/AGENTS.md +121 -0
  2. package/CHANGELOG.md +37 -0
  3. package/README.md +144 -0
  4. package/bin/loop-agent.js +21 -0
  5. package/dist/adapters/aimax.js +91 -0
  6. package/dist/adapters/context.js +32 -0
  7. package/dist/adapters/index.js +28 -0
  8. package/dist/adapters/loop-agent.js +98 -0
  9. package/dist/adapters/types.js +1 -0
  10. package/dist/cli/catalog.js +259 -0
  11. package/dist/cli/help.js +55 -0
  12. package/dist/cli/index.js +3 -0
  13. package/dist/cli/program.js +505 -0
  14. package/dist/cli.js +12 -0
  15. package/dist/commands/closeout.js +13 -0
  16. package/dist/commands/coverage-audit.js +14 -0
  17. package/dist/commands/cursor-prompt.js +222 -0
  18. package/dist/commands/cursor-worker.js +43 -0
  19. package/dist/commands/dag-approve.js +102 -0
  20. package/dist/commands/dag-final-verification.js +76 -0
  21. package/dist/commands/dag-init-hybrid.js +56 -0
  22. package/dist/commands/dag-reconcile-tasks.js +51 -0
  23. package/dist/commands/dag-reject.js +91 -0
  24. package/dist/commands/dag-report.js +177 -0
  25. package/dist/commands/dag-resume.js +34 -0
  26. package/dist/commands/dag-run-task.js +470 -0
  27. package/dist/commands/dag-validate.js +186 -0
  28. package/dist/commands/dag-workflow-compile.js +91 -0
  29. package/dist/commands/dag-workflow-plan.js +130 -0
  30. package/dist/commands/dag-workflow-validate.js +66 -0
  31. package/dist/commands/delegate.js +132 -0
  32. package/dist/commands/docs-archive.js +5 -0
  33. package/dist/commands/docs-audit.js +5 -0
  34. package/dist/commands/doctor.js +50 -0
  35. package/dist/commands/goal.js +92 -0
  36. package/dist/commands/handoff-check.js +5 -0
  37. package/dist/commands/harvest.js +44 -0
  38. package/dist/commands/inspect.js +11 -0
  39. package/dist/commands/instructions.js +195 -0
  40. package/dist/commands/knowledge.js +64 -0
  41. package/dist/commands/loop-benchmark.js +72 -0
  42. package/dist/commands/loop.js +241 -0
  43. package/dist/commands/new-task.js +5 -0
  44. package/dist/commands/pi-prompt.js +181 -0
  45. package/dist/commands/pi-reuse-benchmark.js +153 -0
  46. package/dist/commands/plan-list.js +5 -0
  47. package/dist/commands/promote-run.js +29 -0
  48. package/dist/commands/reference-index.js +16 -0
  49. package/dist/commands/run-dag.js +184 -0
  50. package/dist/commands/spine.js +38 -0
  51. package/dist/commands/stats.js +84 -0
  52. package/dist/commands/status.js +56 -0
  53. package/dist/commands/study-init.js +192 -0
  54. package/dist/commands/workflow.js +259 -0
  55. package/dist/commands/worktree-create.js +31 -0
  56. package/dist/commands/worktree-list.js +5 -0
  57. package/dist/commands/worktree-remove.js +26 -0
  58. package/dist/cursor-worker-entry.js +8 -0
  59. package/dist/executors/config-core.js +55 -0
  60. package/dist/executors/config.js +2 -0
  61. package/dist/executors/cursor-artifacts.js +33 -0
  62. package/dist/executors/cursor-execution-log.js +81 -0
  63. package/dist/executors/cursor-executor-artifacts.js +135 -0
  64. package/dist/executors/cursor-executor.js +468 -0
  65. package/dist/executors/cursor-run.js +115 -0
  66. package/dist/executors/cursor-tool.js +94 -0
  67. package/dist/executors/cursor-worker-client.js +213 -0
  68. package/dist/executors/cursor-worker-protocol.js +18 -0
  69. package/dist/executors/cursor-worker-server.js +54 -0
  70. package/dist/executors/cursor-worker.js +3 -0
  71. package/dist/executors/cursor.js +6 -0
  72. package/dist/executors/dag-cursor-executor.js +88 -0
  73. package/dist/executors/dag-pi-executor.js +322 -0
  74. package/dist/executors/dag-static-executor.js +45 -0
  75. package/dist/executors/dag.js +4 -0
  76. package/dist/executors/index.js +8 -0
  77. package/dist/executors/model-routing.js +60 -0
  78. package/dist/executors/pi-event-serializer.js +43 -0
  79. package/dist/executors/pi-executor.js +606 -0
  80. package/dist/executors/pi-reuse-benchmark.js +316 -0
  81. package/dist/executors/pi-runtime-reuse.js +29 -0
  82. package/dist/executors/pi-sdk-executor.js +255 -0
  83. package/dist/executors/pi-sdk.js +1 -0
  84. package/dist/executors/pi.js +3 -0
  85. package/dist/executors/shell-executor.js +300 -0
  86. package/dist/executors/shell-presets.js +47 -0
  87. package/dist/executors/shell-verification.js +251 -0
  88. package/dist/executors/shell-write-guard.js +126 -0
  89. package/dist/executors/shell.js +3 -0
  90. package/dist/executors/static.js +1 -0
  91. package/dist/governance/checks.js +434 -0
  92. package/dist/governance/harness.js +9 -0
  93. package/dist/governance/index.js +3 -0
  94. package/dist/governance/manifest-types.js +128 -0
  95. package/dist/governance/manifest.js +2 -0
  96. package/dist/governance/path-guard.js +69 -0
  97. package/dist/governance/path-guards.js +2 -0
  98. package/dist/governance/profiles.js +3 -0
  99. package/dist/governance/requirement-coverage.js +425 -0
  100. package/dist/governance/skill-safety.js +135 -0
  101. package/dist/governance/spine-audit.js +152 -0
  102. package/dist/records/closeout.js +2 -0
  103. package/dist/records/harvest.js +236 -0
  104. package/dist/records/index.js +3 -0
  105. package/dist/records/one-shot-runs.js +421 -0
  106. package/dist/records/promotion.js +199 -0
  107. package/dist/shared/artifacts-core.js +88 -0
  108. package/dist/shared/artifacts.js +2 -0
  109. package/dist/shared/context-files.js +32 -0
  110. package/dist/shared/context.js +2 -0
  111. package/dist/shared/copy-dir.js +17 -0
  112. package/dist/shared/git-progress.js +165 -0
  113. package/dist/shared/index.js +5 -0
  114. package/dist/shared/logger.js +23 -0
  115. package/dist/shared/one-shot-prompt-args.js +98 -0
  116. package/dist/shared/path-refs.js +31 -0
  117. package/dist/shared/prompts.js +26 -0
  118. package/dist/shared/reference-context.js +238 -0
  119. package/dist/shared/timeout-policy.js +19 -0
  120. package/dist/shared/timeout.js +1 -0
  121. package/dist/shared/types.js +5 -0
  122. package/dist/task/config-types.js +97 -0
  123. package/dist/task/config.js +2 -0
  124. package/dist/task/delegate.js +220 -0
  125. package/dist/task/goal-audit.js +51 -0
  126. package/dist/task/goal-policy.js +8 -0
  127. package/dist/task/goal.js +3 -0
  128. package/dist/task/ids.js +1 -0
  129. package/dist/task/index.js +9 -0
  130. package/dist/task/lifecycle.js +1 -0
  131. package/dist/task/paths.js +1 -0
  132. package/dist/task/read-model.js +149 -0
  133. package/dist/task/runtime.js +699 -0
  134. package/dist/task/source-state.js +1 -0
  135. package/dist/task/state.js +55 -0
  136. package/dist/task/subagent-guidance.js +1 -0
  137. package/dist/task/workflow-state-types.js +92 -0
  138. package/dist/task/worktree-cleanup.js +140 -0
  139. package/dist/task/worktree.js +171 -0
  140. package/dist/workflows/dag/authoring.js +8 -0
  141. package/dist/workflows/dag/authority-surface.js +138 -0
  142. package/dist/workflows/dag/canvas-observer.js +474 -0
  143. package/dist/workflows/dag/decision-envelope.js +502 -0
  144. package/dist/workflows/dag/decision-evidence.js +153 -0
  145. package/dist/workflows/dag/decision-gates.js +1 -0
  146. package/dist/workflows/dag/executor-registry.js +25 -0
  147. package/dist/workflows/dag/facts.js +4 -0
  148. package/dist/workflows/dag/failure-category.js +111 -0
  149. package/dist/workflows/dag/final-verification.js +180 -0
  150. package/dist/workflows/dag/governance-constants.js +5 -0
  151. package/dist/workflows/dag/governance-profile.js +405 -0
  152. package/dist/workflows/dag/index.js +6 -0
  153. package/dist/workflows/dag/init-hybrid.js +855 -0
  154. package/dist/workflows/dag/knowledge-curator.js +162 -0
  155. package/dist/workflows/dag/lifecycle.js +484 -0
  156. package/dist/workflows/dag/prompt-source.js +88 -0
  157. package/dist/workflows/dag/prompt.js +130 -0
  158. package/dist/workflows/dag/reconcile-tasks.js +404 -0
  159. package/dist/workflows/dag/recovery-recommendation.js +226 -0
  160. package/dist/workflows/dag/repair-artifact.js +136 -0
  161. package/dist/workflows/dag/report.js +1019 -0
  162. package/dist/workflows/dag/runner.js +1677 -0
  163. package/dist/workflows/dag/runtime.js +5 -0
  164. package/dist/workflows/dag/skill-instructions.js +471 -0
  165. package/dist/workflows/dag/skills.js +41 -0
  166. package/dist/workflows/dag/spec.js +3 -0
  167. package/dist/workflows/dag/topo.js +30 -0
  168. package/dist/workflows/dag/types.js +275 -0
  169. package/dist/workflows/dag/upstream-artifacts.js +95 -0
  170. package/dist/workflows/dag/validate.js +527 -0
  171. package/dist/workflows/dynamic/artifacts.js +65 -0
  172. package/dist/workflows/dynamic/compile.js +360 -0
  173. package/dist/workflows/dynamic/compileTypes.js +1 -0
  174. package/dist/workflows/dynamic/errors.js +5 -0
  175. package/dist/workflows/dynamic/index.js +7 -0
  176. package/dist/workflows/dynamic/profiles.js +156 -0
  177. package/dist/workflows/dynamic/spec.js +114 -0
  178. package/dist/workflows/dynamic/validate.js +275 -0
  179. package/dist/workflows/loop/actions.js +1334 -0
  180. package/dist/workflows/loop/benchmark.js +510 -0
  181. package/dist/workflows/loop/closeout.js +134 -0
  182. package/dist/workflows/loop/context.js +48 -0
  183. package/dist/workflows/loop/events.js +25 -0
  184. package/dist/workflows/loop/hash.js +32 -0
  185. package/dist/workflows/loop/index.js +8 -0
  186. package/dist/workflows/loop/paths.js +17 -0
  187. package/dist/workflows/loop/rounds.js +81 -0
  188. package/dist/workflows/loop/signals.js +55 -0
  189. package/dist/workflows/loop/state.js +116 -0
  190. package/dist/workflows/loop/templates.js +54 -0
  191. package/dist/workflows/loop/types.js +28 -0
  192. package/docs/README.md +62 -0
  193. package/docs/agent-dag-recovery-playbook.md +158 -0
  194. package/docs/agent-dag-runner.md +40 -0
  195. package/docs/cursor-executor-usage.md +25 -0
  196. package/docs/decisions/README.md +3 -0
  197. package/docs/design/README.md +36 -0
  198. package/docs/development-principles.md +71 -0
  199. package/docs/dynamic-workflow-dag-engine-roadmap.md +1749 -0
  200. package/docs/exec-plans/README.md +6 -0
  201. package/docs/exec-plans/active/README.md +5 -0
  202. package/docs/exec-plans/completed/README.md +5 -0
  203. package/docs/feature-workflow.md +184 -0
  204. package/docs/harness-methodology-debugging.md +153 -0
  205. package/docs/harness-methodology-tdd.md +130 -0
  206. package/docs/harness-methodology-verification.md +27 -0
  207. package/docs/loop-agent-harness.md +42 -0
  208. package/docs/progress/README.md +3 -0
  209. package/docs/reports/README.md +3 -0
  210. package/docs/templates/adr.md +60 -0
  211. package/docs/templates/agent-dag-authority-surface-audit.prompt.md +94 -0
  212. package/docs/templates/agent-dag-decision-envelope.schema.json +213 -0
  213. package/docs/templates/agent-dag-decision-gate-dogfood-report.md +117 -0
  214. package/docs/templates/agent-dag-decision-gate.prompt.md +246 -0
  215. package/docs/templates/agent-dag-process-supervisor.prompt.md +98 -0
  216. package/docs/templates/agent-dag-report.schema.json +423 -0
  217. package/docs/templates/agent-dag-review-verdict.prompt.md +68 -0
  218. package/docs/templates/agent-dag.base.json +195 -0
  219. package/docs/templates/agent-dag.final-verification.json +190 -0
  220. package/docs/templates/agent-dag.schema.json +316 -0
  221. package/docs/templates/agent-dag.supervised-implementation.json +500 -0
  222. package/docs/templates/exec-plan.md +64 -0
  223. package/docs/templates/feature-spec.md +53 -0
  224. package/docs/templates/hybrid-dag.json +193 -0
  225. package/docs/templates/progress-log.md +17 -0
  226. package/docs/templates/project-start-checklist.md +9 -0
  227. package/docs/templates/qa-report.md +42 -0
  228. package/docs/templates/sprint-contract.md +29 -0
  229. package/docs/verification-matrix.md +30 -0
  230. package/examples/decision-gate-agent-dag.json +123 -0
  231. package/examples/example-dag.json +51 -0
  232. package/examples/hybrid-loop-agent-dag.json +194 -0
  233. package/harness.json +92 -0
  234. package/package.json +61 -0
  235. package/skills/ai-engineering-context/SKILL.md +48 -0
  236. package/skills/loop-agent/SKILL.md +260 -0
  237. package/skills/loop-agent/references/README.md +63 -0
  238. package/skills/loop-agent/references/command-reference.md +315 -0
  239. package/skills/loop-agent/references/harness-policy.md +258 -0
  240. package/skills/loop-agent/references/hybrid-dag.md +216 -0
  241. package/skills/loop-agent/references/learned/README.md +21 -0
  242. package/skills/loop-agent/references/model-routing.md +36 -0
  243. package/skills/loop-agent/references/multi-worktree.md +54 -0
  244. package/skills/loop-agent/references/one-shot-runs.md +85 -0
  245. package/skills/loop-agent/references/orchestrator-and-interventions.md +169 -0
  246. package/skills/loop-agent/references/pi-prompt.md +23 -0
  247. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +83 -0
  248. package/skills/loop-agent/references/post-implementation-and-patterns.md +44 -0
  249. package/skills/loop-agent/references/task-workflow.md +84 -0
  250. package/skills/loop-agent/references/verification-and-failure-handling.md +74 -0
  251. package/skills/requesting-code-review/SKILL.md +101 -0
  252. package/skills/requesting-code-review/code-reviewer.md +168 -0
  253. package/skills/systematic-debugging/CREATION-LOG.md +119 -0
  254. package/skills/systematic-debugging/SKILL.md +296 -0
  255. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  256. package/skills/systematic-debugging/condition-based-waiting.md +115 -0
  257. package/skills/systematic-debugging/defense-in-depth.md +122 -0
  258. package/skills/systematic-debugging/find-polluter.sh +63 -0
  259. package/skills/systematic-debugging/root-cause-tracing.md +169 -0
  260. package/skills/systematic-debugging/test-academic.md +14 -0
  261. package/skills/systematic-debugging/test-pressure-1.md +58 -0
  262. package/skills/systematic-debugging/test-pressure-2.md +68 -0
  263. package/skills/systematic-debugging/test-pressure-3.md +69 -0
  264. package/skills/verification-before-completion/SKILL.md +154 -0
package/AGENTS.md ADDED
@@ -0,0 +1,121 @@
1
+ @/Users/mac/.codex/RTK.md
2
+
3
+ <!-- CODEGRAPH_START -->
4
+ ## CodeGraph
5
+
6
+ 如果仓库根目录存在 `.codegraph/`,在理解或定位代码前优先使用 CodeGraph,再考虑 rg/fd 或手动读文件。
7
+ <!-- CODEGRAPH_END -->
8
+
9
+ # AGENTS.md
10
+
11
+ 本仓库采用“人类掌舵,智能体执行”的工程方式。目标不是一次性写完所有代码,而是在一个可持续演进、可交接、可验证的系统里做小步增量。
12
+
13
+ `AGENTS.md` 是地图,不是百科。顶层只保留开工协议、会话协议与文档导航;长期知识、方法论、决策、计划、报告和模板应进入 `docs/`。
14
+
15
+ ## 默认立场
16
+
17
+ - 仓库是记录系统:决策、契约、计划、测试、报告优先落到仓库,而不是停留在聊天里。
18
+ - 一次只推进一个清晰工作块;主会话按 Orient → Select → Contract → Implement → Verify → Handoff 治理,runtime 真实流程以 `src/workflows/` 为准。
19
+ - 先验证基线,再叠加改动;如果当前基线已坏,优先定位基线问题。
20
+ - 完成定义必须可验证;不能靠删测试、降标准或模糊描述制造“完成”。
21
+ - 搜索先于实现;先查现有代码、文档、脚本、测试,避免重复造轮子或误判系统能力。
22
+ - 在 DAG runtime 中,搜索/侦察是显式节点:标准路径是 Contract → Scout → Plan → Implement → Verify → Closeout/Handoff。
23
+ - Shell 搜索优先 `rg`,按名找文件优先 `fd`;脚本确为 Bash 脚本时使用 Git Bash 或已配置的兼容 Bash,不要求 Windows 环境适配 POSIX 路径。
24
+ - 用 loop-agent 迭代本仓库时,控制器必须来自已发布的 npm 安装包;首次安装或有意升级可用 `@tea-agent/loop-agent@latest`,但一次自举任务启动后不要中途升级控制器,并记录 `npm list -g @tea-agent/loop-agent --depth=0` 显示的实际版本。不要用当前工作区的 `npm link` 或 `npm run dev` 控制可能改动 CLI、DAG runtime、executor、package metadata 或 build output 的任务。
25
+ - 反复出现的约束要固化为文档、脚本、检查项、测试或模板。
26
+ - 禁止占位实现;除非 contract 明确约定为脚手架且标出后续闭环。
27
+
28
+ ## 开始顺序
29
+
30
+ 改文件前必须先完成:
31
+
32
+ 1. 运行 `pwd`。
33
+ 2. 阅读 `README.md`。
34
+ 3. 阅读 `harness.json`。
35
+ 4. 阅读 `docs/README.md`。
36
+ 5. 如果是实现类工作,继续阅读:
37
+ - `docs/development-principles.md`
38
+ - `docs/feature-workflow.md`
39
+ - `docs/verification-matrix.md`
40
+ 6. 如果任务涉及测试纪律、验证声明或调试,继续阅读:
41
+ - `docs/harness-methodology-tdd.md`
42
+ - `docs/harness-methodology-verification.md`
43
+ - `docs/harness-methodology-debugging.md`
44
+ 7. 查看最近提交、相关执行计划、progress/report,确认当前上下文。
45
+ 8. 检查 `git status --short --branch`。
46
+ 9. 运行本次任务相关的最小基线验证。
47
+
48
+ ## 会话协议
49
+
50
+ 1. Orient:读入口文档、相关专题、最近变更和现有实现。
51
+ 2. Select:只选一个清晰工作块;避免把重构、新功能、文档迁移混在一轮里。
52
+ 3. Contract:写清本轮交付物、非目标、完成标准、验证方法和失败条件。
53
+ 4. Implement:做最小增量实现,同步维护必要文档、脚本和测试。
54
+ 5. Verify:优先跑快速反馈,再跑必要的真实路径验证。
55
+ 6. Handoff:更新 progress/report/plan 中有长期价值的信息,写清风险、剩余项和下一步。
56
+
57
+ 这套会话协议不是 DAG runtime 的节点序列。复杂实现默认采用 Agent DAG:主 agent 负责拆任务、写 contract、限制路径、审查 DAG/writeSet、盯验证与 handoff;runtime 通过 `loop-agent dag run-task` 生成 DAG、`loop-agent dag validate` 校验、`loop-agent run-dag` 按依赖 ranks 执行节点。标准生成 DAG 的主干默认是 `contract-pi → scout-src/scout-tests → plan-pi → implement-pi → verify-pi → closeout-pi`,其中 `implement-pi` 使用 `executor: "pi"` 和 `toolProfile: "write"`;当 `harness.json` 显式禁用 Pi 且启用 Cursor 时,writer 节点才切换为 `implement-cursor` / `repair-cursor`。微小任务或 DAG runtime 自身修复也应优先使用 DAG 或 one-shot `pi-prompt` / `cursor-prompt` escape hatch。
58
+
59
+ ## 项目地图
60
+
61
+ - `src/`:loop-agent 运行时代码
62
+ - `test/`:Vitest 测试套件
63
+ - `bin/loop-agent.js`:CLI 可执行入口
64
+ - `skills/`:loop-agent 和 DAG 模板引用的本地 skill 指令与参考资料
65
+ - `.harness/`:任务、DAG、run、cache 和 live state 等运行态目录
66
+ - `docs/`:治理文档、计划、报告和模板
67
+ - `website/`:Docusaurus 用户文档站
68
+ - `scripts/`:验证和维护脚本
69
+
70
+ ## 工作规则
71
+
72
+ - 每次任务只推进一个清晰、有边界的工作块。
73
+ - 保留无关的用户改动,不要回退自己没有做的修改。
74
+ - 优先沿用现有 helper、目录边界和局部模式,再考虑新增抽象。
75
+ - 长期决策写入 `docs/`,不要只留在聊天里。
76
+ - 面向使用者的新增、修改、删除或修复,应同步更新根目录 `CHANGELOG.md`;保持版本级摘要即可,不写过细技术细节。
77
+ - 不提交占位实现。
78
+ - 没有新鲜验证证据时,不声明工作完成。
79
+ - 发现新 bug、技术债或契约漂移时,写回当前 plan、progress 或 report,而不是只在对话里提一句。
80
+ - 涉及 harness 流程变化时,优先把变化落到 `harness.json`、模板、脚本或治理文档,而不是只改提示词。
81
+
82
+ ## 验证
83
+
84
+ 用 `docs/verification-matrix.md` 选择命令。常用门禁:
85
+
86
+ ```bash
87
+ npm run typecheck
88
+ npm test
89
+ npm run build
90
+ node bin/loop-agent.js --help
91
+ bash scripts/check-repo.sh
92
+ bash scripts/ci.sh
93
+ ```
94
+
95
+ Windows 上运行 `scripts/*.sh` 时使用 Git Bash 或已配置的兼容 Bash。CLI、Node 代码、模板和提示词里的实际文件路径必须兼容 macOS 与 Windows:优先使用平台原生临时目录和 `path`/`os.tmpdir()`;仅在 repo 引用、JSON/Markdown 证据引用和 glob 约定中使用 `/` 作为稳定分隔符。
96
+
97
+ 文档站相关变更还需要按范围运行:
98
+
99
+ ```bash
100
+ npm run docs:build
101
+ ```
102
+
103
+ ## 交接
104
+
105
+ 较大的工作结束时记录:
106
+
107
+ - 改了什么
108
+ - 为什么这样改
109
+ - 执行过哪些验证命令以及结果
110
+ - 是否影响契约、文档、测试或脚本
111
+ - 剩余风险
112
+ - 后续工作
113
+
114
+ ## 禁止事项
115
+
116
+ - 不要在未读相关文档的前提下直接大改。
117
+ - 不要一次混合重构、新功能和文档大迁移而没有清晰边界。
118
+ - 不要把仅存在于对话里的约束当作长期知识。
119
+ - 不要在缺少验证的情况下宣称完成。
120
+ - 不要假设系统没有某个能力;先搜索再判断。
121
+ - 不要用 stub、假数据通路或注释承诺替代真正交付。
package/CHANGELOG.md ADDED
@@ -0,0 +1,37 @@
1
+ # 更新日志
2
+
3
+ 这里记录每个版本面向使用者的主要变化。保持简短即可:新增、修改、修复或删除了什么,不需要展开实现细节。
4
+
5
+ ## [0.1.0] - 未发布
6
+
7
+ ### 新增
8
+
9
+ - Agent DAG 支持 no-Cursor 环境:Pi 只读规划/审查、Pi `toolProfile: "write"` 受控写入、shell 验证。
10
+ - 默认 implementation / repair writer 使用 `executor: "pi"` 加 `toolProfile: "write"`。
11
+ - executor 配置保持 `pi` / `cursor` / `shell` / `static` 四类;Cursor 仍是显式启用的可选 backend。
12
+ - Windows 环境下 shell verification 可自动使用 Git Bash。
13
+ - Dynamic Workflow DAG Engine 的编译、校验、运行与回放命令。
14
+ - 仓库内置 `skills/` 目录,用于 DAG 模板和本项目技能引用。
15
+ - CLI 入口迁移为 commander 驱动的 command tree,顶层 help、子命令 help 和未知命令错误改用 commander 语义,同时保留既有命令能力。
16
+ - `commander` 成为正式运行时依赖。
17
+ - npm 发布包入口加载构建产物 `dist/cli.js`,并携带静态能力资料:`skills/`、顶层治理文档、`docs/templates/`、`examples/`、`harness.json`、`AGENTS.md`、`README.md` 和 `CHANGELOG.md`。
18
+ - DAG skill 指令在目标项目没有本地 skill 时会回退到 npm 包内置 `skills/`,支持发布包作为任意项目的稳定控制器。
19
+
20
+ ### 修改
21
+
22
+ - 默认 DAG 和模板从 Cursor-heavy 调整为 Pi read-only + Pi write profile + shell verify。
23
+ - 移除独立 Pi 写入 executor 概念,写入能力改由 `toolProfile: "write"` 表达。
24
+ - 文档、示例和 skill 指引将 Cursor 描述为可选 backend,而不是默认路径。
25
+ - 治理和校验说明改为覆盖所有受控写入 executor,不再只绑定 Cursor。
26
+ - 顺序式 Level 1 workflow 入口从推荐/公开路径中移除,DAG 成为主路径。
27
+ - DAG 默认工程上下文 skill 从 `agent-context` 调整为 `ai-engineering-context`。
28
+ - `npm run dev` 明确为源码调试入口;用 loop-agent 迭代本仓库时应使用已发布的 npm 安装包作为稳定控制器,安装或升级可用 `@latest`,单次任务执行期记录并冻结实际安装版本。
29
+ - 发布包不携带已有 `docs/progress/`、`docs/reports/`、`docs/exec-plans/`、`docs/decisions/` 任务正文;这些目录的正文由目标仓库运行时生成。
30
+
31
+ ### 修复
32
+
33
+ - no-Cursor DAG 生成、校验和 runner 测试可以在没有 Cursor 的环境下通过。
34
+ - Windows 路径和 shell 执行相关的跨平台测试问题。
35
+ - `doctor` 的 Pi CLI 探测支持当前 `@earendil-works/pi-coding-agent` 包名,并兼容 Windows npm shim 与跨平台 global npm 安装。
36
+ - DAG draft、final verification 和 closeout draft 的默认临时输出路径改为平台原生临时目录,不再假设 `/tmp` 存在。
37
+ - exec-plan 索引同步检查兼容发布包目录契约 README,不要求 npm 包内 README 链接未打包的源码历史计划正文。
package/README.md ADDED
@@ -0,0 +1,144 @@
1
+ # loop-agent
2
+
3
+ `loop-agent` 是从 `agent-memory/tools/code-agent` 独立出来的 TypeScript 工作流运行时,用来支撑 AI coding agent 在一个仓库内完成可恢复、可验证、可交接的研发任务。
4
+
5
+ 它保留了原 `code-agent` 的核心思路:以 Agent DAG 为主路径,用 `.harness/` 记录运行态事实,用 shell verification 作为完成依据,并把长期治理、计划和交接资料沉淀到 `docs/`。
6
+
7
+ 当前 CLI 使用 `commander` 组织 command tree。顶层 help、子命令 help、参数解析和未知命令错误都由 commander 驱动。
8
+
9
+ ## 核心能力
10
+
11
+ - 生成、校验、执行和汇总 Agent DAG
12
+ - 支持以 Agent DAG 为主的任务生成、校验、执行和收口
13
+ - 维护 `loop` 长程任务状态,包括目标、轮次、信号、验证事实和收口草稿
14
+ - 通过 Pi executor 执行只读规划、评审和诊断
15
+ - 通过 Pi executor 的 `toolProfile: "write"` 执行有边界的写代码任务;Cursor executor 保留为显式启用的可选后端
16
+ - 通过 shell executor 运行确定性的验证命令
17
+ - 检查任务状态、运行态工件、文档链接和源码结构等治理规则
18
+
19
+ ## 目录结构
20
+
21
+ | 路径 | 用途 |
22
+ |---|---|
23
+ | `src/` | CLI、命令、工作流、执行器、任务运行时、治理和共享 helper |
24
+ | `test/` | Vitest 回归测试 |
25
+ | `bin/loop-agent.js` | CLI 可执行入口 |
26
+ | `skills/` | loop-agent 和 DAG 模板引用的本地 skill 指令与参考资料 |
27
+ | `.harness/` | 任务、DAG、run、cache 和 live state 等运行态目录 |
28
+ | `docs/` | 治理文档、工作流规则、执行计划、报告和模板 |
29
+ | `website/` | Docusaurus 用户文档站 |
30
+ | `examples/` | 可复用 DAG 示例 |
31
+ | `scripts/` | 仓库验证和维护脚本 |
32
+
33
+ ## 安装
34
+
35
+ ```bash
36
+ npm install
37
+ ```
38
+
39
+ 发布包 CLI 使用构建产物:
40
+
41
+ ```bash
42
+ npm run build
43
+ loop-agent --help
44
+ ```
45
+
46
+ 本地源码调试使用开发入口:
47
+
48
+ ```bash
49
+ npm run dev -- --help
50
+ ```
51
+
52
+ 如果要用 loop-agent 迭代 loop-agent 本仓库,不要使用当前工作区的 `npm link` 或 `npm run dev` 作为控制器。应安装 npm 上已发布版本,让已安装的稳定版本操作当前仓库。首次安装或有意升级时使用 `@latest`,启动一次自举任务后不要在任务中途升级控制器:
53
+
54
+ ```bash
55
+ npm install -g @tea-agent/loop-agent@latest
56
+ npm list -g @tea-agent/loop-agent --depth=0
57
+ loop-agent doctor
58
+ loop-agent run-dag --dag <temp-dir>/<task-id>-dag.json --cwd <repo-root>
59
+ ```
60
+
61
+ `@latest` 只用于安装或升级,不要在 DAG 节点里反复用 `npx @latest` 拉取。自举任务应记录 `npm list -g` 显示的实际版本号。
62
+
63
+ 发布包包含静态运行和指导资料:`bin/`、`dist/`、`skills/`、`docs/*.md`、`docs/templates/`、`examples/`、`harness.json`、`AGENTS.md`、`README.md` 和 `CHANGELOG.md`。`docs/progress/`、`docs/reports/`、`docs/exec-plans/`、`docs/decisions/` 等目录下的任务正文是目标仓库实时生成或历史事实;npm 包只携带这些目录的 README,不携带本仓库已有历史记录。
64
+
65
+ 发布包可作为任意目标项目的稳定控制器。DAG skill 指令优先从目标项目或用户配置目录解析;目标项目未提供本地 `skills/` 时,CLI 会回退到 npm 包内置的 `skills/`。因此普通项目不需要复制 loop-agent 仓库历史文档或内置 skills 才能获得默认 DAG 能力。
66
+
67
+ ## 常用命令
68
+
69
+ ```bash
70
+ npm run typecheck
71
+ npm test
72
+ bash scripts/check-repo.sh
73
+ bash scripts/ci.sh
74
+ npm run docs:dev
75
+ npm run docs:build
76
+ ```
77
+
78
+ 跨平台约定:
79
+
80
+ - `scripts/*.sh` 是 Bash 脚本;Windows 上请通过 Git Bash 或已配置的兼容 Bash 运行,不要求使用 WSL 或 POSIX 路径。
81
+ - 实际文件操作和 `--output` / `--dag` / `--cwd` 参数使用当前平台原生路径。仓库内引用、JSON/Markdown 证据引用和 glob 约定可继续用 `/` 作为稳定分隔符。
82
+
83
+ 创建并运行一个任务 DAG:
84
+
85
+ ```bash
86
+ loop-agent new-task <task-id> "任务标题"
87
+ loop-agent dag run-task <task-id> --profile auto --strict-models --output <temp-dir>/<task-id>-dag.json
88
+ loop-agent dag validate --dag <temp-dir>/<task-id>-dag.json --strict-models --strict-governance
89
+ loop-agent run-dag --dag <temp-dir>/<task-id>-dag.json --cwd .
90
+ ```
91
+
92
+ `<temp-dir>` 表示平台原生临时目录;也可以省略 `--output`,再使用命令 JSON 输出里的 `outputPath`。
93
+
94
+ 一次性只读评审或有边界写入:
95
+
96
+ ```bash
97
+ loop-agent pi-prompt --cwd . --tools read,grep,find,ls "只读评审这个任务,不要编辑文件。"
98
+ loop-agent pi-prompt --cwd . --tools read,bash,edit,write,grep,find,ls "<包含 allowedPaths 和 forbiddenPaths 的有边界任务说明>"
99
+ ```
100
+
101
+ ## 文档站
102
+
103
+ 面向使用者的 Markdown 文档放在 `website/docs/`,通过 Docusaurus 渲染为静态 HTML。
104
+
105
+ ```bash
106
+ npm run docs:dev
107
+ npm run docs:build
108
+ npm run docs:serve
109
+ ```
110
+
111
+ 构建产物输出到 `website/build/`。仓库根目录的 `docs/` 仍然是治理根目录,不和用户文档站混用。
112
+
113
+ ## 验证原则
114
+
115
+ 选择能覆盖本次变更的最小命令:
116
+
117
+ - 文档或治理变更:`bash scripts/check-repo.sh`
118
+ - TypeScript 运行时代码变更:`npm run typecheck`
119
+ - 行为变更:`npm test`
120
+ - 完整本地门禁:`bash scripts/ci.sh`
121
+
122
+ Windows 上的 Bash 验证命令同样通过 Git Bash 或配置好的 Bash 执行;不要把 `/tmp`、`which`、POSIX shell builtin 等假设写进跨平台 CLI 逻辑。
123
+
124
+ 不要在没有新鲜验证结果的情况下声明完成。
125
+
126
+ ## 发布前检查
127
+
128
+ 发布 npm 包前至少运行:
129
+
130
+ ```bash
131
+ npm run typecheck
132
+ npm test
133
+ npm run build
134
+ node bin/loop-agent.js --help
135
+ npm pack --dry-run
136
+ ```
137
+
138
+ 发布入口 `bin/loop-agent.js` 只加载 `dist/cli.js`;`npm run dev -- <args>` 只用于源码开发和定位问题。
139
+
140
+ ## 改造来源
141
+
142
+ `loop-agent` 来自 `agent-memory/tools/code-agent` 的主仓库化改造。原型阶段的 `code-agent` 文档偏内部说明;当前仓库入口文档面向独立项目维护和使用。
143
+
144
+ 已完成的主仓库重构记录保留在源码仓库的历史 execution plans 中;发布包只携带目录说明和可复用运行资料。
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ import { fileURLToPath, pathToFileURL } from "node:url";
5
+
6
+ const packageRoot = dirname(dirname(fileURLToPath(import.meta.url)));
7
+ const cliEntry = join(packageRoot, "dist", "cli.js");
8
+
9
+ if (!existsSync(cliEntry)) {
10
+ console.error(
11
+ `loop-agent: cannot find built CLI at ${cliEntry}. Run \`npm run build\` before using the package bin.`,
12
+ );
13
+ process.exit(1);
14
+ }
15
+
16
+ try {
17
+ await import(pathToFileURL(cliEntry).href);
18
+ } catch (error) {
19
+ console.error(error instanceof Error ? error.message : String(error));
20
+ process.exit(1);
21
+ }
@@ -0,0 +1,91 @@
1
+ import path from 'node:path';
2
+ import { buildStepContextFiles } from './context.js';
3
+ import { loadHarnessManifest as coreLoadHarnessManifest } from '../governance/harness.js';
4
+ function getKeyRepoPaths(repoRoot, manifest) {
5
+ const keys = [];
6
+ for (const key of ['readme', 'agents', 'governanceIndex', 'principles', 'workflow', 'verificationMatrix', 'systemOverview', 'architectureBoundaries', 'repoMap', 'backlog']) {
7
+ const value = manifest.entrypoints[key];
8
+ if (value)
9
+ keys.push(path.join(repoRoot, value));
10
+ }
11
+ return keys.filter((filePath) => filePath.length > 0);
12
+ }
13
+ function getRepoFilesForStep(repoRoot, manifest, step, contextProfile) {
14
+ const slim = contextProfile === 'slim';
15
+ if (step === 'analyze') {
16
+ if (slim) {
17
+ return [path.join(repoRoot, 'harness.json')];
18
+ }
19
+ return getKeyRepoPaths(repoRoot, manifest);
20
+ }
21
+ if (step === 'spec') {
22
+ if (slim) {
23
+ return [
24
+ path.join(repoRoot, 'harness.json'),
25
+ ...['verificationMatrix', 'architectureBoundaries']
26
+ .map((key) => manifest.entrypoints[key])
27
+ .filter((value) => Boolean(value))
28
+ .map((value) => path.join(repoRoot, value)),
29
+ ];
30
+ }
31
+ return Array.from(new Set([
32
+ ...getKeyRepoPaths(repoRoot, manifest),
33
+ ...['principles', 'workflow', 'verificationMatrix', 'architectureBoundaries']
34
+ .map((key) => manifest.entrypoints[key])
35
+ .filter((value) => Boolean(value))
36
+ .map((value) => path.join(repoRoot, value)),
37
+ ]));
38
+ }
39
+ if (step === 'plan') {
40
+ if (slim) {
41
+ const keys = ['verificationMatrix', 'architectureBoundaries'];
42
+ return keys
43
+ .map((key) => manifest.entrypoints[key])
44
+ .filter((value) => Boolean(value))
45
+ .map((value) => path.join(repoRoot, value));
46
+ }
47
+ return ['principles', 'workflow', 'verificationMatrix', 'architectureBoundaries']
48
+ .map((key) => manifest.entrypoints[key])
49
+ .filter((value) => Boolean(value))
50
+ .map((value) => path.join(repoRoot, value));
51
+ }
52
+ return [];
53
+ }
54
+ async function getContextFilesForStep(repoRoot, manifest, taskId, step, taskConfig) {
55
+ const repoFiles = getRepoFilesForStep(repoRoot, manifest, step, taskConfig.contextProfile);
56
+ return buildStepContextFiles({
57
+ repoRoot,
58
+ manifest,
59
+ taskId,
60
+ step,
61
+ taskConfig,
62
+ repoFiles,
63
+ });
64
+ }
65
+ function getVerifyCommands(repoRoot, options) {
66
+ const quickCommands = [
67
+ {
68
+ args: ['bash', 'scripts/check-repo.sh'],
69
+ cwd: repoRoot,
70
+ label: 'repo governance checks',
71
+ },
72
+ ];
73
+ const standardCommands = [
74
+ {
75
+ args: ['bash', 'scripts/ci.sh'],
76
+ cwd: repoRoot,
77
+ label: 'full CI suite',
78
+ },
79
+ ];
80
+ if (options.preset === 'quick')
81
+ return quickCommands;
82
+ if (options.preset === 'standard')
83
+ return [...quickCommands, ...standardCommands];
84
+ return [...quickCommands, ...standardCommands];
85
+ }
86
+ export const aimaxAdapter = {
87
+ name: 'aimax',
88
+ loadHarnessManifest: coreLoadHarnessManifest,
89
+ getContextFilesForStep,
90
+ getVerifyCommands,
91
+ };
@@ -0,0 +1,32 @@
1
+ import { getArtifactPath } from '../shared/artifacts-core.js';
2
+ import { buildContextFiles } from '../shared/context-files.js';
3
+ import { getTaskDir, listTaskSourceFiles } from '../task/runtime.js';
4
+ import { getReferenceContextFiles } from '../shared/reference-context.js';
5
+ export async function buildStepContextFiles(input) {
6
+ const sourceFiles = await listTaskSourceFiles(input.repoRoot, input.taskId);
7
+ const taskDir = getTaskDir(input.repoRoot, input.taskId);
8
+ const referenceFiles = await getReferenceContextFiles(input.repoRoot, input.taskId, input.taskConfig);
9
+ const artifactFiles = input.step === 'plan'
10
+ ? [getArtifactPath(taskDir, 'analyze')]
11
+ : input.step === 'implement'
12
+ ? [getArtifactPath(taskDir, 'analyze'), getArtifactPath(taskDir, 'plan')]
13
+ : input.step === 'retrospective'
14
+ ? [
15
+ getArtifactPath(taskDir, 'analyze'),
16
+ getArtifactPath(taskDir, 'plan'),
17
+ getArtifactPath(taskDir, 'implement'),
18
+ getArtifactPath(taskDir, 'verify'),
19
+ `${taskDir}/logs/workflow.log`,
20
+ ]
21
+ : [];
22
+ const groups = input.step === 'analyze'
23
+ ? [sourceFiles, referenceFiles, input.repoFiles, artifactFiles]
24
+ : input.step === 'plan'
25
+ ? [sourceFiles, referenceFiles, artifactFiles, input.repoFiles]
26
+ : input.step === 'implement'
27
+ ? [sourceFiles, referenceFiles, artifactFiles, input.repoFiles]
28
+ : input.step === 'retrospective'
29
+ ? [artifactFiles, sourceFiles, referenceFiles, input.repoFiles]
30
+ : [sourceFiles, referenceFiles, input.repoFiles, artifactFiles];
31
+ return buildContextFiles(groups, input.taskConfig);
32
+ }
@@ -0,0 +1,28 @@
1
+ import { loadHarnessManifest } from '../governance/harness.js';
2
+ import { loopAgentAdapter } from './loop-agent.js';
3
+ import { aimaxAdapter } from './aimax.js';
4
+ const ADAPTERS = {
5
+ 'loop-agent': loopAgentAdapter,
6
+ aimax: aimaxAdapter,
7
+ };
8
+ export async function resolveAdapter(repoRoot, explicit) {
9
+ if (explicit) {
10
+ const adapter = ADAPTERS[explicit];
11
+ if (!adapter)
12
+ throw new Error(`unknown adapter: ${explicit}; valid options: ${Object.keys(ADAPTERS).join(', ')}`);
13
+ return adapter;
14
+ }
15
+ try {
16
+ const manifest = await loadHarnessManifest(repoRoot);
17
+ const adapter = ADAPTERS[manifest.project];
18
+ if (!adapter)
19
+ throw new Error(`no adapter registered for project "${manifest.project}"; valid options: ${Object.keys(ADAPTERS).join(', ')}`);
20
+ return adapter;
21
+ }
22
+ catch (error) {
23
+ if (error instanceof Error && error.message.includes('no adapter registered'))
24
+ throw error;
25
+ throw new Error(`failed to resolve adapter from ${repoRoot}/harness.json: ${error instanceof Error ? error.message : String(error)}`);
26
+ }
27
+ }
28
+ export { loopAgentAdapter, aimaxAdapter };
@@ -0,0 +1,98 @@
1
+ import path from 'node:path';
2
+ import { buildStepContextFiles } from './context.js';
3
+ import { loadHarnessManifest } from '../governance/harness.js';
4
+ function getKeyRepoPaths(repoRoot, manifest) {
5
+ const keys = [];
6
+ for (const key of ['readme', 'agents', 'governanceIndex', 'principles', 'workflow', 'verificationMatrix']) {
7
+ const value = manifest.entrypoints[key];
8
+ if (value)
9
+ keys.push(path.join(repoRoot, value));
10
+ }
11
+ return keys;
12
+ }
13
+ function getRepoFilesForStep(repoRoot, manifest, step, contextProfile) {
14
+ const slim = contextProfile === 'slim';
15
+ if (step === 'analyze') {
16
+ if (slim) {
17
+ return [path.join(repoRoot, 'harness.json')];
18
+ }
19
+ return getKeyRepoPaths(repoRoot, manifest);
20
+ }
21
+ if (step === 'spec') {
22
+ if (slim) {
23
+ const files = [path.join(repoRoot, 'harness.json')];
24
+ const verification = manifest.entrypoints.verificationMatrix;
25
+ if (verification)
26
+ files.push(path.join(repoRoot, verification));
27
+ return files;
28
+ }
29
+ return Array.from(new Set([
30
+ ...getKeyRepoPaths(repoRoot, manifest),
31
+ ...['principles', 'workflow', 'verificationMatrix']
32
+ .map((key) => manifest.entrypoints[key])
33
+ .filter((value) => Boolean(value))
34
+ .map((value) => path.join(repoRoot, value)),
35
+ ]));
36
+ }
37
+ if (step === 'plan') {
38
+ if (slim) {
39
+ const verification = manifest.entrypoints.verificationMatrix;
40
+ return verification ? [path.join(repoRoot, verification)] : [];
41
+ }
42
+ return ['principles', 'workflow', 'verificationMatrix']
43
+ .map((key) => manifest.entrypoints[key])
44
+ .filter((value) => Boolean(value))
45
+ .map((value) => path.join(repoRoot, value));
46
+ }
47
+ return [];
48
+ }
49
+ async function getContextFilesForStep(repoRoot, manifest, taskId, step, taskConfig) {
50
+ const repoFiles = getRepoFilesForStep(repoRoot, manifest, step, taskConfig.contextProfile);
51
+ return buildStepContextFiles({
52
+ repoRoot,
53
+ manifest,
54
+ taskId,
55
+ step,
56
+ taskConfig,
57
+ repoFiles,
58
+ });
59
+ }
60
+ function getVerifyCommands(repoRoot, options) {
61
+ const quickCommands = [
62
+ {
63
+ args: ['bash', 'scripts/check-repo.sh'],
64
+ cwd: repoRoot,
65
+ label: 'repo governance checks',
66
+ },
67
+ ];
68
+ const standardCommands = [
69
+ {
70
+ args: ['npm', 'run', 'typecheck'],
71
+ cwd: repoRoot,
72
+ label: 'loop-agent typecheck',
73
+ },
74
+ ];
75
+ const fullCommands = [
76
+ {
77
+ args: ['npm', 'test'],
78
+ cwd: repoRoot,
79
+ label: 'loop-agent tests',
80
+ },
81
+ ];
82
+ const selectedCommands = options.preset === 'quick'
83
+ ? quickCommands
84
+ : options.preset === 'standard'
85
+ ? [...quickCommands, ...standardCommands]
86
+ : [...quickCommands, ...standardCommands, ...fullCommands];
87
+ if (options.phase === 'final' || !options.quota || options.quota === 'full') {
88
+ return selectedCommands;
89
+ }
90
+ const maxCommands = options.quota === '1' ? 1 : 3;
91
+ return selectedCommands.slice(0, maxCommands);
92
+ }
93
+ export const loopAgentAdapter = {
94
+ name: 'loop-agent',
95
+ loadHarnessManifest,
96
+ getContextFilesForStep,
97
+ getVerifyCommands,
98
+ };
@@ -0,0 +1 @@
1
+ export {};