@tea-agent/loop-agent 0.1.0 → 0.2.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 (100) hide show
  1. package/CHANGELOG.md +17 -1
  2. package/README.md +127 -92
  3. package/dist/adapters/index.js +3 -2
  4. package/dist/adapters/loop-agent.js +44 -2
  5. package/dist/application/dag/args.js +420 -0
  6. package/dist/application/dag/generate-task-dag.js +280 -0
  7. package/dist/application/dag/report-dag.js +14 -0
  8. package/dist/application/dag/run-dag.js +93 -0
  9. package/dist/application/dag/validate-dag.js +101 -0
  10. package/dist/application/loop/run-action.js +23 -0
  11. package/dist/cli/catalog.js +2 -237
  12. package/dist/cli/command-definitions.js +571 -0
  13. package/dist/cli/index.js +2 -0
  14. package/dist/cli/program.js +65 -1
  15. package/dist/cli/router.js +13 -0
  16. package/dist/cli-governance/active-residue-check.js +38 -0
  17. package/dist/commands/dag-report.js +6 -107
  18. package/dist/commands/dag-run-task.js +8 -466
  19. package/dist/commands/dag-validate.js +7 -179
  20. package/dist/commands/examples.js +90 -0
  21. package/dist/commands/init.js +1495 -0
  22. package/dist/commands/loop.js +57 -31
  23. package/dist/commands/pi-prompt.js +2 -9
  24. package/dist/commands/run-dag.js +7 -180
  25. package/dist/executors/cursor-executor-artifacts.js +3 -4
  26. package/dist/executors/cursor-worker-client.js +13 -3
  27. package/dist/executors/dag-cursor-executor.js +2 -3
  28. package/dist/executors/dag-pi-executor.js +3 -4
  29. package/dist/executors/dag-static-executor.js +2 -5
  30. package/dist/executors/pi-defaults.js +9 -0
  31. package/dist/executors/shell-executor.js +12 -20
  32. package/dist/governance/manifest-types.js +1 -0
  33. package/dist/infrastructure/harness/active-residue-policy.js +73 -0
  34. package/dist/infrastructure/harness/artifact-store.js +72 -0
  35. package/dist/infrastructure/harness/atomic-write.js +49 -0
  36. package/dist/infrastructure/harness/completed-facts-guard.js +40 -0
  37. package/dist/infrastructure/harness/loop-action-store.js +23 -0
  38. package/dist/infrastructure/harness/loop-store.js +41 -0
  39. package/dist/infrastructure/harness/one-shot-run-store.js +94 -0
  40. package/dist/infrastructure/harness/task-store.js +77 -0
  41. package/dist/records/one-shot-runs.js +26 -61
  42. package/dist/records/promotion.js +3 -4
  43. package/dist/shared/artifacts-core.js +5 -5
  44. package/dist/shared/logger.js +9 -15
  45. package/dist/task/delegate.js +4 -4
  46. package/dist/task/runtime.js +5 -7
  47. package/dist/task/state.js +6 -20
  48. package/dist/workflows/dag/convergence/controller.js +277 -0
  49. package/dist/workflows/dag/dynamic-runtime/condition.js +48 -0
  50. package/dist/workflows/dag/dynamic-runtime/loop-until.js +156 -0
  51. package/dist/workflows/dag/dynamic-runtime/map.js +185 -0
  52. package/dist/workflows/dag/dynamic-runtime/reduction.js +72 -0
  53. package/dist/workflows/dag/dynamic-runtime/shared.js +133 -0
  54. package/dist/workflows/dag/lifecycle.js +6 -5
  55. package/dist/workflows/dag/node-execution.js +262 -0
  56. package/dist/workflows/dag/run-store.js +36 -0
  57. package/dist/workflows/dag/runner.js +82 -1341
  58. package/dist/workflows/dag/scheduler.js +84 -0
  59. package/dist/workflows/dag/upstream-artifacts.js +20 -18
  60. package/dist/workflows/loop/actions/cursor-fix.js +191 -0
  61. package/dist/workflows/loop/actions/dag-action.js +130 -0
  62. package/dist/workflows/loop/actions/pi-review.js +267 -0
  63. package/dist/workflows/loop/actions/shared.js +157 -0
  64. package/dist/workflows/loop/actions/shell-verify.js +82 -0
  65. package/dist/workflows/loop/actions/types.js +1 -0
  66. package/dist/workflows/loop/actions/workflow-action.js +255 -0
  67. package/dist/workflows/loop/actions.js +55 -1212
  68. package/dist/workflows/loop/closeout.js +5 -4
  69. package/dist/workflows/loop/context.js +2 -3
  70. package/dist/workflows/loop/events.js +3 -2
  71. package/dist/workflows/loop/policy/auto-policy.js +104 -0
  72. package/dist/workflows/loop/policy/cursor-fix-policy.js +31 -0
  73. package/dist/workflows/loop/rounds.js +3 -3
  74. package/dist/workflows/loop/signals.js +4 -7
  75. package/dist/workflows/loop/state.js +11 -11
  76. package/docs/README.md +3 -2
  77. package/docs/architecture/runtime-boundaries.md +147 -0
  78. package/docs/exec-plans/active/README.md +4 -0
  79. package/docs/exec-plans/completed/README.md +6 -2
  80. package/package.json +2 -1
  81. package/skills/ai-engineering-context/SKILL.md +21 -21
  82. package/skills/loop-agent/SKILL.md +73 -188
  83. package/skills/loop-agent/references/README.md +6 -2
  84. package/skills/loop-agent/references/harness-policy.md +113 -113
  85. package/skills/loop-agent/references/learned/README.md +13 -13
  86. package/skills/loop-agent/references/long-running-loop.md +59 -0
  87. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +0 -2
  88. package/skills/loop-agent/references/verification-and-failure-handling.md +18 -0
  89. package/skills/requesting-code-review/SKILL.md +40 -40
  90. package/skills/requesting-code-review/code-reviewer.md +4 -4
  91. package/skills/systematic-debugging/CREATION-LOG.md +43 -43
  92. package/skills/systematic-debugging/SKILL.md +113 -113
  93. package/skills/systematic-debugging/condition-based-waiting.md +20 -20
  94. package/skills/systematic-debugging/defense-in-depth.md +27 -27
  95. package/skills/systematic-debugging/root-cause-tracing.md +38 -38
  96. package/skills/systematic-debugging/test-academic.md +6 -6
  97. package/skills/systematic-debugging/test-pressure-1.md +6 -6
  98. package/skills/systematic-debugging/test-pressure-2.md +2 -2
  99. package/skills/systematic-debugging/test-pressure-3.md +6 -6
  100. package/skills/verification-before-completion/SKILL.md +37 -37
