sdd-agent-platform 0.4.1 → 0.5.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 (698) hide show
  1. package/README.md +24 -28
  2. package/node_modules/@sdd-agent-platform/core/dist/ai-tools.js +84 -103
  3. package/node_modules/@sdd-agent-platform/core/dist/ai-tools.js.map +1 -1
  4. package/node_modules/@sdd-agent-platform/core/dist/config/init-project.d.ts +10 -6
  5. package/node_modules/@sdd-agent-platform/core/dist/config/init-project.js +7 -8
  6. package/node_modules/@sdd-agent-platform/core/dist/config/init-project.js.map +1 -1
  7. package/node_modules/@sdd-agent-platform/core/dist/config/project-config.d.ts +3 -1
  8. package/node_modules/@sdd-agent-platform/core/dist/config/project-config.js +7 -3
  9. package/node_modules/@sdd-agent-platform/core/dist/config/project-config.js.map +1 -1
  10. package/node_modules/@sdd-agent-platform/core/dist/config/starter-documents.d.ts +0 -1
  11. package/node_modules/@sdd-agent-platform/core/dist/config/starter-documents.js +374 -421
  12. package/node_modules/@sdd-agent-platform/core/dist/config/starter-documents.js.map +1 -1
  13. package/node_modules/@sdd-agent-platform/core/dist/context/build-package.d.ts +1 -1
  14. package/node_modules/@sdd-agent-platform/core/dist/context/build-package.js +7 -19
  15. package/node_modules/@sdd-agent-platform/core/dist/context/build-package.js.map +1 -1
  16. package/node_modules/@sdd-agent-platform/core/dist/contracts.d.ts +7 -1
  17. package/node_modules/@sdd-agent-platform/core/dist/contracts.js +6 -0
  18. package/node_modules/@sdd-agent-platform/core/dist/contracts.js.map +1 -1
  19. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/document-chain.js +2 -12
  20. package/node_modules/@sdd-agent-platform/core/dist/doctor/checks/document-chain.js.map +1 -1
  21. package/node_modules/@sdd-agent-platform/core/dist/doctor/doctor.js +1 -18
  22. package/node_modules/@sdd-agent-platform/core/dist/doctor/doctor.js.map +1 -1
  23. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.d.ts +1 -1
  24. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.js +1 -1
  25. package/node_modules/@sdd-agent-platform/core/dist/evidence/lookup.js.map +1 -1
  26. package/node_modules/@sdd-agent-platform/core/dist/evidence-runtime/contracts.d.ts +0 -1
  27. package/node_modules/@sdd-agent-platform/core/dist/evidence-runtime/coordination.js +110 -0
  28. package/node_modules/@sdd-agent-platform/core/dist/evidence-runtime/coordination.js.map +1 -0
  29. package/node_modules/@sdd-agent-platform/core/dist/execution/host-invocation.js +83 -83
  30. package/node_modules/@sdd-agent-platform/core/dist/instructions.d.ts +1 -1
  31. package/node_modules/@sdd-agent-platform/core/dist/instructions.js +37 -80
  32. package/node_modules/@sdd-agent-platform/core/dist/instructions.js.map +1 -1
  33. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/ship.js +58 -68
  34. package/node_modules/@sdd-agent-platform/core/dist/lifecycle/ship.js.map +1 -1
  35. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/contracts.d.ts +159 -0
  36. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/contracts.js +7 -0
  37. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/contracts.js.map +1 -0
  38. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/kernel.d.ts +16 -0
  39. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/kernel.js +461 -0
  40. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph/kernel.js.map +1 -0
  41. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph.d.ts +2 -0
  42. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph.js +3 -0
  43. package/node_modules/@sdd-agent-platform/core/dist/lifecycle-graph.js.map +1 -0
  44. package/node_modules/@sdd-agent-platform/core/dist/orchestration/contracts.d.ts +1 -1
  45. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.js +21 -28
  46. package/node_modules/@sdd-agent-platform/core/dist/orchestration/runtime.js.map +1 -1
  47. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-registry.js +124 -40
  48. package/node_modules/@sdd-agent-platform/core/dist/registries/agent-registry.js.map +1 -1
  49. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.d.ts +1 -1
  50. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.js +6 -13
  51. package/node_modules/@sdd-agent-platform/core/dist/registries/command-team-runtime.js.map +1 -1
  52. package/node_modules/@sdd-agent-platform/core/dist/registries/plan-scout-domains.d.ts +13 -0
  53. package/node_modules/@sdd-agent-platform/core/dist/registries/plan-scout-domains.js +76 -0
  54. package/node_modules/@sdd-agent-platform/core/dist/registries/plan-scout-domains.js.map +1 -0
  55. package/node_modules/@sdd-agent-platform/core/dist/registries/skill-capabilities.js +7 -7
  56. package/node_modules/@sdd-agent-platform/core/dist/registries/skill-capabilities.js.map +1 -1
  57. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-capabilities.js +6 -6
  58. package/node_modules/@sdd-agent-platform/core/dist/registries/tool-capabilities.js.map +1 -1
  59. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.d.ts +1 -1
  60. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.js +18 -18
  61. package/node_modules/@sdd-agent-platform/core/dist/registries/workflow-gates.js.map +1 -1
  62. package/node_modules/@sdd-agent-platform/core/dist/risk/consumer-diagnostics.js +2 -1
  63. package/node_modules/@sdd-agent-platform/core/dist/risk/consumer-diagnostics.js.map +1 -1
  64. package/node_modules/@sdd-agent-platform/core/dist/risk/contracts.d.ts +2 -2
  65. package/node_modules/@sdd-agent-platform/core/dist/risk/kernel.js +7 -7
  66. package/node_modules/@sdd-agent-platform/core/dist/risk/kernel.js.map +1 -1
  67. package/node_modules/@sdd-agent-platform/core/dist/risk/legacy-adapters.js +12 -27
  68. package/node_modules/@sdd-agent-platform/core/dist/risk/legacy-adapters.js.map +1 -1
  69. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.js +6 -6
  70. package/node_modules/@sdd-agent-platform/core/dist/risk/workflow-gates.js.map +1 -1
  71. package/node_modules/@sdd-agent-platform/core/dist/router/agent-runtime-config.js +1 -1
  72. package/node_modules/@sdd-agent-platform/core/dist/router/agent-runtime-config.js.map +1 -1
  73. package/node_modules/@sdd-agent-platform/core/dist/router/routing.js +2 -4
  74. package/node_modules/@sdd-agent-platform/core/dist/router/routing.js.map +1 -1
  75. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-import.d.ts +28 -0
  76. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-import.js +383 -0
  77. package/node_modules/@sdd-agent-platform/core/dist/router/runtime-import.js.map +1 -0
  78. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.d.ts +37 -0
  79. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.js +227 -0
  80. package/node_modules/@sdd-agent-platform/core/dist/router/stage-route-binding.js.map +1 -0
  81. package/node_modules/@sdd-agent-platform/core/dist/router.d.ts +1 -0
  82. package/node_modules/@sdd-agent-platform/core/dist/router.js +1 -0
  83. package/node_modules/@sdd-agent-platform/core/dist/router.js.map +1 -1
  84. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.d.ts +16 -0
  85. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.js +6 -0
  86. package/node_modules/@sdd-agent-platform/core/dist/run-state/artifacts.js.map +1 -1
  87. package/node_modules/@sdd-agent-platform/core/dist/run-state/model.d.ts +20 -0
  88. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-state.js +7 -7
  89. package/node_modules/@sdd-agent-platform/core/dist/run-state/run-state.js.map +1 -1
  90. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.d.ts +1 -2
  91. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.js +2 -9
  92. package/node_modules/@sdd-agent-platform/core/dist/run-state/task-evidence.js.map +1 -1
  93. package/node_modules/@sdd-agent-platform/core/dist/run-state/timing.d.ts +8 -0
  94. package/node_modules/@sdd-agent-platform/core/dist/run-state/timing.js +131 -0
  95. package/node_modules/@sdd-agent-platform/core/dist/run-state/timing.js.map +1 -0
  96. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/build.js +1 -4
  97. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/build.js.map +1 -1
  98. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/findings.js +0 -39
  99. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/findings.js.map +1 -1
  100. package/node_modules/@sdd-agent-platform/core/dist/runtime-analysis/model.d.ts +1 -17
  101. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.d.ts +10 -0
  102. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.js +65 -0
  103. package/node_modules/@sdd-agent-platform/core/dist/runtime-paths.js.map +1 -1
  104. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.d.ts +64 -0
  105. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.js +211 -0
  106. package/node_modules/@sdd-agent-platform/core/dist/runtime-projection-p0.js.map +1 -0
  107. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/artifact-depth.d.ts +14 -0
  108. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/artifact-depth.js +179 -0
  109. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/artifact-depth.js.map +1 -0
  110. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.d.ts +5 -1
  111. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.js +60 -22
  112. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-parser.js.map +1 -1
  113. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-rendering.js +2 -2
  114. package/node_modules/@sdd-agent-platform/core/dist/sdd-docs/task-rendering.js.map +1 -1
  115. package/node_modules/@sdd-agent-platform/core/dist/spec-entry.js +40 -0
  116. package/node_modules/@sdd-agent-platform/core/dist/spec-entry.js.map +1 -0
  117. package/node_modules/@sdd-agent-platform/core/dist/spec-manager-contracts.d.ts +12 -0
  118. package/node_modules/@sdd-agent-platform/core/dist/spec-manager-contracts.js +2 -0
  119. package/node_modules/@sdd-agent-platform/core/dist/spec-manager-contracts.js.map +1 -0
  120. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.d.ts +55 -0
  121. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.js +315 -0
  122. package/node_modules/@sdd-agent-platform/core/dist/stage-artifacts.js.map +1 -0
  123. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.d.ts +55 -0
  124. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.js +238 -0
  125. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration-contracts.js.map +1 -0
  126. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.d.ts +736 -0
  127. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.js +4018 -0
  128. package/node_modules/@sdd-agent-platform/core/dist/stage-collaboration.js.map +1 -0
  129. package/node_modules/@sdd-agent-platform/core/dist/stage-runtime/runtime.js +8 -1
  130. package/node_modules/@sdd-agent-platform/core/dist/stage-runtime/runtime.js.map +1 -1
  131. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.js +25 -1
  132. package/node_modules/@sdd-agent-platform/core/dist/status/project-status.js.map +1 -1
  133. package/node_modules/@sdd-agent-platform/core/dist/storage/runtime-store.d.ts +170 -18
  134. package/node_modules/@sdd-agent-platform/core/dist/storage/runtime-store.js +597 -85
  135. package/node_modules/@sdd-agent-platform/core/dist/storage/runtime-store.js.map +1 -1
  136. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.d.ts +1 -17
  137. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.js +1 -242
  138. package/node_modules/@sdd-agent-platform/core/dist/sync-back/apply.js.map +1 -1
  139. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.d.ts +1 -110
  140. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.js +1 -496
  141. package/node_modules/@sdd-agent-platform/core/dist/sync-back/inspect.js.map +1 -1
  142. package/node_modules/@sdd-agent-platform/core/dist/sync-back.d.ts +1 -2
  143. package/node_modules/@sdd-agent-platform/core/dist/sync-back.js +1 -2
  144. package/node_modules/@sdd-agent-platform/core/dist/sync-back.js.map +1 -1
  145. package/node_modules/@sdd-agent-platform/core/dist/task-execution-contract.d.ts +167 -0
  146. package/node_modules/@sdd-agent-platform/core/dist/task-execution-contract.js +377 -0
  147. package/node_modules/@sdd-agent-platform/core/dist/task-execution-contract.js.map +1 -0
  148. package/node_modules/@sdd-agent-platform/core/dist/test-support/fixtures.js +329 -314
  149. package/node_modules/@sdd-agent-platform/core/dist/test-support/fixtures.js.map +1 -1
  150. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.d.ts +1 -0
  151. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.js +31 -0
  152. package/node_modules/@sdd-agent-platform/core/dist/test-support/run-state.js.map +1 -1
  153. package/node_modules/@sdd-agent-platform/core/dist/truth-reconciliation.d.ts +44 -0
  154. package/node_modules/@sdd-agent-platform/core/dist/truth-reconciliation.js +135 -0
  155. package/node_modules/@sdd-agent-platform/core/dist/truth-reconciliation.js.map +1 -0
  156. package/node_modules/@sdd-agent-platform/core/dist/tsconfig.tsbuildinfo +1 -1
  157. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.d.ts +0 -49
  158. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.js +1 -545
  159. package/node_modules/@sdd-agent-platform/core/dist/verification/goal-verify.js.map +1 -1
  160. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.d.ts +5 -7
  161. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.js +15 -55
  162. package/node_modules/@sdd-agent-platform/core/dist/verification/rendering.js.map +1 -1
  163. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.js +1 -40
  164. package/node_modules/@sdd-agent-platform/core/dist/verification/single-task-loop.js.map +1 -1
  165. package/node_modules/@sdd-agent-platform/core/dist/verification/task-evidence-judgment.d.ts +49 -0
  166. package/node_modules/@sdd-agent-platform/core/dist/verification/task-evidence-judgment.js +521 -0
  167. package/node_modules/@sdd-agent-platform/core/dist/verification/task-evidence-judgment.js.map +1 -0
  168. package/node_modules/@sdd-agent-platform/core/dist/verification/test-runtime.d.ts +12 -2
  169. package/node_modules/@sdd-agent-platform/core/dist/verification/test-runtime.js +247 -112
  170. package/node_modules/@sdd-agent-platform/core/dist/verification/test-runtime.js.map +1 -1
  171. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-cache.d.ts +26 -0
  172. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-cache.js +73 -0
  173. package/node_modules/@sdd-agent-platform/core/dist/verification/validation-cache.js.map +1 -0
  174. package/node_modules/@sdd-agent-platform/core/dist/verification/verify-contract.d.ts +1 -1
  175. package/node_modules/@sdd-agent-platform/core/dist/verification/verify-contract.js +49 -72
  176. package/node_modules/@sdd-agent-platform/core/dist/verification/verify-contract.js.map +1 -1
  177. package/node_modules/@sdd-agent-platform/core/dist/verification.d.ts +3 -3
  178. package/node_modules/@sdd-agent-platform/core/dist/verification.js +2 -2
  179. package/node_modules/@sdd-agent-platform/core/dist/verification.js.map +1 -1
  180. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/evidence-packet.js +2 -7
  181. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/evidence-packet.js.map +1 -1
  182. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/hard-checks.js +0 -7
  183. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/hard-checks.js.map +1 -1
  184. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/policy.js +2 -4
  185. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/policy.js.map +1 -1
  186. package/node_modules/@sdd-agent-platform/core/dist/workflow-gate/types.d.ts +3 -5
  187. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.js +30 -4
  188. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/latest-eligible-run.js.map +1 -1
  189. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/migration-recovery.d.ts +40 -0
  190. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/migration-recovery.js +110 -0
  191. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/migration-recovery.js.map +1 -0
  192. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/repair-contract.d.ts +12 -0
  193. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/repair-contract.js +63 -0
  194. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/repair-contract.js.map +1 -0
  195. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve-task-run.d.ts +21 -0
  196. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve-task-run.js +95 -0
  197. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve-task-run.js.map +1 -0
  198. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.d.ts +55 -5
  199. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.js +518 -36
  200. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/resolve.js.map +1 -1
  201. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/runtime-projections.d.ts +228 -0
  202. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/runtime-projections.js +452 -0
  203. package/node_modules/@sdd-agent-platform/core/dist/workflow-state/runtime-projections.js.map +1 -0
  204. package/node_modules/@sdd-agent-platform/core/package.json +6 -3
  205. package/node_modules/@sdd-agent-platform/core/src/ai-tools.test.ts +238 -137
  206. package/node_modules/@sdd-agent-platform/core/src/ai-tools.ts +84 -103
  207. package/node_modules/@sdd-agent-platform/core/src/artifacts/ingestion.test.ts +189 -189
  208. package/node_modules/@sdd-agent-platform/core/src/artifacts/ingestion.ts +222 -222
  209. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-evidence.test.ts +28 -28
  210. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-evidence.ts +302 -302
  211. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-result.test.ts +181 -181
  212. package/node_modules/@sdd-agent-platform/core/src/artifacts/sdd-result.ts +231 -231
  213. package/node_modules/@sdd-agent-platform/core/src/artifacts/templates.ts +99 -99
  214. package/node_modules/@sdd-agent-platform/core/src/artifacts.ts +4 -4
  215. package/node_modules/@sdd-agent-platform/core/src/coding-facts/contracts.ts +79 -79
  216. package/node_modules/@sdd-agent-platform/core/src/coding-facts.ts +1 -1
  217. package/node_modules/@sdd-agent-platform/core/src/config/init-project.test.ts +314 -306
  218. package/node_modules/@sdd-agent-platform/core/src/config/init-project.ts +128 -120
  219. package/node_modules/@sdd-agent-platform/core/src/config/project-config.ts +265 -259
  220. package/node_modules/@sdd-agent-platform/core/src/config/project-detection.ts +147 -147
  221. package/node_modules/@sdd-agent-platform/core/src/config/starter-documents.ts +400 -445
  222. package/node_modules/@sdd-agent-platform/core/src/context/budget.ts +30 -30
  223. package/node_modules/@sdd-agent-platform/core/src/context/build-package.ts +305 -317
  224. package/node_modules/@sdd-agent-platform/core/src/context/command-summary.ts +45 -45
  225. package/node_modules/@sdd-agent-platform/core/src/context/context-build.test.ts +188 -188
  226. package/node_modules/@sdd-agent-platform/core/src/context/evidence-summary.ts +144 -144
  227. package/node_modules/@sdd-agent-platform/core/src/context/log-worker.ts +48 -48
  228. package/node_modules/@sdd-agent-platform/core/src/context/source-refs.ts +41 -41
  229. package/node_modules/@sdd-agent-platform/core/src/context-offload/contracts.ts +47 -47
  230. package/node_modules/@sdd-agent-platform/core/src/context-offload/runtime.test.ts +71 -71
  231. package/node_modules/@sdd-agent-platform/core/src/context-offload/runtime.ts +178 -178
  232. package/node_modules/@sdd-agent-platform/core/src/context-offload.ts +2 -2
  233. package/node_modules/@sdd-agent-platform/core/src/context.ts +6 -6
  234. package/node_modules/@sdd-agent-platform/core/src/contracts/issues.ts +13 -13
  235. package/node_modules/@sdd-agent-platform/core/src/contracts.test.ts +9 -9
  236. package/node_modules/@sdd-agent-platform/core/src/contracts.ts +121 -115
  237. package/node_modules/@sdd-agent-platform/core/src/delegation/delegation.test.ts +183 -183
  238. package/node_modules/@sdd-agent-platform/core/src/delegation/model.ts +23 -23
  239. package/node_modules/@sdd-agent-platform/core/src/delegation/queue.ts +58 -58
  240. package/node_modules/@sdd-agent-platform/core/src/delegation/run-state.ts +14 -14
  241. package/node_modules/@sdd-agent-platform/core/src/delegation/state-machine.ts +90 -90
  242. package/node_modules/@sdd-agent-platform/core/src/delegation/validation.ts +124 -124
  243. package/node_modules/@sdd-agent-platform/core/src/delegation.ts +26 -26
  244. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/ai-entries.ts +28 -28
  245. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/document-chain.ts +104 -112
  246. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/local-run-index.ts +27 -27
  247. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/project.ts +84 -84
  248. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/registries.ts +252 -252
  249. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-evidence.ts +330 -330
  250. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-records.ts +79 -79
  251. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/run-trust.ts +128 -128
  252. package/node_modules/@sdd-agent-platform/core/src/doctor/checks/runtime-contracts.ts +300 -300
  253. package/node_modules/@sdd-agent-platform/core/src/doctor/doctor.test.ts +627 -657
  254. package/node_modules/@sdd-agent-platform/core/src/doctor/doctor.ts +301 -318
  255. package/node_modules/@sdd-agent-platform/core/src/doctor/model.ts +13 -13
  256. package/node_modules/@sdd-agent-platform/core/src/doctor/summary.ts +11 -11
  257. package/node_modules/@sdd-agent-platform/core/src/doctor.ts +2 -2
  258. package/node_modules/@sdd-agent-platform/core/src/evidence/lookup.ts +80 -80
  259. package/node_modules/@sdd-agent-platform/core/src/evidence-runtime/contracts.ts +48 -49
  260. package/node_modules/@sdd-agent-platform/core/src/evidence-runtime.ts +1 -1
  261. package/node_modules/@sdd-agent-platform/core/src/execution/agent-execution-records.ts +195 -195
  262. package/node_modules/@sdd-agent-platform/core/src/execution/background-executor.test.ts +187 -187
  263. package/node_modules/@sdd-agent-platform/core/src/execution/background-executor.ts +305 -305
  264. package/node_modules/@sdd-agent-platform/core/src/execution/foreground-subagents.test.ts +97 -97
  265. package/node_modules/@sdd-agent-platform/core/src/execution/foreground-subagents.ts +453 -453
  266. package/node_modules/@sdd-agent-platform/core/src/execution/host-invocation.ts +225 -225
  267. package/node_modules/@sdd-agent-platform/core/src/execution/resident-worker.test.ts +132 -132
  268. package/node_modules/@sdd-agent-platform/core/src/execution/resident-worker.ts +436 -436
  269. package/node_modules/@sdd-agent-platform/core/src/execution/stage-team-runtime.test.ts +102 -102
  270. package/node_modules/@sdd-agent-platform/core/src/execution/stage-team-runtime.ts +271 -271
  271. package/node_modules/@sdd-agent-platform/core/src/execution/wave-executor.test.ts +111 -111
  272. package/node_modules/@sdd-agent-platform/core/src/execution/wave-executor.ts +231 -231
  273. package/node_modules/@sdd-agent-platform/core/src/execution.ts +5 -5
  274. package/node_modules/@sdd-agent-platform/core/src/governance/policy.test.ts +57 -57
  275. package/node_modules/@sdd-agent-platform/core/src/governance/policy.ts +175 -175
  276. package/node_modules/@sdd-agent-platform/core/src/governance.ts +1 -1
  277. package/node_modules/@sdd-agent-platform/core/src/instructions.test.ts +80 -49
  278. package/node_modules/@sdd-agent-platform/core/src/instructions.ts +38 -81
  279. package/node_modules/@sdd-agent-platform/core/src/lifecycle/decision-gate.test.ts +174 -174
  280. package/node_modules/@sdd-agent-platform/core/src/lifecycle/decision-gate.ts +373 -373
  281. package/node_modules/@sdd-agent-platform/core/src/lifecycle/rendering.ts +29 -29
  282. package/node_modules/@sdd-agent-platform/core/src/lifecycle/risk-signals.ts +146 -146
  283. package/node_modules/@sdd-agent-platform/core/src/lifecycle/ship.test.ts +47 -0
  284. package/node_modules/@sdd-agent-platform/core/src/lifecycle/ship.ts +255 -263
  285. package/node_modules/@sdd-agent-platform/core/src/lifecycle-graph/contracts.ts +179 -0
  286. package/node_modules/@sdd-agent-platform/core/src/lifecycle-graph/kernel.ts +522 -0
  287. package/node_modules/@sdd-agent-platform/core/src/lifecycle-graph.ts +2 -0
  288. package/node_modules/@sdd-agent-platform/core/src/lifecycle.ts +4 -4
  289. package/node_modules/@sdd-agent-platform/core/src/orchestration/contracts.ts +50 -50
  290. package/node_modules/@sdd-agent-platform/core/src/orchestration/index.ts +2 -2
  291. package/node_modules/@sdd-agent-platform/core/src/orchestration/runtime.ts +331 -342
  292. package/node_modules/@sdd-agent-platform/core/src/path-safety.test.ts +22 -22
  293. package/node_modules/@sdd-agent-platform/core/src/phase8-contracts.test.ts +243 -243
  294. package/node_modules/@sdd-agent-platform/core/src/phase8-projection-compat.test.ts +152 -153
  295. package/node_modules/@sdd-agent-platform/core/src/phase8-risk-kernel.test.ts +277 -277
  296. package/node_modules/@sdd-agent-platform/core/src/phase9-lifecycle-graph.test.ts +103 -0
  297. package/node_modules/@sdd-agent-platform/core/src/planning/task-graph.test.ts +88 -88
  298. package/node_modules/@sdd-agent-platform/core/src/planning/task-graph.ts +222 -222
  299. package/node_modules/@sdd-agent-platform/core/src/planning/wave-plan.test.ts +79 -79
  300. package/node_modules/@sdd-agent-platform/core/src/planning/wave-plan.ts +160 -160
  301. package/node_modules/@sdd-agent-platform/core/src/planning.ts +2 -2
  302. package/node_modules/@sdd-agent-platform/core/src/registries/agent-capability-catalog.ts +426 -426
  303. package/node_modules/@sdd-agent-platform/core/src/registries/agent-registry.ts +230 -146
  304. package/node_modules/@sdd-agent-platform/core/src/registries/agent-runtime-static.ts +142 -142
  305. package/node_modules/@sdd-agent-platform/core/src/registries/capability-sources.ts +253 -253
  306. package/node_modules/@sdd-agent-platform/core/src/registries/command-team-runtime.ts +302 -309
  307. package/node_modules/@sdd-agent-platform/core/src/registries/eval-learning-context.ts +246 -246
  308. package/node_modules/@sdd-agent-platform/core/src/registries/plan-scout-domains.ts +89 -0
  309. package/node_modules/@sdd-agent-platform/core/src/registries/query-status.ts +119 -119
  310. package/node_modules/@sdd-agent-platform/core/src/registries/registries.test.ts +454 -429
  311. package/node_modules/@sdd-agent-platform/core/src/registries/skill-capabilities.ts +37 -37
  312. package/node_modules/@sdd-agent-platform/core/src/registries/tool-capabilities.ts +135 -135
  313. package/node_modules/@sdd-agent-platform/core/src/registries/tool-plugins.ts +132 -132
  314. package/node_modules/@sdd-agent-platform/core/src/registries/worker-adapters.ts +144 -144
  315. package/node_modules/@sdd-agent-platform/core/src/registries/workflow-gates.ts +111 -111
  316. package/node_modules/@sdd-agent-platform/core/src/registries.ts +42 -42
  317. package/node_modules/@sdd-agent-platform/core/src/risk/consumer-diagnostics.ts +98 -97
  318. package/node_modules/@sdd-agent-platform/core/src/risk/contracts.ts +63 -63
  319. package/node_modules/@sdd-agent-platform/core/src/risk/kernel.ts +233 -233
  320. package/node_modules/@sdd-agent-platform/core/src/risk/legacy-adapters.ts +251 -266
  321. package/node_modules/@sdd-agent-platform/core/src/risk/workflow-gates.ts +203 -203
  322. package/node_modules/@sdd-agent-platform/core/src/risk.ts +5 -5
  323. package/node_modules/@sdd-agent-platform/core/src/router/agent-runtime-config.ts +327 -327
  324. package/node_modules/@sdd-agent-platform/core/src/router/agent-runtime.ts +388 -388
  325. package/node_modules/@sdd-agent-platform/core/src/router/profile-resolution.ts +154 -154
  326. package/node_modules/@sdd-agent-platform/core/src/router/risk-policy.ts +33 -33
  327. package/node_modules/@sdd-agent-platform/core/src/router/route-cache.ts +100 -100
  328. package/node_modules/@sdd-agent-platform/core/src/router/route-projection.ts +356 -356
  329. package/node_modules/@sdd-agent-platform/core/src/router/route-sdd-task.test.ts +428 -428
  330. package/node_modules/@sdd-agent-platform/core/src/router/route-sdd-task.ts +2 -2
  331. package/node_modules/@sdd-agent-platform/core/src/router/routing-rules.ts +73 -73
  332. package/node_modules/@sdd-agent-platform/core/src/router/routing.ts +189 -191
  333. package/node_modules/@sdd-agent-platform/core/src/router/runtime-import.ts +464 -0
  334. package/node_modules/@sdd-agent-platform/core/src/router/runtime-inspection.ts +124 -124
  335. package/node_modules/@sdd-agent-platform/core/src/router/runtime-registry.ts +123 -123
  336. package/node_modules/@sdd-agent-platform/core/src/router/runtime-validation.ts +277 -277
  337. package/node_modules/@sdd-agent-platform/core/src/router/stage-route-binding.ts +273 -0
  338. package/node_modules/@sdd-agent-platform/core/src/router/team-mode.ts +170 -170
  339. package/node_modules/@sdd-agent-platform/core/src/router.ts +5 -4
  340. package/node_modules/@sdd-agent-platform/core/src/run-state/artifacts.ts +126 -118
  341. package/node_modules/@sdd-agent-platform/core/src/run-state/events.ts +27 -27
  342. package/node_modules/@sdd-agent-platform/core/src/run-state/inspect-run.ts +172 -172
  343. package/node_modules/@sdd-agent-platform/core/src/run-state/invocation-ledger.ts +109 -109
  344. package/node_modules/@sdd-agent-platform/core/src/run-state/model.ts +252 -230
  345. package/node_modules/@sdd-agent-platform/core/src/run-state/run-index.test.ts +52 -52
  346. package/node_modules/@sdd-agent-platform/core/src/run-state/run-index.ts +356 -356
  347. package/node_modules/@sdd-agent-platform/core/src/run-state/run-state.test.ts +70 -70
  348. package/node_modules/@sdd-agent-platform/core/src/run-state/run-state.ts +406 -406
  349. package/node_modules/@sdd-agent-platform/core/src/run-state/task-evidence.ts +198 -206
  350. package/node_modules/@sdd-agent-platform/core/src/run-state/timing.ts +146 -0
  351. package/node_modules/@sdd-agent-platform/core/src/run-state.ts +8 -8
  352. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/build.ts +60 -63
  353. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/findings.ts +257 -296
  354. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis/model.ts +140 -152
  355. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis.test.ts +66 -68
  356. package/node_modules/@sdd-agent-platform/core/src/runtime-analysis.ts +2 -2
  357. package/node_modules/@sdd-agent-platform/core/src/runtime-paths.ts +253 -176
  358. package/node_modules/@sdd-agent-platform/core/src/runtime-projection-p0.test.ts +101 -0
  359. package/node_modules/@sdd-agent-platform/core/src/runtime-projection-p0.ts +314 -0
  360. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/artifact-depth.test.ts +380 -0
  361. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/artifact-depth.ts +207 -0
  362. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/context.ts +111 -111
  363. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/document-hashes.ts +207 -207
  364. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/run-binding.ts +95 -95
  365. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-inspection.ts +39 -39
  366. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-parser.test.ts +467 -401
  367. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-parser.ts +738 -694
  368. package/node_modules/@sdd-agent-platform/core/src/sdd-docs/task-rendering.ts +81 -81
  369. package/node_modules/@sdd-agent-platform/core/src/sdd-docs.ts +5 -5
  370. package/node_modules/@sdd-agent-platform/core/src/spec-manager-contracts.ts +13 -0
  371. package/node_modules/@sdd-agent-platform/core/src/stage-artifacts.ts +435 -0
  372. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration-contracts.ts +316 -0
  373. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration.test.ts +2964 -0
  374. package/node_modules/@sdd-agent-platform/core/src/stage-collaboration.ts +5856 -0
  375. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/contracts.ts +40 -40
  376. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/runtime.test.ts +209 -209
  377. package/node_modules/@sdd-agent-platform/core/src/stage-runtime/runtime.ts +360 -352
  378. package/node_modules/@sdd-agent-platform/core/src/stage-runtime.ts +2 -2
  379. package/node_modules/@sdd-agent-platform/core/src/status/project-status.test.ts +288 -288
  380. package/node_modules/@sdd-agent-platform/core/src/status/project-status.ts +651 -625
  381. package/node_modules/@sdd-agent-platform/core/src/status.ts +2 -2
  382. package/node_modules/@sdd-agent-platform/core/src/storage/json-io.ts +10 -10
  383. package/node_modules/@sdd-agent-platform/core/src/storage/runtime-store.test.ts +489 -489
  384. package/node_modules/@sdd-agent-platform/core/src/storage/runtime-store.ts +1981 -1175
  385. package/node_modules/@sdd-agent-platform/core/src/subagents/contracts.ts +45 -45
  386. package/node_modules/@sdd-agent-platform/core/src/subagents/runtime.test.ts +232 -232
  387. package/node_modules/@sdd-agent-platform/core/src/subagents/runtime.ts +307 -307
  388. package/node_modules/@sdd-agent-platform/core/src/subagents.ts +2 -2
  389. package/node_modules/@sdd-agent-platform/core/src/task-execution-contract.test.ts +141 -0
  390. package/node_modules/@sdd-agent-platform/core/src/task-execution-contract.ts +566 -0
  391. package/node_modules/@sdd-agent-platform/core/src/task-risk-profile.ts +193 -193
  392. package/node_modules/@sdd-agent-platform/core/src/test-support/fixtures.ts +413 -398
  393. package/node_modules/@sdd-agent-platform/core/src/test-support/run-state.ts +102 -70
  394. package/node_modules/@sdd-agent-platform/core/src/test-support.ts +2 -2
  395. package/node_modules/@sdd-agent-platform/core/src/truth-reconciliation.test.ts +72 -0
  396. package/node_modules/@sdd-agent-platform/core/src/truth-reconciliation.ts +174 -0
  397. package/node_modules/@sdd-agent-platform/core/src/verification/rendering.ts +137 -181
  398. package/node_modules/@sdd-agent-platform/core/src/verification/review-gate.test.ts +77 -77
  399. package/node_modules/@sdd-agent-platform/core/src/verification/review-gate.ts +77 -77
  400. package/node_modules/@sdd-agent-platform/core/src/verification/single-task-loop.ts +455 -494
  401. package/node_modules/@sdd-agent-platform/core/src/verification/{goal-verify.test.ts → task-evidence-judgment.test.ts} +261 -335
  402. package/node_modules/@sdd-agent-platform/core/src/verification/{goal-verify.ts → task-evidence-judgment.ts} +619 -648
  403. package/node_modules/@sdd-agent-platform/core/src/verification/test-runtime.ts +1190 -1032
  404. package/node_modules/@sdd-agent-platform/core/src/verification/validation-cache.ts +106 -0
  405. package/node_modules/@sdd-agent-platform/core/src/verification/validation-wave.ts +513 -513
  406. package/node_modules/@sdd-agent-platform/core/src/verification/verify-contract.ts +334 -358
  407. package/node_modules/@sdd-agent-platform/core/src/verification.ts +8 -8
  408. package/node_modules/@sdd-agent-platform/core/src/work-units/contracts.ts +26 -26
  409. package/node_modules/@sdd-agent-platform/core/src/work-units/runtime.test.ts +88 -88
  410. package/node_modules/@sdd-agent-platform/core/src/work-units/runtime.ts +112 -112
  411. package/node_modules/@sdd-agent-platform/core/src/work-units.ts +2 -2
  412. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/evidence-packet.ts +190 -196
  413. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/hard-checks.test.ts +169 -171
  414. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/hard-checks.ts +136 -143
  415. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/policy.test.ts +135 -137
  416. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/policy.ts +153 -155
  417. package/node_modules/@sdd-agent-platform/core/src/workflow-gate/types.ts +111 -114
  418. package/node_modules/@sdd-agent-platform/core/src/workflow-state/affected-file-conflicts.ts +95 -95
  419. package/node_modules/@sdd-agent-platform/core/src/workflow-state/dependencies.test.ts +32 -32
  420. package/node_modules/@sdd-agent-platform/core/src/workflow-state/dependencies.ts +114 -114
  421. package/node_modules/@sdd-agent-platform/core/src/workflow-state/latest-eligible-run.ts +184 -156
  422. package/node_modules/@sdd-agent-platform/core/src/workflow-state/migration-recovery.ts +158 -0
  423. package/node_modules/@sdd-agent-platform/core/src/workflow-state/repair-contract.ts +77 -0
  424. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve-task-run.ts +114 -0
  425. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve.test.ts +970 -464
  426. package/node_modules/@sdd-agent-platform/core/src/workflow-state/resolve.ts +967 -363
  427. package/node_modules/@sdd-agent-platform/core/src/workflow-state/runtime-projections.ts +712 -0
  428. package/node_modules/@sdd-agent-platform/core/src/workflow-state.ts +2 -2
  429. package/node_modules/@sdd-agent-platform/core/src/worktree/isolation.ts +130 -130
  430. package/node_modules/@sdd-agent-platform/core/src/worktree/lifecycle.ts +269 -269
  431. package/node_modules/@sdd-agent-platform/core/src/worktree/worktree.test.ts +150 -150
  432. package/node_modules/@sdd-agent-platform/core/src/worktree.ts +2 -2
  433. package/node_modules/@sdd-agent-platform/core/tsconfig.json +15 -15
  434. package/package.json +2 -2
  435. package/packages/cli/dist/args.js +1 -1
  436. package/packages/cli/dist/args.js.map +1 -1
  437. package/packages/cli/dist/commands/context.js +1 -1
  438. package/packages/cli/dist/commands/context.js.map +1 -1
  439. package/packages/cli/dist/commands/evidence.js.map +1 -0
  440. package/packages/cli/dist/commands/execution.js +126 -0
  441. package/packages/cli/dist/commands/execution.js.map +1 -1
  442. package/packages/cli/dist/commands/instructions.d.ts +1 -1
  443. package/packages/cli/dist/commands/instructions.js +15 -1
  444. package/packages/cli/dist/commands/instructions.js.map +1 -1
  445. package/packages/cli/dist/commands/registry/runtime.js +70 -1
  446. package/packages/cli/dist/commands/registry/runtime.js.map +1 -1
  447. package/packages/cli/dist/commands/run.js +12 -1
  448. package/packages/cli/dist/commands/run.js.map +1 -1
  449. package/packages/cli/dist/commands/stage-close.d.ts +66 -0
  450. package/packages/cli/dist/commands/stage-close.js +524 -0
  451. package/packages/cli/dist/commands/stage-close.js.map +1 -0
  452. package/packages/cli/dist/commands/status.js +8 -1
  453. package/packages/cli/dist/commands/status.js.map +1 -1
  454. package/packages/cli/dist/commands/tasks.js.map +1 -1
  455. package/packages/cli/dist/dispatch.js +6 -31
  456. package/packages/cli/dist/dispatch.js.map +1 -1
  457. package/packages/cli/dist/help.js +153 -158
  458. package/packages/cli/dist/help.js.map +1 -1
  459. package/packages/cli/dist/renderers/workflow.d.ts +51 -2
  460. package/packages/cli/dist/renderers/workflow.js.map +1 -1
  461. package/packages/cli/dist/skill-import-args.d.ts +10 -0
  462. package/packages/cli/dist/skill-import-args.js +47 -0
  463. package/packages/cli/dist/skill-import-args.js.map +1 -0
  464. package/packages/cli/dist/tsconfig.tsbuildinfo +1 -1
  465. package/packages/cli/package.json +2 -2
  466. package/packages/core/dist/ai-tools.js +84 -103
  467. package/packages/core/dist/ai-tools.js.map +1 -1
  468. package/packages/core/dist/config/init-project.d.ts +10 -6
  469. package/packages/core/dist/config/init-project.js +7 -8
  470. package/packages/core/dist/config/init-project.js.map +1 -1
  471. package/packages/core/dist/config/project-config.d.ts +3 -1
  472. package/packages/core/dist/config/project-config.js +7 -3
  473. package/packages/core/dist/config/project-config.js.map +1 -1
  474. package/packages/core/dist/config/starter-documents.d.ts +0 -1
  475. package/packages/core/dist/config/starter-documents.js +374 -421
  476. package/packages/core/dist/config/starter-documents.js.map +1 -1
  477. package/packages/core/dist/context/build-package.d.ts +1 -1
  478. package/packages/core/dist/context/build-package.js +7 -19
  479. package/packages/core/dist/context/build-package.js.map +1 -1
  480. package/packages/core/dist/contracts.d.ts +7 -1
  481. package/packages/core/dist/contracts.js +6 -0
  482. package/packages/core/dist/contracts.js.map +1 -1
  483. package/packages/core/dist/doctor/checks/document-chain.js +2 -12
  484. package/packages/core/dist/doctor/checks/document-chain.js.map +1 -1
  485. package/packages/core/dist/doctor/doctor.js +1 -18
  486. package/packages/core/dist/doctor/doctor.js.map +1 -1
  487. package/packages/core/dist/evidence/lookup.d.ts +1 -1
  488. package/packages/core/dist/evidence/lookup.js +1 -1
  489. package/packages/core/dist/evidence/lookup.js.map +1 -1
  490. package/packages/core/dist/evidence-runtime/contracts.d.ts +0 -1
  491. package/packages/core/dist/evidence-runtime/coordination.js +110 -0
  492. package/packages/core/dist/evidence-runtime/coordination.js.map +1 -0
  493. package/packages/core/dist/execution/host-invocation.js +83 -83
  494. package/packages/core/dist/instructions.d.ts +1 -1
  495. package/packages/core/dist/instructions.js +37 -80
  496. package/packages/core/dist/instructions.js.map +1 -1
  497. package/packages/core/dist/lifecycle/ship.js +58 -68
  498. package/packages/core/dist/lifecycle/ship.js.map +1 -1
  499. package/packages/core/dist/lifecycle-graph/contracts.d.ts +159 -0
  500. package/packages/core/dist/lifecycle-graph/contracts.js +7 -0
  501. package/packages/core/dist/lifecycle-graph/contracts.js.map +1 -0
  502. package/packages/core/dist/lifecycle-graph/kernel.d.ts +16 -0
  503. package/packages/core/dist/lifecycle-graph/kernel.js +461 -0
  504. package/packages/core/dist/lifecycle-graph/kernel.js.map +1 -0
  505. package/packages/core/dist/lifecycle-graph.d.ts +2 -0
  506. package/packages/core/dist/lifecycle-graph.js +3 -0
  507. package/packages/core/dist/lifecycle-graph.js.map +1 -0
  508. package/packages/core/dist/orchestration/contracts.d.ts +1 -1
  509. package/packages/core/dist/orchestration/runtime.js +21 -28
  510. package/packages/core/dist/orchestration/runtime.js.map +1 -1
  511. package/packages/core/dist/registries/agent-registry.js +124 -40
  512. package/packages/core/dist/registries/agent-registry.js.map +1 -1
  513. package/packages/core/dist/registries/command-team-runtime.d.ts +1 -1
  514. package/packages/core/dist/registries/command-team-runtime.js +6 -13
  515. package/packages/core/dist/registries/command-team-runtime.js.map +1 -1
  516. package/packages/core/dist/registries/plan-scout-domains.d.ts +13 -0
  517. package/packages/core/dist/registries/plan-scout-domains.js +76 -0
  518. package/packages/core/dist/registries/plan-scout-domains.js.map +1 -0
  519. package/packages/core/dist/registries/skill-capabilities.js +7 -7
  520. package/packages/core/dist/registries/skill-capabilities.js.map +1 -1
  521. package/packages/core/dist/registries/tool-capabilities.js +6 -6
  522. package/packages/core/dist/registries/tool-capabilities.js.map +1 -1
  523. package/packages/core/dist/registries/workflow-gates.d.ts +1 -1
  524. package/packages/core/dist/registries/workflow-gates.js +18 -18
  525. package/packages/core/dist/registries/workflow-gates.js.map +1 -1
  526. package/packages/core/dist/risk/consumer-diagnostics.js +2 -1
  527. package/packages/core/dist/risk/consumer-diagnostics.js.map +1 -1
  528. package/packages/core/dist/risk/contracts.d.ts +2 -2
  529. package/packages/core/dist/risk/kernel.js +7 -7
  530. package/packages/core/dist/risk/kernel.js.map +1 -1
  531. package/packages/core/dist/risk/legacy-adapters.js +12 -27
  532. package/packages/core/dist/risk/legacy-adapters.js.map +1 -1
  533. package/packages/core/dist/risk/workflow-gates.js +6 -6
  534. package/packages/core/dist/risk/workflow-gates.js.map +1 -1
  535. package/packages/core/dist/router/agent-runtime-config.js +1 -1
  536. package/packages/core/dist/router/agent-runtime-config.js.map +1 -1
  537. package/packages/core/dist/router/routing.js +2 -4
  538. package/packages/core/dist/router/routing.js.map +1 -1
  539. package/packages/core/dist/router/runtime-import.d.ts +28 -0
  540. package/packages/core/dist/router/runtime-import.js +383 -0
  541. package/packages/core/dist/router/runtime-import.js.map +1 -0
  542. package/packages/core/dist/router/stage-route-binding.d.ts +37 -0
  543. package/packages/core/dist/router/stage-route-binding.js +227 -0
  544. package/packages/core/dist/router/stage-route-binding.js.map +1 -0
  545. package/packages/core/dist/router.d.ts +1 -0
  546. package/packages/core/dist/router.js +1 -0
  547. package/packages/core/dist/router.js.map +1 -1
  548. package/packages/core/dist/run-state/artifacts.d.ts +16 -0
  549. package/packages/core/dist/run-state/artifacts.js +6 -0
  550. package/packages/core/dist/run-state/artifacts.js.map +1 -1
  551. package/packages/core/dist/run-state/model.d.ts +20 -0
  552. package/packages/core/dist/run-state/run-state.js +7 -7
  553. package/packages/core/dist/run-state/run-state.js.map +1 -1
  554. package/packages/core/dist/run-state/task-evidence.d.ts +1 -2
  555. package/packages/core/dist/run-state/task-evidence.js +2 -9
  556. package/packages/core/dist/run-state/task-evidence.js.map +1 -1
  557. package/packages/core/dist/run-state/timing.d.ts +8 -0
  558. package/packages/core/dist/run-state/timing.js +131 -0
  559. package/packages/core/dist/run-state/timing.js.map +1 -0
  560. package/packages/core/dist/runtime-analysis/build.js +1 -4
  561. package/packages/core/dist/runtime-analysis/build.js.map +1 -1
  562. package/packages/core/dist/runtime-analysis/findings.js +0 -39
  563. package/packages/core/dist/runtime-analysis/findings.js.map +1 -1
  564. package/packages/core/dist/runtime-analysis/model.d.ts +1 -17
  565. package/packages/core/dist/runtime-paths.d.ts +10 -0
  566. package/packages/core/dist/runtime-paths.js +65 -0
  567. package/packages/core/dist/runtime-paths.js.map +1 -1
  568. package/packages/core/dist/runtime-projection-p0.d.ts +64 -0
  569. package/packages/core/dist/runtime-projection-p0.js +211 -0
  570. package/packages/core/dist/runtime-projection-p0.js.map +1 -0
  571. package/packages/core/dist/sdd-docs/artifact-depth.d.ts +14 -0
  572. package/packages/core/dist/sdd-docs/artifact-depth.js +179 -0
  573. package/packages/core/dist/sdd-docs/artifact-depth.js.map +1 -0
  574. package/packages/core/dist/sdd-docs/task-parser.d.ts +5 -1
  575. package/packages/core/dist/sdd-docs/task-parser.js +60 -22
  576. package/packages/core/dist/sdd-docs/task-parser.js.map +1 -1
  577. package/packages/core/dist/sdd-docs/task-rendering.js +2 -2
  578. package/packages/core/dist/sdd-docs/task-rendering.js.map +1 -1
  579. package/packages/core/dist/spec-entry.js +40 -0
  580. package/packages/core/dist/spec-entry.js.map +1 -0
  581. package/packages/core/dist/spec-manager-contracts.d.ts +12 -0
  582. package/packages/core/dist/spec-manager-contracts.js +2 -0
  583. package/packages/core/dist/spec-manager-contracts.js.map +1 -0
  584. package/packages/core/dist/stage-artifacts.d.ts +55 -0
  585. package/packages/core/dist/stage-artifacts.js +315 -0
  586. package/packages/core/dist/stage-artifacts.js.map +1 -0
  587. package/packages/core/dist/stage-collaboration-contracts.d.ts +55 -0
  588. package/packages/core/dist/stage-collaboration-contracts.js +238 -0
  589. package/packages/core/dist/stage-collaboration-contracts.js.map +1 -0
  590. package/packages/core/dist/stage-collaboration.d.ts +736 -0
  591. package/packages/core/dist/stage-collaboration.js +4018 -0
  592. package/packages/core/dist/stage-collaboration.js.map +1 -0
  593. package/packages/core/dist/stage-runtime/runtime.js +8 -1
  594. package/packages/core/dist/stage-runtime/runtime.js.map +1 -1
  595. package/packages/core/dist/status/project-status.js +25 -1
  596. package/packages/core/dist/status/project-status.js.map +1 -1
  597. package/packages/core/dist/storage/runtime-store.d.ts +170 -18
  598. package/packages/core/dist/storage/runtime-store.js +597 -85
  599. package/packages/core/dist/storage/runtime-store.js.map +1 -1
  600. package/packages/core/dist/sync-back/apply.d.ts +1 -17
  601. package/packages/core/dist/sync-back/apply.js +1 -242
  602. package/packages/core/dist/sync-back/apply.js.map +1 -1
  603. package/packages/core/dist/sync-back/inspect.d.ts +1 -110
  604. package/packages/core/dist/sync-back/inspect.js +1 -496
  605. package/packages/core/dist/sync-back/inspect.js.map +1 -1
  606. package/packages/core/dist/sync-back.d.ts +1 -2
  607. package/packages/core/dist/sync-back.js +1 -2
  608. package/packages/core/dist/sync-back.js.map +1 -1
  609. package/packages/core/dist/task-execution-contract.d.ts +167 -0
  610. package/packages/core/dist/task-execution-contract.js +377 -0
  611. package/packages/core/dist/task-execution-contract.js.map +1 -0
  612. package/packages/core/dist/test-support/fixtures.js +329 -314
  613. package/packages/core/dist/test-support/fixtures.js.map +1 -1
  614. package/packages/core/dist/test-support/run-state.d.ts +1 -0
  615. package/packages/core/dist/test-support/run-state.js +31 -0
  616. package/packages/core/dist/test-support/run-state.js.map +1 -1
  617. package/packages/core/dist/truth-reconciliation.d.ts +44 -0
  618. package/packages/core/dist/truth-reconciliation.js +135 -0
  619. package/packages/core/dist/truth-reconciliation.js.map +1 -0
  620. package/packages/core/dist/tsconfig.tsbuildinfo +1 -1
  621. package/packages/core/dist/verification/goal-verify.d.ts +0 -49
  622. package/packages/core/dist/verification/goal-verify.js +1 -545
  623. package/packages/core/dist/verification/goal-verify.js.map +1 -1
  624. package/packages/core/dist/verification/rendering.d.ts +5 -7
  625. package/packages/core/dist/verification/rendering.js +15 -55
  626. package/packages/core/dist/verification/rendering.js.map +1 -1
  627. package/packages/core/dist/verification/single-task-loop.js +1 -40
  628. package/packages/core/dist/verification/single-task-loop.js.map +1 -1
  629. package/packages/core/dist/verification/task-evidence-judgment.d.ts +49 -0
  630. package/packages/core/dist/verification/task-evidence-judgment.js +521 -0
  631. package/packages/core/dist/verification/task-evidence-judgment.js.map +1 -0
  632. package/packages/core/dist/verification/test-runtime.d.ts +12 -2
  633. package/packages/core/dist/verification/test-runtime.js +247 -112
  634. package/packages/core/dist/verification/test-runtime.js.map +1 -1
  635. package/packages/core/dist/verification/validation-cache.d.ts +26 -0
  636. package/packages/core/dist/verification/validation-cache.js +73 -0
  637. package/packages/core/dist/verification/validation-cache.js.map +1 -0
  638. package/packages/core/dist/verification/verify-contract.d.ts +1 -1
  639. package/packages/core/dist/verification/verify-contract.js +49 -72
  640. package/packages/core/dist/verification/verify-contract.js.map +1 -1
  641. package/packages/core/dist/verification.d.ts +3 -3
  642. package/packages/core/dist/verification.js +2 -2
  643. package/packages/core/dist/verification.js.map +1 -1
  644. package/packages/core/dist/workflow-gate/evidence-packet.js +2 -7
  645. package/packages/core/dist/workflow-gate/evidence-packet.js.map +1 -1
  646. package/packages/core/dist/workflow-gate/hard-checks.js +0 -7
  647. package/packages/core/dist/workflow-gate/hard-checks.js.map +1 -1
  648. package/packages/core/dist/workflow-gate/policy.js +2 -4
  649. package/packages/core/dist/workflow-gate/policy.js.map +1 -1
  650. package/packages/core/dist/workflow-gate/types.d.ts +3 -5
  651. package/packages/core/dist/workflow-state/latest-eligible-run.js +30 -4
  652. package/packages/core/dist/workflow-state/latest-eligible-run.js.map +1 -1
  653. package/packages/core/dist/workflow-state/migration-recovery.d.ts +40 -0
  654. package/packages/core/dist/workflow-state/migration-recovery.js +110 -0
  655. package/packages/core/dist/workflow-state/migration-recovery.js.map +1 -0
  656. package/packages/core/dist/workflow-state/repair-contract.d.ts +12 -0
  657. package/packages/core/dist/workflow-state/repair-contract.js +63 -0
  658. package/packages/core/dist/workflow-state/repair-contract.js.map +1 -0
  659. package/packages/core/dist/workflow-state/resolve-task-run.d.ts +21 -0
  660. package/packages/core/dist/workflow-state/resolve-task-run.js +95 -0
  661. package/packages/core/dist/workflow-state/resolve-task-run.js.map +1 -0
  662. package/packages/core/dist/workflow-state/resolve.d.ts +55 -5
  663. package/packages/core/dist/workflow-state/resolve.js +518 -36
  664. package/packages/core/dist/workflow-state/resolve.js.map +1 -1
  665. package/packages/core/dist/workflow-state/runtime-projections.d.ts +228 -0
  666. package/packages/core/dist/workflow-state/runtime-projections.js +452 -0
  667. package/packages/core/dist/workflow-state/runtime-projections.js.map +1 -0
  668. package/packages/core/package.json +6 -3
  669. package/tsconfig.build.json +6 -7
  670. package/node_modules/@sdd-agent-platform/core/dist/doctor/render.d.ts +0 -2
  671. package/node_modules/@sdd-agent-platform/core/dist/doctor/render.js +0 -44
  672. package/node_modules/@sdd-agent-platform/core/dist/doctor/render.js.map +0 -1
  673. package/node_modules/@sdd-agent-platform/core/src/sync-back/apply.ts +0 -270
  674. package/node_modules/@sdd-agent-platform/core/src/sync-back/inspect.ts +0 -655
  675. package/node_modules/@sdd-agent-platform/core/src/sync-back/sync-back.test.ts +0 -569
  676. package/node_modules/@sdd-agent-platform/core/src/sync-back.ts +0 -2
  677. package/node_modules/@sdd-agent-platform/core/src/verification/single-task-loop.test.ts +0 -255
  678. package/node_modules/@sdd-agent-platform/core/src/verification/test-runtime.test.ts +0 -439
  679. package/node_modules/@sdd-agent-platform/core/src/verification/validation-wave.test.ts +0 -341
  680. package/node_modules/@sdd-agent-platform/core/src/verification/verify-contract.test.ts +0 -204
  681. package/packages/cli/dist/commands/lifecycle.d.ts +0 -6
  682. package/packages/cli/dist/commands/lifecycle.js +0 -112
  683. package/packages/cli/dist/commands/lifecycle.js.map +0 -1
  684. package/packages/cli/dist/commands/sync-back.d.ts +0 -6
  685. package/packages/cli/dist/commands/sync-back.js +0 -82
  686. package/packages/cli/dist/commands/sync-back.js.map +0 -1
  687. package/packages/cli/dist/commands/test.d.ts +0 -6
  688. package/packages/cli/dist/commands/test.js +0 -195
  689. package/packages/cli/dist/commands/test.js.map +0 -1
  690. package/packages/cli/dist/commands/verifies.d.ts +0 -6
  691. package/packages/cli/dist/commands/verifies.js +0 -85
  692. package/packages/cli/dist/commands/verifies.js.map +0 -1
  693. package/packages/cli/dist/commands/verify.d.ts +0 -6
  694. package/packages/cli/dist/commands/verify.js +0 -134
  695. package/packages/cli/dist/commands/verify.js.map +0 -1
  696. package/packages/core/dist/doctor/render.d.ts +0 -2
  697. package/packages/core/dist/doctor/render.js +0 -44
  698. package/packages/core/dist/doctor/render.js.map +0 -1
