@tea-agent/loop-agent 0.20.1-beta.0 → 0.21.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/CHANGELOG.md +50 -0
- package/dist/application/dag/args.js +29 -0
- package/dist/application/dag/run-dag.js +3 -1
- package/dist/cli/command-definitions.js +15 -1
- package/dist/cli/program.js +11 -1
- package/dist/commands/dag-rerun-task.js +19 -0
- package/dist/commands/dag-rerun.js +111 -0
- package/dist/commands/init.js +7 -0
- package/dist/executors/dag-pi-executor.js +24 -0
- package/dist/executors/pi-executor.js +111 -36
- package/dist/executors/pi-sdk-executor.js +105 -29
- package/dist/executors/shell-executor.js +54 -11
- package/dist/shared/operator/capabilities.js +54 -0
- package/dist/worker/console/index.js +1 -1
- package/dist/worker/console/inspect-split.js +82 -0
- package/dist/worker/console/operation-runner.js +3 -1
- package/dist/worker/console/operation-store.js +1 -0
- package/dist/worker/console/operator-actions.js +153 -2
- package/dist/worker/console/operator-user-error.js +10 -0
- package/dist/worker/console/pi-readiness.js +4 -0
- package/dist/worker/console/recovery-cta.js +116 -5
- package/dist/worker/console/recovery-selection.js +107 -0
- package/dist/worker/console/resolve-dag-run-for-task.js +50 -11
- package/dist/worker/console/routes.js +20 -0
- package/dist/worker/console/sibling-controller.js +12 -7
- package/dist/worker/console/static/assets/index-CUDke82y.js +18 -0
- package/dist/worker/console/static/assets/index-wSEksVSO.css +1 -0
- package/dist/worker/console/static/index.html +2 -2
- package/dist/worker/loop-agent/loop-agent-client.js +43 -9
- package/dist/worker/observability/read-model.js +67 -1
- package/dist/worker/observe/static/constants.js +5 -0
- package/dist/worker/observe/static/format-pool.js +22 -3
- package/dist/worker/observe/static/index.html +1 -1
- package/dist/worker/observe/static/styles.css +32 -3
- package/dist/worker/observe/static/views/dag-inspector.js +2 -2
- package/dist/worker/run-task/run-task.js +23 -6
- package/dist/workflows/dag/backend-test-markdown-workflow.js +291 -97
- package/dist/workflows/dag/backend-test-result-contract.js +10 -4
- package/dist/workflows/dag/frontend-test-result-contract.js +64 -0
- package/dist/workflows/dag/init-hybrid.js +117 -64
- package/dist/workflows/dag/lifecycle.js +60 -4
- package/dist/workflows/dag/liveness-policy.js +250 -0
- package/dist/workflows/dag/node-execution.js +89 -6
- package/dist/workflows/dag/output-protocol.js +76 -0
- package/dist/workflows/dag/rerun-plan.js +611 -0
- package/dist/workflows/dag/rerun-run.js +497 -0
- package/dist/workflows/dag/rerun-task.js +284 -0
- package/dist/workflows/dag/retry-policy.js +20 -1
- package/dist/workflows/dag/runner.js +71 -1
- package/dist/workflows/dag/skill-snapshot.js +22 -3
- package/dist/workflows/dag/types.js +12 -0
- package/dist/workflows/dag/validate.js +11 -0
- package/dist/workflows/dag/workspace-checkpoint.js +163 -0
- package/docs/README.md +5 -5
- package/docs/architecture/dag-execution.md +11 -0
- package/docs/architecture/facts-and-state.md +1 -0
- package/docs/architecture/worker-and-feature.md +10 -0
- package/docs/templates/agent-dag.schema.json +17 -2
- package/docs/templates/backend-test-dag.generate-pytest.prompt.md +5 -2
- package/docs/templates/backend-test-dag.json +15 -15
- package/docs/templates/frontend-test-case-checklist.md +16 -1
- package/docs/templates/frontend-test-dag.generate-cases.prompt.md +26 -2
- package/docs/templates/frontend-test-dag.json +65 -6
- package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +4 -1
- package/harness.json +1 -1
- package/package.json +1 -1
- package/skills/loop-agent/references/command-reference.md +5 -0
- package/skills/loop-agent/references/hybrid-dag.md +2 -2
- package/skills/playwright-cli-case-generator/SKILL.md +35 -7
- package/dist/worker/console/static/assets/index-3vsjZJHq.js +0 -16
- package/dist/worker/console/static/assets/index-i1wV4LrY.css +0 -1
|
@@ -10,5 +10,8 @@ Resolve a single absolute browser base URL and record it explicitly in `context.
|
|
|
10
10
|
2. If no usable absolute `http://` / `https://` URL is found in `config.md` (or equivalent source facts), default to `http://localhost:5173`.
|
|
11
11
|
3. Never use production hosts. Prefer local / isolated non-production URLs.
|
|
12
12
|
4. Also record `baseUrlSource: config.md|<path>` or `baseUrlSource: default-localhost-5173` so later nodes can audit the choice.
|
|
13
|
-
5.
|
|
13
|
+
5. Write `environmentProbe: pending`. The environment preflight shell will replace this with `reachable`, `unreachable`, or `curl-unavailable` plus a structured `blockedReason` (for example `frontend-base-url-unreachable`).
|
|
14
|
+
6. Include the exact browser start prefix that generators must copy:
|
|
14
15
|
`playwright-cli open --browser=chrome --headed <resolved-base-url>`.
|
|
16
|
+
|
|
17
|
+
Do not claim the environment is reachable until preflight completes. Preflight does not start the application.
|
package/harness.json
CHANGED
package/package.json
CHANGED
|
@@ -303,6 +303,9 @@ loop-agent dag report [--run-id <run-id>] [--lifecycle active|paused|completed|a
|
|
|
303
303
|
loop-agent dag reconcile-run --run-id <run-id> # 只读检查 effectiveStatus 与恢复/收口资格
|
|
304
304
|
loop-agent dag reconcile-run --run-id <run-id> --action supersede --reason "..." # 显式保留证据并标记为任务已另行完成
|
|
305
305
|
loop-agent dag reconcile-run --run-id <run-id> --action abandon --reason "..." # 显式保留证据并收口为已放弃
|
|
306
|
+
loop-agent dag rerun --run-id <run-id> --from-node <node-id> --plan [--json] # 从节点重跑资格预检(不执行)
|
|
307
|
+
loop-agent dag rerun --run-id <run-id> --from-node <node-id> --plan-hash <sha256> --request-id <key> --reason "..." [--json] # 安全子图 continuation
|
|
308
|
+
loop-agent dag rerun-task --run-id <run-id> --reason "..." --request-id <key> [--profile auto] [--task-id <id>] [--json] # standalone 完整任务重跑
|
|
306
309
|
loop-agent dag reconcile-tasks --glob '<pattern>' # 仅报告的 task/run/artifact/verify drift audit
|
|
307
310
|
loop-agent dag final-verification <task-id> # 生成 closeout DAG,closeout artifact 后再 final verify
|
|
308
311
|
loop-agent dag decision inspect --run-id <run-id> [--node-id <node-id>] # dry-run envelope 重解析;除 run 缺失外 exit 0
|
|
@@ -323,6 +326,8 @@ loop-agent dag resume --run-id <run-id> # approve 后继续
|
|
|
323
326
|
- operator 聚焦最新 paused run 用 `dag report --paused-latest`(等同 `--lifecycle paused --latest`;勿与显式 `--lifecycle` 并用)。
|
|
324
327
|
- 需 operator 关注的 run 用 `dag report --failed-only`、`--latest`、`--action <recovery-action>` 收窄。category→action 映射见 `ai_workspace/loop-agent/agent-dag-recovery-playbook.md`。
|
|
325
328
|
- 只读扫描 `.harness/dag-runs/` 下所有 run 的生命周期 health issue 与建议 action 用 `dag doctor`(`advisoryOnly: true`;不 mutate facts)。
|
|
329
|
+
- `dag status` / `dag doctor` 的 runner heartbeat 只表示 lease;Pi meaningful progress 由 Provider/tool/output 活动决定。节点可显示 `quiet`、`suspected-stall`、`probing` 或 `needs-attention`,不要仅凭运行时长手工结束。
|
|
330
|
+
- Pi 默认 4h absolute max,`agent-worker` 默认不设置外层 `run-dag` wall-clock;显式 `worker.timeout_ms` 仍是 hard timeout。`termination-unconfirmed` 表示旧 attempt 的退出无法确认,禁止自动 retry,先保留现场并完成 operator 对账。
|
|
326
331
|
- approve/resume 前用 `dag status --run-id <id>` 看单次 lifecycle、`approvalFlow`、`hasHumanApproval`。
|
|
327
332
|
- lifecycle、raw status 与 liveness 冲突时先用 `dag reconcile-run --run-id <id>` 只读检查。只有 runner 已证明停止且 operator 明确给出 `supersede|abandon` 与 reason 时才允许收口;它保存原始 state,不把未执行节点标成成功。
|
|
328
333
|
- task status、source/artifacts、DAG outcome、verification 记录可能 drift 时用 `dag reconcile-tasks --glob '<pattern>'`。默认仅报告;`--patch` 显式且不能伪造 verification evidence。
|
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
前端专用链保留独立 contract/scout;plan 同时选择 Mock/API 策略并输出结构化 implementation contract。design initial pass 直接使用原计划,只有 request-revision 才运行 revision/final review;small-risk 只执行一次 design review。`frontend-prewrite-gate-shell` 合并生效 verdict、REQ/BR/AC 覆盖、Mock policy 和 contract 物化,是唯一写入授权。实现后 `frontend-verify-assess-shell` 合并 Mock/static/behavior/trace/assessment;只有 `eligible=true` 才运行同 writeSet 的 repair 和 `frontend-reverify-shell`。`frontend-review-context-shell` 绑定真实 diff 与有效验证证据后再 review/closeout。standard/high-risk 为 15 个顶层节点,small-risk 为 13;绿色路径执行 11 个节点、7 次 Pi。生成期 blocked Mock 只生成一个确定性阻塞节点且没有 writer。
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
> Backend-test Markdown-first:先由确定性环境 Shell 检查 clean env 中 Python/pytest、常见配置、conftest/fixture、test root、server entry 和 HTML renderer,失败时不消耗模型调用。随后 Pi 生成中文 README 索引与模块用例卡片并独立 Review `testcase/md
|
|
22
|
+
> Backend-test Markdown-first:先由确定性环境 Shell 检查 clean env 中 Python/pytest、常见配置、conftest/fixture、test root、server entry 和 HTML renderer,失败时不消耗模型调用。随后 Pi 生成中文 README 索引与模块用例卡片并独立 Review `testcase/md/**`。第 4 节点只把前置条件、操作步骤、预期结果作为必选章节,并检查 Case ID、业务 AC、步骤/预期和占位措辞;不校验需求来源引用有效性或 Markdown sensitive-shaped 内容。pytest writer 为每次真实接口调用记录脱敏、有界的请求 method/URL/参数摘要和响应 status/body 摘要。第 6 节点只扫描每条 Case 明确映射的 pytest 脚本,同时支持模块级函数和 pytest class 方法,并把缺少请求/响应日志、递归脱敏或有界截断证据记录为 advisory。第 4/6 节点均写 PASS/FAIL findings 而不阻断后续;pytest 仍只运行一次,生成 JUnit,并把 Markdown 名称/场景/脚本映射与同一 JUnit 合成为按测试概览、质量校验、失败概览、用例执行明细和技术证据组织的中文 self-contained HTML 与 Markdown facts。最终 Pi 按固定简洁结构汇总 advisory 状态、执行事实和 L-5 结论。active 流程不要求模型生成 backend-test 业务 JSON。
|
|
23
23
|
|
|
24
|
-
显式专用 `taskKind` 保持兼容并优先于任务源分类。`backend-test` 选择固定 **8 个真实顶层节点**的 Markdown-first DAG:环境硬门、Markdown cases、独立 Review
|
|
24
|
+
显式专用 `taskKind` 保持兼容并优先于任务源分类。`backend-test` 选择固定 **8 个真实顶层节点**的 Markdown-first DAG:环境硬门、Markdown cases、独立 Review/修订、第 4 节点 advisory Markdown 校验、pytest 转换、第 6 节点 scoped advisory traceability、单次 pytest + JUnit/HTML/facts、最终 Markdown 报告与 L-5。历史 JSON contract/materializer 可继续读取旧 DAG,但新 runtime/template 不再生成模型业务 JSON。`knowledge-sync` 与 `knowledge-graph-bootstrap` 继续通过各自显式 taskKind 选择知识回写/图谱开荒 DAG。治理等级仍由 `minimal|standard|reviewed|supervised` 推断。
|
|
25
25
|
|
|
26
26
|
### DAG workflow 层级
|
|
27
27
|
|
|
@@ -20,10 +20,20 @@ Playwright/Pytest 源码,也不修改被测应用。
|
|
|
20
20
|
|
|
21
21
|
## 输出
|
|
22
22
|
|
|
23
|
-
- 写 `index.md`、`manifest.json
|
|
23
|
+
- 写 `index.md`、`manifest.draft.json`(生成阶段;materialize 会写成
|
|
24
|
+
`manifest.json`)与独立 case 文件
|
|
24
25
|
`FE-<FEATURE>-<NNN>-<dimension>.md`;`dimension` 仅为 `core`、`boundary`、
|
|
25
26
|
`flow` 或 `backend`。
|
|
26
|
-
-
|
|
27
|
+
- **ID 契约(高频失败点,禁止混用)**:
|
|
28
|
+
- `caseId` / 文件名 = **用例 ID**,形态 `FE-<FEATURE>-<NNN>-<dimension>`
|
|
29
|
+
(例:`FE-LOGIN-001-core`)。**禁止**把验收标准写成 caseId
|
|
30
|
+
(错误:`AC-FE-001.md` / `caseId: "AC-FE-001"`)。
|
|
31
|
+
- `acIds` = **验收标准 ID 列表**,形态 `AC-FE-*` / `AC-*`
|
|
32
|
+
(例:`["AC-FE-001"]`)。**禁止**把用例 ID 放进 acIds
|
|
33
|
+
(错误:`acIds: ["FE-LOGIN-001-core"]`)。
|
|
34
|
+
- `casePath` 必须等于 `testcase/frontend/cases/<caseId>.md`;
|
|
35
|
+
`evidenceDir` 必须等于 `testcase/frontend/evidence/<caseId>/`。
|
|
36
|
+
- `manifest` 使用 `schemaVersion: 1`,每项只含 `caseId`、`casePath`、
|
|
27
37
|
`dimension`、`acIds`、`evidenceDir`。所有 ID、路径和 evidenceDir 必须唯一,
|
|
28
38
|
并位于 `testcase/frontend/` 内。
|
|
29
39
|
- `index.md` 按功能点列出 case、维度、AC、数据依赖、API 映射和预期执行状态。
|
|
@@ -31,9 +41,9 @@ Playwright/Pytest 源码,也不修改被测应用。
|
|
|
31
41
|
每个 case 必须包含:
|
|
32
42
|
|
|
33
43
|
1. 元信息:功能、CRUD 分类、维度、关联 AC、RAG 来源、API 映射状态与数据策略。
|
|
34
|
-
2.
|
|
35
|
-
3. 可独立执行的命令序列:使用 RAG `context.md` 中已解析的绝对 `baseUrl`(优先来自任务源 `config.md`;缺失时默认 `http://localhost:5173
|
|
36
|
-
`open --browser=chrome --headed <resolved-base-url
|
|
44
|
+
2. 前置条件:默认浏览器 session 中的登录状态、fixture/存量数据、清理责任;不得用 `-s=<case-id>` 建立 named session。
|
|
45
|
+
3. 可独立执行的命令序列:使用 RAG `context.md` 中已解析的绝对 `baseUrl`(优先来自任务源 `config.md`;缺失时默认 `http://localhost:5173`),必须以
|
|
46
|
+
`playwright-cli open --browser=chrome --headed <resolved-base-url>` 开始,禁止保留 `<base-url>` 占位符,也不得使用 `-s=<case-id>` 或其他 named session;再按需登录/数据准备、
|
|
37
47
|
`snapshot` 后优先使用元素引用、操作、UI 断言、可选 API 断言、cleanup、`close`。
|
|
38
48
|
4. 明确的 UI/API 预期与数据清理结果;无法满足的环境或数据依赖必须写为 `blocked`。
|
|
39
49
|
|
|
@@ -42,6 +52,14 @@ Playwright/Pytest 源码,也不修改被测应用。
|
|
|
42
52
|
`playwright-cli` skill 已声明的接口;不要生成 `requests --clear`、
|
|
43
53
|
`request-body` 或 `response-body`。
|
|
44
54
|
|
|
55
|
+
### playwright-cli-only(硬约束)
|
|
56
|
+
|
|
57
|
+
- 用例步骤只能使用 `playwright-cli` skill 已声明的命令语法。
|
|
58
|
+
- **禁止**裸 `playwright`、`npx playwright`、`playwright test`、`@playwright/test`、
|
|
59
|
+
Node Playwright API 或生成 Playwright/Pytest 源码。
|
|
60
|
+
- `playwright-cli` 不可用时不得降级到原生 Playwright;应写 blocked evidence,
|
|
61
|
+
`blockedReason: playwright-cli-unavailable`。
|
|
62
|
+
|
|
45
63
|
## 覆盖矩阵
|
|
46
64
|
|
|
47
65
|
| CRUD 类型 | 必选 | 条件 |
|
|
@@ -63,8 +81,18 @@ Playwright/Pytest 源码,也不修改被测应用。
|
|
|
63
81
|
|
|
64
82
|
- C-新增优先使用需求中给出的测试数据;仅在已授权 API 映射存在时才描述临时构造
|
|
65
83
|
与清理。
|
|
66
|
-
- R
|
|
67
|
-
|
|
84
|
+
- R 查询优先使用知识包登记的 fixture 或当前用户可见数据。
|
|
85
|
+
- **U/D 修改删除归属顺序(硬约束)**:
|
|
86
|
+
1. 仅操作可由**当前登录用户身份**与 UI/API 可观测归属字段共同证明的数据;
|
|
87
|
+
禁止只凭名称、猜测 ID 或列表顺序认定归属。
|
|
88
|
+
2. 当前用户无可用数据时,优先在当前用户上下文创建带 run/case 可追踪标记、
|
|
89
|
+
可清理的数据,再执行 U/D,并在 cleanup 中验证清理。
|
|
90
|
+
3. 无法安全创建时,仅可使用任务源/RAG 已确认且受路径/环境约束的 Mock,
|
|
91
|
+
并明确标注为 Mock(不得声称真实后端验证)。
|
|
92
|
+
4. 既无法证明归属、也无法安全创建或 Mock 时,写 `blocked` evidence,
|
|
93
|
+
`blockedReason` 使用:`current-user-data-unavailable` |
|
|
94
|
+
`data-ownership-unverifiable` | `safe-test-data-setup-unavailable`,不执行 U/D。
|
|
95
|
+
5. 禁止修改/删除其他用户数据、共享 fixture、生产数据或无法确认可清理的数据。
|
|
68
96
|
- 禁止使用生产 URL、真实用户凭据或不可清理的数据写入。无法证明隔离与清理时,
|
|
69
97
|
case 必须为 `blocked`。
|
|
70
98
|
|