@tea-agent/loop-agent 0.10.0 → 0.12.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.
- package/AGENTS.md +10 -2
- package/CHANGELOG.md +91 -24
- package/README.md +84 -12
- package/dist/application/dag/args.js +1 -12
- package/dist/application/dag/generate-task-dag.js +38 -2
- package/dist/application/dag/run-dag.js +11 -27
- package/dist/application/dag/validate-dag.js +13 -2
- package/dist/application/loop/run-action.js +0 -4
- package/dist/cli/command-definitions.js +44 -16
- package/dist/cli/program.js +40 -23
- package/dist/cli/update/notifier.js +117 -0
- package/dist/cli/update/npm-client.js +151 -0
- package/dist/cli/update/policy.js +58 -0
- package/dist/cli/update/state.js +68 -0
- package/dist/cli.js +33 -0
- package/dist/commands/cursor-prompt.js +42 -82
- package/dist/commands/dag-approve.js +36 -0
- package/dist/commands/delegate.js +75 -77
- package/dist/commands/doctor.js +0 -18
- package/dist/commands/init.js +547 -95
- package/dist/commands/instructions.js +7 -10
- package/dist/commands/loop.js +4 -20
- package/dist/commands/plan.js +50 -0
- package/dist/executors/config-core.js +0 -51
- package/dist/executors/dag-pi-executor.js +1 -1
- package/dist/executors/dag.js +0 -1
- package/dist/executors/index.js +0 -2
- package/dist/executors/model-routing.js +9 -9
- package/dist/executors/shell-executor.js +1 -1
- package/dist/governance/checks.js +6 -3
- package/dist/governance/exec-plans.js +545 -0
- package/dist/governance/manifest-types.js +24 -2
- package/dist/infrastructure/harness/loop-action-store.js +0 -3
- package/dist/records/harvest.js +2 -23
- package/dist/records/one-shot-runs.js +1 -1
- package/dist/shared/artifacts-core.js +24 -5
- package/dist/shared/output-truncation.js +37 -0
- package/dist/shared/package-metadata.js +488 -0
- package/dist/{executors/cursor-executor.js → sidecars/cursor-prompt/executor.js} +2 -42
- package/dist/sidecars/cursor-prompt/index.js +3 -0
- package/dist/sidecars/cursor-prompt/stream.js +121 -0
- package/dist/task/config-types.js +29 -12
- package/dist/task/delegate.js +9 -21
- package/dist/task/runtime.js +1 -2
- package/dist/worker/cli.js +32 -3
- package/dist/worker/delivery/final-verification.js +47 -11
- package/dist/worker/delivery/package.js +63 -10
- package/dist/worker/feature/run.js +60 -8
- package/dist/worker/loop-agent/loop-agent-client.js +329 -126
- package/dist/worker/observability/event-history.js +216 -0
- package/dist/worker/observability/read-model.js +338 -83
- package/dist/worker/observe/paths.js +17 -0
- package/dist/worker/observe/routes.js +165 -21
- package/dist/worker/observe/server.js +59 -1
- package/dist/worker/observe/static/api.js +27 -0
- package/dist/worker/observe/static/app.js +120 -2317
- package/dist/worker/observe/static/constants.js +148 -0
- package/dist/worker/observe/static/copy.js +67 -0
- package/dist/worker/observe/static/dag-helpers.js +172 -0
- package/dist/worker/observe/static/dag-model.js +72 -0
- package/dist/worker/observe/static/dom.js +61 -0
- package/dist/worker/observe/static/format-pool.js +67 -0
- package/dist/worker/observe/static/format.js +292 -0
- package/dist/worker/observe/static/index.html +300 -82
- package/dist/worker/observe/static/kpi.js +94 -0
- package/dist/worker/observe/static/relations.js +128 -0
- package/dist/worker/observe/static/router.js +85 -0
- package/dist/worker/observe/static/run-processing.js +148 -0
- package/dist/worker/observe/static/shell-chrome.js +68 -0
- package/dist/worker/observe/static/state.js +253 -0
- package/dist/worker/observe/static/styles.css +1720 -495
- package/dist/worker/observe/static/views/batch.js +226 -0
- package/dist/worker/observe/static/views/dag-graph.js +172 -0
- package/dist/worker/observe/static/views/dag-inspector.js +477 -0
- package/dist/worker/observe/static/views/dag.js +362 -0
- package/dist/worker/observe/static/views/dashboard.js +442 -0
- package/dist/worker/observe/static/views/failures.js +143 -0
- package/dist/worker/observe/static/views/feature.js +453 -0
- package/dist/worker/observe/static/views/pool.js +347 -0
- package/dist/worker/observe/static/views/run.js +453 -0
- package/dist/worker/observe/static/views/session-timeline.js +205 -0
- package/dist/worker/observe/static/views/shell.js +7 -0
- package/dist/worker/observe/static/views/task.js +260 -0
- package/dist/worker/observe/static/views/timeline.js +163 -0
- package/dist/worker/preflight.js +49 -1
- package/dist/worker/run-task/run-task.js +22 -12
- package/dist/worker/runner/run-ready.js +76 -12
- package/dist/worker/task-spec/schema.js +0 -1
- package/dist/workflows/dag/controller-identity.js +104 -0
- package/dist/workflows/dag/convergence/controller.js +1 -1
- package/dist/workflows/dag/executor-registry.js +0 -2
- package/dist/workflows/dag/init-hybrid.js +797 -27
- package/dist/workflows/dag/node-execution.js +183 -35
- package/dist/workflows/dag/repair-artifact.js +91 -0
- package/dist/workflows/dag/report.js +50 -0
- package/dist/workflows/dag/retry-policy.js +138 -0
- package/dist/workflows/dag/runner.js +77 -17
- package/dist/workflows/dag/runtime-contract.js +87 -0
- package/dist/workflows/dag/scheduler.js +7 -2
- package/dist/workflows/dag/sdd-embedded.js +128 -0
- package/dist/workflows/dag/skill-instructions.js +5 -4
- package/dist/workflows/dag/skill-snapshot.js +529 -0
- package/dist/workflows/dag/types.js +86 -10
- package/dist/workflows/dag/validate.js +73 -12
- package/dist/workflows/loop/actions/dag-action.js +0 -2
- package/dist/workflows/loop/actions/shared.js +1 -1
- package/dist/workflows/loop/actions.js +14 -31
- package/dist/workflows/loop/benchmark.js +1 -1
- package/dist/workflows/loop/index.js +1 -1
- package/dist/workflows/loop/policy/auto-policy.js +22 -14
- package/dist/workflows/loop/policy/path-patterns.js +13 -0
- package/docs/README.md +36 -33
- package/docs/agent-dag-recovery-playbook.md +1 -1
- package/docs/agent-dag-runner.md +28 -3
- package/docs/architecture/README.md +26 -0
- package/docs/architecture/dag-execution.md +140 -0
- package/docs/architecture/evolution.md +53 -0
- package/docs/architecture/facts-and-state.md +58 -0
- package/docs/architecture/runtime-boundaries.md +45 -17
- package/docs/architecture/system-overview.md +93 -0
- package/docs/architecture/worker-and-feature.md +81 -0
- package/docs/cursor-prompt-sidecar.md +36 -0
- package/docs/decisions/README.md +13 -1
- package/docs/design/README.md +43 -21
- package/docs/development-principles.md +2 -2
- package/docs/exec-plans/active/README.md +1 -3
- package/docs/exec-plans/completed/README.md +23 -0
- package/docs/feature-workflow.md +78 -4
- package/docs/harness-methodology-debugging.md +1 -1
- package/docs/harness-methodology-tdd.md +3 -3
- package/docs/init-surface.manifest.json +60 -25
- package/docs/loop-agent-harness.md +28 -4
- package/docs/progress/README.md +50 -1
- package/docs/reports/README.md +90 -18
- package/docs/skills/README.md +2 -1
- package/docs/skills/vetted-skill-registry.md +2 -1
- package/docs/templates/agent-dag-report.schema.json +23 -6
- package/docs/templates/agent-dag.base.json +0 -5
- package/docs/templates/agent-dag.final-verification.json +0 -5
- package/docs/templates/agent-dag.schema.json +70 -3
- package/docs/templates/agent-dag.supervised-implementation.json +9 -8
- package/docs/templates/backend-test-dag.generate-pytest.prompt.md +139 -0
- package/docs/templates/backend-test-dag.json +276 -0
- package/docs/templates/backend-test-dag.retrospect.prompt.md +125 -0
- package/docs/templates/backend-test-dag.review-cases.prompt.md +81 -0
- package/docs/templates/frontend-design-contract.md +33 -0
- package/docs/templates/frontend-task-constraints.md +25 -0
- package/docs/templates/frontend-task-requirement.md +61 -0
- package/docs/templates/harness.schema.json +10 -12
- package/docs/templates/hybrid-dag.json +1 -6
- package/docs/templates/interactive-ui-round2-experiment.md +1 -1
- package/docs/templates/product-line/task.yaml +0 -1
- package/docs/templates/project-start-checklist.md +2 -2
- package/docs/templates/worker-dogfood-evidence.md +28 -0
- package/docs/templates/worker-dogfood-setup.md +20 -0
- package/docs/verification-matrix.md +10 -0
- package/examples/decision-gate-agent-dag.json +87 -33
- package/examples/example-dag.json +0 -5
- package/examples/hybrid-loop-agent-dag.json +0 -5
- package/harness.json +7 -15
- package/package.json +22 -46
- package/scripts/check-product-line-docs.sh +10 -7
- package/skills/agent-worker/SKILL.md +37 -0
- package/skills/agent-worker/references/agent-worker-operator.md +43 -0
- package/skills/frontend-design-review/SKILL.md +59 -0
- package/skills/frontend-design-review/references/review-checklist.md +37 -0
- package/skills/frontend-implementation/SKILL.md +51 -0
- package/skills/frontend-implementation/references/code-standards.md +34 -0
- package/skills/frontend-implementation/references/design-spec.md +46 -0
- package/skills/frontend-implementation/references/node-contracts.md +32 -0
- package/skills/frontend-review/SKILL.md +53 -0
- package/skills/frontend-review/references/review-findings.md +42 -0
- package/skills/frontend-verification/SKILL.md +40 -0
- package/skills/frontend-verification/references/verification-checklist.md +56 -0
- package/skills/grill-me/SKILL.md +10 -0
- package/skills/grill-with-docs/SKILL.md +88 -0
- package/skills/grill-with-docs/adr-format.md +47 -0
- package/skills/grill-with-docs/context-format.md +60 -0
- package/skills/loop-agent/SKILL.md +11 -9
- package/skills/loop-agent/references/command-reference.md +14 -15
- package/skills/loop-agent/references/docs-converge.md +126 -0
- package/skills/loop-agent/references/harness-policy.md +7 -7
- package/skills/loop-agent/references/hybrid-dag.md +36 -20
- package/skills/loop-agent/references/long-running-loop.md +4 -6
- package/skills/loop-agent/references/multi-worktree.md +6 -6
- package/skills/loop-agent/references/orchestrator-and-interventions.md +3 -3
- package/skills/loop-agent/references/pi-subagent-assisted-mode.md +14 -11
- package/skills/loop-agent/references/task-workflow.md +1 -1
- package/skills/loop-agent/references/verification-and-failure-handling.md +6 -0
- package/skills/using-git-worktrees/SKILL.md +215 -0
- package/dist/commands/cursor-worker.js +0 -43
- package/dist/cursor-worker-entry.js +0 -8
- package/dist/executors/cursor-artifacts.js +0 -33
- package/dist/executors/cursor-execution-log.js +0 -81
- package/dist/executors/cursor-executor-artifacts.js +0 -134
- package/dist/executors/cursor-run.js +0 -115
- package/dist/executors/cursor-tool.js +0 -94
- package/dist/executors/cursor-worker-client.js +0 -223
- package/dist/executors/cursor-worker-protocol.js +0 -18
- package/dist/executors/cursor-worker-server.js +0 -54
- package/dist/executors/cursor-worker.js +0 -3
- package/dist/executors/cursor.js +0 -6
- package/dist/executors/dag-cursor-executor.js +0 -87
- package/dist/workflows/loop/actions/cursor-fix.js +0 -191
- package/dist/workflows/loop/policy/cursor-fix-policy.js +0 -31
- package/docs/cursor-executor-usage.md +0 -25
- package/docs/dynamic-workflow-dag-engine-roadmap.md +0 -1749
package/AGENTS.md
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
- 先验证基线,再叠加改动;如果当前基线已坏,优先定位基线问题。
|
|
18
18
|
- 完成定义必须可验证;不能靠删测试、降标准或模糊描述制造“完成”。
|
|
19
19
|
- 搜索先于实现;先查现有代码、文档、脚本、测试,避免重复造轮子或误判系统能力。
|
|
20
|
+
- 受治理 Agent runtime 只有 Pi:DAG writer 固定为 `implement-pi` / `repair-pi`;`cursor-prompt` 仅是显式手工 one-shot sidecar,不进入 Loop auto-execute 或 Delegate 自动写入。
|
|
20
21
|
- 在 DAG runtime 中,搜索/侦察是显式节点:标准路径是 Contract → Scout → Plan → Implement → Verify → Closeout/Handoff。
|
|
21
22
|
- init surface、runtime 边界、command registry、skill entry 和架构 import 方向是可机器校验的治理契约;相关细节以 `docs/init-surface.manifest.json`、`docs/architecture/runtime-boundaries.md`、`src/cli/command-definitions.ts`、`skills/loop-agent/` 和 `scripts/check-*.sh` 为准,顶层 `AGENTS.md` 只指路,不重复维护事实源。
|
|
22
23
|
- 本仓库既是 loop-agent 源项目,也是目标项目初始化体验的默认模板;任何新增命令、脚本、文档、skill、模板或发布包内容,都要判断它应由 npm 包内置提供,还是由 `loop-agent init` 投影到目标项目,避免出现“本项目能用、初始化项目缺能力”。
|
|
@@ -70,7 +71,7 @@
|
|
|
70
71
|
- `src/`:loop-agent 运行时代码
|
|
71
72
|
- `test/`:Vitest 测试套件
|
|
72
73
|
- `bin/loop-agent.js`:CLI 可执行入口
|
|
73
|
-
- `skills/`:loop-agent
|
|
74
|
+
- `skills/`:loop-agent 源仓库和 npm 包内置 skill 指令与参考资料;目标项目初始化后只生成 `.agents/skills/`,不再生成根 `skills/`。初始化还会向目标项目 `.gitignore` 合并 loop-agent managed block,忽略 `.harness/tasks/*`、`.harness/dag-runs/*`、`.harness/runs/*`、`.harness/init-surface.json`、`.harness/task-pool/*`、`.task-pool/`、`.worktrees/` 等运行态事实,但保留 `.harness/prompts/` 和目录占位可共享,不会整目录忽略 `.harness/`。
|
|
74
75
|
- `.harness/`:任务、DAG、run、cache 和 live state 等运行态目录
|
|
75
76
|
- `docs/`:治理文档、计划、报告和模板
|
|
76
77
|
- `website/`:Docusaurus 用户文档站
|
|
@@ -84,7 +85,7 @@
|
|
|
84
85
|
- 长期决策写入 `docs/`,不要只留在聊天里。
|
|
85
86
|
- 面向使用者的新增、修改、删除或修复,应同步更新根目录 `CHANGELOG.md`;保持版本级摘要即可,不写过细技术细节。
|
|
86
87
|
- 面向用户的中文更新日志、README 和说明文档应使用自然、结果导向的表达:先说明用户能获得什么或问题如何改善,保留必要的命令和产品术语,避免逐字翻译、内部实现细节和无意义的中英混杂。
|
|
87
|
-
- 涉及 `loop-agent init` 或目标项目投影的改动,必须同步考虑目标项目生成物:`AGENTS.md`、`README.md`、`harness.json`、`
|
|
88
|
+
- 涉及 `loop-agent init` 或目标项目投影的改动,必须同步考虑目标项目生成物:`AGENTS.md`、`README.md`、`harness.json`、`ai_workspace/loop-agent/`、`scripts/`、`.agents/skills/`、`.harness/prompts`、`.gitignore`(loop-agent runtime managed block)和 npm 包内置 assets;目标项目根 `docs/` 和根 `skills/` 的旧投影需要由 `init update --apply-safe` 安全迁移或退役。
|
|
88
89
|
- 涉及初始化能力演化时,按 `docs/init-surface.manifest.json` 与 `scripts/check-init-evolution-needed.sh` 分级处理:小改 advisory,中等 surface-check,高影响才需要模型审查;不要把所有小改动升级成重流程。
|
|
89
90
|
- 通用脚本、skill 和模板可以复制或投影;项目相关 README、验证命令、发布/维护脚本必须基于模板和目标项目真实文件生成,不假定目标项目是 TypeScript、Node、前端、后端或工具项目。
|
|
90
91
|
- 涉及 CLI command、skill entry、runtime boundary、import 方向或发布包范围时,同步更新对应文档、catalog/definition、治理脚本和测试,避免 README、skill reference、CLI help、npm 包内容互相漂移。
|
|
@@ -143,3 +144,10 @@ npm run docs:build
|
|
|
143
144
|
- 不要用 stub、假数据通路或注释承诺替代真正交付。
|
|
144
145
|
- 不要把个人机器的绝对路径写入仓库级 `AGENTS.md`、README、模板或发布包资料;个人工具配置应留在用户级配置或本机会话上下文。
|
|
145
146
|
- 不要只更新 loop-agent 本仓库体验而遗漏目标项目初始化体验;新增能力如果不能通过 npm 内置资料或 `loop-agent init` 到达目标项目,必须写清原因和替代入口。
|
|
147
|
+
|
|
148
|
+
## Cursor Cloud specific instructions
|
|
149
|
+
|
|
150
|
+
这些是 Cursor Cloud VM 上非显而易见、会反复踩的两个环境坑。标准命令仍以 `README.md` 与 `docs/verification-matrix.md` 为准,这里不重复。启动时的 update script 已执行 `nvm use 22` + `npm ci`。
|
|
151
|
+
|
|
152
|
+
- Node 版本:VM 默认 `node`(`/exec-daemon/node`)是 v22.14.0,但可选依赖 `@earendil-works/pi-ai` / `@earendil-works/pi-coding-agent` 要求 Node `>=22.19.0`,否则 `npm install`/`npm ci` 会静默跳过它们,导致 `npm run typecheck` 和 `npm run build` 报 `Cannot find module '@earendil-works/...'`。交互式 shell 默认仍是系统 node,跑任何 `npm install`/`npm ci` 前先执行 `nvm use 22`(已预装 v22.22.2)。
|
|
153
|
+
- Git 提交签名会让 git 密集型测试超时:全局 git 配置默认对每次 commit 用 `cursor-git-ssh-keygen`(`gpg.format=ssh` + `commit.gpgsign=true`)签名,该 helper 会间歇性卡住 7–30s,使 `test/worker/delivery/**`、`test/worker/feature/**` 等在临时仓库里做多次 commit 的用例撞上 15/30s 超时而失败(单独跑却能过)。跑 `npm test` 或任何会频繁 commit 的工作前,先对子进程 git 关闭签名:`export GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=commit.gpgsign GIT_CONFIG_VALUE_0=false`(或在目标仓库 `git config commit.gpgsign false`)。关闭后整套 `npm test` 约 60s 全绿。这只影响本地/测试环境,不改仓库代码。
|
package/CHANGELOG.md
CHANGED
|
@@ -4,36 +4,99 @@
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [0.12.0] - 2026-07-16
|
|
8
|
+
|
|
7
9
|
### 新增
|
|
8
10
|
|
|
9
|
-
-
|
|
11
|
+
- 只读 Pi DAG 节点支持 opt-in 安全重试:仅 planner/scout/reviewer/verifier/closeout 角色且无写入能力的 Pi 节点可声明 `retryPolicy`,在同一 run 内重试模型连接中断(`network`)、provider 限流(`rate-limit`)、临时不可用(`unavailable`)或请求 timeout。生成模板默认总尝试 3 次,手工配置最多 5 次,并使用有上限的指数退避。每次 attempt 保留独立证据,节点耗时、Token 与事件数按尝试聚合;后一次成功不会覆盖前一次失败证据。`quota`、`auth`、`invalid-output`、`write-guard` 与未知失败不重试;supervisor、implementer、writer、dynamic、shell、static、docs-only、decision-gate 节点声明策略会在校验阶段失败。未声明策略的历史 DAG 不新增 attempt artifact,行为保持不变。
|
|
12
|
+
- 新增 `taskKind: "backend-test"` 专用 DAG:从需求分析开始,生成并评审后端功能用例,再生成和执行 pytest 自动化,最后产出测试复盘报告;新 DAG 沿用当前 Pi-only runtime、版本化 runtime contract 与既有执行恢复机制。
|
|
13
|
+
|
|
14
|
+
### 修复
|
|
15
|
+
|
|
16
|
+
- `loop-agent init check-update` / `init update --apply-safe` 漏检初始化投影文件:fresh `init --profile full` 通过目录复制把整个 `docs/templates/` 与 `skills/`(镜像到 `.agents/skills/`)投影到目标项目,但期望 init surface 只跟踪其中一个子集。旧版本(如 0.11.0)初始化的项目升级 controller 后,缺失的 backend-test 模板、agent-dag schema/prompt、`loop-agent` 必需 references 等文件无法被报告或补齐,`check-update` 会错误返回 `ok: true`。现在期望 surface 会自动发现包内 `docs/templates/` 与 `skills/` 的所有文件并纳入校验;`check-update` 会报告全部缺失/陈旧 surface;`apply-safe` 会确定性补齐缺失文件,对无法证明 ownership 的旧文件仍保持 fail-safe(给出 model merge / human decision,不覆盖用户内容)。`scripts/check-init-surface.sh` 新增 drift 门,阻止“fresh init 会复制、surface 却不跟踪”的漂移。
|
|
17
|
+
|
|
18
|
+
## [0.11.0] - 2026-07-15
|
|
19
|
+
|
|
20
|
+
### 新增
|
|
21
|
+
|
|
22
|
+
- 受治理 DAG 的 repair 环节改为显式声明:`shell.repairArtifactGate` 新增 `repairNodeId`,新生成的 supervised DAG 会直接写明由哪个 Pi 修复节点承接 supervisor 的修订请求;旧 DAG 未声明时,只有在能唯一、安全地推导出下游 Pi 修复节点时才继续兼容,缺失、歧义或修复节点不满足受治理写入契约都会在执行前明确报错。
|
|
23
|
+
- 新生成的 DagSpec 升级为 `version: 3`,并携带必需的 `runtimeContract`(`agentRuntime` / `repairWriterProtocol` / 可选最低 controller 版本)。旧 controller 会因不认识 v3 而在解析阶段拒绝,新 controller 则在 `dag validate`、执行和 resume 前检查 capability 与最低版本,避免版本漂移运行到中途才失败;legacy v1/v2 DAG 继续可读。
|
|
24
|
+
- 每个新的 DAG run 必须把实际执行的 controller identity(package version、binary SHA-256、portable fingerprint)冻结为 run-owned 事实并记录内容哈希;identity 无法解析时不创建 run。`dag report` 会展示 identity 与 runtime-contract compatibility,resume 时重新校验;身份漂移、artifact 篡改或 legacy-unpinned run 都会拒绝继续。
|
|
25
|
+
- Observe R5:控制台前端拆为原生 ES modules(router/api/format/state/views 等),`app.js` 作轻量入口并 re-export 可测 API;统一 loading/empty/degraded/error 状态 helper;资源池支持可分享的 hash 筛选(`status`/`q`);不引入框架或构建器,R1–R4 路由/API/行为保持。
|
|
26
|
+
- Observe R4:Batch/Pool 有界事件历史 `GET /api/batches/:batchRunId/events` 与 `GET /api/events`(默认 limit 50、硬顶 200,opaque `cursor`/`nextCursor`,与 SSE/run 整数 `after` 分离);服务端尾部有界 JSONL 扫描;snapshot 事件归约容量硬顶并暴露 `projectionWarnings`;Pool 投影失败 fault-first,避免健康零值 KPI。
|
|
27
|
+
- Observe R3:`#/feature/:featureId` 决策详情(状态、AC 覆盖、blocking、risk、follow-ups、evidence、projectionWarnings);总览 Feature 可下钻;Feature/Task/Batch/Run/DAG 统一对象关系条,仅 snapshot 可证对象出链;建议命令仅可复制,与已执行事实分区。
|
|
28
|
+
- Observe R2:Batch 详情展示完整 summary(含 additive `recordErrors?`/`runErrors?`)、派生总耗时、Task 诊断列(失败分类、follow-up、harnessTaskId、起止)与页内安全 artifact preview;Worker Run 收敛为「主事实 / 执行过程 / 诊断证据」三层,Task/Batch/DAG 深链仅在 canonical 字段且 snapshot 命中时生成。`TaskSummary.batchRunId?` 对外保留。
|
|
29
|
+
- Observe R1:顶栏「资源池」与 `#/pool` 盘点当前 Worker Task(状态分布、最新 run、更新时间、失败分类);`#/task/:taskId` 下钻当前事实、真实关联 batch/run/DAG、失败证据与有界 run history(`GET /api/tasks/:taskId/runs`,limit/cursor,`retryOfWorkerRunId`)。`TaskSummary` additive `updatedAt?`;snapshot additive `taskPool.present` 区分未使用与空池。
|
|
30
|
+
- 新增版本更新提醒。发现新版本时可以直接确认升级;忽略某个版本后不会重复提醒,后续新版本仍会正常提示。可用 `LOOP_AGENT_DISABLE_UPDATE_CHECK=1` 关闭检查。
|
|
31
|
+
- 新增 `loop-agent plan create`、`plan complete` 和 `plan check`,统一维护执行计划及其索引,并在生成 DAG 前发现遗漏或不一致。
|
|
32
|
+
- 目标项目可以选择复用本地 SDD skills,为需求、设计、实现和评审节点补充方法指引;未安装时保持原有流程。
|
|
33
|
+
- 新增 `docs/architecture/` 全景、DAG 执行、Worker/Feature、运行态事实与演进五篇主题文档及目录索引,并在 npm package(不投影到 init)内可达。
|
|
34
|
+
- Worker 和 DAG 运行会固定本次使用的 loop-agent 版本与 skill 配置,避免执行过程中因环境变化产生不一致结果。
|
|
35
|
+
- 新增 `npm run self-host:canary -- --deterministic`,可在隔离环境中检查候选发布包是否能够接管常用 CLI、初始化和 DAG 流程。
|
|
36
|
+
- 新增可选的 `agent-worker` skill,为 Feature、Task、交付和失败恢复提供统一的操作指引。
|
|
37
|
+
- 文档站新增功能导览、架构导读与当前规划入口,并把文档收敛检查固化到 `skills/loop-agent`,减少站上文档与仓库治理文档漂移。
|
|
38
|
+
- 前端 DAG 的 repo-local skills 补齐节点输入、输出、证据和失败规则;前端规范会优先查知识库,失败时回退到当前项目 `openSpec/`。
|
|
39
|
+
- 目标项目旧布局迁移:`init check-update`(只读)报告旧根 `docs/` / `skills/` 可安全迁移的 loop-agent owned 文件、空目录和 `harness.json` 中已废弃的模型字段;`init update --apply-safe` 迁移确认未修改的文件、清理空目录并清理废弃字段,本地修改过、来源不明或目标冲突的文件只进入人工决策,不会被覆盖或删除。
|
|
40
|
+
|
|
41
|
+
### 变更
|
|
42
|
+
|
|
43
|
+
- `observe serve` 提高对外访问稳定性:HTTP keep-alive 默认约 65s(避免 Node 5s 默认导致连接池复用失败),SSE 增加 keepalive comment 与 `X-Accel-Buffering: no`;新增 `--debug` 在 stderr 打印请求来源/方法/路径/状态/耗时。
|
|
44
|
+
- `observe serve` 允许显式绑定非 loopback 地址(如 `--host 0.0.0.0`)以便局域网访问;默认仍是 `127.0.0.1`,非本机绑定时会在 stderr 提示无鉴权风险。
|
|
45
|
+
- 根 README 在「核心概念」后增加极简「仓库地图」,方便一眼区分 `src/`、`skills/`、`.harness/`、`docs/` 等职责;细节仍以 `AGENTS.md` 与 `docs/README.md` 为准。
|
|
46
|
+
- 文档治理收敛:站上「当前规划」与 active plan 同步(无进行中计划时明确写出);`docs/README` 只索引核心契约与产物目录入口,progress/report 全量列表下沉到子目录 README;Dynamic Workflow 路线图迁入 `docs/design/`;补齐 design 漏索引与 DAG recovery playbook 入口。
|
|
47
|
+
- 活文档校准:Dynamic Workflow 路线图页首标明已落地 vs 设计输入(Pi-only);六个月规划第 1–2 月改为 archive/reports 指针;`repository-analysis` 冻结为基线快照,新增 `docs/reports/current-capability-summary.md`;落地 ADR 0001–0003(Pi-only、Task Pool 根、双树/docs-converge)。
|
|
48
|
+
- 统一 Feature Packet 的推荐目录和中文说明,相关检查同时兼容现有产品线目录。
|
|
49
|
+
- 目标项目初始化布局收敛:默认把 loop-agent 治理资料生成到 `ai_workspace/loop-agent/`,不再在目标项目根生成 `docs/`;`--profile full` 只把 repo-local skills 写到 `.agents/skills/`,不再生成根 `skills/`。
|
|
50
|
+
- `new-task` 不再预种 L1 空报告模板(`分析报告.md` / `实现计划.md` / `复盘报告.md`);任务 `artifacts/` 默认只保留 `修改记录.md` 与 `验证结果.md`,由 `promote-run` 从 completed run 回填。
|
|
51
|
+
- 运行期间修改 skill 不会影响当前任务,新配置会从下一次运行开始生效。
|
|
52
|
+
- Observe 自动刷新时会保留依赖图、检查器和日志的阅读位置,查看长时间任务时不再被频繁打断。
|
|
53
|
+
|
|
54
|
+
### 修复
|
|
55
|
+
|
|
56
|
+
- 修复 supervised convergence DAG 在 `process-gate-shell` 报「repair artifact gate cannot find downstream repair task」的问题:修复环节不再按固定节点名(历史上的 `repair-cursor` / `repair-pi`)猜测,而是根据 gate 声明的 `repairNodeId` 或唯一安全的下游 Pi 写入节点解析,合法的 `request-revision` 修订请求能正常走完 repair、hard verify 与 review。
|
|
57
|
+
- Observe UI R5:可变 UI 状态改为 `uiState` plain object,修复 Chrome 中 ES module namespace 赋值导致的路由崩溃;`app.js` 收为约 136 行 bootstrap/route/listeners/re-export,KPI、DAG helpers、run processing 与 shell chrome 迁入职责模块,移除 nullable `registerShell/getShell` locator;Pool grouped filters、四态、DAG inspector ARIA/方向键同步收敛,并通过 focused tests、构建治理与 fresh dist Chrome 验证。
|
|
58
|
+
- 前端 DAG 从 `需求.md` / `执行约束.md` 读取验证命令时不再交给 shell 解释执行;命令会先解析为受限参数列表并拒绝 shell 特殊语法,避免任务文本触发额外命令。
|
|
59
|
+
- 改进 Windows 下 Git Bash、npm 和集成测试的运行方式,减少环境识别错误与资源竞争导致的误失败。
|
|
10
60
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
|
|
19
|
-
|
|
61
|
+
## [0.10.0] - 2026-07-12
|
|
62
|
+
|
|
63
|
+
### 破坏性变更
|
|
64
|
+
|
|
65
|
+
- DAG、Loop、Delegate 和 Worker 统一使用 Pi,不再支持 Cursor executor 及相关旧配置。
|
|
66
|
+
- Cursor 仍可通过 `loop-agent cursor-prompt` 手动调用,但不再参与自动执行和受治理写入。
|
|
67
|
+
- Delegate 默认只创建 worktree;需要自动生成并执行 DAG 时必须显式使用 `--auto-run`。
|
|
68
|
+
|
|
69
|
+
### 迁移提示
|
|
70
|
+
|
|
71
|
+
1. 删除 harness 和 task 中的 Cursor executor 配置,只保留 `executors.pi`。
|
|
72
|
+
2. 把 `loopAutoWritePolicy` 改为 `loopAutoExecutionPolicy`(`off` | `approval-required` | `enabled`)。
|
|
73
|
+
3. 重新运行 `dag run-task` 并使用 `dag validate` 校验 DAG。
|
|
74
|
+
4. 需要 Cursor 人工辅助时使用 `loop-agent cursor-prompt`,完成后仍需运行项目验证命令。
|
|
75
|
+
|
|
76
|
+
### 新增
|
|
77
|
+
|
|
78
|
+
- `agent-worker feature review` 可汇总 Feature 状态、阻塞、验收覆盖、证据和下一步;`--json` 可供脚本读取。
|
|
79
|
+
- `agent-worker feature run` 可检查并推进一个就绪任务,`--dry-run` 可在不写入的情况下预览执行结果。
|
|
80
|
+
- 新增失败接续流程,可根据失败类型生成修复任务或人工行动建议,并在批准前保留原始失败证据。
|
|
81
|
+
- `feature run --git-mode checkpoint` 可为成功任务创建本地检查点,并在任务失败后恢复干净工作区;不会自动 push、merge 或创建远程 PR。
|
|
82
|
+
- 新增 `feature verify-final`、`feature delivery` 和 `feature closeout`,覆盖最终验证、交付材料和显式确认后的收尾操作。
|
|
83
|
+
- 晨报、Observe 和 `report metrics` 会集中展示 Feature 状态、下一步、验收覆盖和统计口径。
|
|
84
|
+
- 初始化演化检查可以复用仍然有效的历史审查结果,减少低影响后续改动造成的重复评审。
|
|
20
85
|
|
|
21
86
|
### 修改
|
|
22
87
|
|
|
23
|
-
-
|
|
24
|
-
- Agent DAG
|
|
25
|
-
- Dashboard
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
- 修复旧版(未写 runner 心跳元数据)的运行中 DAG 被 Observe 误判为不活跃的问题:`effectiveStatus=unknown` 只表示活性证据不足,不再覆盖 `lifecycle=active` 且原始 `status` 为 `running`/`pending` 的运行事实,也不再掩盖存在 RUNNING/PENDING 节点的运行。服务端健康计数(活跃运行、执行中节点、等待节点)与前端进行中 DAG 列表现在使用一致的判定语义;`paused`、`terminal`、`stale`、`orphaned` 等明确非活跃事实仍优先于原始 `running`。
|
|
36
|
-
- `npm test` 会先运行可并行的纯测试,再串行运行会启动 CLI 或子进程的集成测试。纯测试会根据机器可用并行度自动选择 1 至 4 个 Worker,低配和高配环境都能在稳定性与速度之间取得更合适的平衡。
|
|
88
|
+
- `design/` 已并入 `docs/design/`,设计资料统一从治理文档目录查找。
|
|
89
|
+
- Agent DAG 默认使用简体中文输出;可通过 `workflowPolicy.dag.outputLanguage: "en"` 切换为英文。
|
|
90
|
+
- Observe 和 Dashboard 更集中地展示运行状态、风险、模型、耗时和下一步,并减少已经结束任务中的无关诊断信息。
|
|
91
|
+
- 新增 `dag reconcile-run`,可在执行器已经停止后安全收尾历史失联的 DAG。
|
|
92
|
+
- DAG 详情的节点检查器、事件记录和风险区域更易阅读,长内容和异常状态也能得到清楚提示。
|
|
93
|
+
- 测试会根据机器资源安排并行和串行任务,降低资源竞争造成的不稳定。
|
|
94
|
+
|
|
95
|
+
### 修复
|
|
96
|
+
|
|
97
|
+
- 修复 `cursor-prompt --stream` 超时或异常后可能残留连接或进程的问题。
|
|
98
|
+
- 修复部分运行中 DAG 被误判为不活跃、状态颜色丢失以及风险统计重复的问题。
|
|
99
|
+
- 运行快照暂时无法生成时会明确提示指标不可用,不再显示具有误导性的全零状态。
|
|
37
100
|
|
|
38
101
|
## [0.9.0] - 2026-07-12
|
|
39
102
|
|
|
@@ -155,6 +218,8 @@
|
|
|
155
218
|
|
|
156
219
|
### 新增
|
|
157
220
|
|
|
221
|
+
- 新增 `frontend-implementation` 任务类型与专用 Agent DAG 模板,支持前端 contract / scout / design gate / implement / static verify / behavior verify / review gate / closeout 节点链,并附带 repo-local `frontend-implementation` skill 骨架。
|
|
222
|
+
- 补齐前端 DAG 的 repo-local skills:前端实现、design gate review、实现 review 和 verification closeout,并纳入 npm package / `loop-agent init --profile full` 初始化投影。
|
|
158
223
|
- `loop-agent init` 支持检查和更新已初始化项目,可提示缺失文件、过期配置和需要人工确认的变更。
|
|
159
224
|
- 新增 `--version`,可直接查看当前安装的 loop-agent 版本。
|
|
160
225
|
- 初始化内容和 npm 包内容会进行一致性检查,减少“本仓库可用、初始化项目缺文件”的情况。
|
|
@@ -173,6 +238,8 @@
|
|
|
173
238
|
|
|
174
239
|
### 修复
|
|
175
240
|
|
|
241
|
+
- 前端 DAG 的 static / behavior shell 验证会优先使用任务源 `需求.md` / `执行约束.md` 中声明的前端验证命令,避免被通用 adapter 验证命令覆盖。
|
|
242
|
+
- 前端 DAG 节点不再默认注入通用 DAG role skills,改为只加载节点显式声明的前端 skills,避免前端 skill references 被上下文预算挤出。
|
|
176
243
|
- 修复完整测试运行时,部分真实命令可能因默认超时时间过短而失败的问题。
|
|
177
244
|
|
|
178
245
|
## [0.2.0] - 2026-07-05
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
`loop-agent` 是面向 AI coding agent 的仓库级任务运行时和治理工具。它把一次研发任务组织成可生成、可校验、可执行、可恢复、可交接的 Agent DAG,并用 `.harness/`、`docs/` 和 shell verification 记录执行事实、长期治理资料和完成依据。
|
|
4
4
|
|
|
5
|
-
它可以作为任意目标项目的稳定控制器:初始化目标项目后,项目会获得
|
|
5
|
+
它可以作为任意目标项目的稳定控制器:初始化目标项目后,项目会获得 `.agents/skills/`、`ai_workspace/loop-agent/` 治理资料、验证脚本、任务运行态目录和模型执行指引,使 agent 在目标项目里的工作体验尽量与本仓库对齐。
|
|
6
6
|
|
|
7
7
|
## 快速开始
|
|
8
8
|
|
|
@@ -20,6 +20,22 @@ loop-agent --version
|
|
|
20
20
|
loop-agent --help
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
+
## 自动更新提醒
|
|
24
|
+
|
|
25
|
+
通过 npm 全局安装的 `loop-agent` 会在普通交互式命令成功结束后检查 `@tea-agent/loop-agent` 是否有新版本。提醒只写入 `stderr`,不会污染命令原本的 `stdout`;失败命令、CI、管道/重定向、`--help`、`--version`、JSON/Markdown 输出以及 DAG/Loop/Delegate/Pi/Cursor 等 controller-sensitive 路径都会跳过。
|
|
26
|
+
|
|
27
|
+
如果你拒绝版本 A,当前系统用户下不会再提醒 A;之后发布版本 B 时会继续提醒。确认更新时,CLI 会先证明当前安装来自同一 npm global root,然后安装刚确认的精确版本,例如:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm install -g @tea-agent/loop-agent@0.12.0
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
需要完全关闭自动检查时设置:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
LOOP_AGENT_DISABLE_UPDATE_CHECK=1
|
|
37
|
+
```
|
|
38
|
+
|
|
23
39
|
检查当前项目的 loop-agent 配置:
|
|
24
40
|
|
|
25
41
|
```bash
|
|
@@ -38,7 +54,7 @@ loop-agent inspect
|
|
|
38
54
|
|
|
39
55
|
然后运行 `loop-agent init instructions --repo-root .`,按指引使用 full + merge 初始化。需要选择 provider/model,或涉及凭据、成本、部署副作用时先问我;其他能安全默认的选项直接继续。
|
|
40
56
|
|
|
41
|
-
初始化后请立刻探索当前项目的 README、manifest/build/config 文件和源码目录,补全根 README 的项目概览、技术栈/目录结构、开发与验证命令,并同步更新 `
|
|
57
|
+
初始化后请立刻探索当前项目的 README、manifest/build/config 文件和源码目录,补全根 README 的项目概览、技术栈/目录结构、开发与验证命令,并同步更新 `ai_workspace/loop-agent/verification-matrix.md` 和必要的 `scripts/ci-tests.sh`。
|
|
42
58
|
|
|
43
59
|
最后运行 `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`,并汇报结果、假设和剩余风险。
|
|
44
60
|
```
|
|
@@ -51,7 +67,7 @@ loop-agent init --repo-root <target-repo> --profile full --merge
|
|
|
51
67
|
loop-agent init doctor --repo-root <target-repo>
|
|
52
68
|
```
|
|
53
69
|
|
|
54
|
-
`init instructions` 会输出给模型/Agent 执行完整初始化的指引包,不要求目标项目已有 `harness.json`。默认初始化会 merge 已有 `AGENTS.md`、`harness.json` 和
|
|
70
|
+
`init instructions` 会输出给模型/Agent 执行完整初始化的指引包,不要求目标项目已有 `harness.json`。默认初始化会 merge 已有 `AGENTS.md`、`harness.json` 和 loop-agent 治理资料,生成语言无关的治理脚本矩阵、中文根 README 入口、`ai_workspace/loop-agent/` 目标项目治理资料、`.agents/skills/` repo-local skills、`harness.json` IDE schema 指引和 `.harness/` 骨架;不会在目标项目根目录生成 `skills/`,也不会把 loop-agent 生成的治理资料写到根 `docs/`。已有 README 会保留用户正文并插入/更新 loop-agent managed block。初始化还会向 `.gitignore` 合并一个 loop-agent managed block(`# LOOP_AGENT_INIT_START/END`),把 `.harness/tasks/*`、`.harness/dag-runs/*`、`.harness/runs/*`、`.harness/live/`、`.harness/cache/`、`.harness/init-surface.json`、`.harness/task-pool/*`、`.task-pool/`、`.worktrees/` 等个人/会话运行态事实忽略掉,同时保留 `.harness/prompts/` 和目录占位可共享,不会整目录忽略 `.harness/`,也不会覆盖用户已有的 ignore 规则。
|
|
55
71
|
|
|
56
72
|
新初始化会写入 `.harness/init-surface.json`,记录当前 controller 版本、初始化投影文件 hash 和 manifest hash。已用旧版本初始化的目标项目,可以用下面的维护入口对齐新版本初始化能力:
|
|
57
73
|
|
|
@@ -62,9 +78,9 @@ loop-agent init update --repo-root <target-repo> --bootstrap-surface
|
|
|
62
78
|
loop-agent init update --repo-root <target-repo> --apply-safe
|
|
63
79
|
```
|
|
64
80
|
|
|
65
|
-
`check-update` 只读报告 deterministic actions、model merge tasks、human decisions 和 recommended next
|
|
81
|
+
`check-update` 只读报告 deterministic actions、model merge tasks、human decisions 和 recommended next。期望 init surface 会自动发现包内 `docs/templates/` 与 `skills/` 的所有文件,因此 fresh `init --profile full` 投影到目标项目的每个 template/skill 文件都会被纳入校验。`update --bootstrap-surface` 为旧项目补 inferred baseline;`update --apply-safe` 只补缺失文件、目录和 managed block(包括过期的 `.gitignore` managed block),不覆盖已有但无法确认来源的本地文件;对在旧路径被用户修改过的遗留副本,会在对应标准路径上给出 model merge / human decision,不会静默用包内容覆盖。
|
|
66
82
|
|
|
67
|
-
当初始化由模型/Agent 执行时,它应把初始化当成一个自动化闭环:确认真正不能安全默认的 provider/model、治理根目录或凭据/成本问题后,运行 deterministic init,随后立刻读取目标项目真实文件,补全根 README 的项目概览、技术栈/目录结构、开发与验证命令,并同步适配 `
|
|
83
|
+
当初始化由模型/Agent 执行时,它应把初始化当成一个自动化闭环:确认真正不能安全默认的 provider/model、治理根目录或凭据/成本问题后,运行 deterministic init,随后立刻读取目标项目真实文件,补全根 README 的项目概览、技术栈/目录结构、开发与验证命令,并同步适配 `ai_workspace/loop-agent/verification-matrix.md` 和必要的 `scripts/ci-tests.sh`。
|
|
68
84
|
|
|
69
85
|
初始化生成的 `scripts/ci-tests.sh` 不假定目标项目是 TypeScript、Node、前端或后端项目。它会保守探测 `package.json`、`Makefile`、`go.mod`、`Cargo.toml`、Python 测试配置、Maven、Gradle、.NET 等常见入口,只运行实际存在且工具可用的命令;探测不到时会清楚提示需要由初始化模型或用户按目标项目实际技术栈补充。
|
|
70
86
|
|
|
@@ -79,8 +95,20 @@ loop-agent dag validate --dag <temp-dir>/<task-id>-dag.json --strict-models --st
|
|
|
79
95
|
loop-agent run-dag --dag <temp-dir>/<task-id>-dag.json --cwd .
|
|
80
96
|
```
|
|
81
97
|
|
|
98
|
+
当前 `dag run-task` 也支持按 `task.json.taskKind` 选择专用模板;`frontend-implementation` 会生成前端契约、design gate、静态验证、行为验证和 review gate 节点链,`backend-test` 会生成从需求分析、功能用例、pytest 自动化到测试复盘的专用节点链。
|
|
99
|
+
|
|
82
100
|
`<temp-dir>` 表示平台原生临时目录;也可以省略 `--output`,再使用命令 JSON 输出里的 `outputPath`。
|
|
83
101
|
|
|
102
|
+
非微小工作需要 exec-plan 时,使用确定性生命周期命令维护计划与索引;`new-task` 不会自动创建计划:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
loop-agent plan create <plan-id> "<title>"
|
|
106
|
+
loop-agent plan check
|
|
107
|
+
loop-agent plan complete <plan-id> --summary "<summary>"
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
`plan create` 优先复用目标项目模板并回退到发布包内置模板,create/complete 失败时会回滚多文件修改。`dag run-task` 在生成 DAG 草稿前运行同源索引检查,避免遗漏登记直到末端 verify 才暴露。
|
|
111
|
+
|
|
84
112
|
一次性只读评审或有边界写入:
|
|
85
113
|
|
|
86
114
|
```bash
|
|
@@ -103,6 +131,19 @@ agent-worker feature approve-followup --feature-dir <feature-dir> --followup-id
|
|
|
103
131
|
bash scripts/worker-nightly.sh <feature-dir> <target-repo> <batch-run-id>
|
|
104
132
|
```
|
|
105
133
|
|
|
134
|
+
写入型 Worker 入口会在目标仓库写入前解析并冻结实际启动的 `loop-agent` controller identity。自举或其他需要精确版本约束的批次,可以额外传入:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
agent-worker feature run \
|
|
138
|
+
--feature-dir <feature-dir> \
|
|
139
|
+
--repo <target-repo> \
|
|
140
|
+
--loop-agent-bin <published-loop-agent-entry> \
|
|
141
|
+
--expected-controller-version <version> \
|
|
142
|
+
--expected-controller-fingerprint <sha256:value>
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
identity 不只包含 semver,还包含绝对 launch spec、入口 SHA-256,以及覆盖 `package.json`、`bin/**`、`dist/**`、`skills/**` 的 portable package fingerprint。校验失败时会在 materialize、Task Pool `Running` 或其他目标仓库写入前停止,并保留实际 identity 供诊断。
|
|
146
|
+
|
|
106
147
|
`feature review` 是只读的 Feature 级入口。它从 Feature Packet 和现有 Task Pool 事实派生状态、required AC 覆盖、阻塞、证据和唯一主行动;默认输出简洁人类摘要,`--json` 输出稳定的 schemaVersion 1 读模型。它不会写入 Feature Packet 或 Task Pool。
|
|
107
148
|
|
|
108
149
|
`feature verify-final` 在 clean Delivery HEAD 上复用已完成的 `qa-execute` TaskSpec,执行独立、不会 promote/closeout 或移动 HEAD 的最终验证,并原子投影 canonical QA aggregate 与 HEAD-bound final-verification evidence。`feature delivery` 复用 checkpoint transaction,校验 branch/HEAD/clean、commit trailers、changed files、成功 run、QA、最终验证和 required AC 后,在 `.harness/task-pool/` 原子生成 Delivery manifest、Acceptance Coverage 与 `PR.md`;`--dry-run` 零写入。`feature closeout` 默认只预览 gates;显式 `--apply --owner <owner>` 才会在前后校验与整体回滚保护下写入 Feature Closeout,重复相同 facts 会幂等复用。
|
|
@@ -124,19 +165,40 @@ nightly wrapper 按 feature 互斥,保留批次/超时退出码,并输出 mo
|
|
|
124
165
|
- **Agent DAG**:把一次任务拆成 contract、scout、plan、implement、verify、closeout 等可审查节点。
|
|
125
166
|
- **`.harness/`**:记录 task、DAG run、one-shot run、cache 和 live state 等运行态事实。
|
|
126
167
|
- **`harness.json`**:描述项目名、治理根目录、模型路由、executor 和验证脚本;`docs/templates/harness.schema.json` 为 IDE 提供补全和字段说明,运行时仍由 Zod schema 校验。
|
|
127
|
-
- **repo-local skills
|
|
168
|
+
- **repo-local skills**:目标项目本地 skills 统一放在 `.agents/skills/`,便于项目定制 agent 行为并让外部 agent 自动发现。DAG skill 解析顺序为:用户配置目录 → `.agents/skills/` → 发布包内置 `skills/`。
|
|
169
|
+
- **可选 SDD skill 嵌入**:如果目标项目在 `.agents/skills/` 中提供 `SDD-requirement-analysis`、`SDD-design-analysis`、`SDD-implementation-test-review`,`dag run-task` 会把它们作为知识与方法补充追加到对应的 Contract、Plan、Implement/Repair、Verify、Review 节点。loop-agent 仍控制 DAG、状态、写入边界、验证和收口;不会自动运行 SDD 初始化/扫描 skill,也不会推进 `ai_workspace` 状态或归档。没有这些 repo-local skills 时,生成结果保持原有默认流程。
|
|
170
|
+
- **run-owned skill snapshot**:新 DAG run 会在任何节点执行前,把本次实际注入 prompt 的 resolved skill profiles 冻结到 run 自己的 `.runtime/skill-snapshot.json`。后续节点、dynamic child、approve/resume 都使用同一份 hash-anchored snapshot;run 内修改 skill 只会从下一次 run 生效。
|
|
171
|
+
- **controller identity**:`agent-worker` 把一次 Feature/batch 实际使用的发布包、入口、启动参数和 package 内容 fingerprint 固定下来,并把 identity 传播到 Worker、Task Pool、batch/Feature 与最终验证证据。
|
|
172
|
+
- **只读 Pi 节点安全重试**:仅 planner/scout/reviewer/verifier/closeout 这类没有仓库写入能力的 Pi 节点,遇到模型连接中断、provider 限流、临时不可用或 timeout 时,可在同一 run 内有界重试;生成模板会自动声明默认 `retryPolicy`(总尝试 3 次、最多可配置 5 次、指数退避、单次等待上限 30s)。每次 attempt 保留独立证据,耗时与 Token 用量按尝试聚合,后一次成功不覆盖前一次失败证据。`quota`/`auth`/`invalid-output`/`write-guard` 与未知失败不重试;supervisor、implementer、writer、dynamic、shell、static、docs-only、decision-gate 节点不重试。
|
|
173
|
+
- **`agent-worker` operator skill**:`skills/agent-worker/` 只负责 Feature Packet、TaskSpec、Task Pool、自举 release train 和失败恢复的外层路由;单个 DAG 实现、DAG kernel 修复和节点执行仍由 `loop-agent` 负责,该 skill 不进入默认 DAG role skills。
|
|
128
174
|
- **治理文档**:`docs/` 保存原则、工作流、验证矩阵、runtime 边界、计划和报告。
|
|
129
175
|
- **shell verification**:完成声明必须有可复现命令作为依据,而不是只靠聊天结论。
|
|
130
176
|
|
|
131
177
|
这些治理原则的设计思想吸收了 Anthropic 长时运行 agent harness、OpenAI Codex harness engineering、腾讯端到端 Harness Engineering 和社区 agent harness 实践:人类掌舵,智能体执行;仓库作为记录系统;任务小步推进;用结构化 handoff 与可复现验证跨 session 保持连续性。背景资料收录在 `website/docs/practices/`。
|
|
132
178
|
|
|
179
|
+
## 仓库地图
|
|
180
|
+
|
|
181
|
+
本仓库按职责分区;更细的开工协议与会话规则见 `AGENTS.md`,治理索引见 `docs/README.md`。
|
|
182
|
+
|
|
183
|
+
| 路径 | 职责 |
|
|
184
|
+
|---|---|
|
|
185
|
+
| `bin/`、`src/` | CLI 入口与运行时代码 |
|
|
186
|
+
| `skills/` | repo-local skill 指令与 references |
|
|
187
|
+
| `.harness/` | task、DAG run、cache、live state 等运行态事实 |
|
|
188
|
+
| `docs/` | 长期治理文档、计划、报告与模板 |
|
|
189
|
+
| `website/` | 面向使用者的文档站 |
|
|
190
|
+
| `scripts/`、`test/` | 验证脚本与测试套件 |
|
|
191
|
+
| `examples/` | 可复制 DAG 示例(默认不投影到目标项目) |
|
|
192
|
+
| `features/`、`dogfood/` | 样板 Feature Packet 与 dogfood 样本(本仓库维护用) |
|
|
193
|
+
| `harness.json`、`AGENTS.md`、`CONTEXT.md` | 项目配置、agent 开工地图与术语表 |
|
|
194
|
+
|
|
133
195
|
## 能力概览
|
|
134
196
|
|
|
135
197
|
- 生成、校验、执行和汇总 Agent DAG。
|
|
136
198
|
- 从任务说明生成标准 DAG,并按依赖顺序运行规划、实现、验证和收口节点。
|
|
137
199
|
- 维护 `loop` 长程任务状态,包括目标、轮次、信号、验证事实和收口草稿。
|
|
138
|
-
- 通过 Pi executor
|
|
139
|
-
- 保留
|
|
200
|
+
- 通过 Pi executor 执行只读规划、评审、诊断和有边界写入(唯一受治理 Agent writer)。
|
|
201
|
+
- 保留 `cursor-prompt` 作为显式、手工触发的 one-shot sidecar(不是受治理 DAG/Loop writer)。
|
|
140
202
|
- 通过 shell executor 运行确定性的验证命令。
|
|
141
203
|
- 检查任务状态、运行态工件、文档链接、skill entry 和 runtime boundary 等治理规则。
|
|
142
204
|
|
|
@@ -152,7 +214,7 @@ loop-agent examples copy example-dag.json --repo-root <target-repo>
|
|
|
152
214
|
|
|
153
215
|
## 迭代本仓库
|
|
154
216
|
|
|
155
|
-
如果要用 loop-agent 迭代 loop-agent
|
|
217
|
+
如果要用 loop-agent 迭代 loop-agent 本仓库,发布版本 N 必须作为整个维护批次的固定 controller,候选版本 N+1 只能在隔离安装槽中接受接棒验证。不要使用当前工作区的 `npm link` 或 `npm run dev` 作为 controller;首次安装或有意升级可用 `@latest`,但一次自举任务启动后不要中途升级或重新通过 PATH 解析入口。
|
|
156
218
|
|
|
157
219
|
```bash
|
|
158
220
|
npm install -g @tea-agent/loop-agent@latest
|
|
@@ -161,7 +223,17 @@ loop-agent doctor
|
|
|
161
223
|
loop-agent run-dag --dag <temp-dir>/<task-id>-dag.json --cwd <repo-root>
|
|
162
224
|
```
|
|
163
225
|
|
|
164
|
-
`@latest` 只用于安装或升级,不要在 DAG 节点里反复用 `npx @latest`
|
|
226
|
+
`@latest` 只用于安装或升级,不要在 DAG 节点里反复用 `npx @latest` 拉取。自举证据应记录 controller version、portable package fingerprint、候选 commit/tarball hash 和失败 run;semver 相同并不代表 package 内容相同。
|
|
227
|
+
|
|
228
|
+
源码仓库提供 repo-maintainer deterministic takeover canary。它打包候选、安装到临时隔离 slot,由维护脚本独立计算 canonical package fingerprint 并与候选实现交叉核对,再通过候选包内两个绝对入口执行 full init、doctor、inspect、docs audit、目标项目治理检查、Feature validation/dry-run 和一个只含 static/shell executor 的小型 DAG;所有子进程都有硬超时,PATH trap 证明没有回退全局 `loop-agent` / `agent-worker` 命令,run evidence 则证明没有观察到 Pi/model executor:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
npm run self-host:canary -- --deterministic --output <evidence.json>
|
|
232
|
+
# 或验证已经构建好的候选 tarball
|
|
233
|
+
npm run self-host:canary -- --deterministic --tarball <candidate.tgz> --output <evidence.json>
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
该脚本属于源码仓库维护入口,不进入发布包的 `files` surface;`--live` 当前明确拒绝执行。deterministic canary 证明候选包和 static/shell runtime 能接棒,但不会调度 Pi executor,也不承担 Pi skill source 解析证明;run-owned skill snapshot 的候选包解析由 snapshot 定向测试和真实 DAG 证据单独证明。
|
|
165
237
|
|
|
166
238
|
## 文档导航
|
|
167
239
|
|
|
@@ -205,11 +277,11 @@ Windows 上运行 `scripts/*.sh` 时使用 Git Bash 或已配置的兼容 Bash
|
|
|
205
277
|
|
|
206
278
|
## 发布包内容
|
|
207
279
|
|
|
208
|
-
发布包包含静态运行和指导资料:`bin/`、`dist/`、`skills
|
|
280
|
+
发布包包含静态运行和指导资料:`bin/`、`dist/`、`skills/`(包括 `loop-agent` 与可选的 `agent-worker` operator skill)、`docs/*.md`、`docs/architecture/runtime-boundaries.md`、`docs/skills/`、`docs/templates/`、`docs/init-surface.manifest.json`、`examples/`、`harness.json`、`AGENTS.md`、`README.md` 和 `CHANGELOG.md`。
|
|
209
281
|
|
|
210
282
|
`docs/progress/`、`docs/reports/`、`docs/exec-plans/`、`docs/decisions/` 等目录下的任务正文是目标仓库实时生成或历史事实;npm 包只携带这些目录的 README,不携带本仓库已有历史记录。
|
|
211
283
|
|
|
212
|
-
DAG skill
|
|
284
|
+
DAG skill 指令优先从用户配置目录和目标项目 `.agents/skills/` 解析;目标项目未提供本地 skill 时,CLI 会回退到 npm 包内置的 `skills/`。因此普通项目不需要复制 loop-agent 仓库历史文档或根 `skills/` 目录才可获得默认 DAG 能力。
|
|
213
285
|
|
|
214
286
|
## 发布前检查
|
|
215
287
|
|
|
@@ -16,12 +16,11 @@ function parseMaxConcurrent(value) {
|
|
|
16
16
|
}
|
|
17
17
|
export function parseDagRunTaskArgs(args, defaultCwd) {
|
|
18
18
|
if (args.length === 0) {
|
|
19
|
-
throw new Error("usage: dag run-task <task-id> [--output <path>] [--profile auto|minimal|standard|reviewed|supervised] [--strict-models] [--
|
|
19
|
+
throw new Error("usage: dag run-task <task-id> [--output <path>] [--profile auto|minimal|standard|reviewed|supervised] [--strict-models] [--execute] [--init-only] [--dry-run] [--cwd <dir>] [--max-concurrent N] [--run-id id] [--canvas-path <abs-path> | --canvas <name> [--canvases-dir <dir>]]");
|
|
20
20
|
}
|
|
21
21
|
let taskId;
|
|
22
22
|
let outputPath;
|
|
23
23
|
let strictModels = false;
|
|
24
|
-
let noCursor = false;
|
|
25
24
|
let execute = false;
|
|
26
25
|
let initOnly = false;
|
|
27
26
|
let dryRun = false;
|
|
@@ -50,10 +49,6 @@ export function parseDagRunTaskArgs(args, defaultCwd) {
|
|
|
50
49
|
strictModels = true;
|
|
51
50
|
continue;
|
|
52
51
|
}
|
|
53
|
-
if (arg === "--no-cursor") {
|
|
54
|
-
noCursor = true;
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
52
|
if (arg === "--execute") {
|
|
58
53
|
execute = true;
|
|
59
54
|
continue;
|
|
@@ -135,7 +130,6 @@ export function parseDagRunTaskArgs(args, defaultCwd) {
|
|
|
135
130
|
taskId,
|
|
136
131
|
outputPath: outputPath ? path.resolve(outputPath) : undefined,
|
|
137
132
|
strictModels,
|
|
138
|
-
noCursor,
|
|
139
133
|
execute,
|
|
140
134
|
initOnly,
|
|
141
135
|
dryRun,
|
|
@@ -257,7 +251,6 @@ export function parseRunDagArgs(args, defaultCwd) {
|
|
|
257
251
|
let dryRun = false;
|
|
258
252
|
let maxConcurrent;
|
|
259
253
|
let runId;
|
|
260
|
-
let noCursor = false;
|
|
261
254
|
let canvasPath;
|
|
262
255
|
let canvasName;
|
|
263
256
|
let canvasesDir;
|
|
@@ -288,9 +281,6 @@ export function parseRunDagArgs(args, defaultCwd) {
|
|
|
288
281
|
else if (arg === "--run-id") {
|
|
289
282
|
runId = args[++i];
|
|
290
283
|
}
|
|
291
|
-
else if (arg === "--no-cursor") {
|
|
292
|
-
noCursor = true;
|
|
293
|
-
}
|
|
294
284
|
else if (arg === "--canvas-path") {
|
|
295
285
|
canvasPath = args[++i];
|
|
296
286
|
}
|
|
@@ -335,7 +325,6 @@ export function parseRunDagArgs(args, defaultCwd) {
|
|
|
335
325
|
dryRun,
|
|
336
326
|
maxConcurrent,
|
|
337
327
|
runId,
|
|
338
|
-
noCursor,
|
|
339
328
|
canvasPath,
|
|
340
329
|
canvasName,
|
|
341
330
|
canvasesDir,
|
|
@@ -4,7 +4,9 @@ import { resolveShellCommands } from "../../executors/shell-executor.js";
|
|
|
4
4
|
import { parseDagSpec } from "../../workflows/dag/types.js";
|
|
5
5
|
import { pathMatchesPattern } from "../../shared/git-progress.js";
|
|
6
6
|
import { loadHarnessManifest } from "../../governance/harness.js";
|
|
7
|
+
import { assertExecPlanIndexConsistent } from "../../governance/exec-plans.js";
|
|
7
8
|
import { defaultHybridDagOutputPath, initHybridDagFromTask, } from "../../workflows/dag/init-hybrid.js";
|
|
9
|
+
import { loadTaskConfig } from "../../task/runtime.js";
|
|
8
10
|
import { validateDagUseCase } from "./validate-dag.js";
|
|
9
11
|
import { runDagUseCase } from "./run-dag.js";
|
|
10
12
|
const PLACEHOLDER_WRITESET_MARKER = "REPLACE/WITH";
|
|
@@ -14,7 +16,7 @@ function buildValidateInput(repoRoot, dagPath, parsed) {
|
|
|
14
16
|
dagPath,
|
|
15
17
|
strictModelMatrix: parsed.strictModels,
|
|
16
18
|
strictGovernance: false,
|
|
17
|
-
forbidExecutors:
|
|
19
|
+
forbidExecutors: [],
|
|
18
20
|
};
|
|
19
21
|
}
|
|
20
22
|
function shouldRunExecution(parsed) {
|
|
@@ -196,6 +198,13 @@ async function resolveProfileRouting(repoRoot, parsed, candidateProfile) {
|
|
|
196
198
|
}
|
|
197
199
|
export async function generateTaskDagUseCase(input) {
|
|
198
200
|
const { repoRoot, ...parsed } = input;
|
|
201
|
+
// Deterministic exec-plan preflight: fail closed on real index drift
|
|
202
|
+
// before any expensive DAG generation or execution. Empty/consistent
|
|
203
|
+
// repos stay compatible so the default DAG flow is unblocked.
|
|
204
|
+
await assertExecPlanIndexConsistent(repoRoot);
|
|
205
|
+
const taskConfig = await loadTaskConfig(repoRoot, parsed.taskId);
|
|
206
|
+
const isFrontendImplementationTask = taskConfig.taskKind === "frontend-implementation";
|
|
207
|
+
const isBackendTestTask = taskConfig.taskKind === "backend-test";
|
|
199
208
|
const candidateResult = await initHybridDagFromTask(repoRoot, parsed.taskId, {
|
|
200
209
|
outputPath: parsed.outputPath,
|
|
201
210
|
template: "standard-dag",
|
|
@@ -208,6 +217,34 @@ export async function generateTaskDagUseCase(input) {
|
|
|
208
217
|
codeChange: [],
|
|
209
218
|
reasons: ["dag run-task validate did not report governanceProfile"],
|
|
210
219
|
});
|
|
220
|
+
if (isFrontendImplementationTask) {
|
|
221
|
+
profileRouting.selectedTemplate = "frontend-implementation";
|
|
222
|
+
profileRouting.source = "taskKind";
|
|
223
|
+
profileRouting.routingReasons = [
|
|
224
|
+
'taskKind "frontend-implementation" selects the dedicated frontend DAG template',
|
|
225
|
+
];
|
|
226
|
+
if (parsed.profile === "auto") {
|
|
227
|
+
profileRouting.selectedByProfile =
|
|
228
|
+
resolveAutoRoutingProfile(profileRouting.candidateProfile);
|
|
229
|
+
}
|
|
230
|
+
else if (parsed.profileExplicit) {
|
|
231
|
+
profileRouting.selectedByProfile = parsed.profile;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
if (isBackendTestTask) {
|
|
235
|
+
profileRouting.selectedTemplate = "backend-test-dag";
|
|
236
|
+
profileRouting.source = "taskKind";
|
|
237
|
+
profileRouting.routingReasons = [
|
|
238
|
+
'taskKind "backend-test" selects the dedicated backend test DAG template',
|
|
239
|
+
];
|
|
240
|
+
if (parsed.profile === "auto") {
|
|
241
|
+
profileRouting.selectedByProfile =
|
|
242
|
+
resolveAutoRoutingProfile(profileRouting.candidateProfile);
|
|
243
|
+
}
|
|
244
|
+
else if (parsed.profileExplicit) {
|
|
245
|
+
profileRouting.selectedByProfile = parsed.profile;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
211
248
|
const initResult = profileRouting.selectedTemplate === "standard-dag"
|
|
212
249
|
? candidateResult
|
|
213
250
|
: await initHybridDagFromTask(repoRoot, parsed.taskId, {
|
|
@@ -258,7 +295,6 @@ export async function generateTaskDagUseCase(input) {
|
|
|
258
295
|
dryRun: parsed.dryRun,
|
|
259
296
|
maxConcurrent: parsed.maxConcurrent,
|
|
260
297
|
runId: parsed.runId,
|
|
261
|
-
noCursor: parsed.noCursor,
|
|
262
298
|
canvasPath: parsed.canvasPath,
|
|
263
299
|
canvasName: parsed.canvasName,
|
|
264
300
|
canvasesDir: parsed.canvasesDir,
|
|
@@ -1,30 +1,11 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
1
|
import { createDagEventObserver } from "../../workflows/dag/event-observer.js";
|
|
3
2
|
import { composeDagRunObservers } from "../../workflows/dag/observer-compose.js";
|
|
4
3
|
import { createDagCanvasObserver, resolveCanvasPath, } from "../../workflows/dag/canvas-observer.js";
|
|
5
4
|
import { loadDagSpecFromFile, runDag } from "../../workflows/dag/runner.js";
|
|
6
|
-
import { assertValidDagSpec
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
for (const task of raw.tasks ?? []) {
|
|
11
|
-
if (typeof task.id === "string")
|
|
12
|
-
map.set(task.id, task.executor);
|
|
13
|
-
}
|
|
14
|
-
return map;
|
|
15
|
-
}
|
|
16
|
-
function assertNoCursorTasks(spec, rawTaskExecutors) {
|
|
17
|
-
const issues = collectForbiddenExecutorIssues(spec, ["cursor"]);
|
|
18
|
-
if (issues.length === 0)
|
|
19
|
-
return;
|
|
20
|
-
const details = issues
|
|
21
|
-
.map((issue) => {
|
|
22
|
-
const implicitDefault = rawTaskExecutors.get(issue.taskId) === undefined;
|
|
23
|
-
return `task=${issue.taskId}${implicitDefault ? " (implicit cursor default)" : ""}`;
|
|
24
|
-
})
|
|
25
|
-
.join("; ");
|
|
26
|
-
throw new Error(`--no-cursor forbids cursor executor tasks: ${details}`);
|
|
27
|
-
}
|
|
5
|
+
import { assertValidDagSpec } from "../../workflows/dag/validate.js";
|
|
6
|
+
import { assertRuntimeContractCompatible } from "../../workflows/dag/runtime-contract.js";
|
|
7
|
+
import { DAG_CONTROLLER_CAPABILITIES } from "../../workflows/dag/runtime-contract.js";
|
|
8
|
+
import { resolveRunningControllerIdentity } from "../../shared/package-metadata.js";
|
|
28
9
|
function getCanvasFlushErrorMessage(error) {
|
|
29
10
|
return error instanceof Error ? error.message : String(error);
|
|
30
11
|
}
|
|
@@ -50,11 +31,14 @@ function buildRunDagNextSteps(runId) {
|
|
|
50
31
|
}
|
|
51
32
|
export async function runDagUseCase(input) {
|
|
52
33
|
const spec = await loadDagSpecFromFile(input.dagPath);
|
|
53
|
-
if (input.noCursor) {
|
|
54
|
-
const rawTaskExecutors = await loadRawTaskExecutorMap(input.dagPath);
|
|
55
|
-
assertNoCursorTasks(spec, rawTaskExecutors);
|
|
56
|
-
}
|
|
57
34
|
assertValidDagSpec(spec);
|
|
35
|
+
const runningIdentity = resolveRunningControllerIdentity();
|
|
36
|
+
assertRuntimeContractCompatible(spec, {
|
|
37
|
+
...DAG_CONTROLLER_CAPABILITIES,
|
|
38
|
+
...(runningIdentity
|
|
39
|
+
? { controllerVersion: runningIdentity.packageVersion }
|
|
40
|
+
: {}),
|
|
41
|
+
});
|
|
58
42
|
const resolvedCanvasPath = resolveCanvasPath({
|
|
59
43
|
canvasPath: input.canvasPath,
|
|
60
44
|
canvasName: input.canvasName,
|