package/CHANGELOG.md CHANGED
@@ -2,7 +2,23 @@
2
2
 
3
3
  这里记录每个版本面向使用者的主要变化。保持简短即可:新增、修改、修复或删除了什么,不需要展开实现细节。
4
4
 
5
- ## [0.1.0] - 未发布
5
+ ## [0.2.0] - 2026-07-05
6
+
7
+ ### 新增
8
+
9
+ - 新增 `loop-agent init` 初始化目标项目,包含模型指引输出、merge 初始化、初始化体检、repo-local skills 投影、语言无关治理脚本矩阵、runtime boundary 文档、skill entry/architecture boundary 检查和目标项目版治理文档;根 README 默认生成中文项目入口,并以 managed block 合并已有 README;模型执行初始化时必须在同一轮自动完成项目识别、README/验证矩阵适配和体检闭环;`examples` 改为工具内置查看/按需复制,不在初始化时默认写入目标仓库。
10
+
11
+ ### 修改
12
+
13
+ - `harness.json` 支持用 `adapter: "loop-agent"` 与真实项目名分离,目标项目无需把 `project` 写成 `loop-agent` 才能使用默认 adapter。
14
+ - README 重组为兼顾 npm/GitHub 展示和本仓库迭代导航的入口,明确区分快速开始、目标项目初始化、任务运行、核心概念、本仓库开发和发布包内容,并补充新项目初始化时可直接交给模型执行的提示词。
15
+
16
+ ### 修复
17
+
18
+ - npm 发布包范围纳入 `docs/architecture/runtime-boundaries.md`,确保 runtime boundary 治理文档随 0.2.0 包一起发布。
19
+ - Cursor DAG worker 在构建产物中使用 `.js` worker 入口且不依赖 `tsx`,避免发布包/本地 build 运行 Cursor 节点时先因 worker 入口解析失败。
20
+
21
+ ## [0.1.0] - 已发布
6
22
 
7
23
  ### 新增
8
24
 
