@tea-agent/loop-agent 0.39.0-next.9 → 0.39.1

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 (288) hide show
  1. package/AGENTS.md +4 -1
  2. package/CHANGELOG.md +269 -69
  3. package/README.md +11 -5
  4. package/bin/loop-agent.js +7 -3
  5. package/dist/application/dag/generate-task-dag.js +9 -0
  6. package/dist/application/task-lifecycle/advance.js +16 -0
  7. package/dist/build-stamp.json +3 -3
  8. package/dist/cli/command-definitions.js +16 -5
  9. package/dist/cli/program.js +16 -2
  10. package/dist/cli/update/notifier.js +2 -2
  11. package/dist/cli/update/runtime-activity.js +1 -29
  12. package/dist/cli.js +2 -1
  13. package/dist/commands/dag-rerun.js +55 -1
  14. package/dist/commands/init-model-catalog.js +464 -0
  15. package/dist/commands/init-upgrade.js +265 -97
  16. package/dist/commands/init.js +428 -27
  17. package/dist/commands/inspect-next.js +8 -0
  18. package/dist/commands/task-advance.js +31 -0
  19. package/dist/executors/dag-pi-executor.js +124 -18
  20. package/dist/executors/pi-event-serializer.js +42 -1
  21. package/dist/executors/pi-executor.js +51 -0
  22. package/dist/executors/pi-extension-resolver.js +233 -0
  23. package/dist/executors/pi-playwright-cli-tool.js +74 -28
  24. package/dist/executors/pi-sdk-executor.js +187 -59
  25. package/dist/executors/shell-executor.js +555 -34
  26. package/dist/executors/shell-write-guard.js +7 -0
  27. package/dist/shared/dag-failure-category.js +138 -0
  28. package/dist/shared/dag-prompt-override.js +27 -0
  29. package/dist/shared/operator/capabilities.js +181 -27
  30. package/dist/shared/playwright-cli-command-policy.js +15 -0
  31. package/dist/shared/update/console-notifier.js +100 -0
  32. package/dist/{cli → shared}/update/npm-client.js +70 -15
  33. package/dist/{cli → shared}/update/state.js +41 -13
  34. package/dist/task/config-types.js +28 -0
  35. package/dist/task/contract/apply.js +11 -1
  36. package/dist/task/contract/constants.js +3 -0
  37. package/dist/task/contract/diff.js +26 -0
  38. package/dist/task/contract/hash.js +3 -0
  39. package/dist/task/contract/observe.js +25 -4
  40. package/dist/task/contract/paths.js +2 -1
  41. package/dist/task/contract/project.js +20 -1
  42. package/dist/task/contract/schema.js +8 -1
  43. package/dist/task/contract/transaction.js +12 -0
  44. package/dist/task/source-prepare/build-draft.js +15 -0
  45. package/dist/task/source-prepare/completeness.js +188 -0
  46. package/dist/task/source-prepare/fragment-inventory.js +474 -0
  47. package/dist/task/source-prepare/index.js +3 -0
  48. package/dist/task/source-prepare/ledger-reconciliation.js +127 -0
  49. package/dist/task/source-prepare/ledger-review.js +214 -0
  50. package/dist/task/source-prepare/ledger.js +545 -0
  51. package/dist/task/source-prepare/parse-intent.js +24 -4
  52. package/dist/task/source-prepare/prepare.js +262 -1
  53. package/dist/task/source-prepare/semantic-intake.js +19 -3
  54. package/dist/task/source-prepare/source-fidelity-pi.js +384 -0
  55. package/dist/task/source-prepare/types.js +22 -0
  56. package/dist/worker/cli.js +18 -2
  57. package/dist/worker/console/chat/deferred-turn.js +91 -0
  58. package/dist/worker/console/chat/mcp-inventory.js +221 -0
  59. package/dist/worker/console/chat/operation-card.js +8 -1
  60. package/dist/worker/console/chat/pi-console-config.js +81 -10
  61. package/dist/worker/console/chat/pi-runtime.js +165 -83
  62. package/dist/worker/console/chat/repo-walk.js +10 -1
  63. package/dist/worker/console/chat/routes.js +480 -55
  64. package/dist/worker/console/chat/semantic-activity.js +20 -8
  65. package/dist/worker/console/chat/session-store.js +146 -2
  66. package/dist/worker/console/chat/turn-process.js +10 -10
  67. package/dist/worker/console/console-handoff.js +82 -0
  68. package/dist/worker/console/console-update-and-init.js +115 -0
  69. package/dist/worker/console/console-update-runtime.js +84 -0
  70. package/dist/worker/console/dag-execution-receipt.js +33 -0
  71. package/dist/worker/console/draft-store.js +49 -0
  72. package/dist/worker/console/inspect-split.js +18 -0
  73. package/dist/worker/console/operation-run-facts.js +19 -3
  74. package/dist/worker/console/operation-store.js +1 -1
  75. package/dist/worker/console/operator-actions.js +320 -4
  76. package/dist/worker/console/operator-surface-health.js +1 -0
  77. package/dist/worker/console/operator-user-error.js +2 -2
  78. package/dist/worker/console/pi-readiness.js +5 -4
  79. package/dist/worker/console/prd-intake-bridge.js +13 -0
  80. package/dist/worker/console/recovery-cta.js +4 -4
  81. package/dist/worker/console/recovery-error-copy.js +4 -4
  82. package/dist/worker/console/routes.js +46 -2
  83. package/dist/worker/console/security.js +63 -9
  84. package/dist/worker/console/server.js +111 -7
  85. package/dist/worker/console/static/assets/{abnfDiagram-N423BO3Z-BLXFe4qI.js → abnfDiagram-N423BO3Z-CTx1TrNa.js} +1 -1
  86. package/dist/worker/console/static/assets/{arc-7iOJeqho.js → arc-B4i9cVxX.js} +1 -1
  87. package/dist/worker/console/static/assets/{architectureDiagram-T3A2C74G-CYoyj5K7.js → architectureDiagram-T3A2C74G-BAXE8_Rl.js} +1 -1
  88. package/dist/worker/console/static/assets/{blockDiagram-VBNYF7ZC-fK01JNlR.js → blockDiagram-VBNYF7ZC-C5Xh59at.js} +1 -1
  89. package/dist/worker/console/static/assets/{c4Diagram-5PPSVZJV-bzbw5D_Z.js → c4Diagram-5PPSVZJV-B_asOzAu.js} +1 -1
  90. package/dist/worker/console/static/assets/channel-Dj_4Moei.js +1 -0
  91. package/dist/worker/console/static/assets/{chunk-2GRJ4B5K-Cf6hJFFG.js → chunk-2GRJ4B5K-wRO_iRNc.js} +1 -1
  92. package/dist/worker/console/static/assets/{chunk-2Q5K7J3B-DSFXR-et.js → chunk-2Q5K7J3B-ByOaSh_G.js} +1 -1
  93. package/dist/worker/console/static/assets/{chunk-5RXB4S5H-BagJechl.js → chunk-5RXB4S5H-DjLzudan.js} +1 -1
  94. package/dist/worker/console/static/assets/{chunk-5VM5RSS4-E7QNMFaW.js → chunk-5VM5RSS4-JCNGkXYT.js} +1 -1
  95. package/dist/worker/console/static/assets/{chunk-6Q2QTUOP-BG_eOBrC.js → chunk-6Q2QTUOP-BhrPXXMZ.js} +1 -1
  96. package/dist/worker/console/static/assets/{chunk-GF5L2VYU-Bo42dqol.js → chunk-GF5L2VYU-TJ5JuEBT.js} +1 -1
  97. package/dist/worker/console/static/assets/{chunk-JWPE2WC7-dibM-87v.js → chunk-JWPE2WC7-VVthn_mD.js} +1 -1
  98. package/dist/worker/console/static/assets/{chunk-KBJHAD2P-Bytrp3Oe.js → chunk-KBJHAD2P-D60-Mny4.js} +1 -1
  99. package/dist/worker/console/static/assets/{chunk-RYQCIY6F-DBABILrr.js → chunk-RYQCIY6F-zXv7aVye.js} +1 -1
  100. package/dist/worker/console/static/assets/{chunk-XXDRQBXY-DCUk5Pf9.js → chunk-XXDRQBXY-By9VQoi1.js} +1 -1
  101. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-C0YYAyCa.js +1 -0
  102. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-C0YYAyCa.js +1 -0
  103. package/dist/worker/console/static/assets/{cose-bilkent-JH36ORCC-BlGE9v6E.js → cose-bilkent-JH36ORCC-C4zQLe-M.js} +1 -1
  104. package/dist/worker/console/static/assets/{cynefin-VYW2F7L2-DGl5ewph.js → cynefin-VYW2F7L2-wh5N2ReN.js} +1 -1
  105. package/dist/worker/console/static/assets/{cynefinDiagram-MW4NZA55-DsJ_SVH_.js → cynefinDiagram-MW4NZA55-Dlu5wIqs.js} +1 -1
  106. package/dist/worker/console/static/assets/{dagre-VZM6K2ZE-BIhjFdzv.js → dagre-VZM6K2ZE-CrDgthc6.js} +1 -1
  107. package/dist/worker/console/static/assets/{diagram-7IWD3JNH-Dmy1ctTb.js → diagram-7IWD3JNH-zN1clg27.js} +1 -1
  108. package/dist/worker/console/static/assets/{diagram-B4RE2ZJO-DYCtWUF3.js → diagram-B4RE2ZJO-BN-o7J7-.js} +1 -1
  109. package/dist/worker/console/static/assets/{diagram-LBJQPF4R-BMZFHVd2.js → diagram-LBJQPF4R-C8SuPt0d.js} +1 -1
  110. package/dist/worker/console/static/assets/{diagram-Q27KOJAE-b_U8gfaO.js → diagram-Q27KOJAE-BoizuHbZ.js} +1 -1
  111. package/dist/worker/console/static/assets/{diagram-UB23O5K3-Dzy_bn-I.js → diagram-UB23O5K3-BzUzXixG.js} +1 -1
  112. package/dist/worker/console/static/assets/{ebnfDiagram-BXEA7PRR-DJCiMNEI.js → ebnfDiagram-BXEA7PRR-Ev3lA4Cf.js} +1 -1
  113. package/dist/worker/console/static/assets/{erDiagram-JOGREHBK-28lD016B.js → erDiagram-JOGREHBK-GALUzRbs.js} +1 -1
  114. package/dist/worker/console/static/assets/{flowDiagram-UKHOOZJN-DGyHJmIw.js → flowDiagram-UKHOOZJN-CZJN65Sb.js} +1 -1
  115. package/dist/worker/console/static/assets/{ganttDiagram-PKOTCBZU-CzdwUjrO.js → ganttDiagram-PKOTCBZU-JLB9OESl.js} +1 -1
  116. package/dist/worker/console/static/assets/{gitGraphDiagram-DS77QQ5N-D9bGwuo8.js → gitGraphDiagram-DS77QQ5N-CcvCr4GD.js} +1 -1
  117. package/dist/worker/console/static/assets/index-CW88Fjbw.js +406 -0
  118. package/dist/worker/console/static/assets/index-DP0ZJl39.css +1 -0
  119. package/dist/worker/console/static/assets/{infoDiagram-6WML65LV-LJgJUQFC.js → infoDiagram-6WML65LV-HG5z7aVg.js} +1 -1
  120. package/dist/worker/console/static/assets/{ishikawaDiagram-WSZJBQD7-98LaB8zb.js → ishikawaDiagram-WSZJBQD7-BHEu9chR.js} +1 -1
  121. package/dist/worker/console/static/assets/{journeyDiagram-NVQOT4AX-D-ISzwlQ.js → journeyDiagram-NVQOT4AX-Cp_Up8-a.js} +1 -1
  122. package/dist/worker/console/static/assets/{kanban-definition-27J2QSJJ-gfYOI-EL.js → kanban-definition-27J2QSJJ-DvVeY-em.js} +1 -1
  123. package/dist/worker/console/static/assets/{linear-CyntZgKV.js → linear-aGmcjgTn.js} +1 -1
  124. package/dist/worker/console/static/assets/{mermaid.core-BBOR7dg0.js → mermaid.core-Biyo-tqA.js} +5 -5
  125. package/dist/worker/console/static/assets/{mindmap-definition-FAOFIHXS-CQAgwPMk.js → mindmap-definition-FAOFIHXS-DyxY2pIb.js} +1 -1
  126. package/dist/worker/console/static/assets/{pegDiagram-VL7TDLO6-DkMiZFuV.js → pegDiagram-VL7TDLO6-CkdGuc50.js} +1 -1
  127. package/dist/worker/console/static/assets/{pieDiagram-7S7Q4E2Y-DLNXa_0J.js → pieDiagram-7S7Q4E2Y-NNQI9xVR.js} +1 -1
  128. package/dist/worker/console/static/assets/{quadrantDiagram-CIZ2JOQS-Dc7bdzjm.js → quadrantDiagram-CIZ2JOQS-PAJkuz_G.js} +1 -1
  129. package/dist/worker/console/static/assets/{railroadDiagram-AXF67PYL-BxMB0QqW.js → railroadDiagram-AXF67PYL-ZwrQod0O.js} +1 -1
  130. package/dist/worker/console/static/assets/{requirementDiagram-LRYGKXZP-FjumoKn4.js → requirementDiagram-LRYGKXZP-D3ZfrzM2.js} +1 -1
  131. package/dist/worker/console/static/assets/{sankeyDiagram-W5VNT64P-CkhKc_E3.js → sankeyDiagram-W5VNT64P-DDGFmWk5.js} +1 -1
  132. package/dist/worker/console/static/assets/{sequenceDiagram-SI44F4Z6-DoBWqTTH.js → sequenceDiagram-SI44F4Z6-DO6mmXTA.js} +1 -1
  133. package/dist/worker/console/static/assets/{sizeCapture-X5ZJPWSS-CQeh_YeE.js → sizeCapture-X5ZJPWSS-DMbCQiJt.js} +1 -1
  134. package/dist/worker/console/static/assets/{stateDiagram-OKZ733FA-LuHmFW-I.js → stateDiagram-OKZ733FA-Di_YUEfC.js} +1 -1
  135. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-DrdDvela.js +1 -0
  136. package/dist/worker/console/static/assets/{swimlanes-SLNWSIFB-CHwbDctY.js → swimlanes-SLNWSIFB-Bn2PphNJ.js} +2 -2
  137. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-DPkEAULl.js +8 -0
  138. package/dist/worker/console/static/assets/{timeline-definition-Z64GVDOM-CoMngk0X.js → timeline-definition-Z64GVDOM-DPh8pRsp.js} +1 -1
  139. package/dist/worker/console/static/assets/{vennDiagram-T6HMQDX7-CURYbtbO.js → vennDiagram-T6HMQDX7-GMfl26pW.js} +1 -1
  140. package/dist/worker/console/static/assets/{wardleyDiagram-T6FBY63Y-BdqSECjU.js → wardleyDiagram-T6FBY63Y-DTlmVrmF.js} +1 -1
  141. package/dist/worker/console/static/assets/{xychartDiagram-ELKLHX3M-DbMUYuAg.js → xychartDiagram-ELKLHX3M-YGBjKAS5.js} +1 -1
  142. package/dist/worker/console/static/index.html +2 -2
  143. package/dist/worker/console/static-src/app/console-types.js +40 -1
  144. package/dist/worker/console/static-src/app/useOperatorActions.js +6 -1
  145. package/dist/worker/console/static-src/app/useRecoveryActions.js +2 -2
  146. package/dist/worker/console/static-src/app/useRecoveryConsole.js +38 -2
  147. package/dist/worker/console/static-src/app/useRunProgress.js +46 -0
  148. package/dist/worker/console/static-src/app/useTaskWizard.js +73 -1
  149. package/dist/worker/console/static-src/operator-chat/cards/failure-category-advice.js +25 -0
  150. package/dist/worker/console/static-src/operator-chat/chat-sse-events.js +74 -26
  151. package/dist/worker/console/static-src/operator-chat/input-history.js +76 -0
  152. package/dist/worker/console/static-src/operator-chat/mutation-gate.js +1 -1
  153. package/dist/worker/console/static-src/operator-chat/open-preview-in-browser.js +328 -0
  154. package/dist/worker/console/static-src/operator-chat/resource-diagnostics.js +204 -0
  155. package/dist/worker/console/static-src/operator-chat/turn-stream-controller.js +8 -1
  156. package/dist/worker/console/static-src/operator-chat/turn-submission.js +54 -0
  157. package/dist/worker/console/static-src/operator-chat/useChatSessions.js +3 -0
  158. package/dist/worker/console/static-src/operator-chat/useChatStream.js +237 -11
  159. package/dist/worker/console/static-src/operator-chat/useChatThread.js +50 -22
  160. package/dist/worker/console/static-src/operator-chat/useComposer.js +32 -0
  161. package/dist/worker/console/static-src/operator-chat/useRepoBrowser.js +26 -1
  162. package/dist/worker/console/static-src/pages/tasks/run-id-resolution.js +79 -0
  163. package/dist/worker/console/static-src/pages/tasks/run-ownership-verify.js +23 -0
  164. package/dist/worker/console/static-src/pages/tasks/run-panel-progress.js +110 -0
  165. package/dist/worker/loop-agent/loop-agent-client.js +7 -3
  166. package/dist/worker/materialize/harness-task-lineage.js +5 -2
  167. package/dist/worker/observability/init-runtime-activity.js +26 -0
  168. package/dist/worker/observability/read-model.js +22 -0
  169. package/dist/worker/observe/node-input.js +160 -3
  170. package/dist/worker/observe/node-process.js +377 -0
  171. package/dist/worker/observe/routes.js +224 -3
  172. package/dist/worker/observe/shell-handler-keys.js +34 -0
  173. package/dist/worker/observe/static/api.js +67 -1
  174. package/dist/worker/observe/static/constants.js +8 -1
  175. package/dist/worker/observe/static/dag-history-labels.js +4 -0
  176. package/dist/worker/observe/static/format.js +60 -0
  177. package/dist/worker/observe/static/index.html +5 -0
  178. package/dist/worker/observe/static/markdown-render.js +20 -1
  179. package/dist/worker/observe/static/operator-chrome.js +4 -0
  180. package/dist/worker/observe/static/prompt-restart-candidates.d.ts +18 -0
  181. package/dist/worker/observe/static/prompt-restart-candidates.js +36 -0
  182. package/dist/worker/observe/static/state.js +13 -2
  183. package/dist/worker/observe/static/styles.css +85 -0
  184. package/dist/worker/observe/static/views/dag-inspector.js +912 -8
  185. package/dist/worker/observe/static/views/dag.js +8 -1
  186. package/dist/worker/observe/static/views/failures.js +5 -2
  187. package/dist/worker/observe/static/views/session-timeline.js +78 -9
  188. package/dist/worker/observe/static/views/task.js +55 -0
  189. package/dist/workflows/dag/backend-test-case-coverage-analysis.js +856 -54
  190. package/dist/workflows/dag/backend-test-case-manifest.js +4 -0
  191. package/dist/workflows/dag/backend-test-execution-contract.js +18 -9
  192. package/dist/workflows/dag/backend-test-gap-fill.js +205 -0
  193. package/dist/workflows/dag/backend-test-intake-context.js +32 -0
  194. package/dist/workflows/dag/backend-test-layout.js +133 -0
  195. package/dist/workflows/dag/backend-test-markdown-workflow.js +343 -33
  196. package/dist/workflows/dag/backend-test-module-stem.js +5 -0
  197. package/dist/workflows/dag/backend-test-pytest-collection.js +454 -36
  198. package/dist/workflows/dag/backend-test-result-contract.js +1 -1
  199. package/dist/workflows/dag/backend-test-scenario-param.js +884 -140
  200. package/dist/workflows/dag/backend-test-scenario-partitions.js +321 -0
  201. package/dist/workflows/dag/backend-test-writer-completeness.js +110 -61
  202. package/dist/workflows/dag/contract-output-registry.js +15 -0
  203. package/dist/workflows/dag/contract-validator-registrations.js +3 -1
  204. package/dist/workflows/dag/convergence/controller.js +141 -0
  205. package/dist/workflows/dag/dynamic-runtime/loop-until.js +1 -1
  206. package/dist/workflows/dag/dynamic-runtime/map.js +25 -9
  207. package/dist/workflows/dag/dynamic-runtime/shared.js +1 -1
  208. package/dist/workflows/dag/failure-category.js +7 -116
  209. package/dist/workflows/dag/frontend-implementation-contract.js +465 -6
  210. package/dist/workflows/dag/frontend-plan-render.js +24 -0
  211. package/dist/workflows/dag/frontend-prewrite-gate.js +293 -84
  212. package/dist/workflows/dag/frontend-repair.js +14 -0
  213. package/dist/workflows/dag/frontend-review-context.js +92 -10
  214. package/dist/workflows/dag/frontend-risk.js +15 -2
  215. package/dist/workflows/dag/frontend-test-case-checklist.js +30 -4
  216. package/dist/workflows/dag/frontend-test-case-manifest.js +11 -4
  217. package/dist/workflows/dag/frontend-test-case-quality.js +11 -16
  218. package/dist/workflows/dag/frontend-test-environment-probe.js +230 -0
  219. package/dist/workflows/dag/frontend-test-html-report.js +3 -1
  220. package/dist/workflows/dag/frontend-test-l5-report.js +3 -1
  221. package/dist/workflows/dag/frontend-test-layout.js +159 -0
  222. package/dist/workflows/dag/frontend-test-markdown.js +61 -0
  223. package/dist/workflows/dag/frontend-test-result-contract.js +188 -42
  224. package/dist/workflows/dag/frontend-test-standard-scenarios.js +70 -0
  225. package/dist/workflows/dag/frontend-verification-trace.js +29 -4
  226. package/dist/workflows/dag/init-hybrid.js +1019 -209
  227. package/dist/workflows/dag/node-execution.js +228 -15
  228. package/dist/workflows/dag/prompt.js +60 -1
  229. package/dist/workflows/dag/rerun-feedback.js +212 -0
  230. package/dist/workflows/dag/rerun-plan.js +224 -27
  231. package/dist/workflows/dag/rerun-run.js +61 -6
  232. package/dist/workflows/dag/rerun-task.js +61 -2
  233. package/dist/workflows/dag/retry-policy.js +109 -0
  234. package/dist/workflows/dag/structured-output-repair.js +712 -0
  235. package/dist/workflows/dag/types.js +185 -12
  236. package/dist/workflows/dag/validate.js +64 -20
  237. package/docs/README.md +1 -0
  238. package/docs/architecture/evolution.md +45 -0
  239. package/docs/init-surface.manifest.json +6 -0
  240. package/docs/operations/README.md +1 -1
  241. package/docs/operations/local-development-environment.md +1 -5
  242. package/docs/skills/vetted-skill-registry.md +14 -0
  243. package/docs/templates/README.md +2 -2
  244. package/docs/templates/agent-dag.schema.json +44 -0
  245. package/docs/templates/backend-test-dag.json +60 -35
  246. package/docs/templates/frontend-implementation-contract.schema.json +681 -24
  247. package/docs/templates/frontend-test-case-checklist.md +2 -2
  248. package/docs/templates/frontend-test-dag.json +8 -10
  249. package/docs/templates/frontend-test-dag.retrieve-context.prompt.md +1 -1
  250. package/docs/templates/init-managed-agents.md +13 -3
  251. package/harness.json +6 -4
  252. package/package.json +12 -4
  253. package/scripts/next-info.mjs +356 -0
  254. package/scripts/next-publish-gate.mjs +238 -0
  255. package/scripts/release-source-binding.mjs +251 -0
  256. package/skills/analyze-product-requirements/SKILL.md +8 -5
  257. package/skills/analyze-product-requirements/references/acceptance-criteria.md +1 -1
  258. package/skills/analyze-product-requirements/references/clarification-and-knowledge.md +10 -6
  259. package/skills/analyze-product-requirements/references/example.md +50 -0
  260. package/skills/analyze-product-requirements/references/forward-test-cases.md +11 -7
  261. package/skills/analyze-product-requirements/references/kb-integration.md +5 -5
  262. package/skills/analyze-product-requirements/references/product-analysis-schema.md +8 -4
  263. package/skills/analyze-product-requirements/references/product-requirement-schema.md +2 -2
  264. package/skills/analyze-product-requirements/references/requirement-clarification-schema.md +1 -1
  265. package/skills/analyze-product-requirements/scripts/test-validators.mjs +11 -1
  266. package/skills/analyze-product-requirements/scripts/validate-product-analysis.mjs +20 -1
  267. package/skills/analyze-product-requirements/scripts/validate-requirement-clarification.mjs +9 -0
  268. package/skills/codebase-scout/SKILL.md +1 -1
  269. package/skills/fe-test-ui-scout/SKILL.md +65 -0
  270. package/skills/fe-test-ui-scout/references/ledger-schema.md +62 -0
  271. package/skills/fe-test-ui-scout/references/recon-protocol.md +54 -0
  272. package/skills/frontend-implementation/references/node-contracts.md +2 -2
  273. package/skills/improve-codebase-architecture/SKILL.md +81 -0
  274. package/skills/improve-codebase-architecture/deepening.md +37 -0
  275. package/skills/improve-codebase-architecture/html-report.md +123 -0
  276. package/skills/improve-codebase-architecture/interface-design.md +44 -0
  277. package/skills/improve-codebase-architecture/language.md +53 -0
  278. package/skills/loop-agent/references/command-reference.md +11 -4
  279. package/skills/loop-agent/references/hybrid-dag.md +7 -0
  280. package/skills/playwright-cli/SKILL.md +23 -1
  281. package/skills/playwright-cli-case-generator/SKILL.md +29 -8
  282. package/dist/worker/console/static/assets/channel-BBOTJHvD.js +0 -1
  283. package/dist/worker/console/static/assets/classDiagram-JCYQIIEL-Cm8Yf8tD.js +0 -1
  284. package/dist/worker/console/static/assets/classDiagram-v2-OCEON4UE-Cm8Yf8tD.js +0 -1
  285. package/dist/worker/console/static/assets/index-B-qWGThd.js +0 -325
  286. package/dist/worker/console/static/assets/index-C-xRgY_0.css +0 -1
  287. package/dist/worker/console/static/assets/stateDiagram-v2-UEYNNEHI-DZihfdKc.js +0 -1
  288. package/dist/worker/console/static/assets/swimlanesDiagram-ULZ7WXOC-CKnXCjHX.js +0 -8
