@tea-agent/loop-agent 0.13.0-beta.0 → 0.13.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 (282) hide show
  1. package/AGENTS.md +157 -155
  2. package/CHANGELOG.md +301 -322
  3. package/README.md +335 -345
  4. package/bin/agent-worker.js +22 -22
  5. package/bin/loop-agent.js +21 -21
  6. package/dist/commands/cursor-prompt.js +6 -6
  7. package/dist/commands/init.js +597 -528
  8. package/dist/commands/loop-benchmark.js +11 -11
  9. package/dist/commands/pi-reuse-benchmark.js +16 -16
  10. package/dist/executors/shell-executor.js +200 -21
  11. package/dist/infrastructure/evaluation/candidate-store.js +5 -1
  12. package/dist/sidecars/cursor-prompt/executor.js +1 -1
  13. package/dist/task/runtime.js +27 -27
  14. package/dist/worker/observe/static/api.js +46 -46
  15. package/dist/worker/observe/static/app.js +150 -150
  16. package/dist/worker/observe/static/constants.js +148 -148
  17. package/dist/worker/observe/static/copy.js +67 -67
  18. package/dist/worker/observe/static/dag-helpers.js +172 -172
  19. package/dist/worker/observe/static/dag-layout.d.ts +31 -31
  20. package/dist/worker/observe/static/dag-layout.js +83 -83
  21. package/dist/worker/observe/static/dag-model.js +72 -72
  22. package/dist/worker/observe/static/dom.js +212 -53
  23. package/dist/worker/observe/static/format-pool.js +67 -67
  24. package/dist/worker/observe/static/format.js +292 -292
  25. package/dist/worker/observe/static/index.html +308 -308
  26. package/dist/worker/observe/static/kpi.js +94 -94
  27. package/dist/worker/observe/static/relations.js +133 -133
  28. package/dist/worker/observe/static/router.js +93 -93
  29. package/dist/worker/observe/static/run-processing.js +148 -148
  30. package/dist/worker/observe/static/shell-chrome.js +68 -68
  31. package/dist/worker/observe/static/state.js +267 -253
  32. package/dist/worker/observe/static/styles.css +1902 -1902
  33. package/dist/worker/observe/static/views/batch.js +227 -227
  34. package/dist/worker/observe/static/views/dag-graph.js +172 -172
  35. package/dist/worker/observe/static/views/dag-inspector.js +627 -607
  36. package/dist/worker/observe/static/views/dag.js +371 -362
  37. package/dist/worker/observe/static/views/dashboard.js +509 -252
  38. package/dist/worker/observe/static/views/failures.js +143 -143
  39. package/dist/worker/observe/static/views/feature.js +492 -492
  40. package/dist/worker/observe/static/views/pool.js +350 -350
  41. package/dist/worker/observe/static/views/run.js +453 -453
  42. package/dist/worker/observe/static/views/session-timeline.js +219 -205
  43. package/dist/worker/observe/static/views/shell.js +7 -7
  44. package/dist/worker/observe/static/views/task.js +314 -314
  45. package/dist/worker/observe/static/views/timeline.js +163 -163
  46. package/dist/workflows/dag/backend-test-case-manifest.js +503 -0
  47. package/dist/workflows/dag/backend-test-execution-contract.js +353 -0
  48. package/dist/workflows/dag/backend-test-result-contract.js +568 -0
  49. package/dist/workflows/dag/canvas-observer.js +275 -275
  50. package/dist/workflows/dag/decision-envelope.js +57 -2
  51. package/dist/workflows/dag/frontend-implementation-contract.js +240 -0
  52. package/dist/workflows/dag/frontend-project-capability.js +309 -0
  53. package/dist/workflows/dag/frontend-repair.js +341 -0
  54. package/dist/workflows/dag/frontend-risk.js +161 -0
  55. package/dist/workflows/dag/frontend-verification-trace.js +190 -0
  56. package/dist/workflows/dag/init-hybrid.js +1020 -125
  57. package/dist/workflows/dag/repair-artifact.js +43 -3
  58. package/dist/workflows/dag/skill-instructions.js +4 -2
  59. package/dist/workflows/dag/types.js +29 -8
  60. package/docs/README.md +105 -104
  61. package/docs/agent-dag-recovery-playbook.md +195 -195
  62. package/docs/agent-dag-runner.md +67 -67
  63. package/docs/architecture/README.md +26 -26
  64. package/docs/architecture/dag-execution.md +140 -140
  65. package/docs/architecture/evolution.md +54 -54
  66. package/docs/architecture/facts-and-state.md +71 -71
  67. package/docs/architecture/runtime-boundaries.md +191 -191
  68. package/docs/architecture/system-overview.md +93 -93
  69. package/docs/architecture/worker-and-feature.md +85 -85
  70. package/docs/cursor-prompt-sidecar.md +36 -36
  71. package/docs/decisions/README.md +18 -18
  72. package/docs/design/README.md +167 -167
  73. package/docs/development-principles.md +73 -73
  74. package/docs/exec-plans/README.md +6 -6
  75. package/docs/exec-plans/active/README.md +1 -4
  76. package/docs/exec-plans/completed/README.md +106 -84
  77. package/docs/feature-workflow.md +414 -389
  78. package/docs/harness-methodology-debugging.md +153 -153
  79. package/docs/harness-methodology-tdd.md +130 -130
  80. package/docs/harness-methodology-verification.md +27 -27
  81. package/docs/init-surface.manifest.json +307 -289
  82. package/docs/loop-agent-harness.md +142 -142
  83. package/docs/production-readiness.md +96 -96
  84. package/docs/progress/README.md +76 -60
  85. package/docs/reports/README.md +150 -108
  86. package/docs/skills/README.md +7 -7
  87. package/docs/skills/vetted-skill-registry.md +29 -29
  88. package/docs/templates/adr.md +60 -60
  89. package/docs/templates/agent-dag-authority-surface-audit.prompt.md +94 -94
  90. package/docs/templates/agent-dag-decision-envelope.schema.json +213 -213
  91. package/docs/templates/agent-dag-decision-gate-dogfood-report.md +117 -117
  92. package/docs/templates/agent-dag-decision-gate.prompt.md +246 -246
  93. package/docs/templates/agent-dag-process-supervisor.prompt.md +98 -98
  94. package/docs/templates/agent-dag-report.schema.json +473 -473
  95. package/docs/templates/agent-dag-review-verdict.prompt.md +68 -68
  96. package/docs/templates/agent-dag.base.json +190 -190
  97. package/docs/templates/agent-dag.final-verification.json +185 -185
  98. package/docs/templates/agent-dag.schema.json +411 -411
  99. package/docs/templates/agent-dag.supervised-implementation.json +620 -501
  100. package/docs/templates/backend-test-analysis.schema.json +44 -44
  101. package/docs/templates/backend-test-case-manifest.schema.json +190 -0
  102. package/docs/templates/backend-test-dag.classify.prompt.md +75 -0
  103. package/docs/templates/backend-test-dag.generate-pytest.prompt.md +204 -202
  104. package/docs/templates/backend-test-dag.json +559 -311
  105. package/docs/templates/backend-test-dag.retrospect.prompt.md +139 -125
  106. package/docs/templates/backend-test-dag.review-cases.prompt.md +83 -81
  107. package/docs/templates/backend-test-execution.schema.json +133 -0
  108. package/docs/templates/backend-test-result.schema.json +99 -0
  109. package/docs/templates/branch-merge-report.md +93 -0
  110. package/docs/templates/exec-plan.md +64 -64
  111. package/docs/templates/feature-spec.md +53 -53
  112. package/docs/templates/frontend-design-contract.md +42 -42
  113. package/docs/templates/frontend-eval/fixtures/failures/01-type-build-error.md +17 -0
  114. package/docs/templates/frontend-eval/fixtures/failures/02-unit-component-test-fail.md +16 -0
  115. package/docs/templates/frontend-eval/fixtures/failures/03-fixture-schema-drift.md +16 -0
  116. package/docs/templates/frontend-eval/fixtures/failures/04-missing-loading-empty-error-state.md +16 -0
  117. package/docs/templates/frontend-eval/fixtures/failures/05-forbidden-write-writeset-expansion.md +16 -0
  118. package/docs/templates/frontend-eval/fixtures/failures/06-unapproved-dependency-add.md +16 -0
  119. package/docs/templates/frontend-eval/fixtures/failures/07-mock-production-on.md +21 -0
  120. package/docs/templates/frontend-eval/fixtures/functional/01-simple-component-style.md +29 -0
  121. package/docs/templates/frontend-eval/fixtures/functional/02-form-validation.md +28 -0
  122. package/docs/templates/frontend-eval/fixtures/functional/03-list-detail-page.md +28 -0
  123. package/docs/templates/frontend-eval/fixtures/functional/04-api-mock.md +29 -0
  124. package/docs/templates/frontend-eval/fixtures/functional/05-permission-auth-gated-ui.md +27 -0
  125. package/docs/templates/frontend-eval/fixtures/functional/06-ssr-server-client-boundary.md +28 -0
  126. package/docs/templates/frontend-eval/fixtures/functional/07-shared-public-component-api.md +28 -0
  127. package/docs/templates/frontend-eval/fixtures/functional/08-pure-local-no-remote.md +27 -0
  128. package/docs/templates/frontend-eval/metrics.md +138 -0
  129. package/docs/templates/frontend-eval/smoke-targets.md +53 -0
  130. package/docs/templates/frontend-implementation-contract.schema.json +27 -0
  131. package/docs/templates/frontend-task-constraints.md +35 -35
  132. package/docs/templates/frontend-task-requirement.md +70 -70
  133. package/docs/templates/frontend-test-dag.generate-cases.prompt.md +5 -5
  134. package/docs/templates/frontend-test-dag.json +23 -23
  135. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +3 -3
  136. package/docs/templates/frontend-test-dag.retrospect.prompt.md +3 -3
  137. package/docs/templates/frontend-test-dag.review-cases.prompt.md +3 -3
  138. package/docs/templates/frontend-test-dag.review-execution.prompt.md +3 -3
  139. package/docs/templates/harness.schema.json +221 -221
  140. package/docs/templates/hybrid-dag.json +188 -188
  141. package/docs/templates/init-evolution-review.md +35 -35
  142. package/docs/templates/interactive-ui-round2-experiment.md +66 -66
  143. package/docs/templates/knowledge-graph-bootstrap-dag.json +118 -118
  144. package/docs/templates/knowledge-sync-dag.json +178 -178
  145. package/docs/templates/knowledge-sync-draft.schema.json +71 -71
  146. package/docs/templates/product-line/AGENTS.md +8 -8
  147. package/docs/templates/product-line/README.md +9 -9
  148. package/docs/templates/product-line/acceptance.yaml +14 -14
  149. package/docs/templates/product-line/closeout.yaml +9 -9
  150. package/docs/templates/product-line/design.md +13 -13
  151. package/docs/templates/product-line/links.md +10 -10
  152. package/docs/templates/product-line/requirement.md +17 -17
  153. package/docs/templates/product-line/task-graph.yaml +15 -15
  154. package/docs/templates/product-line/task.yaml +64 -64
  155. package/docs/templates/product-line/test-plan.md +7 -7
  156. package/docs/templates/production-readiness-checklist.md +57 -57
  157. package/docs/templates/progress-log.md +17 -17
  158. package/docs/templates/project-start-checklist.md +9 -9
  159. package/docs/templates/qa-report.md +48 -48
  160. package/docs/templates/sprint-contract.md +29 -29
  161. package/docs/templates/worker-dogfood-evidence.md +80 -80
  162. package/docs/templates/worker-dogfood-setup.md +68 -68
  163. package/docs/verification-matrix.md +70 -70
  164. package/examples/decision-gate-agent-dag.json +177 -177
  165. package/examples/example-dag.json +46 -46
  166. package/examples/hybrid-loop-agent-dag.json +189 -189
  167. package/harness.json +66 -66
  168. package/package.json +52 -88
  169. package/scripts/check-product-line-docs.sh +29 -29
  170. package/scripts/check-task-pool-root.sh +32 -32
  171. package/scripts/kb-bootstrap-init-skeleton.sh +240 -240
  172. package/scripts/kb-graph-incremental-prepare.mjs +386 -386
  173. package/scripts/kb-graph-incremental-prepare.sh +5 -5
  174. package/scripts/kb-graph-materialize.mjs +105 -105
  175. package/scripts/kb-graph-materialize.sh +4 -4
  176. package/scripts/kb-graph-promote.mjs +164 -164
  177. package/scripts/kb-graph-promote.sh +4 -4
  178. package/scripts/kb-query.mjs +554 -554
  179. package/scripts/kb-query.sh +5 -5
  180. package/skills/agent-worker/SKILL.md +39 -39
  181. package/skills/agent-worker/references/agent-worker-operator.md +60 -60
  182. package/skills/ai-engineering-context/SKILL.md +48 -48
  183. package/skills/analyze-product-dependencies/SKILL.md +67 -67
  184. package/skills/analyze-product-dependencies/agents/openai.yaml +4 -4
  185. package/skills/analyze-product-dependencies/references/api-documentation-schema.md +30 -30
  186. package/skills/analyze-product-dependencies/references/dependency-analysis-schema.md +28 -28
  187. package/skills/analyze-product-dependencies/references/example.md +76 -76
  188. package/skills/analyze-product-dependencies/references/forward-test-cases.md +35 -35
  189. package/skills/analyze-product-dependencies/references/input-contract.md +11 -11
  190. package/skills/analyze-product-dependencies/references/scouting-rules.md +61 -61
  191. package/skills/analyze-product-dependencies/scripts/test-validators.mjs +267 -267
  192. package/skills/analyze-product-dependencies/scripts/validate-api-documentation.mjs +101 -101
  193. package/skills/analyze-product-dependencies/scripts/validate-dependency-analysis.mjs +142 -142
  194. package/skills/analyze-product-dependencies/scripts/validate-product-requirement-input.mjs +76 -76
  195. package/skills/analyze-product-dependencies/scripts/validation-helpers.mjs +146 -146
  196. package/skills/analyze-product-requirements/SKILL.md +90 -90
  197. package/skills/analyze-product-requirements/agents/openai.yaml +4 -4
  198. package/skills/analyze-product-requirements/references/acceptance-criteria.md +91 -91
  199. package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +56 -56
  200. package/skills/analyze-product-requirements/references/example.md +86 -86
  201. package/skills/analyze-product-requirements/references/forward-test-cases.md +66 -66
  202. package/skills/analyze-product-requirements/references/product-analysis-schema.md +32 -32
  203. package/skills/analyze-product-requirements/references/product-requirement-schema.md +33 -33
  204. package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +35 -35
  205. package/skills/analyze-product-requirements/scripts/test-validators.mjs +193 -193
  206. package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +69 -69
  207. package/skills/analyze-product-requirements/scripts/validate-product-requirement.mjs +97 -97
  208. package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +98 -98
  209. package/skills/analyze-product-requirements/scripts/validation-helpers.mjs +156 -156
  210. package/skills/browser-tools/SKILL.md +196 -0
  211. package/skills/browser-tools/browser-content.js +103 -0
  212. package/skills/browser-tools/browser-cookies.js +35 -0
  213. package/skills/browser-tools/browser-eval.js +53 -0
  214. package/skills/browser-tools/browser-hn-scraper.js +108 -0
  215. package/skills/browser-tools/browser-nav.js +44 -0
  216. package/skills/browser-tools/browser-pick.js +162 -0
  217. package/skills/browser-tools/browser-screenshot.js +34 -0
  218. package/skills/browser-tools/browser-start.js +86 -0
  219. package/skills/browser-tools/package-lock.json +2556 -0
  220. package/skills/browser-tools/package.json +19 -0
  221. package/skills/code-review-core/SKILL.md +20 -20
  222. package/skills/codebase-scout/SKILL.md +19 -19
  223. package/skills/frontend-design-review/SKILL.md +66 -66
  224. package/skills/frontend-design-review/references/review-checklist.md +58 -58
  225. package/skills/frontend-implementation/SKILL.md +49 -47
  226. package/skills/frontend-implementation/references/code-standards.md +32 -32
  227. package/skills/frontend-implementation/references/design-spec.md +46 -46
  228. package/skills/frontend-implementation/references/node-contracts.md +27 -76
  229. package/skills/frontend-review/SKILL.md +59 -59
  230. package/skills/frontend-review/references/review-findings.md +47 -47
  231. package/skills/frontend-verification/SKILL.md +53 -53
  232. package/skills/frontend-verification/references/verification-checklist.md +68 -68
  233. package/skills/grill-me/SKILL.md +10 -10
  234. package/skills/grill-with-docs/SKILL.md +88 -88
  235. package/skills/grill-with-docs/adr-format.md +47 -47
  236. package/skills/grill-with-docs/context-format.md +60 -60
  237. package/skills/init-capability-evolution/SKILL.md +70 -70
  238. package/skills/loop-agent/SKILL.md +151 -151
  239. package/skills/loop-agent/references/README.md +67 -67
  240. package/skills/loop-agent/references/command-reference.md +527 -505
  241. package/skills/loop-agent/references/docs-converge.md +126 -126
  242. package/skills/loop-agent/references/harness-policy.md +263 -263
  243. package/skills/loop-agent/references/hybrid-dag.md +243 -238
  244. package/skills/loop-agent/references/learned/README.md +21 -21
  245. package/skills/loop-agent/references/long-running-loop.md +57 -57
  246. package/skills/loop-agent/references/model-routing.md +36 -36
  247. package/skills/loop-agent/references/multi-worktree.md +54 -54
  248. package/skills/loop-agent/references/one-shot-runs.md +85 -85
  249. package/skills/loop-agent/references/orchestrator-and-interventions.md +169 -169
  250. package/skills/loop-agent/references/pi-prompt.md +23 -23
  251. package/skills/loop-agent/references/pi-subagent-assisted-mode.md +84 -84
  252. package/skills/loop-agent/references/post-implementation-and-patterns.md +44 -44
  253. package/skills/loop-agent/references/task-workflow.md +89 -89
  254. package/skills/loop-agent/references/verification-and-failure-handling.md +141 -139
  255. package/skills/playwright-cli/SKILL.md +420 -420
  256. package/skills/playwright-cli/references/element-attributes.md +23 -23
  257. package/skills/playwright-cli/references/playwright-tests.md +39 -39
  258. package/skills/playwright-cli/references/request-mocking.md +87 -87
  259. package/skills/playwright-cli/references/running-code.md +241 -241
  260. package/skills/playwright-cli/references/session-management.md +225 -225
  261. package/skills/playwright-cli/references/storage-state.md +275 -275
  262. package/skills/playwright-cli/references/test-generation.md +433 -433
  263. package/skills/playwright-cli/references/tracing.md +139 -139
  264. package/skills/playwright-cli/references/video-recording.md +143 -143
  265. package/skills/playwright-cli-case-generator/SKILL.md +74 -74
  266. package/skills/requesting-code-review/SKILL.md +101 -101
  267. package/skills/requesting-code-review/code-reviewer.md +168 -168
  268. package/skills/systematic-debugging/CREATION-LOG.md +119 -119
  269. package/skills/systematic-debugging/SKILL.md +296 -296
  270. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -158
  271. package/skills/systematic-debugging/condition-based-waiting.md +115 -115
  272. package/skills/systematic-debugging/defense-in-depth.md +122 -122
  273. package/skills/systematic-debugging/find-polluter.sh +63 -63
  274. package/skills/systematic-debugging/root-cause-tracing.md +169 -169
  275. package/skills/systematic-debugging/test-academic.md +14 -14
  276. package/skills/systematic-debugging/test-pressure-1.md +58 -58
  277. package/skills/systematic-debugging/test-pressure-2.md +68 -68
  278. package/skills/systematic-debugging/test-pressure-3.md +69 -69
  279. package/skills/test-driven-development/SKILL.md +20 -20
  280. package/skills/using-git-worktrees/SKILL.md +215 -215
  281. package/skills/verification-before-completion/SKILL.md +154 -154
  282. package/skills/webapp-testing/SKILL.md +19 -19