package/README.md CHANGED
@@ -1,55 +1,113 @@
1
- # loop-agent
2
-
3
- `loop-agent` 是从 `agent-memory/tools/code-agent` 独立出来的 TypeScript 工作流运行时,用来支撑 AI coding agent 在一个仓库内完成可恢复、可验证、可交接的研发任务。
1
+ # loop-agent
4
2
 
5
- 它保留了原 `code-agent` 的核心思路:以 Agent DAG 为主路径,用 `.harness/` 记录运行态事实,用 shell verification 作为完成依据,并把长期治理、计划和交接资料沉淀到 `docs/`。
3
+ `loop-agent` 是面向 AI coding agent 的仓库级任务运行时和治理工具。它把一次研发任务组织成可生成、可校验、可执行、可恢复、可交接的 Agent DAG,并用 `.harness/`、`docs/` shell verification 记录执行事实、长期治理资料和完成依据。
6
4
 
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
- ## 安装
5
+ 它可以作为任意目标项目的稳定控制器:初始化目标项目后,项目会获得 repo-local skills、治理文档、验证脚本、任务运行态目录和模型执行指引,使 agent 在目标项目里的工作体验尽量与本仓库对齐。
34
6
 
35
- ```bash
36
- npm install
7
+ ## 快速开始
8
+
9
+ 到一个新项目时,可以直接对当前 agent 说:
10
+
11
+ ```text
12
+ 请用 loop-agent 完整初始化当前项目;如果本机没有 loop-agent,请先安装 @tea-agent/loop-agent@latest。按 init instructions 使用 full + merge 初始化,探索项目后补全 README 和验证命令,最后运行 doctor、inspect、docs audit 和 check-repo 并汇报结果。
37
13
  ```
38
14
 
39
- 发布包 CLI 使用构建产物:
15
+ 作为 CLI 使用时,安装已发布包:
40
16
 
41
17
  ```bash
42
- npm run build
18
+ npm install -g @tea-agent/loop-agent@latest
43
19
  loop-agent --help
44
20
  ```
45
21
 
46
- 本地源码调试使用开发入口:
22
+ 检查当前项目的 loop-agent 配置:
47
23
 
48
24
  ```bash