@@ -1,306 +1,314 @@
1
- import test from 'node:test';
2
- import assert from 'node:assert/strict';
3
- import { access, mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
4
- import { tmpdir } from 'node:os';
5
- import path from 'node:path';
6
-
7
- import { getProjectStatus } from './project-status.js';
8
- import { initProject } from './init-project.js';
9
- import { parseSddBranch } from '../sdd-docs/task-parser.js';
10
- import { readAgentRuntimeProjectConfig as readProjectConfig } from '../router/agent-runtime-config.js';
11
-
12
-
13
- test('initProject creates readable project config', async () => {
14
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-runtime-'));
15
- try {
16
- const init = await initProject(root);
17
- assert.equal(init.created, true);
18
- const config = await readProjectConfig(root);
19
- assert.equal(config.contract, 'phase-1.2-project-contract');
20
- assert.equal(config.sdd.docs_language, 'zh-CN');
21
- assert.equal(config.lifecycle.decision_required, true);
22
- assert.match(await readFile(init.configPath, 'utf8'), /Project-level SDD document prose language/);
23
- } finally {
24
- await rm(root, { recursive: true, force: true });
25
- }
26
- });
27
-
28
- test('initProject creates starter semantic documents by default', async () => {
29
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-init-docs-'));
30
- try {
31
- const init = await initProject(root);
32
- const spec = await readFile(path.join(root, 'specs', 'master', 'spec.md'), 'utf8');
33
- const plan = await readFile(path.join(root, 'specs', 'master', 'plan.md'), 'utf8');
34
- const tasks = await readFile(path.join(root, 'specs', 'master', 'tasks.md'), 'utf8');
35
- const verify = await readFile(path.join(root, 'specs', 'master', 'verify.md'), 'utf8');
36
- const branch = await parseSddBranch(root, 'master');
37
- const status = await getProjectStatus(root, { branch: 'master' });
38
-
39
- assert.equal(init.documents.branch, 'master');
40
- assert.equal(init.documents.documents.every((document) => document.status === 'created'), true);
41
- assert.match(spec, /sdd-init-onboarding-spec-v1/);
42
- assert.match(spec, /## 1\. Objective \/ Customer Value/);
43
- assert.match(spec, /## 4\. User Stories \/ Scenarios/);
44
- assert.match(spec, /\| AC-1 \|/);
45
- assert.match(spec, /Assumptions \/ Dependencies/);
46
- assert.match(spec, /Risks \/ Hard Gates/);
47
- assert.match(spec, /项目入门/);
48
- assert.match(spec, /仓库在第一个真实变更前/);
49
- assert.match(plan, /sdd-init-onboarding-plan-v1/);
50
- assert.match(plan, /## 3\. Current State Analysis/);
51
- assert.match(plan, /## 5\. Architecture \/ Component Design/);
52
- assert.match(plan, /```plantuml/);
53
- assert.match(plan, /Risk-driven Plan Requirements/);
54
- assert.match(plan, /业务背景与技术背景/);
55
- assert.match(tasks, /sdd-init-onboarding-tasks-v1/);
56
- assert.match(tasks, /## 1\. Delivery Map/);
57
- assert.match(tasks, /acceptance_refs:/);
58
- assert.match(tasks, /plan_refs:/);
59
- assert.match(tasks, /allowed_agents:/);
60
- assert.match(tasks, /required_artifacts:/);
61
- assert.match(tasks, /verification_availability:/);
62
- assert.match(tasks, /#### Definition of Done/);
63
- assert.match(tasks, /#### Evidence Expectations/);
64
- assert.match(tasks, /Allowed scope 仅限/);
65
- assert.match(verify, /sdd-init-onboarding-verify-v1/);
66
- assert.match(verify, /contract: sdd-verify-doc-v1/);
67
- assert.match(verify, /ONBOARDING-1/);
68
- assert.match(verify, /不是 runtime evidence/);
69
- assert.equal(branch.tasks.some((task) => task.id === 'ONBOARDING-1'), true);
70
- assert.equal(status.documents.specExists, true);
71
- assert.equal(status.documents.planExists, true);
72
- assert.equal(status.documents.tasksExists, true);
73
- assert.equal(status.documents.verifyExists, true);
74
- assert.equal(status.gaps.some((gap) => gap.type === 'Document Gap'), false);
75
- } finally {
76
- await rm(root, { recursive: true, force: true });
77
- }
78
- });
79
-
80
- test('initProject falls back to English starter document prose for non-Chinese docs_language', async () => {
81
- for (const docsLanguage of ['en-US', 'fr-FR']) {
82
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-init-language-fallback-'));
83
- try {
84
- await initProject(root, { scaffoldDocuments: false });
85
- const configPath = path.join(root, '.sdd', 'project.yml');
86
- const config = await readFile(configPath, 'utf8');
87
- await writeFile(configPath, config.replace('docs_language: zh-CN', `docs_language: ${docsLanguage}`), 'utf8');
88
-
89
- await initProject(root);
90
- const spec = await readFile(path.join(root, 'specs', 'master', 'spec.md'), 'utf8');
91
- const plan = await readFile(path.join(root, 'specs', 'master', 'plan.md'), 'utf8');
92
- const tasks = await readFile(path.join(root, 'specs', 'master', 'tasks.md'), 'utf8');
93
- const verify = await readFile(path.join(root, 'specs', 'master', 'verify.md'), 'utf8');
94
-
95
- assert.match(spec, /# Spec: Project Onboarding/);
96
- assert.match(spec, /the repository has a visible SDD entrypoint/);
97
- assert.match(plan, /business and technical context/);
98
- assert.match(tasks, /Allowed scope is limited/);
99
- assert.match(verify, /task-derived verification guidance/);
100
- assert.doesNotMatch(`${spec}\n${plan}\n${tasks}\n${verify}`, /项目入门|仓库在第一个真实变更前|业务背景与技术背景|Allowed scope 仅限|不是 runtime evidence/);
101
- } finally {
102
- await rm(root, { recursive: true, force: true });
103
- }
104
- }
105
- });
106
-
107
- test('initProject preserves existing semantic documents by default', async () => {
108
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-init-preserve-'));
109
- try {
110
- await mkdir(path.join(root, 'specs', 'master'), { recursive: true });
111
- await writeFile(path.join(root, 'specs', 'master', 'spec.md'), 'user spec', 'utf8');
112
- await writeFile(path.join(root, 'specs', 'master', 'plan.md'), 'user plan', 'utf8');
113
- await writeFile(path.join(root, 'specs', 'master', 'tasks.md'), 'user tasks', 'utf8');
114
- await writeFile(path.join(root, 'specs', 'master', 'verify.md'), 'user verify', 'utf8');
115
- const init = await initProject(root);
116
-
117
- assert.equal(await readFile(path.join(root, 'specs', 'master', 'spec.md'), 'utf8'), 'user spec');
118
- assert.equal(await readFile(path.join(root, 'specs', 'master', 'plan.md'), 'utf8'), 'user plan');
119
- assert.equal(await readFile(path.join(root, 'specs', 'master', 'tasks.md'), 'utf8'), 'user tasks');
120
- assert.equal(await readFile(path.join(root, 'specs', 'master', 'verify.md'), 'utf8'), 'user verify');
121
- assert.equal(init.documents.documents.every((document) => document.status === 'unchanged'), true);
122
- } finally {
123
- await rm(root, { recursive: true, force: true });
124
- }
125
- });
126
-
127
- test('initProject force overwrites semantic documents', async () => {
128
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-init-force-'));
129
- try {
130
- await mkdir(path.join(root, 'specs', 'master'), { recursive: true });
131
- await writeFile(path.join(root, 'specs', 'master', 'spec.md'), 'user spec', 'utf8');
132
- await writeFile(path.join(root, 'specs', 'master', 'plan.md'), 'user plan', 'utf8');
133
- await writeFile(path.join(root, 'specs', 'master', 'tasks.md'), 'user tasks', 'utf8');
134
- await writeFile(path.join(root, 'specs', 'master', 'verify.md'), 'user verify', 'utf8');
135
- const init = await initProject(root, { force: true });
136
- const spec = await readFile(path.join(root, 'specs', 'master', 'spec.md'), 'utf8');
137
- const plan = await readFile(path.join(root, 'specs', 'master', 'plan.md'), 'utf8');
138
- const tasks = await readFile(path.join(root, 'specs', 'master', 'tasks.md'), 'utf8');
139
- const verify = await readFile(path.join(root, 'specs', 'master', 'verify.md'), 'utf8');
140
-
141
- assert.match(spec, /sdd-init-onboarding-spec-v1/);
142
- assert.match(plan, /sdd-init-onboarding-plan-v1/);
143
- assert.match(tasks, /sdd-init-onboarding-tasks-v1/);
144
- assert.match(verify, /sdd-init-onboarding-verify-v1/);
145
- assert.equal(init.documents.documents.every((document) => document.status === 'overwritten'), true);
146
- } finally {
147
- await rm(root, { recursive: true, force: true });
148
- }
149
- });
150
-
151
- test('initProject scaffolds custom branch documents', async () => {
152
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-init-branch-'));
153
- try {
154
- const init = await initProject(root, { branch: 'feature-x' });
155
- const status = await getProjectStatus(root, { branch: 'feature-x' });
156
-
157
- assert.equal(init.documents.branch, 'feature-x');
158
- assert.match(await readFile(path.join(root, 'specs', 'feature-x', 'tasks.md'), 'utf8'), /id: ONBOARDING-1/);
159
- assert.match(await readFile(path.join(root, 'specs', 'feature-x', 'verify.md'), 'utf8'), /sdd-init-onboarding-verify-v1/);
160
- assert.equal(status.documents.specExists, true);
161
- assert.equal(status.documents.planExists, true);
162
- assert.equal(status.documents.tasksExists, true);
163
- assert.equal(status.documents.verifyExists, true);
164
- assert.equal(status.gaps.some((gap) => gap.type === 'Document Gap'), false);
165
- } finally {
166
- await rm(root, { recursive: true, force: true });
167
- }
168
- });
169
-
170
- test('initProject can skip semantic document scaffold', async () => {
171
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-init-skip-docs-'));
172
- try {
173
- const init = await initProject(root, { scaffoldDocuments: false });
174
-
175
- await assert.rejects(readFile(path.join(root, 'specs', 'master', 'spec.md'), 'utf8'), /ENOENT/);
176
- await assert.rejects(readFile(path.join(root, 'specs', 'master', 'verify.md'), 'utf8'), /ENOENT/);
177
- assert.equal(init.documents.documents.every((document) => document.status === 'skipped'), true);
178
- } finally {
179
- await rm(root, { recursive: true, force: true });
180
- }
181
- });
182
-
183
- test('initProject projects managed Claude Code entries by default', async () => {
184
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-ai-init-'));
185
- try {
186
- const init = await initProject(root);
187
- const skill = await readFile(path.join(root, '.claude', 'skills', 'sdd', 'SKILL.md'), 'utf8');
188
- const doctorCommand = await readFile(path.join(root, '.claude', 'commands', 'sdd', 'doctor.md'), 'utf8');
189
-
190
- const specCommand = await readFile(path.join(root, '.claude', 'commands', 'sdd', 'spec.md'), 'utf8');
191
- const planCommand = await readFile(path.join(root, '.claude', 'commands', 'sdd', 'plan.md'), 'utf8');
192
- const tasksCommand = await readFile(path.join(root, '.claude', 'commands', 'sdd', 'tasks.md'), 'utf8');
193
- const doCommand = await readFile(path.join(root, '.claude', 'commands', 'sdd', 'do.md'), 'utf8');
194
- const testCommand = await readFile(path.join(root, '.claude', 'commands', 'sdd', 'test.md'), 'utf8');
195
- const syncBackCommand = await readFile(path.join(root, '.claude', 'commands', 'sdd', 'sync-back.md'), 'utf8');
196
- const shipCommand = await readFile(path.join(root, '.claude', 'commands', 'sdd', 'ship.md'), 'utf8');
197
-
198
- assert.equal(init.aiTools.length, 1);
199
- assert.equal(init.aiTools[0].entries.some((entry) => entry.status === 'created'), true);
200
- assert.match(skill, /sdd_contract: sdd-ai-entry-v1/);
201
- assert.match(skill, /sdd_hash: sha256:/);
202
- assert.match(skill, /manual `\/sdd` root intent router/);
203
- assert.match(skill, /do not paste or restate full status/);
204
- assert.match(skill, /natural-language intent/);
205
- assert.match(skill, /CLI\/core output/);
206
- assert.match(skill, /projected command entry/);
207
- assert.match(skill, /ambiguous after status/);
208
- assert.match(skill, /sdd tasks inspect <task_id>/);
209
- assert.match(skill, /treat `sdd sync-back inspect\|apply` as diagnostic\/recovery\/replay only/);
210
- assert.match(skill, /sdd ship --branch <branch> --dry-run/);
211
- assert.match(skill, /`test`/);
212
- assert.doesNotMatch(skill, /follow apply_policy/);
213
- assert.match(skill, /workflow_status=not_started/);
214
- assert.match(skill, /workflow branch entry/);
215
- assert.match(doctorCommand, /sdd instructions doctor --json/);
216
- assert.match(doctorCommand, /explicit diagnostic scope/);
217
- await assert.rejects(access(path.join(root, '.claude', 'commands', 'sdd.md')), /ENOENT/);
218
- await assert.rejects(access(path.join(root, '.claude', 'commands', 'sdd', 'init.md')), /ENOENT/);
219
- await assert.rejects(access(path.join(root, '.claude', 'commands', 'sdd', 'verify.md')), /ENOENT/);
220
- await assert.rejects(access(path.join(root, '.claude', 'commands', 'sdd', 'verifies.md')), /ENOENT/);
221
- await assert.rejects(access(path.join(root, '.claude', 'commands', 'sdd', 'update.md')), /ENOENT/);
222
- await assert.rejects(access(path.join(root, '.claude', 'commands', 'sdd', 'instructions.md')), /ENOENT/);
223
- assert.equal(init.aiTools[0].entries.some((entry) => entry.id === 'sdd-root'), false);
224
- assert.equal(init.aiTools[0].entries.some((entry) => entry.id === 'sdd-init'), false);
225
- assert.equal(init.aiTools[0].entries.some((entry) => entry.id === 'sdd-verify'), false);
226
- assert.equal(init.aiTools[0].entries.some((entry) => entry.id === 'sdd-verifies'), false);
227
- assert.equal(init.aiTools[0].entries.some((entry) => entry.id === 'sdd-update'), false);
228
- assert.equal(init.aiTools[0].entries.some((entry) => entry.id === 'sdd-instructions'), false);
229
- assert.match(specCommand, /sdd instructions spec --json/);
230
- assert.match(planCommand, /sdd instructions plan --json/);
231
- assert.match(tasksCommand, /sdd instructions tasks --json/);
232
- assert.match(tasksCommand, /sdd tasks format/);
233
- assert.match(tasksCommand, /acceptance_refs and plan_refs/);
234
- assert.match(tasksCommand, /required_artifacts, verification_availability, autonomy/);
235
- assert.match(tasksCommand, /metadata inside the ```sdd-task fenced block/);
236
- assert.match(specCommand, /workflow partition entry/);
237
- assert.match(specCommand, /not a technical design/);
238
- assert.match(planCommand, /Refine the existing SDD plan document/);
239
- assert.match(planCommand, /deliverable technical solution/);
240
- assert.match(planCommand, /based_on_spec_hash/);
241
- assert.match(planCommand, /PlantUML/);
242
- assert.match(planCommand, /state-machine risk needs a state diagram/);
243
- assert.match(tasksCommand, /executable task and verification contracts/);
244
- assert.match(tasksCommand, /based_on_plan_hash/);
245
- assert.match(doCommand, /sdd status/);
246
- assert.match(doCommand, /sdd instructions do --json/);
247
- assert.match(doCommand, /sdd tasks inspect <task_id>/);
248
- assert.match(doCommand, /artifacts\/implement-<task_id>\.md/);
249
- assert.match(doCommand, /--agent implementer/);
250
- assert.match(doCommand, /sdd do task <task_id>/);
251
- assert.match(doCommand, /sdd test batch/);
252
- assert.match(doCommand, /sdd test wave/);
253
- assert.match(testCommand, /sdd instructions test --json/);
254
- assert.match(testCommand, /sdd test batch <batch_id> --branch <branch>/);
255
- assert.match(testCommand, /sdd test wave --branch <branch> --wave <n>/);
256
- assert.match(testCommand, /Execute validation from the frozen tasks\.md \+ verify\.md contract/);
257
- assert.match(testCommand, /sdd ship --branch <branch> --dry-run/);
258
- assert.match(syncBackCommand, /sdd instructions sync-back --json/);
259
- assert.match(syncBackCommand, /sdd sync-back inspect --branch <branch> --task <task_id>/);
260
- assert.match(syncBackCommand, /explicit recovery\/replay/);
261
- assert.match(syncBackCommand, /Do not apply without inspect/);
262
- assert.match(shipCommand, /sdd instructions ship --json/);
263
- assert.match(shipCommand, /sdd ship --branch <branch> --dry-run/);
264
- assert.match(shipCommand, /does not authorize npm publish/);
265
- assert.match(shipCommand, /statusline --branch <branch>/);
266
- } finally {
267
- await rm(root, { recursive: true, force: true });
268
- }
269
- });
270
-
271
- test('initProject detects Maven multi-module Java projects', async () => {
272
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-runtime-maven-'));
273
- try {
274
- await writeFile(path.join(root, 'pom.xml'), '<project><packaging>pom</packaging><modules><module>emp-api</module></modules></project>');
275
- await initProject(root);
276
- const config = await readProjectConfig(root);
277
- assert.equal(config.project.language, 'java');
278
- assert.equal(config.project.framework, 'ssm-maven-multimodule');
279
- assert.deepEqual(config.validation.default, ['mvn compile']);
280
- assert.equal(config.detection?.primary, 'java-ssm-maven-multimodule');
281
- assert.equal(config.detection?.confidence, 'medium');
282
- } finally {
283
- await rm(root, { recursive: true, force: true });
284
- }
285
- });
286
-
287
- test('initProject classifies mixed Java and Node repos by source evidence', async () => {
288
- const root = await mkdtemp(path.join(tmpdir(), 'sdd-runtime-mixed-'));
289
- try {
290
- await writeFile(path.join(root, 'pom.xml'), '<project><packaging>pom</packaging><modules><module>emp-api</module></modules><dependencies><dependency><groupId>org.springframework</groupId></dependency><dependency><groupId>org.mybatis</groupId></dependency></dependencies></project>');
291
- await writeFile(path.join(root, 'package.json'), JSON.stringify({ name: 'tooling-only', devDependencies: { typescript: '^5.0.0' } }));
292
- await mkdir(path.join(root, 'emp-api', 'src', 'main', 'java', 'com', 'emp'), { recursive: true });
293
- await mkdir(path.join(root, 'emp-api', 'src', 'main', 'resources'), { recursive: true });
294
- await writeFile(path.join(root, 'emp-api', 'src', 'main', 'java', 'com', 'emp', 'ApiController.java'), 'class ApiController {}');
295
- await writeFile(path.join(root, 'emp-api', 'src', 'main', 'resources', 'applicationContext.xml'), '<beans></beans>');
296
- await initProject(root);
297
- const config = await readProjectConfig(root);
298
- assert.equal(config.project.language, 'java');
299
- assert.equal(config.project.framework, 'ssm-maven-multimodule');
300
- assert.deepEqual(config.validation.default, ['mvn compile']);
301
- assert.equal(config.detection?.mixed_stack, true);
302
- assert.equal(config.detection?.candidates.some((candidate) => candidate.id === 'typescript-node'), true);
303
- } finally {
304
- await rm(root, { recursive: true, force: true });
305
- }
306
- });
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { access, mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
4
+ import { tmpdir } from 'node:os';
5
+ import path from 'node:path';
6
+
7
+ import { getProjectStatus } from './project-status.js';
8
+ import { initProject } from './init-project.js';
9
+ import { parseSddBranch } from '../sdd-docs/task-parser.js';
10
+ import { readAgentRuntimeProjectConfig as readProjectConfig } from '../router/agent-runtime-config.js';
11
+
12
+
13
+ test('initProject creates readable project config', async () => {
14
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-runtime-'));
15
+ try {
16
+ const init = await initProject(root);
17
+ assert.equal(init.created, true);
18
+ const config = await readProjectConfig(root);
19
+ assert.equal(config.contract, 'phase-1.2-project-contract');
20
+ assert.equal(config.sdd.docs_language, 'zh-CN');
21
+ assert.equal(config.lifecycle.decision_required, true);
22
+ assert.equal(config.runtime.runtime_store, '.sdd/runtime.sqlite');
23
+ assert.equal(config.runtime.stage_evidence, '.sdd/runs/<branch>/<stage>/*.md');
24
+ assert.equal(config.runtime.truth_alignment_mode, 'required');
25
+ const renderedConfig = await readFile(init.configPath, 'utf8');
26
+ assert.match(renderedConfig, /Project-level SDD document prose language/);
27
+ assert.match(renderedConfig, /runtime_store: \.sdd\/runtime\.sqlite/);
28
+ assert.match(renderedConfig, /stage_evidence: \.sdd\/runs\/<branch>\/<stage>\/\*\.md/);
29
+ assert.match(renderedConfig, /truth_alignment_mode: required/);
30
+ await assert.rejects(access(path.join(root, '.sdd', 'runs')));
31
+ } finally {
32
+ await rm(root, { recursive: true, force: true });
33
+ }
34
+ });
35
+
36
+ test.skip('initProject creates starter semantic documents by default', async () => {
37
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-init-docs-'));
38
+ try {
39
+ const init = await initProject(root);
40
+ const spec = await readFile(path.join(root, 'specs', 'master', 'spec.md'), 'utf8');
41
+ const plan = await readFile(path.join(root, 'specs', 'master', 'plan.md'), 'utf8');
42
+ const tasks = await readFile(path.join(root, 'specs', 'master', 'tasks.md'), 'utf8');
43
+ const verify = await readFile(path.join(root, 'specs', 'master', 'verify.md'), 'utf8');
44
+ const branch = await parseSddBranch(root, 'master');
45
+ const status = await getProjectStatus(root, { branch: 'master' });
46
+
47
+ assert.equal(init.documents.branch, 'master');
48
+ assert.equal(init.documents.documents.every((document) => document.status === 'created'), true);
49
+ assert.match(spec, /sdd-init-onboarding-spec-v3/);
50
+ assert.match(spec, /## 1\. Problem Reframing \/ Intent Discovery/);
51
+ assert.match(spec, /## 2\. Change Delta/);
52
+ assert.match(spec, /## 8\. Open Questions \/ Ambiguity Ledger/);
53
+ assert.match(spec, /## 9\. Close Quality Evidence/);
54
+ assert.doesNotMatch(spec, /Lifecycle Decision Reference/);
55
+ assert.doesNotMatch(spec, /lifecycle_profile/);
56
+ assert.match(spec, /安全可见的 SDD 入口/);
57
+ assert.match(plan, /sdd-init-onboarding-plan-v3/);
58
+ assert.match(plan, /contract: sdd-plan-doc-v3/);
59
+ assert.match(plan, /## 2\. Planning Problem \/ Strategy Framing/);
60
+ assert.match(plan, /## 5\. Change Topology \/ Responsibility Boundaries/);
61
+ assert.match(plan, /## 13\. Task-stage Constraints/);
62
+ assert.match(plan, /implementation strategy contract/);
63
+ assert.match(tasks, /sdd-init-onboarding-tasks-v2/);
64
+ assert.match(tasks, /contract: sdd-tasks-doc-v2/);
65
+ assert.match(tasks, /## 1\. Split Basis/);
66
+ assert.match(tasks, /## 3\. Implementation Tasks/);
67
+ assert.match(tasks, /## 4\. Validation Tasks/);
68
+ assert.match(tasks, /taskClass: implementation/);
69
+ assert.match(tasks, /taskClass: validation/);
70
+ assert.match(tasks, /validationHandoff:/);
71
+ assert.match(tasks, /validatesImplementationTasks:/);
72
+ assert.match(tasks, /Allowed scope 仅限/);
73
+ assert.match(verify, /sdd-init-onboarding-verify-v1/);
74
+ assert.match(verify, /contract: sdd-verify-doc-v1/);
75
+ assert.match(verify, /ONBOARDING-1/);
76
+ assert.match(verify, /不是 runtime evidence/);
77
+ assert.equal(branch.tasks.some((task) => task.id === 'ONBOARDING-1'), true);
78
+ assert.equal(status.documents.specExists, true);
79
+ assert.equal(status.documents.planExists, true);
80
+ assert.equal(status.documents.tasksExists, true);
81
+ assert.equal(status.documents.verifyExists, true);
82
+ assert.equal(status.gaps.some((gap) => gap.type === 'Document Gap'), false);
83
+ } finally {
84
+ await rm(root, { recursive: true, force: true });
85
+ }
86
+ });
87
+
88
+ test.skip('initProject falls back to English starter document prose for non-Chinese docs_language', async () => {
89
+ for (const docsLanguage of ['en-US', 'fr-FR']) {
90
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-init-language-fallback-'));
91
+ try {
92
+ await initProject(root, { scaffoldDocuments: false });
93
+ const configPath = path.join(root, '.sdd', 'project.yml');
94
+ const config = await readFile(configPath, 'utf8');
95
+ await writeFile(configPath, config.replace('docs_language: zh-CN', `docs_language: ${docsLanguage}`), 'utf8');
96
+
97
+ await initProject(root);
98
+ const spec = await readFile(path.join(root, 'specs', 'master', 'spec.md'), 'utf8');
99
+ const plan = await readFile(path.join(root, 'specs', 'master', 'plan.md'), 'utf8');
100
+ const tasks = await readFile(path.join(root, 'specs', 'master', 'tasks.md'), 'utf8');
101
+ const verify = await readFile(path.join(root, 'specs', 'master', 'verify.md'), 'utf8');
102
+
103
+ assert.match(spec, /# Spec: Project Onboarding/);
104
+ assert.match(spec, /safe visible SDD entrypoint/);
105
+ assert.match(plan, /AI-ready technical design/);
106
+ assert.match(tasks, /Allowed scope is limited/);
107
+ assert.match(verify, /task-derived verification guidance/);
108
+ assert.doesNotMatch(`${spec}\n${plan}\n${tasks}\n${verify}`, /项目入门|安全可见的 SDD 入口|业务背景与技术背景|Allowed scope 仅限|不是 runtime evidence/);
109
+ } finally {
110
+ await rm(root, { recursive: true, force: true });
111
+ }
112
+ }
113
+ });
114
+
115
+ test('initProject preserves existing semantic documents by default', async () => {
116
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-init-preserve-'));
117
+ try {
118
+ await mkdir(path.join(root, 'specs', 'master'), { recursive: true });
119
+ await writeFile(path.join(root, 'specs', 'master', 'spec.md'), 'user spec', 'utf8');
120
+ await writeFile(path.join(root, 'specs', 'master', 'plan.md'), 'user plan', 'utf8');
121
+ await writeFile(path.join(root, 'specs', 'master', 'tasks.md'), 'user tasks', 'utf8');
122
+ await writeFile(path.join(root, 'specs', 'master', 'verify.md'), 'user verify', 'utf8');
123
+ const init = await initProject(root);
124
+
125
+ assert.equal(await readFile(path.join(root, 'specs', 'master', 'spec.md'), 'utf8'), 'user spec');
126
+ assert.equal(await readFile(path.join(root, 'specs', 'master', 'plan.md'), 'utf8'), 'user plan');
127
+ assert.equal(await readFile(path.join(root, 'specs', 'master', 'tasks.md'), 'utf8'), 'user tasks');
128
+ assert.equal(await readFile(path.join(root, 'specs', 'master', 'verify.md'), 'utf8'), 'user verify');
129
+ assert.equal(init.documents.documents.every((document) => document.status === 'unchanged'), true);
130
+ } finally {
131
+ await rm(root, { recursive: true, force: true });
132
+ }
133
+ });
134
+
135
+ test.skip('initProject force overwrites semantic documents', async () => {
136
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-init-force-'));
137
+ try {
138
+ await mkdir(path.join(root, 'specs', 'master'), { recursive: true });
139
+ await writeFile(path.join(root, 'specs', 'master', 'spec.md'), 'user spec', 'utf8');
140
+ await writeFile(path.join(root, 'specs', 'master', 'plan.md'), 'user plan', 'utf8');
141
+ await writeFile(path.join(root, 'specs', 'master', 'tasks.md'), 'user tasks', 'utf8');
142
+ await writeFile(path.join(root, 'specs', 'master', 'verify.md'), 'user verify', 'utf8');
143
+ const init = await initProject(root, { force: true });
144
+ const spec = await readFile(path.join(root, 'specs', 'master', 'spec.md'), 'utf8');
145
+ const plan = await readFile(path.join(root, 'specs', 'master', 'plan.md'), 'utf8');
146
+ const tasks = await readFile(path.join(root, 'specs', 'master', 'tasks.md'), 'utf8');
147
+ const verify = await readFile(path.join(root, 'specs', 'master', 'verify.md'), 'utf8');
148
+
149
+ assert.match(spec, /sdd-init-onboarding-spec-v3/);
150
+ assert.match(plan, /sdd-init-onboarding-plan-v3/);
151
+ assert.match(tasks, /sdd-init-onboarding-tasks-v2/);
152
+ assert.match(verify, /sdd-init-onboarding-verify-v1/);
153
+ assert.equal(init.documents.documents.every((document) => document.status === 'overwritten'), true);
154
+ } finally {
155
+ await rm(root, { recursive: true, force: true });
156
+ }
157
+ });
158
+
159
+ test.skip('initProject scaffolds custom branch documents', async () => {
160
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-init-branch-'));
161
+ try {
162
+ const init = await initProject(root, { branch: 'feature-x' });
163
+ const status = await getProjectStatus(root, { branch: 'feature-x' });
164
+
165
+ assert.equal(init.documents.branch, 'feature-x');
166
+ assert.match(await readFile(path.join(root, 'specs', 'feature-x', 'tasks.md'), 'utf8'), /id: ONBOARDING-1/);
167
+ assert.match(await readFile(path.join(root, 'specs', 'feature-x', 'verify.md'), 'utf8'), /sdd-init-onboarding-verify-v1/);
168
+ assert.equal(status.documents.specExists, true);
169
+ assert.equal(status.documents.planExists, true);
170
+ assert.equal(status.documents.tasksExists, true);
171
+ assert.equal(status.documents.verifyExists, true);
172
+ assert.equal(status.gaps.some((gap) => gap.type === 'Document Gap'), false);
173
+ } finally {
174
+ await rm(root, { recursive: true, force: true });
175
+ }
176
+ });
177
+
178
+ test('initProject can skip semantic document scaffold', async () => {
179
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-init-skip-docs-'));
180
+ try {
181
+ const init = await initProject(root, { scaffoldDocuments: false });
182
+
183
+ await assert.rejects(readFile(path.join(root, 'specs', 'master', 'spec.md'), 'utf8'), /ENOENT/);
184
+ await assert.rejects(readFile(path.join(root, 'specs', 'master', 'verify.md'), 'utf8'), /ENOENT/);
185
+ assert.equal(init.documents.documents.every((document) => document.status === 'skipped'), true);
186
+ } finally {
187
+ await rm(root, { recursive: true, force: true });
188
+ }
189
+ });
190
+
191
+ test.skip('initProject projects managed Claude Code entries by default', async () => {
192
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-ai-init-'));
193
+ try {
194
+ const init = await initProject(root);
195
+ const skill = await readFile(path.join(root, '.claude', 'skills', 'sdd', 'SKILL.md'), 'utf8');
196
+ const doctorCommand = await readFile(path.join(root, '.claude', 'commands', 'sdd', 'doctor.md'), 'utf8');
197
+ const updateCommand = await readFile(path.join(root, '.claude', 'commands', 'sdd', 'update.md'), 'utf8');
198
+
199
+ const specCommand = await readFile(path.join(root, '.claude', 'commands', 'sdd', 'spec.md'), 'utf8');
200
+ const planCommand = await readFile(path.join(root, '.claude', 'commands', 'sdd', 'plan.md'), 'utf8');
201
+ const tasksCommand = await readFile(path.join(root, '.claude', 'commands', 'sdd', 'tasks.md'), 'utf8');
202
+ const executeCommand = await readFile(path.join(root, '.claude', 'commands', 'sdd', 'execute.md'), 'utf8');
203
+ const shipCommand = await readFile(path.join(root, '.claude', 'commands', 'sdd', 'ship.md'), 'utf8');
204
+
205
+ assert.equal(init.aiTools.length, 1);
206
+ assert.equal(init.aiTools[0].entries.some((entry) => entry.status === 'created'), true);
207
+ assert.match(skill, /sdd_contract: sdd-ai-entry-v1/);
208
+ assert.match(skill, /sdd_hash: sha256:/);
209
+ assert.match(skill, /manual `\/sdd` root intent router/);
210
+ assert.match(skill, /do not paste or restate full status/);
211
+ assert.match(skill, /natural-language intent/);
212
+ assert.match(skill, /CLI\/core output/);
213
+ assert.match(skill, /projected command bundle/);
214
+ assert.match(skill, /ambiguous after status/);
215
+ assert.match(skill, /sdd tasks inspect <task_id>/);
216
+ assert.doesNotMatch(skill, /sync-back|sync_back/);
217
+ assert.match(skill, /sdd ship close --branch <branch> --json/);
218
+ assert.match(skill, /sdd ship close --branch <branch> --json/);
219
+ assert.doesNotMatch(skill, /follow apply_policy/);
220
+ assert.match(skill, /workflow_status=not_started/);
221
+ assert.match(skill, /workflow branch entry/);
222
+ assert.match(doctorCommand, /sdd instructions doctor --json/);
223
+ assert.match(doctorCommand, /explicit diagnostic scope/);
224
+ await assert.rejects(access(path.join(root, '.claude', 'commands', 'sdd.md')), /ENOENT/);
225
+ await assert.rejects(access(path.join(root, '.claude', 'commands', 'sdd', 'init.md')), /ENOENT/);
226
+ await assert.rejects(access(path.join(root, '.claude', 'commands', 'sdd', 'verify.md')), /ENOENT/);
227
+ await assert.rejects(access(path.join(root, '.claude', 'commands', 'sdd', 'verifies.md')), /ENOENT/);
228
+ await assert.rejects(access(path.join(root, '.claude', 'commands', 'sdd', 'instructions.md')), /ENOENT/);
229
+ await assert.rejects(access(path.join(root, '.claude', 'commands', 'sdd', 'sync-back.md')), /ENOENT/);
230
+ assert.equal(init.aiTools[0].entries.some((entry) => entry.id === 'sdd-root'), false);
231
+ assert.equal(init.aiTools[0].entries.some((entry) => entry.id === 'sdd-init'), false);
232
+ assert.equal(init.aiTools[0].entries.some((entry) => entry.id === 'sdd-verify'), false);
233
+ assert.equal(init.aiTools[0].entries.some((entry) => entry.id === 'sdd-verifies'), false);
234
+ assert.equal(init.aiTools[0].entries.some((entry) => entry.id === 'sdd-update'), true);
235
+ assert.equal(init.aiTools[0].entries.some((entry) => entry.id === 'sdd-instructions'), false);
236
+ assert.equal(init.aiTools[0].entries.some((entry) => entry.id === 'sdd-sync-back'), false);
237
+ assert.match(specCommand, /sdd instructions spec --json/);
238
+ assert.match(planCommand, /sdd instructions plan --json/);
239
+ assert.match(tasksCommand, /sdd instructions tasks --json/);
240
+ assert.match(tasksCommand, /sdd tasks format/);
241
+ assert.match(tasksCommand, /tasksStageWorkOrderHandoff/);
242
+ assert.match(tasksCommand, /implementation tasks/);
243
+ assert.match(tasksCommand, /validation tasks/);
244
+ assert.match(specCommand, /specStageWorkOrderHandoff/);
245
+ assert.match(specCommand, /runtime primary spec artifact/);
246
+ assert.match(planCommand, /planStageWorkOrderHandoff/);
247
+ assert.match(planCommand, /AI-ready Technical Design/);
248
+ assert.match(planCommand, /accepted spec and accepted plan refs\/hashes/);
249
+ assert.match(planCommand, /plan-scout/);
250
+ assert.match(planCommand, /plan-review-agent/);
251
+ assert.match(planCommand, /Side logs are never runtime primary truth/);
252
+ assert.match(planCommand, /blocking design decisions/);
253
+ assert.match(planCommand, /must not become task decomposition/);
254
+ assert.match(tasksCommand, /AI-ready Implementation Tickets/);
255
+ assert.match(tasksCommand, /task-slicer/);
256
+ assert.match(tasksCommand, /task-review-agent/);
257
+ assert.match(tasksCommand, /TOO_THIN_FOR_EXECUTE/);
258
+ assert.match(tasksCommand, /missing failure routes/);
259
+ assert.match(tasksCommand, /sdd tasks close --branch <branch> --json/);
260
+ assert.match(executeCommand, /public \/sdd:execute stage/);
261
+ assert.match(executeCommand, /sdd instructions execute --json/);
262
+ assert.match(executeCommand, /sdd execute close --branch <branch> --json/);
263
+ assert.match(executeCommand, /execute lane state/);
264
+ assert.match(executeCommand, /sdd execute close --branch <branch> --json/);
265
+ await assert.rejects(access(path.join(root, '.claude', 'commands', 'sdd', 'do.md')), /ENOENT/);
266
+ await assert.rejects(access(path.join(root, '.claude', 'commands', 'sdd', 'test.md')), /ENOENT/);
267
+ assert.match(updateCommand, /sdd update/);
268
+ assert.match(updateCommand, /does not execute imported skills/);
269
+ assert.doesNotMatch(`${skill}\n${executeCommand}\n${shipCommand}\n${updateCommand}`, /sync-back|sync_back/);
270
+ assert.match(shipCommand, /sdd instructions ship --json/);
271
+ assert.match(shipCommand, /sdd ship close --branch <branch> --json/);
272
+ assert.match(shipCommand, /truthAlignment/);
273
+ assert.match(shipCommand, /ship-collaboration-contract-vN\.md/);
274
+ } finally {
275
+ await rm(root, { recursive: true, force: true });
276
+ }
277
+ });
278
+
279
+ test('initProject detects Maven multi-module Java projects', async () => {
280
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-runtime-maven-'));
281
+ try {
282
+ await writeFile(path.join(root, 'pom.xml'), '<project><packaging>pom</packaging><modules><module>emp-api</module></modules></project>');
283
+ await initProject(root);
284
+ const config = await readProjectConfig(root);
285
+ assert.equal(config.project.language, 'java');
286
+ assert.equal(config.project.framework, 'ssm-maven-multimodule');
287
+ assert.deepEqual(config.validation.default, ['mvn compile']);
288
+ assert.equal(config.detection?.primary, 'java-ssm-maven-multimodule');
289
+ assert.equal(config.detection?.confidence, 'medium');
290
+ } finally {
291
+ await rm(root, { recursive: true, force: true });
292
+ }
293
+ });
294
+
295
+ test('initProject classifies mixed Java and Node repos by source evidence', async () => {
296
+ const root = await mkdtemp(path.join(tmpdir(), 'sdd-runtime-mixed-'));
297
+ try {
298
+ await writeFile(path.join(root, 'pom.xml'), '<project><packaging>pom</packaging><modules><module>emp-api</module></modules><dependencies><dependency><groupId>org.springframework</groupId></dependency><dependency><groupId>org.mybatis</groupId></dependency></dependencies></project>');
299
+ await writeFile(path.join(root, 'package.json'), JSON.stringify({ name: 'tooling-only', devDependencies: { typescript: '^5.0.0' } }));
300
+ await mkdir(path.join(root, 'emp-api', 'src', 'main', 'java', 'com', 'emp'), { recursive: true });
301
+ await mkdir(path.join(root, 'emp-api', 'src', 'main', 'resources'), { recursive: true });
302
+ await writeFile(path.join(root, 'emp-api', 'src', 'main', 'java', 'com', 'emp', 'ApiController.java'), 'class ApiController {}');
303
+ await writeFile(path.join(root, 'emp-api', 'src', 'main', 'resources', 'applicationContext.xml'), '<beans></beans>');
304
+ await initProject(root);
305
+ const config = await readProjectConfig(root);
306
+ assert.equal(config.project.language, 'java');
307
+ assert.equal(config.project.framework, 'ssm-maven-multimodule');
308
+ assert.deepEqual(config.validation.default, ['mvn compile']);
309
+ assert.equal(config.detection?.mixed_stack, true);
310
+ assert.equal(config.detection?.candidates.some((candidate) => candidate.id === 'typescript-node'), true);
311
+ } finally {
312
+ await rm(root, { recursive: true, force: true });
313
+ }
314
+ });