@@ -1,267 +1,267 @@
1
- #!/usr/bin/env node
2
-
3
- import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs";
4
- import { tmpdir } from "node:os";
5
- import { dirname, join } from "node:path";
6
- import { fileURLToPath } from "node:url";
7
- import { spawnSync } from "node:child_process";
8
-
9
- const scriptDir = dirname(fileURLToPath(import.meta.url));
10
- const temp = mkdtempSync(join(tmpdir(), "dependency-v3-validators-"));
11
- const repo = join(temp, "repo");
12
- const artifactDir = join(repo, "docs", "product-analysis", "refund-status");
13
- mkdirSync(artifactDir, { recursive: true });
14
- const requirementValidator = join(scriptDir, "validate-product-requirement-input.mjs");
15
- const apiValidator = join(scriptDir, "validate-api-documentation.mjs");
16
- const dependencyValidator = join(scriptDir, "validate-dependency-analysis.mjs");
17
-
18
- const run = (script, args) => spawnSync(process.execPath, [script, ...args], { encoding: "utf8" });
19
- function pass(name, result) {
20
- if (result.status !== 0) throw new Error(`${name} should pass:\n${result.stderr}${result.stdout}`);
21
- }
22
- function fail(name, result, message) {
23
- if (result.status === 0) throw new Error(`${name} should fail.`);
24
- if (message && !`${result.stderr}${result.stdout}`.includes(message)) throw new Error(`${name} should mention ${message}:\n${result.stderr}${result.stdout}`);
25
- }
26
- function variant(name, text) {
27
- const path = join(artifactDir, name);
28
- writeFileSync(path, text);
29
- return path;
30
- }
31
-
32
- const requirementPath = join(artifactDir, "product-requirement.md");
33
- const apiPath = join(artifactDir, "api-documentation.md");
34
- const dependencyPath = join(artifactDir, "dependency-analysis.md");
35
-
36
- const requirement = `---
37
- artifact_version: "3.0"
38
- artifact_type: product-requirement
39
- requirement_id: refund-status
40
- project_root: ../../..
41
- requirement_status: complete
42
- analysis_scope: backend
43
- source_requirement: inline
44
- source_product_analysis: none
45
- source_clarification: none
46
- ---
47
- # Product Requirement
48
- ## 1. 需求概述
49
- 订单所属用户可以查询退款状态。
50
- ## 2. 业务目标
51
- - 提供可解释的退款进度。
52
- ## 3. 需求范围
53
- ### 3.1 已确认需求
54
- - 仅订单所属用户可查询。
55
- ### 3.2 非目标
56
- - 不修改退款流程。
57
- ### 3.3 默认假设
58
- - 无。
59
- ### 3.4 未决事项
60
- - 无。
61
- ## 4. 业务规则
62
- - 不得泄露其他用户订单。
63
- ## 5. 后端用户故事
64
- ### BE-US-001 查询退款状态
65
- - 系统能力:返回指定订单的退款状态
66
- - 使用方:订单详情页
67
- - 业务价值:让用户了解退款进度
68
- - 触发方式:API
69
- - 验收标准:AC-BE-001
70
- ## 6. 后端输出规范
71
- ### BE-US-001 查询退款状态
72
- - 输入语义:当前用户和订单 ID
73
- - 输出语义:退款状态、步骤和更新时间
74
- - 数据读写:只读订单及退款记录
75
- - 权限规则:仅订单所属用户
76
- - 业务规则:按最新退款记录返回
77
- - 安全要求:不得泄露内部错误或其他用户数据
78
- - 幂等与并发:重复查询不修改数据
79
- - 错误与边界:订单不存在返回标准错误
80
- #### AC-BE-001 返回退款状态
81
- Given:
82
- - 请求用户已认证且拥有目标订单。
83
- When:
84
- - 用户请求目标订单退款状态。
85
- Then:
86
- - HTTP 状态码为 200。
87
- - 返回 refundStatus 和 updatedAt。
88
- - 查询不得修改退款记录。
89
- 异常场景:
90
- - 无权访问时返回 403 且不得泄露订单详情。
91
- ## 7. 决策追溯
92
- - 需求直接来源于明确需求。
93
- `;
94
-
95
- const api = `---
96
- artifact_version: "3.0"
97
- artifact_type: api-documentation
98
- requirement_id: refund-status
99
- project_root: ../../..
100
- api_status: complete
101
- analysis_scope: backend
102
- source_product_requirement: ./product-requirement.md
103
- repository_root: ../../..
104
- ---
105
- # API Documentation
106
- ## 1. 通用约定
107
- ### 1.1 Base URL
108
- - /api/v1
109
- ### 1.2 统一响应结构
110
- - data 包裹成功响应。
111
- ### 1.3 错误响应结构
112
- - code 和 message。
113
- ### 1.4 分页约定
114
- - 本接口不分页。
115
- ### 1.5 时间和标识符规范
116
- - ISO 8601 和字符串 ID。
117
- ## 2. API 索引
118
- | API | Method + Path | Operation ID | 用户故事 | AC | 变更 |
119
- |---|---|---|---|---|---|
120
- | API-001 | GET /api/v1/orders/{orderId}/refund-status | getRefundStatus | BE-US-001 | AC-BE-001 | 新增 |
121
- ## 3. API 详情
122
- ### API-001 查询退款状态
123
- > \`GET /api/v1/orders/{orderId}/refund-status\`
124
- #### 基本信息
125
- | 字段 | 值 |
126
- |---|---|
127
- | Operation ID | getRefundStatus |
128
- | 变更类型 | 新增 |
129
- | 幂等性 | 只读请求天然幂等 |
130
- #### Path 参数
131
- | 参数 | 类型 | 必填 | 语义 |
132
- |---|---|---|---|
133
- | orderId | string | 是 | 订单标识 |
134
- #### 成功响应
135
- - HTTP:200
136
- \`\`\`json
137
- {"data":{"refundStatus":"processing","updatedAt":"2026-01-01T00:00:00Z"}}
138
- \`\`\`
139
- #### 错误响应
140
- | 状态码 | 错误码 | 条件 |
141
- |---|---|---|
142
- | 403 | FORBIDDEN | 资源访问被拒绝 |
143
- \`\`\`json
144
- {"code":"FORBIDDEN","message":"forbidden"}
145
- \`\`\`
146
- ## 4. 数据模型
147
- - RefundStatus 包含 refundStatus 和 updatedAt。
148
- ## 5. 错误码
149
- - FORBIDDEN:请求被拒绝。
150
- `;
151
-
152
- const dependency = `---
153
- artifact_version: "3.0"
154
- artifact_type: dependency-analysis
155
- requirement_id: refund-status
156
- project_root: ../../..
157
- analysis_scope: backend
158
- source_product_requirement: ./product-requirement.md
159
- source_api_documentation: ./api-documentation.md
160
- repository_root: ../../..
161
- analysis_status: complete
162
- blocked_on: none
163
- ---
164
- # Dependency Analysis
165
- ## 1. 输入与代码基线
166
- - 需求:./product-requirement.md
167
- - 仓库:../../..
168
- ## 2. 用户故事覆盖矩阵
169
- | 故事 | AC | API | 主要代码入口 | 状态 |
170
- |---|---|---|---|---|
171
- | BE-US-001 | AC-BE-001 | API-001 | F1 | confirmed |
172
- ## 3. 后端依赖详情
173
- ### BE-US-001 查询退款状态
174
- - 验收标准:AC-BE-001
175
- - API 文档引用:API-001
176
- - 影响文件:
177
- - F1 modify \`src/refund/refund.controller.ts\`:增加查询入口
178
- - F2 modify \`src/refund/refund.service.ts\`:组合退款状态
179
- - F3 reuse \`src/refund/refund.repository.ts\`:读取退款记录
180
- - 路由/入口:F1 注册退款状态路由
181
- - Controller/Handler:F1 校验身份和订单 ID
182
- - Service/领域逻辑:F2 组合状态和更新时间
183
- - DTO/Schema:F1 复用统一响应结构
184
- - 数据依赖:F3 读取退款记录
185
- - 权限依赖:F1 校验订单归属
186
- - 错误/日志/审计:F1 映射 403 和 404
187
- - 测试落点:F1、F2 的相邻测试文件
188
- - 定位证据:现有订单路由调用 F2,F2 注入 F3
189
- - 风险:旧退款记录可能缺少 updatedAt
190
- - 置信度:high
191
- ## 4. API 实现映射
192
- | API | Operation ID | 方法与路径 | 代码入口 |
193
- |---|---|---|---|
194
- | API-001 | getRefundStatus | GET /api/v1/orders/{orderId}/refund-status | F1 |
195
- ## 5. 跨故事共享依赖
196
- - 复用订单鉴权和统一错误结构。
197
- ## 6. 风险与未定位项
198
- - 需要确认历史数据的 updatedAt 完整性。
199
- `;
200
-
201
- writeFileSync(requirementPath, requirement);
202
- writeFileSync(apiPath, api);
203
- writeFileSync(dependencyPath, dependency);
204
-
205
- const paginationSections = `#### Query 参数
206
- | 参数 | 类型 | 必填 | 允许值 | 语义 |
207
- |---|---|---|---|---|
208
- | pageSize | integer | 否 | 10 \| 20 \| 50 \| 100 | 每页条数 |
209
- | cursor | string | 否 | - | 下一页游标 |
210
- `;
211
- const paginatedApi = api.replace("#### 成功响应", `${paginationSections}#### 成功响应`);
212
-
213
- let checks = 0;
214
- function expectPass(name, script, args) { pass(name, run(script, args)); checks += 1; }
215
- function expectFail(name, script, args, message) { fail(name, run(script, args), message); checks += 1; }
216
-
217
- expectPass("valid V3 requirement input", requirementValidator, [requirementPath, "--target", "backend"]);
218
- expectFail("reject scope expansion", requirementValidator, [requirementPath, "--target", "both"], "not included");
219
- expectFail("require matching output spec", requirementValidator, [variant("requirement-no-spec.md", requirement.replace("### BE-US-001 查询退款状态\n- 输入语义", "### BE-US-002 查询退款状态\n- 输入语义"))], "Missing output specification");
220
- expectFail("require matching AC", requirementValidator, [variant("requirement-bad-ac.md", requirement.replace("- 验收标准:AC-BE-001", "- 验收标准:AC-BE-002"))], "must match");
221
-
222
- expectPass("valid compact API documentation", apiValidator, [requirementPath, apiPath, "--target", "backend"]);
223
- writeFileSync(apiPath, paginatedApi);
224
- expectPass("valid optional page sizes", apiValidator, [requirementPath, apiPath]);
225
- writeFileSync(apiPath, api);
226
- expectFail("pagination requires all page sizes", apiValidator, [requirementPath, variant("api-pagination-incomplete.md", paginatedApi.replace("10 | 20 | 50 | 100", "10 | 20 | 50"))], "exactly 10, 20, 50, and 100");
227
- expectFail("pagination page size must be optional", apiValidator, [requirementPath, variant("api-pagination-required.md", paginatedApi.replace("| pageSize | integer | 否 |", "| pageSize | integer | 是 |"))], "must be optional");
228
- expectFail("API index covers story", apiValidator, [requirementPath, variant("api-no-story.md", api.replace("BE-US-001 | AC-BE-001", "BE-US-999 | AC-BE-001"))], "does not cover");
229
- expectFail("API success JSON must parse", apiValidator, [requirementPath, variant("api-bad-json.md", api.replace("{\"data\":{\"refundStatus\":\"processing\",\"updatedAt\":\"2026-01-01T00:00:00Z\"}}", "{bad json}"))], "must be valid JSON");
230
- expectFail("API does not repeat ID", apiValidator, [requirementPath, variant("api-repeat-id.md", api.replace("| Operation ID | getRefundStatus |", "| API ID | API-001 |\n| Operation ID | getRefundStatus |"))], "must not repeat API ID");
231
- expectFail("API rejects authentication sections", apiValidator, [requirementPath, variant("api-auth.md", api.replace("### 1.2 统一响应结构", "### 1.2 认证方式\n- Bearer token\n### 1.3 统一响应结构"))], "must not contain authentication");
232
- expectFail("API rejects reuse-check output", apiValidator, [requirementPath, variant("api-reuse-check.md", api.replace("## 4. 数据模型", "## 4. 数据模型\n### 4.1 复用检查"))], "must not contain reuse-check");
233
-
234
- expectPass("valid V3 dependency analysis", dependencyValidator, [requirementPath, dependencyPath, apiPath, "--target", "backend"]);
235
- expectFail("impact files are required", dependencyValidator, [requirementPath, variant("dependency-no-impact.md", dependency.replace(/- 影响文件:[\s\S]*?- 路由\/入口:/, "- 路由/入口:")), apiPath], "missing field 影响文件");
236
- expectFail("impact file IDs must be declared", dependencyValidator, [requirementPath, variant("dependency-bad-file-ref.md", dependency.replace("- Service/领域逻辑:F2", "- Service/领域逻辑:F9")), apiPath], "undeclared impact file F9");
237
- expectFail("dependency rejects trace summary", dependencyValidator, [requirementPath, variant("dependency-trace.md", dependency + "\n## 7. 追溯汇总\n- BE-US-001。\n"), apiPath], "must not contain 分析范围 or 追溯汇总");
238
- expectFail("API mapping keeps operation", dependencyValidator, [requirementPath, variant("dependency-no-operation.md", dependency.replace("getRefundStatus", "missingOperation")), apiPath], "missing Operation ID getRefundStatus");
239
- expectFail("dependency AC matches requirement", dependencyValidator, [requirementPath, variant("dependency-bad-ac.md", dependency.replace("- 验收标准:AC-BE-001", "- 验收标准:AC-BE-002")), apiPath], "must match Product Requirement");
240
-
241
- const blocked = `---
242
- artifact_version: "3.0"
243
- artifact_type: dependency-analysis
244
- requirement_id: refund-status
245
- project_root: ../../..
246
- analysis_scope: backend
247
- source_product_requirement: none
248
- source_api_documentation: none
249
- repository_root: none
250
- analysis_status: blocked
251
- blocked_on: requirement-missing repository-missing
252
- ---
253
- # Dependency Analysis
254
- ## 1. 分析范围
255
- - backend
256
- ## 2. 输入与代码基线
257
- - 未提供需求和仓库。
258
- ## 3. 阻断原因
259
- - 缺少 Product Requirement。
260
- ## 4. 恢复条件
261
- - 提供 complete Product Requirement 和仓库。
262
- `;
263
- writeFileSync(dependencyPath, blocked);
264
- expectPass("valid blocked dependency", dependencyValidator, ["none", dependencyPath, "--target", "backend"]);
265
- writeFileSync(dependencyPath, dependency);
266
-
267
- console.log(`Dependency V3 validator matrix passed: ${checks} checks.`);
1
+ #!/usr/bin/env node
2
+
3
+ import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { dirname, join } from "node:path";
6
+ import { fileURLToPath } from "node:url";
7
+ import { spawnSync } from "node:child_process";
8
+
9
+ const scriptDir = dirname(fileURLToPath(import.meta.url));
10
+ const temp = mkdtempSync(join(tmpdir(), "dependency-v3-validators-"));
11
+ const repo = join(temp, "repo");
12
+ const artifactDir = join(repo, "docs", "product-analysis", "refund-status");
13
+ mkdirSync(artifactDir, { recursive: true });
14
+ const requirementValidator = join(scriptDir, "validate-product-requirement-input.mjs");
15
+ const apiValidator = join(scriptDir, "validate-api-documentation.mjs");
16
+ const dependencyValidator = join(scriptDir, "validate-dependency-analysis.mjs");
17
+
18
+ const run = (script, args) => spawnSync(process.execPath, [script, ...args], { encoding: "utf8" });
19
+ function pass(name, result) {
20
+ if (result.status !== 0) throw new Error(`${name} should pass:\n${result.stderr}${result.stdout}`);
21
+ }
22
+ function fail(name, result, message) {
23
+ if (result.status === 0) throw new Error(`${name} should fail.`);
24
+ if (message && !`${result.stderr}${result.stdout}`.includes(message)) throw new Error(`${name} should mention ${message}:\n${result.stderr}${result.stdout}`);
25
+ }
26
+ function variant(name, text) {
27
+ const path = join(artifactDir, name);
28
+ writeFileSync(path, text);
29
+ return path;
30
+ }
31
+
32
+ const requirementPath = join(artifactDir, "product-requirement.md");
33
+ const apiPath = join(artifactDir, "api-documentation.md");
34
+ const dependencyPath = join(artifactDir, "dependency-analysis.md");
35
+
36
+ const requirement = `---
37
+ artifact_version: "3.0"
38
+ artifact_type: product-requirement
39
+ requirement_id: refund-status
40
+ project_root: ../../..
41
+ requirement_status: complete
42
+ analysis_scope: backend
43
+ source_requirement: inline
44
+ source_product_analysis: none
45
+ source_clarification: none
46
+ ---
47
+ # Product Requirement
48
+ ## 1. 需求概述
49
+ 订单所属用户可以查询退款状态。
50
+ ## 2. 业务目标
51
+ - 提供可解释的退款进度。
52
+ ## 3. 需求范围
53
+ ### 3.1 已确认需求
54
+ - 仅订单所属用户可查询。
55
+ ### 3.2 非目标
56
+ - 不修改退款流程。
57
+ ### 3.3 默认假设
58
+ - 无。
59
+ ### 3.4 未决事项
60
+ - 无。
61
+ ## 4. 业务规则
62
+ - 不得泄露其他用户订单。
63
+ ## 5. 后端用户故事
64
+ ### BE-US-001 查询退款状态
65
+ - 系统能力:返回指定订单的退款状态
66
+ - 使用方:订单详情页
67
+ - 业务价值:让用户了解退款进度
68
+ - 触发方式:API
69
+ - 验收标准:AC-BE-001
70
+ ## 6. 后端输出规范
71
+ ### BE-US-001 查询退款状态
72
+ - 输入语义:当前用户和订单 ID
73
+ - 输出语义:退款状态、步骤和更新时间
74
+ - 数据读写:只读订单及退款记录
75
+ - 权限规则:仅订单所属用户
76
+ - 业务规则:按最新退款记录返回
77
+ - 安全要求:不得泄露内部错误或其他用户数据
78
+ - 幂等与并发:重复查询不修改数据
79
+ - 错误与边界:订单不存在返回标准错误
80
+ #### AC-BE-001 返回退款状态
81
+ Given:
82
+ - 请求用户已认证且拥有目标订单。
83
+ When:
84
+ - 用户请求目标订单退款状态。
85
+ Then:
86
+ - HTTP 状态码为 200。
87
+ - 返回 refundStatus 和 updatedAt。
88
+ - 查询不得修改退款记录。
89
+ 异常场景:
90
+ - 无权访问时返回 403 且不得泄露订单详情。
91
+ ## 7. 决策追溯
92
+ - 需求直接来源于明确需求。
93
+ `;
94
+
95
+ const api = `---
96
+ artifact_version: "3.0"
97
+ artifact_type: api-documentation
98
+ requirement_id: refund-status
99
+ project_root: ../../..
100
+ api_status: complete
101
+ analysis_scope: backend
102
+ source_product_requirement: ./product-requirement.md
103
+ repository_root: ../../..
104
+ ---
105
+ # API Documentation
106
+ ## 1. 通用约定
107
+ ### 1.1 Base URL
108
+ - /api/v1
109
+ ### 1.2 统一响应结构
110
+ - data 包裹成功响应。
111
+ ### 1.3 错误响应结构
112
+ - code 和 message。
113
+ ### 1.4 分页约定
114
+ - 本接口不分页。
115
+ ### 1.5 时间和标识符规范
116
+ - ISO 8601 和字符串 ID。
117
+ ## 2. API 索引
118
+ | API | Method + Path | Operation ID | 用户故事 | AC | 变更 |
119
+ |---|---|---|---|---|---|
120
+ | API-001 | GET /api/v1/orders/{orderId}/refund-status | getRefundStatus | BE-US-001 | AC-BE-001 | 新增 |
121
+ ## 3. API 详情
122
+ ### API-001 查询退款状态
123
+ > \`GET /api/v1/orders/{orderId}/refund-status\`
124
+ #### 基本信息
125
+ | 字段 | 值 |
126
+ |---|---|
127
+ | Operation ID | getRefundStatus |
128
+ | 变更类型 | 新增 |
129
+ | 幂等性 | 只读请求天然幂等 |
130
+ #### Path 参数
131
+ | 参数 | 类型 | 必填 | 语义 |
132
+ |---|---|---|---|
133
+ | orderId | string | 是 | 订单标识 |
134
+ #### 成功响应
135
+ - HTTP:200
136
+ \`\`\`json
137
+ {"data":{"refundStatus":"processing","updatedAt":"2026-01-01T00:00:00Z"}}
138
+ \`\`\`
139
+ #### 错误响应
140
+ | 状态码 | 错误码 | 条件 |
141
+ |---|---|---|
142
+ | 403 | FORBIDDEN | 资源访问被拒绝 |
143
+ \`\`\`json
144
+ {"code":"FORBIDDEN","message":"forbidden"}
145
+ \`\`\`
146
+ ## 4. 数据模型
147
+ - RefundStatus 包含 refundStatus 和 updatedAt。
148
+ ## 5. 错误码
149
+ - FORBIDDEN:请求被拒绝。
150
+ `;
151
+
152
+ const dependency = `---
153
+ artifact_version: "3.0"
154
+ artifact_type: dependency-analysis
155
+ requirement_id: refund-status
156
+ project_root: ../../..
157
+ analysis_scope: backend
158
+ source_product_requirement: ./product-requirement.md
159
+ source_api_documentation: ./api-documentation.md
160
+ repository_root: ../../..
161
+ analysis_status: complete
162
+ blocked_on: none
163
+ ---
164
+ # Dependency Analysis
165
+ ## 1. 输入与代码基线
166
+ - 需求:./product-requirement.md
167
+ - 仓库:../../..
168
+ ## 2. 用户故事覆盖矩阵
169
+ | 故事 | AC | API | 主要代码入口 | 状态 |
170
+ |---|---|---|---|---|
171
+ | BE-US-001 | AC-BE-001 | API-001 | F1 | confirmed |
172
+ ## 3. 后端依赖详情
173
+ ### BE-US-001 查询退款状态
174
+ - 验收标准:AC-BE-001
175
+ - API 文档引用:API-001
176
+ - 影响文件:
177
+ - F1 modify \`src/refund/refund.controller.ts\`:增加查询入口
178
+ - F2 modify \`src/refund/refund.service.ts\`:组合退款状态
179
+ - F3 reuse \`src/refund/refund.repository.ts\`:读取退款记录
180
+ - 路由/入口:F1 注册退款状态路由
181
+ - Controller/Handler:F1 校验身份和订单 ID
182
+ - Service/领域逻辑:F2 组合状态和更新时间
183
+ - DTO/Schema:F1 复用统一响应结构
184
+ - 数据依赖:F3 读取退款记录
185
+ - 权限依赖:F1 校验订单归属
186
+ - 错误/日志/审计:F1 映射 403 和 404
187
+ - 测试落点:F1、F2 的相邻测试文件
188
+ - 定位证据:现有订单路由调用 F2,F2 注入 F3
189
+ - 风险:旧退款记录可能缺少 updatedAt
190
+ - 置信度:high
191
+ ## 4. API 实现映射
192
+ | API | Operation ID | 方法与路径 | 代码入口 |
193
+ |---|---|---|---|
194
+ | API-001 | getRefundStatus | GET /api/v1/orders/{orderId}/refund-status | F1 |
195
+ ## 5. 跨故事共享依赖
196
+ - 复用订单鉴权和统一错误结构。
197
+ ## 6. 风险与未定位项
198
+ - 需要确认历史数据的 updatedAt 完整性。
199
+ `;
200
+
201
+ writeFileSync(requirementPath, requirement);
202
+ writeFileSync(apiPath, api);
203
+ writeFileSync(dependencyPath, dependency);
204
+
205
+ const paginationSections = `#### Query 参数
206
+ | 参数 | 类型 | 必填 | 允许值 | 语义 |
207
+ |---|---|---|---|---|
208
+ | pageSize | integer | 否 | 10 \| 20 \| 50 \| 100 | 每页条数 |
209
+ | cursor | string | 否 | - | 下一页游标 |
210
+ `;
211
+ const paginatedApi = api.replace("#### 成功响应", `${paginationSections}#### 成功响应`);
212
+
213
+ let checks = 0;
214
+ function expectPass(name, script, args) { pass(name, run(script, args)); checks += 1; }
215
+ function expectFail(name, script, args, message) { fail(name, run(script, args), message); checks += 1; }
216
+
217
+ expectPass("valid V3 requirement input", requirementValidator, [requirementPath, "--target", "backend"]);
218
+ expectFail("reject scope expansion", requirementValidator, [requirementPath, "--target", "both"], "not included");
219
+ expectFail("require matching output spec", requirementValidator, [variant("requirement-no-spec.md", requirement.replace("### BE-US-001 查询退款状态\n- 输入语义", "### BE-US-002 查询退款状态\n- 输入语义"))], "Missing output specification");
220
+ expectFail("require matching AC", requirementValidator, [variant("requirement-bad-ac.md", requirement.replace("- 验收标准:AC-BE-001", "- 验收标准:AC-BE-002"))], "must match");
221
+
222
+ expectPass("valid compact API documentation", apiValidator, [requirementPath, apiPath, "--target", "backend"]);
223
+ writeFileSync(apiPath, paginatedApi);
224
+ expectPass("valid optional page sizes", apiValidator, [requirementPath, apiPath]);
225
+ writeFileSync(apiPath, api);
226
+ expectFail("pagination requires all page sizes", apiValidator, [requirementPath, variant("api-pagination-incomplete.md", paginatedApi.replace("10 | 20 | 50 | 100", "10 | 20 | 50"))], "exactly 10, 20, 50, and 100");
227
+ expectFail("pagination page size must be optional", apiValidator, [requirementPath, variant("api-pagination-required.md", paginatedApi.replace("| pageSize | integer | 否 |", "| pageSize | integer | 是 |"))], "must be optional");
228
+ expectFail("API index covers story", apiValidator, [requirementPath, variant("api-no-story.md", api.replace("BE-US-001 | AC-BE-001", "BE-US-999 | AC-BE-001"))], "does not cover");
229
+ expectFail("API success JSON must parse", apiValidator, [requirementPath, variant("api-bad-json.md", api.replace("{\"data\":{\"refundStatus\":\"processing\",\"updatedAt\":\"2026-01-01T00:00:00Z\"}}", "{bad json}"))], "must be valid JSON");
230
+ expectFail("API does not repeat ID", apiValidator, [requirementPath, variant("api-repeat-id.md", api.replace("| Operation ID | getRefundStatus |", "| API ID | API-001 |\n| Operation ID | getRefundStatus |"))], "must not repeat API ID");
231
+ expectFail("API rejects authentication sections", apiValidator, [requirementPath, variant("api-auth.md", api.replace("### 1.2 统一响应结构", "### 1.2 认证方式\n- Bearer token\n### 1.3 统一响应结构"))], "must not contain authentication");
232
+ expectFail("API rejects reuse-check output", apiValidator, [requirementPath, variant("api-reuse-check.md", api.replace("## 4. 数据模型", "## 4. 数据模型\n### 4.1 复用检查"))], "must not contain reuse-check");
233
+
234
+ expectPass("valid V3 dependency analysis", dependencyValidator, [requirementPath, dependencyPath, apiPath, "--target", "backend"]);
235
+ expectFail("impact files are required", dependencyValidator, [requirementPath, variant("dependency-no-impact.md", dependency.replace(/- 影响文件:[\s\S]*?- 路由\/入口:/, "- 路由/入口:")), apiPath], "missing field 影响文件");
236
+ expectFail("impact file IDs must be declared", dependencyValidator, [requirementPath, variant("dependency-bad-file-ref.md", dependency.replace("- Service/领域逻辑:F2", "- Service/领域逻辑:F9")), apiPath], "undeclared impact file F9");
237
+ expectFail("dependency rejects trace summary", dependencyValidator, [requirementPath, variant("dependency-trace.md", dependency + "\n## 7. 追溯汇总\n- BE-US-001。\n"), apiPath], "must not contain 分析范围 or 追溯汇总");
238
+ expectFail("API mapping keeps operation", dependencyValidator, [requirementPath, variant("dependency-no-operation.md", dependency.replace("getRefundStatus", "missingOperation")), apiPath], "missing Operation ID getRefundStatus");
239
+ expectFail("dependency AC matches requirement", dependencyValidator, [requirementPath, variant("dependency-bad-ac.md", dependency.replace("- 验收标准:AC-BE-001", "- 验收标准:AC-BE-002")), apiPath], "must match Product Requirement");
240
+
241
+ const blocked = `---
242
+ artifact_version: "3.0"
243
+ artifact_type: dependency-analysis
244
+ requirement_id: refund-status
245
+ project_root: ../../..
246
+ analysis_scope: backend
247
+ source_product_requirement: none
248
+ source_api_documentation: none
249
+ repository_root: none
250
+ analysis_status: blocked
251
+ blocked_on: requirement-missing repository-missing
252
+ ---
253
+ # Dependency Analysis
254
+ ## 1. 分析范围
255
+ - backend
256
+ ## 2. 输入与代码基线
257
+ - 未提供需求和仓库。
258
+ ## 3. 阻断原因
259
+ - 缺少 Product Requirement。
260
+ ## 4. 恢复条件
261
+ - 提供 complete Product Requirement 和仓库。
262
+ `;
263
+ writeFileSync(dependencyPath, blocked);
264
+ expectPass("valid blocked dependency", dependencyValidator, ["none", dependencyPath, "--target", "backend"]);
265
+ writeFileSync(dependencyPath, dependency);
266
+
267
+ console.log(`Dependency V3 validator matrix passed: ${checks} checks.`);