49
- npm run dev -- --help
25
+ loop-agent doctor
26
+ loop-agent inspect
50
27
  ```
51
28
 
52
- 如果要用 loop-agent 迭代 loop-agent 本仓库,不要使用当前工作区的 `npm link` 或 `npm run dev` 作为控制器。应安装 npm 上已发布版本,让已安装的稳定版本操作当前仓库。首次安装或有意升级时使用 `@latest`,启动一次自举任务后不要在任务中途升级控制器:
29
+ ## 初始化目标项目
30
+
31
+ 在新项目中,最简单的用法是让当前 agent 执行初始化。需要更稳的执行约束时,可以使用下面这段完整提示词:
32
+
33
+ ```text
34
+ 请用 loop-agent 完整初始化当前项目。
35
+
36
+ 如果本机还没有 `loop-agent` 命令,请先运行 `npm install -g @tea-agent/loop-agent@latest`,再记录 `npm list -g @tea-agent/loop-agent --depth=0` 的实际版本。
37
+
38
+ 然后运行 `loop-agent init instructions --repo-root .`,按指引使用 full + merge 初始化。需要选择 provider/model,或涉及凭据、成本、部署副作用时先问我;其他能安全默认的选项直接继续。
39
+
40
+ 初始化后请立刻探索当前项目的 README、manifest/build/config 文件和源码目录,补全根 README 的项目概览、技术栈/目录结构、开发与验证命令,并同步更新 `docs/verification-matrix.md` 和必要的 `scripts/ci-tests.sh`。
41
+
42
+ 最后运行 `loop-agent init doctor --repo-root .`、`loop-agent inspect --repo-root .`、`loop-agent docs audit --repo-root .`、`bash scripts/check-repo.sh`,如项目测试入口可识别也运行 `bash scripts/ci-tests.sh` 或 `bash scripts/ci.sh`,并汇报结果、假设和剩余风险。
43
+ ```
44
+
45
+ 如果手动运行 CLI,可以使用:
46
+
47
+ ```bash
48
+ loop-agent init instructions --repo-root <target-repo>
49
+ loop-agent init --repo-root <target-repo> --profile full --merge
50
+ loop-agent init doctor --repo-root <target-repo>
51
+ ```
52
+
53
+ `init instructions` 会输出给模型/Agent 执行完整初始化的指引包,不要求目标项目已有 `harness.json`。默认初始化会 merge 已有 `AGENTS.md`、`harness.json` 和 `docs/`,复制 repo-local `skills/`,生成语言无关的治理脚本矩阵、中文根 README 入口、目标项目版治理文档和 `.harness/` 骨架;已有 README 会保留用户正文并插入/更新 loop-agent managed block。
54
+
55
+ 当初始化由模型/Agent 执行时,它应把初始化当成一个自动化闭环:确认真正不能安全默认的 provider/model、治理根目录或凭据/成本问题后,运行 deterministic init,随后立刻读取目标项目真实文件,补全根 README 的项目概览、技术栈/目录结构、开发与验证命令,并同步适配 `docs/verification-matrix.md` 和必要的 `scripts/ci-tests.sh`。
56
+
57
+ 初始化生成的 `scripts/ci-tests.sh` 不假定目标项目是 TypeScript、Node、前端或后端项目。它会保守探测 `package.json`、`Makefile`、`go.mod`、`Cargo.toml`、Python 测试配置、Maven、Gradle、.NET 等常见入口,只运行实际存在且工具可用的命令;探测不到时会清楚提示需要由初始化模型或用户按目标项目实际技术栈补充。
58
+
59
+ ## 运行任务
60
+
61
+ 创建并运行一个标准 Agent DAG:
62
+
63
+ ```bash
64
+ loop-agent new-task <task-id> "任务标题"
65
+ loop-agent dag run-task <task-id> --profile auto --strict-models --output <temp-dir>/<task-id>-dag.json
66
+ loop-agent dag validate --dag <temp-dir>/<task-id>-dag.json --strict-models --strict-governance
67
+ loop-agent run-dag --dag <temp-dir>/<task-id>-dag.json --cwd .
68
+ ```
69
+
70
+ `<temp-dir>` 表示平台原生临时目录;也可以省略 `--output`,再使用命令 JSON 输出里的 `outputPath`。
71
+
72
+ 一次性只读评审或有边界写入:
73
+
74
+ ```bash
75
+ loop-agent pi-prompt --cwd . --tools read,grep,find,ls "只读评审这个任务,不要编辑文件。"
76
+ loop-agent pi-prompt --cwd . --tools read,bash,edit,write,grep,find,ls "<包含 allowedPaths 和 forbiddenPaths 的有边界任务说明>"
77
+ ```
78
+
79
+ ## 核心概念
80
+
81
+ - **Agent DAG**:把一次任务拆成 contract、scout、plan、implement、verify、closeout 等可审查节点。
82
+ - **`.harness/`**:记录 task、DAG run、one-shot run、cache 和 live state 等运行态事实。
83
+ - **`harness.json`**:描述项目名、治理根目录、模型路由、executor 和验证脚本。
84
+ - **repo-local skills**:目标项目本地的 `skills/` 优先于发布包内置 skills,便于项目定制 agent 行为。
85
+ - **治理文档**:`docs/` 保存原则、工作流、验证矩阵、runtime 边界、计划和报告。
86
+ - **shell verification**:完成声明必须有可复现命令作为依据,而不是只靠聊天结论。
87
+
88
+ ## 能力概览
89
+
90
+ - 生成、校验、执行和汇总 Agent DAG。
91
+ - 从任务说明生成标准 DAG,并按依赖顺序运行规划、实现、验证和收口节点。
92
+ - 维护 `loop` 长程任务状态,包括目标、轮次、信号、验证事实和收口草稿。
93
+ - 通过 Pi executor 执行只读规划、评审、诊断和有边界写入。
94
+ - 保留 Cursor executor 作为显式启用的可选后端。
95
+ - 通过 shell executor 运行确定性的验证命令。
96
+ - 检查任务状态、运行态工件、文档链接、skill entry 和 runtime boundary 等治理规则。
97
+
98
+ ## 内置示例
99
+
100
+ `examples/` 默认不复制到目标项目。可以通过工具内置命令查看或按需复制:
101
+
102
+ ```bash
103
+ loop-agent examples list
104
+ loop-agent examples show example-dag.json
105
+ loop-agent examples copy example-dag.json --repo-root <target-repo>
106
+ ```
107
+
108
+ ## 迭代本仓库
109
+
110
+ 如果要用 loop-agent 迭代 loop-agent 本仓库,控制器必须来自已发布的 npm 安装包。不要使用当前工作区的 `npm link` 或 `npm run dev` 作为控制器;首次安装或有意升级可用 `@latest`,但一次自举任务启动后不要在任务中途升级控制器。
53
111
 
54
112
  ```bash