@@ -279,6 +279,7 @@ export async function generateTaskDagUseCase(input) {
279
279
  const candidateResult = await initHybridDagFromTask(repoRoot, parsed.taskId, {
280
280
  outputPath: parsed.outputPath,
281
281
  template: "standard-dag",
282
+ rerunFeedback: parsed.rerunFeedback,
282
283
  });
283
284
  const candidateValidateSummary = await validateDagUseCase(buildValidateInput(repoRoot, candidateResult.outputPath, parsed));
284
285
  const profileRouting = await resolveProfileRouting(repoRoot, parsed, candidateValidateSummary.governanceProfile ?? {
@@ -324,8 +325,16 @@ export async function generateTaskDagUseCase(input) {
324
325
  : await initHybridDagFromTask(repoRoot, parsed.taskId, {
325
326
  outputPath: parsed.outputPath,
326
327
  template: profileRouting.selectedTemplate,
328
+ rerunFeedback: parsed.rerunFeedback,
327
329
  });
328
330
  const outputPath = initResult.outputPath;
331
+ if (parsed.expectedRerunFeedbackDigest) {
332
+ const generatedSpec = parseDagSpec(JSON.parse(await readFile(outputPath, "utf8")));
333
+ if (generatedSpec.rerunFeedback?.digest !==
334
+ parsed.expectedRerunFeedbackDigest) {
335
+ throw new Error(`rerun feedback drift: expected ${parsed.expectedRerunFeedbackDigest}, got ${generatedSpec.rerunFeedback?.digest ?? "missing"}`);
336
+ }
337
+ }
329
338
  const validateSummary = profileRouting.selectedTemplate === candidateResult.template
330
339
  ? candidateValidateSummary
331
340
  : await validateDagUseCase(buildValidateInput(repoRoot, outputPath, parsed));
@@ -3,6 +3,7 @@ import path from "node:path";
3
3
  import { createTask, getTaskPaths, loadTaskConfig, } from "../../task/runtime.js";
4
4
  import { importPrdDocument } from "../../task/source-references.js";
5
5
  import { prepareTaskSource } from "../../task/source-prepare/index.js";
6
+ import { resolveProductionSourceFidelityPi } from "../../task/source-prepare/source-fidelity-pi.js";
6
7
  import { isIntakeSoftGapCode, resolvePrdImportRole, } from "../../task/source-prepare/artifact-meta.js";
7
8
  import { sanitizeDraftPlaceholders } from "../../task/source-prepare/placeholder-paths.js";
8
9
  import { evaluateSemanticIntakeEligibility, isSemanticIntakeDisabled, readSemanticIntakeAttempted, runSemanticIntake, } from "../../task/source-prepare/semantic-intake.js";
@@ -38,6 +39,7 @@ function hasEngineeringBoundary(input) {
38
39
  return Boolean((input.allowedPaths && input.allowedPaths.length > 0) ||
39
40
  (input.forbiddenPaths && input.forbiddenPaths.length > 0) ||
40
41
  (input.verifyCommands && input.verifyCommands.length > 0) ||
42
+ input.backendTest !== undefined ||
41
43
  input.fromText ||
42
44
  input.fromDraftPath);
43
45
  }
@@ -584,6 +586,15 @@ export async function advanceTaskLifecycle(input) {
584
586
  continue;
585
587
  }
586
588
  if (action.type === "prepare-contract") {
589
+ // 生产 source fidelity Pi 接线(AC-PROD-001/005):仅 frontend-implementation
590
+ // 任务注入 reconcile executor + 独立 reviewer;ineligible 返回 undefined 不接线。
591
+ // 主路径与 semantic-intake retry 路径共用同一接线,保证任意一条生产路径都实际
592
+ // 触发 reconciliation executor(修复前两处均缺省导致生产路径从不调用 Pi)。
593
+ const sourceFidelity = await resolveProductionSourceFidelityPi({
594
+ repoRoot: input.repoRoot,
595
+ taskId: input.taskId,
596
+ taskKind: input.taskKind,
597
+ });
587
598
  let draftIntent = null;
588
599
  if (input.fromDraftPath) {
589
600
  try {
@@ -632,7 +643,9 @@ export async function advanceTaskLifecycle(input) {
632
643
  allowedPaths: effectiveInput.allowedPaths,
633
644
  forbiddenPaths: input.forbiddenPaths,
634
645
  verifyCommands: effectiveInput.verifyCommands,
646
+ backendTest: input.backendTest,
635
647
  },
648
+ ...(sourceFidelity ? { sourceFidelity } : {}),
636
649
  });
637
650
  if (!prepareResult.ok) {
638
651
  const gapCodes = (prepareResult.gaps ?? [])
@@ -687,6 +700,7 @@ export async function advanceTaskLifecycle(input) {
687
700
  allowedPaths: effectiveInput.allowedPaths,
688
701
  forbiddenPaths: input.forbiddenPaths,
689
702
  verifyCommands: effectiveInput.verifyCommands,
703
+ backendTest: input.backendTest,
690
704
  },
691
705
  });
692
706
  if (semantic.ok) {
@@ -707,7 +721,9 @@ export async function advanceTaskLifecycle(input) {
707
721
  allowedPaths: effectiveInput.allowedPaths,
708
722
  forbiddenPaths: input.forbiddenPaths,
709
723
  verifyCommands: effectiveInput.verifyCommands,
724
+ backendTest: input.backendTest,
710
725
  },
726
+ ...(sourceFidelity ? { sourceFidelity } : {}),
711
727
  });
712
728
  if (retry.ok) {
713
729
  warnings.push({
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "0.37.0",
4
- "gitSha": "aaa51e1fe0a1b8731731152ae34de25ed4c8ff0d",
5
- "builtAt": "2026-08-18T06:52:28.616Z"
3
+ "version": "0.39.1",
4
+ "gitSha": "0111f8b7ae21df3ec1c46c7b520d92db16cf44a6",
5
+ "builtAt": "2026-08-25T09:12:07.381Z"
6
6
  }
@@ -7,6 +7,7 @@ import { runCoverageReport } from "../commands/coverage-report.js";
7
7
  import { runExamples } from "../commands/examples.js";
8
8
  import { runHandoffCheck } from "../commands/handoff-check.js";
9
9
  import { runInspect } from "../commands/inspect.js";
10
+ import { runInspectNext } from "../commands/inspect-next.js";
10
11
  import { runInstructions } from "../commands/instructions.js";
11
12
  import { runTaskAdvance } from "../commands/task-advance.js";
12
13
  import { runTaskStatus } from "../commands/task-status.js";
@@ -74,6 +75,7 @@ export function parseSummaryFlag(tokens) {
74
75
  const DOCS_SUBCOMMANDS = ["audit", "archive"];
75
76
  const INIT_SUBCOMMANDS = [
76
77
  "instructions",
78
+ "model-catalog",
77
79
  "doctor",
78
80
  "check-update",
79
81
  "update",
@@ -162,10 +164,19 @@ export const COMMAND_DEFINITIONS = [
162
164
  name: "inspect",
163
165
  adapter: "required",
164
166
  tier: "operator",
165
- intent: "Inspect the target repo harness manifest.",
166
- usage: "inspect",
167
- handler: async ({ adapter, repoRoot }) => {
168
- await runInspect(adapter, repoRoot);
167
+ intent: "Inspect the target repo harness manifest, or report the current npm next binding.",
168
+ usage: "inspect | inspect next [--json]",
169
+ subcommands: ["next"],
170
+ handler: async ({ adapter, repoRoot, subcommand, rest }) => {
171
+ if (subcommand === "next") {
172
+ await runInspectNext(repoRoot, rest.filter((arg) => Boolean(arg)));
173
+ return;
174
+ }
175
+ if (subcommand === undefined || subcommand.startsWith("-")) {
176
+ await runInspect(adapter, repoRoot);
177
+ return;
178
+ }
179
+ throw new Error("usage: inspect | inspect next [--json]");
169
180
  },
170
181
  },
171
182
  {
@@ -205,7 +216,7 @@ export const COMMAND_DEFINITIONS = [
205
216
  adapter: "none",
206
217
  tier: "primary",
207
218
  intent: "Initialize a target repository with loop-agent harness capabilities.",
208
- usage: "init [instructions|doctor|check-update|update|reconcile|upgrade] [--profile full|minimal] [--merge] [--json|--markdown] [--bootstrap-surface|--apply-safe] [--client-recovery=auto|project|user|off] [--run-id <id> --status|--continue|--report]",
219
+ usage: "init [instructions|model-catalog|doctor|check-update|update|reconcile|upgrade] [--profile full|minimal] [--merge] [--model provider/model | --low-model provider/model --med-model provider/model --high-model provider/model] [--json|--markdown] [--bootstrap-surface|--apply-safe] [--client-recovery=auto|project|user|off] [--run-id <id> --status|--continue|--report]",
209
220
  subcommands: [...INIT_SUBCOMMANDS],
210
221
  handler: async ({ repoRoot, subcommand, rest }) => {
211
222
  await runInit(repoRoot, [subcommand, ...rest].filter(Boolean), { readRuntimeActivity: readInitRuntimeActivity });
@@ -33,6 +33,7 @@ import { runHarvest } from "../commands/harvest.js";
33
33
  import { runInit } from "../commands/init.js";
34
34
  import { readInitRuntimeActivity } from "./update/runtime-activity.js";
35
35
  import { runInspect } from "../commands/inspect.js";
36
+ import { runInspectNext } from "../commands/inspect-next.js";
36
37
  import { runInstructions } from "../commands/instructions.js";
37
38
  import { runKnowledge } from "../commands/knowledge.js";
38
39
  import { runLoop } from "../commands/loop.js";
@@ -97,6 +98,9 @@ async function dispatchRegisteredCommand(commandObject, defaultRepoRoot, rawArgs
97
98
  [...rest, ...rawArgs].some((token) => token === "--json")) ||
98
99
  (command === "stats" &&
99
100
  subcommand === "context" &&
101
+ [...rest, ...rawArgs].some((token) => token === "--json")) ||
102
+ (command === "inspect" &&
103
+ subcommand === "next" &&
100
104
  [...rest, ...rawArgs].some((token) => token === "--json"));
101
105
  const repoRoot = resolveRepoRootOnly(commandObject, defaultRepoRoot, {
102
106
  quiet,
@@ -125,8 +129,15 @@ async function runTaskCommand(repoRoot, subcommand, rest) {
125
129
  async function runCommanderAction(ctx, command, subcommand, rest) {
126
130
  switch (command) {
127
131
  case "inspect":
128
- await runInspect(ctx.adapter, ctx.repoRoot);
129
- return;
132
+ if (subcommand === "next") {
133
+ await runInspectNext(ctx.repoRoot, rest);
134
+ return;
135
+ }
136
+ if (subcommand === undefined || subcommand.startsWith("-")) {
137
+ await runInspect(ctx.adapter, ctx.repoRoot);
138
+ return;
139
+ }
140
+ throw new Error("usage: inspect | inspect next [--json]");
130
141
  case "doctor":
131
142
  await runDoctor(ctx.adapter, ctx.repoRoot, compactArgs([subcommand, ...rest]));
132
143
  return;
@@ -595,6 +606,9 @@ export function buildLoopAgentProgram(options) {
595
606
  .option("--no-merge", "skip existing files")
596
607
  .option("--provider <provider>", "provider paired with a bare --model (otherwise use provider/model)")
597
608
  .option("--model <model>", "qualified provider/model, or a bare model paired with --provider")
609
+ .option("--low-model <provider/model>", "credential-ready Pi model for LOW")
610
+ .option("--med-model <provider/model>", "credential-ready Pi model for MED")
611
+ .option("--high-model <provider/model>", "credential-ready Pi model for HIGH")
598
612
  .option("--json", "print JSON")
599
613
  .option("--markdown", "print Markdown")
600
614
  .option("--bootstrap-surface", "write an inferred .harness/init-surface.json baseline")
@@ -1,6 +1,6 @@
1
1
  import { createInterface } from "node:readline/promises";
2
2
  import { evaluateLatestVersion, shouldCheckForUpdates } from "./policy.js";
3
- import { acquireUpdateLock, readUpdateState, updateLockPath, updateStatePath, writeUpdateState, } from "./state.js";
3
+ import { acquireUpdateLock, readUpdateState, updateLockPath, updateStatePath, writeUpdateState, } from "../../shared/update/state.js";
4
4
  const CHECK_INTERVAL_MS = 24 * 60 * 60 * 1000;
5
5
  const FAILURE_COOLDOWN_MS = 10 * 60 * 1000;
6
6
  export async function runSelfUpdateNotifier(options) {
@@ -69,7 +69,7 @@ export async function runSelfUpdateNotifier(options) {
69
69
  }
70
70
  writeStderr(`loop-agent 已更新到 ${decision.targetVersion};新版本将在下一次调用时生效。\n`);
71
71
  await safeWriteState(statePath, {
72
- schemaVersion: 1,
72
+ ...state,
73
73
  lastCheckedAt: now().toISOString(),
74
74
  latestVersion: decision.targetVersion,
75
75
  });
@@ -1,29 +1 @@
1
- import { readdir } from "node:fs/promises";
2
- import path from "node:path";
3
- import { buildGlobalSnapshot } from "../../worker/observability/read-model.js";
4
- /**
5
- * Read-only runtime guard for init-surface writes.
6
- *
7
- * DAG activeness is anchored to real directories in the canonical active
8
- * lifecycle root. Worker activeness reuses the Observe read model so Task Pool
9
- * status precedence and composite identity stay owned by the Worker adapter.
10
- * Projection failures block writes because liveness cannot be proven safely.
11
- */
12
- export async function readInitRuntimeActivity(repoRoot) {
13
- const resolvedRoot = path.resolve(repoRoot);
14
- const activeDagRoot = path.join(resolvedRoot, ".harness", "dag-runs", "active");
15
- const entries = await readdir(activeDagRoot, { withFileTypes: true }).catch(() => []);
16
- const activeDagRunIds = entries
17
- .filter((entry) => entry.isDirectory() && entry.name !== ".gitkeep")
18
- .map((entry) => entry.name)
19
- .sort();
20
- const snapshot = await buildGlobalSnapshot({ repoRoot: resolvedRoot });
21
- return {
22
- activeDagRunIds,
23
- activeWorkerBatches: snapshot.health.worker.activeBatches,
24
- activeWorkerTasks: snapshot.health.worker.activeTasks,
25
- ...(snapshot.projectionError
26
- ? { workerProjectionError: snapshot.projectionError.message }
27
- : {}),
28
- };
29
- }
1
+ export { readInitRuntimeActivity } from "../../worker/observability/init-runtime-activity.js";
package/dist/cli.js CHANGED
@@ -4,7 +4,7 @@ import os from "node:os";
4
4
  import path from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { buildLoopAgentProgram } from "./cli/program.js";
7
- import { createNpmUpdateClient } from "./cli/update/npm-client.js";
7
+ import { createNpmUpdateClient } from "./shared/update/npm-client.js";
8
8
  import { runSelfUpdateNotifier } from "./cli/update/notifier.js";
9
9
  import { resolveInitSurfaceRepoRoot, runInitSurfaceNotifier, } from "./cli/update/init-surface-notifier.js";
10
10
  async function main() {
@@ -29,6 +29,7 @@ async function main() {
29
29
  client: createNpmUpdateClient({
30
30
  currentVersion,
31
31
  packageRoot,
32
+ cwd: defaultRepoRoot,
32
33
  env: process.env,
33
34
  }),
34
35
  });
@@ -1,3 +1,5 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { isDagRerunPromptOverrideEnabled } from "../shared/dag-prompt-override.js";
1
3
  import { executeDagRerun, planDagRerun, } from "../workflows/dag/rerun-run.js";
2
4
  export function parseDagRerunArgs(args) {
3
5
  if (args.length === 0) {
@@ -9,6 +11,8 @@ export function parseDagRerunArgs(args) {
9
11
  let planHash;
10
12
  let requestId;
11
13
  let reason;
14
+ const promptOverrideSpecs = [];
15
+ const promptOverrideAppendSpecs = [];
12
16
  for (let index = 0; index < args.length; index += 1) {
13
17
  const arg = args[index];
14
18
  if (arg === "--run-id")
@@ -33,6 +37,14 @@ export function parseDagRerunArgs(args) {
33
37
  reason = args[++index];
34
38
  else if (arg.startsWith("--reason="))
35
39
  reason = arg.slice("--reason=".length);
40
+ else if (arg === "--prompt-override")
41
+ promptOverrideSpecs.push(args[++index] ?? "");
42
+ else if (arg.startsWith("--prompt-override="))
43
+ promptOverrideSpecs.push(arg.slice("--prompt-override=".length));
44
+ else if (arg === "--prompt-override-append")
45
+ promptOverrideAppendSpecs.push(args[++index] ?? "");
46
+ else if (arg.startsWith("--prompt-override-append="))
47
+ promptOverrideAppendSpecs.push(arg.slice("--prompt-override-append=".length));
36
48
  else if (arg === "--json")
37
49
  continue;
38
50
  else if (arg.startsWith("-"))
@@ -50,7 +62,13 @@ export function parseDagRerunArgs(args) {
50
62
  if (planHash || requestId || reason) {
51
63
  throw new Error("dag rerun --plan cannot be combined with execute flags");
52
64
  }
53
- return { parentRunId, selectedNodeId, planOnly: true };
65
+ return {
66
+ parentRunId,
67
+ selectedNodeId,
68
+ planOnly: true,
69
+ promptOverrideSpecs,
70
+ promptOverrideAppendSpecs,
71
+ };
54
72
  }
55
73
  if (!planHash?.trim()) {
56
74
  throw new Error("dag rerun execute requires --plan-hash <hash>");
@@ -68,15 +86,50 @@ export function parseDagRerunArgs(args) {
68
86
  planHash: planHash.trim(),
69
87
  requestId: requestId.trim(),
70
88
  reason: reason.trim(),
89
+ promptOverrideSpecs,
90
+ promptOverrideAppendSpecs,
71
91
  };
72
92
  }
93
+ async function loadPromptOverrides(specs, mode) {
94
+ const overrides = [];
95
+ for (const spec of specs) {
96
+ const separator = spec.indexOf("@");
97
+ if (separator <= 0 || separator >= spec.length - 1) {
98
+ throw new Error(`dag rerun --prompt-override${mode === "append" ? "-append" : ""} expects <nodeId>@<filePath>, got: ${spec}`);
99
+ }
100
+ const nodeId = spec.slice(0, separator);
101
+ const filePath = spec.slice(separator + 1);
102
+ let prompt;
103
+ try {
104
+ prompt = await readFile(filePath, "utf-8");
105
+ }
106
+ catch (error) {
107
+ throw new Error(`cannot read prompt override file for node ${nodeId} (${filePath}): ${error instanceof Error ? error.message : String(error)}`);
108
+ }
109
+ overrides.push(mode === "append" ? { nodeId, prompt, mode } : { nodeId, prompt });
110
+ }
111
+ return overrides;
112
+ }
73
113
  export async function runDagRerun(repoRoot, rawArgs) {
74
114
  const parsed = parseDagRerunArgs(rawArgs);
115
+ let promptOverrides;
116
+ const hasOverrides = parsed.promptOverrideSpecs.length > 0 ||
117
+ parsed.promptOverrideAppendSpecs.length > 0;
118
+ if (hasOverrides) {
119
+ if (!isDagRerunPromptOverrideEnabled()) {
120
+ throw new Error("prompt override rerun is disabled by HARNESS_DAG_RERUN_PROMPT_OVERRIDE; unset it or use a value other than 0, false, or off to enable this experimental capability");
121
+ }
122
+ promptOverrides = [
123
+ ...(await loadPromptOverrides(parsed.promptOverrideSpecs, "replace")),
124
+ ...(await loadPromptOverrides(parsed.promptOverrideAppendSpecs, "append")),
125
+ ];
126
+ }
75
127
  if (parsed.planOnly) {
76
128
  const plan = await planDagRerun({
77
129
  cwd: repoRoot,
78
130
  parentRunId: parsed.parentRunId,
79
131
  selectedNodeId: parsed.selectedNodeId,
132
+ promptOverrides,
80
133
  });
81
134
  const result = {
82
135
  ok: plan.eligible,
@@ -95,6 +148,7 @@ export async function runDagRerun(repoRoot, rawArgs) {
95
148
  planHash: parsed.planHash,
96
149
  requestId: parsed.requestId,
97
150
  reason: parsed.reason,
151
+ promptOverrides,
98
152
  });
99
153
  console.log(JSON.stringify(result, null, 2));
100
154
  if (!result.ok) {