55
113
  npm install -g @tea-agent/loop-agent@latest
@@ -60,68 +118,51 @@ loop-agent run-dag --dag <temp-dir>/<task-id>-dag.json --cwd <repo-root>
60
118
 
61
119
  `@latest` 只用于安装或升级,不要在 DAG 节点里反复用 `npx @latest` 拉取。自举任务应记录 `npm list -g` 显示的实际版本号。
62
120
 
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,不携带本仓库已有历史记录。
121
+ ## 文档导航
122
+
123
+ | 路径 | 用途 |
124
+ |---|---|
125
+ | `AGENTS.md` | 本仓库的 agent 开工协议、会话协议和长期工作规则 |
126
+ | `harness.json` | loop-agent 在本仓库的模型、executor、治理根目录和脚本配置 |
127
+ | `docs/README.md` | 治理文档索引 |
128
+ | `docs/verification-matrix.md` | 不同变更类型对应的验证命令 |
129
+ | `docs/architecture/runtime-boundaries.md` | runtime 层边界和依赖方向 |
130
+ | `skills/loop-agent/` | loop-agent skill 入口和 references |
131
+ | `examples/` | 可复用 DAG 示例 |
132
+ | `website/docs/` | 面向使用者的 Docusaurus 文档站内容 |
133
+
134
+ ## 本仓库开发
135
+
136
+ 本地源码开发:
64
137
 
65
- 发布包可作为任意目标项目的稳定控制器。DAG skill 指令优先从目标项目或用户配置目录解析;目标项目未提供本地 `skills/` 时,CLI 会回退到 npm 包内置的 `skills/`。因此普通项目不需要复制 loop-agent 仓库历史文档或内置 skills 才能获得默认 DAG 能力。
138
+ ```bash
139
+ npm install
140
+ npm run build
141
+ node bin/loop-agent.js --help
142
+ npm run dev -- --help
143
+ ```
144
+
145
+ 常用验证命令:
66
146
 
67
- ## 常用命令
68
-
69
147
  ```bash
70
148
  npm run typecheck
71
149
  npm test
72
150
  bash scripts/check-repo.sh
73
151
  bash scripts/ci.sh
74
- npm run docs:dev
75
152
  npm run docs:build
76
153
  ```
77
154
 
78
- 跨平台约定:
155
+ 当前 CLI 使用 `commander` 组织 command tree。顶层 help、子命令 help、参数解析和未知命令错误都由 commander 驱动。
79
156
 
80
- - `scripts/*.sh` Bash 脚本;Windows 上请通过 Git Bash 或已配置的兼容 Bash 运行,不要求使用 WSL 或 POSIX 路径。
81
- - 实际文件操作和 `--output` / `--dag` / `--cwd` 参数使用当前平台原生路径。仓库内引用、JSON/Markdown 证据引用和 glob 约定可继续用 `/` 作为稳定分隔符。
157
+ Windows 上运行 `scripts/*.sh` 时使用 Git Bash 或已配置的兼容 Bash,不要求使用 WSL 或 POSIX 路径。实际文件操作和 `--output` / `--dag` / `--cwd` 参数使用当前平台原生路径;仓库内引用、JSON/Markdown 证据引用和 glob 约定可继续用 `/` 作为稳定分隔符。
82
158
 
83
- 创建并运行一个任务 DAG:
159
+ ## 发布包内容
84
160
 
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
- ```
161
+ 发布包包含静态运行和指导资料:`bin/`、`dist/`、`skills/`、`docs/*.md`、`docs/architecture/runtime-boundaries.md`、`docs/templates/`、`examples/`、`harness.json`、`AGENTS.md`、`README.md` 和 `CHANGELOG.md`。
91
162
 
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
- 不要在没有新鲜验证结果的情况下声明完成。
163
+ `docs/progress/`、`docs/reports/`、`docs/exec-plans/`、`docs/decisions/` 等目录下的任务正文是目标仓库实时生成或历史事实;npm 包只携带这些目录的 README,不携带本仓库已有历史记录。
164
+
165
+ DAG skill 指令优先从目标项目或用户配置目录解析;目标项目未提供本地 `skills/` 时,CLI 会回退到 npm 包内置的 `skills/`。因此普通项目不需要复制 loop-agent 仓库历史文档或内置 skills 才能获得默认 DAG 能力。
125
166
 
126
167
  ## 发布前检查
127
168
 
@@ -136,9 +177,3 @@ npm pack --dry-run
136
177
  ```
137
178
 
138
179
  发布入口 `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 中;发布包只携带目录说明和可复用运行资料。
@@ -14,9 +14,10 @@ export async function resolveAdapter(repoRoot, explicit) {
14
14
  }
15
15
  try {
16
16
  const manifest = await loadHarnessManifest(repoRoot);
17
- const adapter = ADAPTERS[manifest.project];
17
+ const adapterName = manifest.adapter ?? manifest.project;
18
+ const adapter = ADAPTERS[adapterName];
18
19
  if (!adapter)
19
- throw new Error(`no adapter registered for project "${manifest.project}"; valid options: ${Object.keys(ADAPTERS).join(', ')}`);
20
+ throw new Error(`no adapter registered for project "${adapterName}"; valid options: ${Object.keys(ADAPTERS).join(', ')}`);
20
21
  return adapter;
21
22
  }
22
23
  catch (error) {
@@ -1,4 +1,5 @@
1
1
  import path from 'node:path';
2
+ import { readFileSync } from 'node:fs';
2
3
  import { buildStepContextFiles } from './context.js';
3
4
  import { loadHarnessManifest } from '../governance/harness.js';
4
5
  function getKeyRepoPaths(repoRoot, manifest) {
@@ -58,6 +59,10 @@ async function getContextFilesForStep(repoRoot, manifest, taskId, step, taskConf
58
59
  });
59
60
  }
60
61
  function getVerifyCommands(repoRoot, options) {
62
+ const manifestCommands = getManifestVerifyCommands(repoRoot, options.preset);
63
+ if (manifestCommands) {
64
+ return applyQuota(manifestCommands, options);
65
+ }
61
66
  const quickCommands = [
62
67
  {
63
68
  args: ['bash', 'scripts/check-repo.sh'],
@@ -84,11 +89,48 @@ function getVerifyCommands(repoRoot, options) {
84
89
  : options.preset === 'standard'
85
90
  ? [...quickCommands, ...standardCommands]
86
91
  : [...quickCommands, ...standardCommands, ...fullCommands];
92
+ return applyQuota(selectedCommands, options);
93
+ }
94
+ function applyQuota(commands, options) {
87
95
  if (options.phase === 'final' || !options.quota || options.quota === 'full') {
88
- return selectedCommands;
96
+ return commands;
89
97
  }
90
98
  const maxCommands = options.quota === '1' ? 1 : 3;
91
- return selectedCommands.slice(0, maxCommands);
99
+ return commands.slice(0, maxCommands);
100
+ }
101
+ function commandFromScript(repoRoot, label, command) {
102
+ return {
103
+ args: ['bash', '-lc', command],
104
+ cwd: repoRoot,
105
+ label,
106
+ };
107
+ }
108
+ function getManifestVerifyCommands(repoRoot, preset) {
109
+ try {
110
+ const manifest = JSON.parse(readFileSync(path.join(repoRoot, 'harness.json'), 'utf-8'));
111
+ const quick = typeof manifest.scripts?.quickVerify === 'string'
112
+ ? manifest.scripts.quickVerify
113
+ : undefined;
114
+ const standard = typeof manifest.scripts?.standardVerify === 'string'
115
+ ? manifest.scripts.standardVerify
116
+ : undefined;
117
+ const full = typeof manifest.scripts?.fullVerify === 'string'
118
+ ? manifest.scripts.fullVerify
119
+ : undefined;
120
+ if (!quick && !standard && !full)
121
+ return undefined;
122
+ const quickCommands = quick ? [commandFromScript(repoRoot, 'repo quick verification', quick)] : [];
123
+ const standardCommands = standard ? [commandFromScript(repoRoot, 'repo standard verification', standard)] : [];
124
+ const fullCommands = full ? [commandFromScript(repoRoot, 'repo full verification', full)] : [];
125
+ if (preset === 'quick')
126
+ return quickCommands;
127
+ if (preset === 'standard')
128
+ return [...quickCommands, ...standardCommands];
129
+ return [...quickCommands, ...standardCommands, ...fullCommands];
130
+ }
131
+ catch {
132
+ return undefined;
133
+ }
92
134
  }
93
135
  export const loopAgentAdapter = {
94
136
  name: 'loop-agent',