@opengsd/gsd-core 1.14.0 → 1.16.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 (551) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.opencode/plugins/gsd-core.js +85 -5
  4. package/README.ja-JP.md +3 -3
  5. package/README.ko-KR.md +3 -3
  6. package/README.pt-BR.md +3 -3
  7. package/README.zh-CN.md +3 -3
  8. package/agents/gsd-code-fixer.compact.md +7 -6
  9. package/agents/gsd-code-fixer.md +9 -8
  10. package/agents/gsd-code-reviewer.compact.md +5 -3
  11. package/agents/gsd-code-reviewer.md +8 -6
  12. package/agents/gsd-debug-session-manager.compact.md +17 -2
  13. package/agents/gsd-debug-session-manager.md +17 -2
  14. package/agents/gsd-debugger.md +3 -3
  15. package/agents/gsd-eval-auditor.compact.md +1 -1
  16. package/agents/gsd-eval-auditor.md +1 -1
  17. package/agents/gsd-executor.md +17 -12
  18. package/agents/gsd-intel-updater.compact.md +1 -1
  19. package/agents/gsd-intel-updater.md +1 -1
  20. package/agents/gsd-mempalace-curator.md +2 -2
  21. package/agents/gsd-phase-researcher.md +19 -11
  22. package/agents/gsd-plan-checker.md +15 -9
  23. package/agents/gsd-planner.md +15 -11
  24. package/agents/gsd-project-researcher.compact.md +1 -1
  25. package/agents/gsd-project-researcher.md +1 -1
  26. package/agents/gsd-research-synthesizer.compact.md +1 -1
  27. package/agents/gsd-research-synthesizer.md +1 -1
  28. package/agents/gsd-ui-auditor.compact.md +21 -30
  29. package/agents/gsd-ui-auditor.md +166 -37
  30. package/agents/gsd-ui-researcher.compact.md +1 -1
  31. package/agents/gsd-ui-researcher.md +1 -1
  32. package/agents/gsd-verifier.md +37 -14
  33. package/bin/install.js +764 -287
  34. package/commands/gsd/add-tests.md +6 -1
  35. package/commands/gsd/ai-integration-phase.md +6 -1
  36. package/commands/gsd/audit-fix.md +5 -0
  37. package/commands/gsd/audit-milestone.md +6 -1
  38. package/commands/gsd/autonomous.md +7 -2
  39. package/commands/gsd/capture.md +9 -5
  40. package/commands/gsd/code-review.md +7 -2
  41. package/commands/gsd/complete-milestone.md +4 -0
  42. package/commands/gsd/config.md +7 -3
  43. package/commands/gsd/debug.md +11 -7
  44. package/commands/gsd/discuss-phase.md +7 -3
  45. package/commands/gsd/docs-update.md +12 -7
  46. package/commands/gsd/eval-review.md +6 -1
  47. package/commands/gsd/execute-phase.md +12 -7
  48. package/commands/gsd/extract-learnings.md +5 -0
  49. package/commands/gsd/fast.md +4 -0
  50. package/commands/gsd/forensics.md +5 -1
  51. package/commands/gsd/graphify.md +10 -6
  52. package/commands/gsd/health.md +5 -0
  53. package/commands/gsd/help.md +7 -2
  54. package/commands/gsd/import.md +7 -3
  55. package/commands/gsd/inbox.md +5 -0
  56. package/commands/gsd/ingest-docs.md +5 -1
  57. package/commands/gsd/manager.md +6 -1
  58. package/commands/gsd/map-codebase.md +7 -3
  59. package/commands/gsd/mempalace-capture.md +12 -4
  60. package/commands/gsd/mempalace-recall.md +5 -1
  61. package/commands/gsd/milestone-summary.md +5 -1
  62. package/commands/gsd/mvp-phase.md +8 -3
  63. package/commands/gsd/new-milestone.md +6 -1
  64. package/commands/gsd/new-project.md +5 -0
  65. package/commands/gsd/next.md +6 -1
  66. package/commands/gsd/ns-context.md +4 -0
  67. package/commands/gsd/ns-ideate.md +4 -0
  68. package/commands/gsd/ns-manage.md +4 -0
  69. package/commands/gsd/ns-project.md +4 -0
  70. package/commands/gsd/ns-review.md +4 -0
  71. package/commands/gsd/ns-workflow.md +4 -0
  72. package/commands/gsd/onboard.md +6 -1
  73. package/commands/gsd/pause-work.md +5 -1
  74. package/commands/gsd/phase.md +8 -4
  75. package/commands/gsd/plan-phase.md +6 -1
  76. package/commands/gsd/plan-review-convergence.md +11 -7
  77. package/commands/gsd/pr-branch.md +4 -0
  78. package/commands/gsd/profile-user.md +5 -1
  79. package/commands/gsd/progress.md +7 -2
  80. package/commands/gsd/quick-batch.md +21 -9
  81. package/commands/gsd/quick.md +12 -7
  82. package/commands/gsd/review.md +7 -4
  83. package/commands/gsd/secure-phase.md +6 -1
  84. package/commands/gsd/ship.md +5 -0
  85. package/commands/gsd/sketch.md +7 -2
  86. package/commands/gsd/spec-phase.md +5 -1
  87. package/commands/gsd/spike.md +8 -3
  88. package/commands/gsd/surface.md +5 -1
  89. package/commands/gsd/thread.md +4 -0
  90. package/commands/gsd/ui-phase.md +6 -1
  91. package/commands/gsd/ui-review.md +6 -1
  92. package/commands/gsd/ultraplan-phase.md +5 -1
  93. package/commands/gsd/undo.md +5 -1
  94. package/commands/gsd/update.md +6 -2
  95. package/commands/gsd/validate-phase.md +6 -1
  96. package/commands/gsd/verify-work.md +6 -1
  97. package/commands/gsd/workspace.md +7 -3
  98. package/gsd-core/bin/gsd-tools.cjs +477 -78
  99. package/gsd-core/bin/lib/active-workstream-store.cjs +15 -0
  100. package/gsd-core/bin/lib/adr-parser.cjs +3 -1
  101. package/gsd-core/bin/lib/agent-install-check.cjs +4 -1
  102. package/gsd-core/bin/lib/audit.cjs +144 -42
  103. package/gsd-core/bin/lib/broken-windows.cjs +13 -13
  104. package/gsd-core/bin/lib/capability-activation.cjs +9 -4
  105. package/gsd-core/bin/lib/capability-registry.cjs +197 -222
  106. package/gsd-core/bin/lib/capability-validator.cjs +16 -1
  107. package/gsd-core/bin/lib/check-auto-mode.cjs +35 -0
  108. package/gsd-core/bin/lib/check-command-router.cjs +164 -1625
  109. package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +13 -2
  110. package/gsd-core/bin/lib/cli-exit.cjs +12 -0
  111. package/gsd-core/bin/lib/codex-agent-toml.cjs +32 -33
  112. package/gsd-core/bin/lib/command-aliases.cjs +7 -0
  113. package/gsd-core/bin/lib/command-routing-hub.cjs +48 -1
  114. package/gsd-core/bin/lib/commands.cjs +343 -207
  115. package/gsd-core/bin/lib/complexity-trigger.cjs +8 -7
  116. package/gsd-core/bin/lib/config-loader.cjs +65 -4
  117. package/gsd-core/bin/lib/config.cjs +76 -19
  118. package/gsd-core/bin/lib/core-utils.cjs +6 -1
  119. package/gsd-core/bin/lib/coverage.cjs +4 -8
  120. package/gsd-core/bin/lib/decision-coverage-support.cjs +259 -0
  121. package/gsd-core/bin/lib/decisions.cjs +30 -14
  122. package/gsd-core/bin/lib/drift.cjs +177 -42
  123. package/gsd-core/bin/lib/frontmatter-fence.cjs +90 -0
  124. package/gsd-core/bin/lib/frontmatter-splice.cjs +494 -0
  125. package/gsd-core/bin/lib/frontmatter.cjs +426 -234
  126. package/gsd-core/bin/lib/gap-checker.cjs +72 -29
  127. package/gsd-core/bin/lib/gate-api-coverage-verify-pre.cjs +381 -0
  128. package/gsd-core/bin/lib/gate-args.cjs +53 -0
  129. package/gsd-core/bin/lib/gate-codebase-drift.cjs +285 -0
  130. package/gsd-core/bin/lib/gate-config.cjs +46 -0
  131. package/gsd-core/bin/lib/gate-context-drift.cjs +141 -0
  132. package/gsd-core/bin/lib/gate-decision-coverage-plan.cjs +169 -0
  133. package/gsd-core/bin/lib/gate-decision-coverage-verify.cjs +126 -0
  134. package/gsd-core/bin/lib/gate-evaluation-scope.cjs +555 -0
  135. package/gsd-core/bin/lib/gate-evidence.cjs +138 -0
  136. package/gsd-core/bin/lib/gate-exit.cjs +27 -0
  137. package/gsd-core/bin/lib/gate-gap-analysis-plan-post.cjs +61 -0
  138. package/gsd-core/bin/lib/gate-phase-context.cjs +170 -0
  139. package/gsd-core/bin/lib/gate-predicate-evaluator.cjs +1 -1
  140. package/gsd-core/bin/lib/gate-predicate.cjs +165 -0
  141. package/gsd-core/bin/lib/gate-prohibition-enforcement.cjs +94 -0
  142. package/gsd-core/bin/lib/gate-schema-drift.cjs +165 -0
  143. package/gsd-core/bin/lib/gate-tdd-red-evidence.cjs +100 -0
  144. package/gsd-core/bin/lib/gate-tdd-review-checkpoint.cjs +182 -0
  145. package/gsd-core/bin/lib/gate-ui-plan.cjs +86 -0
  146. package/gsd-core/bin/lib/gate-ui-safety.cjs +80 -0
  147. package/gsd-core/bin/lib/gate-verdict.cjs +64 -0
  148. package/gsd-core/bin/lib/gate-verify-command-paths.cjs +78 -0
  149. package/gsd-core/bin/lib/gate-verify-failure-directions.cjs +41 -0
  150. package/gsd-core/bin/lib/graphify.cjs +10 -2
  151. package/gsd-core/bin/lib/health-diagnostic-rules/phase-structure.cjs +43 -47
  152. package/gsd-core/bin/lib/health-diagnostic.cjs +45 -8
  153. package/gsd-core/bin/lib/host-runtime-detection.cjs +9 -0
  154. package/gsd-core/bin/lib/init.cjs +364 -132
  155. package/gsd-core/bin/lib/install-engine.cjs +30 -33
  156. package/gsd-core/bin/lib/install-profiles.cjs +7 -4
  157. package/gsd-core/bin/lib/installer-migrations.cjs +8 -1
  158. package/gsd-core/bin/lib/io.cjs +122 -3
  159. package/gsd-core/bin/lib/loop-resolver.cjs +95 -0
  160. package/gsd-core/bin/lib/markdown-sectionizer.cjs +75 -1
  161. package/gsd-core/bin/lib/milestone.cjs +37 -6
  162. package/gsd-core/bin/lib/model-resolver.cjs +171 -62
  163. package/gsd-core/bin/lib/observability/event.cjs +1 -1
  164. package/gsd-core/bin/lib/observability/logger.cjs +46 -1
  165. package/gsd-core/bin/lib/pattern.cjs +10 -0
  166. package/gsd-core/bin/lib/phase-command-router.cjs +20 -5
  167. package/gsd-core/bin/lib/phase-estimation.cjs +5 -4
  168. package/gsd-core/bin/lib/phase-id-card.cjs +32 -0
  169. package/gsd-core/bin/lib/phase-id-display.cjs +78 -0
  170. package/gsd-core/bin/lib/phase-id.cjs +110 -8
  171. package/gsd-core/bin/lib/phase-lifecycle.cjs +9 -2
  172. package/gsd-core/bin/lib/phase-locator.cjs +29 -10
  173. package/gsd-core/bin/lib/phase-status.cjs +360 -0
  174. package/gsd-core/bin/lib/phase.cjs +489 -88
  175. package/gsd-core/bin/lib/plan-document.cjs +142 -20
  176. package/gsd-core/bin/lib/plan-drift-guard.cjs +5 -0
  177. package/gsd-core/bin/lib/planning-document.cjs +692 -0
  178. package/gsd-core/bin/lib/planning-inspect.cjs +60 -9
  179. package/gsd-core/bin/lib/planning-snapshot.cjs +18 -0
  180. package/gsd-core/bin/lib/planning-workspace.cjs +83 -55
  181. package/gsd-core/bin/lib/pr-branch-patterns.cjs +57 -0
  182. package/gsd-core/bin/lib/pristine-baseline.cjs +10 -0
  183. package/gsd-core/bin/lib/probe-core.cjs +7 -1
  184. package/gsd-core/bin/lib/profile-output.cjs +6 -3
  185. package/gsd-core/bin/lib/prohibition-enforcement.cjs +0 -55
  186. package/gsd-core/bin/lib/project-root.cjs +41 -2
  187. package/gsd-core/bin/lib/quick-batch-command-router.cjs +35 -9
  188. package/gsd-core/bin/lib/quick-batch-dispatch.cjs +11 -8
  189. package/gsd-core/bin/lib/real-home-guard.cjs +9 -1
  190. package/gsd-core/bin/lib/report-parser.cjs +269 -0
  191. package/gsd-core/bin/lib/review-lane-descriptor.cjs +10 -30
  192. package/gsd-core/bin/lib/review-reviewer-selection.cjs +2 -2
  193. package/gsd-core/bin/lib/roadmap-command-router.cjs +25 -19
  194. package/gsd-core/bin/lib/roadmap-parser.cjs +242 -15
  195. package/gsd-core/bin/lib/roadmap-upgrade.cjs +1653 -65
  196. package/gsd-core/bin/lib/roadmap.cjs +405 -88
  197. package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +373 -187
  198. package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +5 -2
  199. package/gsd-core/bin/lib/runtime-artifact-layout.cjs +57 -1
  200. package/gsd-core/bin/lib/runtime-homes.cjs +14 -7
  201. package/gsd-core/bin/lib/runtime-hooks-surface.cjs +522 -624
  202. package/gsd-core/bin/lib/runtime-name-policy.cjs +246 -21
  203. package/gsd-core/bin/lib/runtime-slash.cjs +47 -30
  204. package/gsd-core/bin/lib/shell-command-projection.cjs +47 -8
  205. package/gsd-core/bin/lib/smart-entry.cjs +19 -3
  206. package/gsd-core/bin/lib/stale-bake-guard.cjs +32 -48
  207. package/gsd-core/bin/lib/state-contract.cjs +15 -18
  208. package/gsd-core/bin/lib/state-document.cjs +100 -22
  209. package/gsd-core/bin/lib/state-transition.cjs +39 -2
  210. package/gsd-core/bin/lib/state.cjs +256 -105
  211. package/gsd-core/bin/lib/surface.cjs +19 -2
  212. package/gsd-core/bin/lib/tdd-red-evidence.cjs +48 -79
  213. package/gsd-core/bin/lib/uat-predicate.cjs +359 -38
  214. package/gsd-core/bin/lib/uat.cjs +432 -7
  215. package/gsd-core/bin/lib/ui-consideration-probe.cjs +15 -2
  216. package/gsd-core/bin/lib/ui-frontend-evidence.cjs +167 -40
  217. package/gsd-core/bin/lib/undo-commit-selection.cjs +131 -0
  218. package/gsd-core/bin/lib/vendor/README.md +31 -9
  219. package/gsd-core/bin/lib/vendor/saxes.cjs +1934 -0
  220. package/gsd-core/bin/lib/vendor/saxes.cjs.LICENSE.txt +92 -0
  221. package/gsd-core/bin/lib/vendor/tap-parser.cjs +8927 -0
  222. package/gsd-core/bin/lib/vendor/tap-parser.cjs.LICENSE.txt +152 -0
  223. package/gsd-core/bin/lib/verification-command-router.cjs +2 -1
  224. package/gsd-core/bin/lib/verification.cjs +1378 -274
  225. package/gsd-core/bin/lib/verify-command-grounding.cjs +46 -2
  226. package/gsd-core/bin/lib/verify-command-router.cjs +18 -7
  227. package/gsd-core/bin/lib/verify.cjs +357 -531
  228. package/gsd-core/bin/lib/workstream-inventory-builder.cjs +14 -6
  229. package/gsd-core/bin/lib/workstream-inventory.cjs +31 -21
  230. package/gsd-core/bin/lib/workstream-name-policy.cjs +31 -1
  231. package/gsd-core/bin/lib/workstream.cjs +11 -2
  232. package/gsd-core/bin/lib/worktree-base-ref.cjs +482 -73
  233. package/gsd-core/bin/lib/worktree-safety.cjs +784 -51
  234. package/gsd-core/bin/shared/config-defaults.manifest.json +8 -0
  235. package/gsd-core/bin/shared/config-schema.manifest.json +5 -0
  236. package/gsd-core/references/autonomous-smart-discuss.md +2 -1
  237. package/gsd-core/references/autonomous-ui-design-contract.md +3 -3
  238. package/gsd-core/references/checkpoints.md +5 -3
  239. package/gsd-core/references/edge-probe-fixtures/01-round-half-even/expected-coverage.json +28 -3
  240. package/gsd-core/references/edge-probe-fixtures/02-merge-intervals/expected-coverage.json +37 -4
  241. package/gsd-core/references/edge-probe-fixtures/03-truncate-graphemes/expected-coverage.json +28 -3
  242. package/gsd-core/references/edge-probe-fixtures/04-money-rounding/expected-coverage.json +28 -3
  243. package/gsd-core/references/edge-probe-fixtures/05-list-dedupe/expected-coverage.json +37 -4
  244. package/gsd-core/references/edge-probe-fixtures/06-resolved-mixed/expected-coverage.json +37 -4
  245. package/gsd-core/references/edge-probe.md +195 -21
  246. package/gsd-core/references/execute-mvp-tdd.md +5 -10
  247. package/gsd-core/references/execute-phase-between-wave-reset.md +10 -6
  248. package/gsd-core/references/execute-phase-response-language.md +1 -1
  249. package/gsd-core/references/execute-phase-wave-guard.md +22 -11
  250. package/gsd-core/references/gsd-run-resolver.md +1 -1
  251. package/gsd-core/references/loop-hook-dispatch.md +7 -1
  252. package/gsd-core/references/model-profiles.md +1 -1
  253. package/gsd-core/references/offer-next.md +1 -1
  254. package/gsd-core/references/phase-argument-parsing.md +9 -7
  255. package/gsd-core/references/phase-id-convention.md +28 -0
  256. package/gsd-core/references/planner-gap-closure.md +2 -0
  257. package/gsd-core/references/planner-load-graph-context.md +24 -13
  258. package/gsd-core/references/planner-verify-command-grounding.md +14 -0
  259. package/gsd-core/references/planning-config.md +12 -3
  260. package/gsd-core/references/spidr-splitting.md +1 -1
  261. package/gsd-core/references/tdd.md +37 -8
  262. package/gsd-core/references/ui-consideration-probe.md +10 -5
  263. package/gsd-core/references/verifier-phase-gates.md +5 -2
  264. package/gsd-core/references/verify-command-path-resolvability.md +10 -2
  265. package/gsd-core/references/verify-mvp-mode.md +2 -2
  266. package/gsd-core/references/workstream-flag.md +33 -3
  267. package/gsd-core/references/worktree-path-safety.md +321 -0
  268. package/gsd-core/templates/README.md +1 -1
  269. package/gsd-core/templates/UAT.md +17 -1
  270. package/gsd-core/templates/config.json +2 -11
  271. package/gsd-core/templates/verification-report.md +1 -1
  272. package/gsd-core/workflows/_runtime-launcher.snippet.sh +1 -1
  273. package/gsd-core/workflows/add-backlog.md +1 -1
  274. package/gsd-core/workflows/add-phase.md +8 -7
  275. package/gsd-core/workflows/add-tests.md +4 -3
  276. package/gsd-core/workflows/add-todo.md +6 -5
  277. package/gsd-core/workflows/ai-integration-phase.md +13 -4
  278. package/gsd-core/workflows/audit-fix.md +1 -1
  279. package/gsd-core/workflows/audit-milestone.md +4 -3
  280. package/gsd-core/workflows/audit-uat.md +1 -1
  281. package/gsd-core/workflows/autonomous/steps/converge-fail-fast.md +9 -18
  282. package/gsd-core/workflows/autonomous.md +43 -23
  283. package/gsd-core/workflows/check-todos.md +7 -6
  284. package/gsd-core/workflows/cleanup.md +2 -2
  285. package/gsd-core/workflows/code-review/steps/dispatch-fix.md +4 -3
  286. package/gsd-core/workflows/code-review/steps/structural-pre-pass.md +20 -13
  287. package/gsd-core/workflows/code-review-fix.md +112 -25
  288. package/gsd-core/workflows/code-review.md +146 -135
  289. package/gsd-core/workflows/complete-milestone/detail/elaboration.md +4 -3
  290. package/gsd-core/workflows/complete-milestone.md +13 -8
  291. package/gsd-core/workflows/debug.md +32 -7
  292. package/gsd-core/workflows/diagnose-issues.md +3 -2
  293. package/gsd-core/workflows/discuss-phase/modes/advisor.md +1 -1
  294. package/gsd-core/workflows/discuss-phase/modes/chain.md +1 -1
  295. package/gsd-core/workflows/discuss-phase-assumptions.md +4 -3
  296. package/gsd-core/workflows/discuss-phase.md +4 -3
  297. package/gsd-core/workflows/do.md +2 -2
  298. package/gsd-core/workflows/docs-update.md +6 -5
  299. package/gsd-core/workflows/edit-phase.md +4 -3
  300. package/gsd-core/workflows/eval-review.md +14 -5
  301. package/gsd-core/workflows/execute-phase/detail/elaboration.md +2 -2
  302. package/gsd-core/workflows/execute-phase/steps/code-review-disposition.md +1019 -0
  303. package/gsd-core/workflows/execute-phase/steps/codebase-drift-gate.md +15 -4
  304. package/gsd-core/workflows/execute-phase/steps/completion-reconciliation.md +10 -7
  305. package/gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md +37 -3
  306. package/gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md +3 -1
  307. package/gsd-core/workflows/execute-phase/steps/partial-wave.md +2 -2
  308. package/gsd-core/workflows/execute-phase/steps/per-plan-executor-routing.md +1 -1
  309. package/gsd-core/workflows/execute-phase/steps/per-plan-worktree-gate.md +1 -1
  310. package/gsd-core/workflows/execute-phase/steps/post-merge-gate.md +46 -9
  311. package/gsd-core/workflows/execute-phase/steps/protected-branch.md +1 -1
  312. package/gsd-core/workflows/execute-phase/steps/ready-wave-gate.md +37 -0
  313. package/gsd-core/workflows/execute-phase/steps/regression-gate-run.md +1 -1
  314. package/gsd-core/workflows/execute-phase/steps/regression-gate.md +2 -0
  315. package/gsd-core/workflows/execute-phase/steps/tdd-applicability-resolution.md +1 -1
  316. package/gsd-core/workflows/execute-phase/steps/threat-id-gate.md +28 -0
  317. package/gsd-core/workflows/execute-phase/steps/verify-phase-goal.md +187 -0
  318. package/gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md +2 -3
  319. package/gsd-core/workflows/execute-phase/steps/worktree-base-check.md +25 -0
  320. package/gsd-core/workflows/execute-phase.md +96 -178
  321. package/gsd-core/workflows/execute-plan.md +18 -23
  322. package/gsd-core/workflows/explore.md +4 -4
  323. package/gsd-core/workflows/extract-learnings.md +4 -2
  324. package/gsd-core/workflows/fast.md +1 -1
  325. package/gsd-core/workflows/forensics.md +1 -1
  326. package/gsd-core/workflows/graduation.md +1 -1
  327. package/gsd-core/workflows/health.md +3 -2
  328. package/gsd-core/workflows/help/modes/full.compact.md +3 -3
  329. package/gsd-core/workflows/help/modes/full.md +5 -5
  330. package/gsd-core/workflows/help/modes/topic.md +15 -5
  331. package/gsd-core/workflows/import.md +4 -3
  332. package/gsd-core/workflows/inbox.md +2 -2
  333. package/gsd-core/workflows/ingest-docs.md +3 -3
  334. package/gsd-core/workflows/insert-phase.md +4 -3
  335. package/gsd-core/workflows/list-seeds.md +1 -1
  336. package/gsd-core/workflows/list-workspaces.md +1 -1
  337. package/gsd-core/workflows/manager.md +6 -4
  338. package/gsd-core/workflows/map-codebase.md +5 -4
  339. package/gsd-core/workflows/milestone-summary.md +3 -2
  340. package/gsd-core/workflows/mvp-phase.md +14 -14
  341. package/gsd-core/workflows/new-milestone.md +11 -11
  342. package/gsd-core/workflows/new-project/steps/auto-mode-config.md +3 -3
  343. package/gsd-core/workflows/new-project/steps/codebase-map-offer.md +1 -1
  344. package/gsd-core/workflows/new-project.md +7 -7
  345. package/gsd-core/workflows/new-workspace.md +2 -2
  346. package/gsd-core/workflows/next.md +1 -1
  347. package/gsd-core/workflows/note.md +1 -1
  348. package/gsd-core/workflows/onboard.md +1 -1
  349. package/gsd-core/workflows/pause-work.md +2 -2
  350. package/gsd-core/workflows/plan-phase/detail/elaboration.md +1 -1
  351. package/gsd-core/workflows/plan-phase/steps/chunked-planning-mode.md +17 -5
  352. package/gsd-core/workflows/plan-phase/steps/closed-phase-gate.md +1 -1
  353. package/gsd-core/workflows/plan-phase/steps/prd-express-path.md +1 -1
  354. package/gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md +23 -5
  355. package/gsd-core/workflows/plan-phase.md +50 -24
  356. package/gsd-core/workflows/plan-review-convergence.md +21 -5
  357. package/gsd-core/workflows/plant-seed.md +62 -20
  358. package/gsd-core/workflows/pr-branch.md +113 -13
  359. package/gsd-core/workflows/profile-user.md +2 -2
  360. package/gsd-core/workflows/progress.md +19 -49
  361. package/gsd-core/workflows/quick/steps/plan-checker-loop.md +27 -0
  362. package/gsd-core/workflows/quick/steps/quick-verification.md +4 -4
  363. package/gsd-core/workflows/quick/steps/worktree-pre-dispatch-commit.md +30 -11
  364. package/gsd-core/workflows/quick-batch/steps/batch-init.md +1 -1
  365. package/gsd-core/workflows/quick-batch/steps/completion.md +1 -1
  366. package/gsd-core/workflows/quick-batch/steps/merge-wave.md +1 -1
  367. package/gsd-core/workflows/quick-batch/steps/planner-wave.md +1 -1
  368. package/gsd-core/workflows/quick-batch/steps/research-phase.md +1 -1
  369. package/gsd-core/workflows/quick-batch/steps/resume-mode.md +1 -1
  370. package/gsd-core/workflows/quick-batch/steps/verification-wave.md +9 -3
  371. package/gsd-core/workflows/quick-batch/steps/worktree-dispatch.md +1 -1
  372. package/gsd-core/workflows/quick-batch.md +15 -10
  373. package/gsd-core/workflows/quick.md +62 -39
  374. package/gsd-core/workflows/reapply-patches.md +9 -3
  375. package/gsd-core/workflows/remove-phase.md +3 -2
  376. package/gsd-core/workflows/remove-workspace.md +2 -2
  377. package/gsd-core/workflows/resume-project.md +3 -2
  378. package/gsd-core/workflows/review.md +33 -17
  379. package/gsd-core/workflows/scan.md +3 -2
  380. package/gsd-core/workflows/secure-phase.md +13 -13
  381. package/gsd-core/workflows/settings-advanced.md +30 -10
  382. package/gsd-core/workflows/settings-integrations.md +2 -3
  383. package/gsd-core/workflows/settings.md +4 -4
  384. package/gsd-core/workflows/ship.md +14 -13
  385. package/gsd-core/workflows/sketch-wrap-up.md +1 -1
  386. package/gsd-core/workflows/sketch.md +1 -1
  387. package/gsd-core/workflows/smart-entry.md +2 -2
  388. package/gsd-core/workflows/spec-phase.md +15 -5
  389. package/gsd-core/workflows/spike-wrap-up.md +1 -1
  390. package/gsd-core/workflows/spike.md +1 -1
  391. package/gsd-core/workflows/stats.md +1 -1
  392. package/gsd-core/workflows/sync-skills.md +5 -5
  393. package/gsd-core/workflows/thread.md +2 -2
  394. package/gsd-core/workflows/transition.md +13 -23
  395. package/gsd-core/workflows/ui-phase.md +48 -11
  396. package/gsd-core/workflows/ui-review.md +21 -6
  397. package/gsd-core/workflows/ultraplan-phase.md +3 -2
  398. package/gsd-core/workflows/undo.md +339 -20
  399. package/gsd-core/workflows/update.md +7 -7
  400. package/gsd-core/workflows/validate-phase.md +12 -13
  401. package/gsd-core/workflows/verify-work/detail/elaboration.md +43 -3
  402. package/gsd-core/workflows/verify-work/steps/automated-ui-verification.md +1 -1
  403. package/gsd-core/workflows/verify-work/steps/mvp-uat-framing.md +5 -3
  404. package/gsd-core/workflows/verify-work.md +129 -55
  405. package/hooks/dist/gsd-agent-isolation-guard.js +32 -0
  406. package/hooks/dist/gsd-check-update-worker.js +8 -0
  407. package/hooks/dist/gsd-check-update.js +8 -0
  408. package/hooks/dist/gsd-context-monitor.js +31 -8
  409. package/hooks/dist/gsd-cursor-subagent-start.js +8 -0
  410. package/hooks/dist/gsd-secret-read-guard.js +161 -4
  411. package/hooks/dist/gsd-statusline.js +85 -20
  412. package/hooks/dist/gsd-update-banner.js +8 -0
  413. package/hooks/dist/gsd-validate-commit.sh +63 -4
  414. package/hooks/dist/gsd-windsurf-pre-write.js +11 -2
  415. package/hooks/dist/gsd-workflow-guard.js +5 -4
  416. package/hooks/dist/gsd-worktree-path-guard.js +6 -2
  417. package/hooks/dist/lib/cli-exit.js +12 -0
  418. package/hooks/dist/lib/git-probe.js +17 -1
  419. package/hooks/dist/lib/isolation-sentinel.js +2 -2
  420. package/hooks/gsd-agent-isolation-guard.js +32 -0
  421. package/hooks/gsd-check-update-worker.js +8 -0
  422. package/hooks/gsd-check-update.js +8 -0
  423. package/hooks/gsd-context-monitor.js +31 -8
  424. package/hooks/gsd-cursor-subagent-start.js +8 -0
  425. package/hooks/gsd-secret-read-guard.js +161 -4
  426. package/hooks/gsd-statusline.js +85 -20
  427. package/hooks/gsd-update-banner.js +8 -0
  428. package/hooks/gsd-validate-commit.sh +63 -4
  429. package/hooks/gsd-windsurf-pre-write.js +11 -2
  430. package/hooks/gsd-workflow-guard.js +5 -4
  431. package/hooks/gsd-worktree-path-guard.js +6 -2
  432. package/hooks/hooks.json +5 -5
  433. package/hooks/lib/cli-exit.js +12 -0
  434. package/hooks/lib/git-probe.js +17 -1
  435. package/hooks/lib/isolation-sentinel.js +2 -2
  436. package/package.json +22 -4
  437. package/scripts/build-hooks.js +15 -6
  438. package/scripts/changeset/parse.cjs +52 -4
  439. package/scripts/check-contract-drift.cjs +127 -11
  440. package/scripts/ci-timeout-report.cjs +770 -4
  441. package/scripts/command-contract-helpers.cjs +15 -8
  442. package/scripts/docs-guard-registry.cjs +34 -0
  443. package/scripts/gen-features.cjs +13 -8
  444. package/scripts/gen-hooks-cli-exit.cjs +12 -28
  445. package/scripts/gen-loop-host-contract.cjs +79 -1
  446. package/scripts/gen-platform-conformance-tier.cjs +187 -1
  447. package/scripts/gen-plugin-skills.cjs +87 -1
  448. package/scripts/gen-research-agents.cjs +24 -31
  449. package/scripts/gen-scripts-cli-exit.cjs +30 -3
  450. package/scripts/gen-test-timings.cjs +32 -7
  451. package/scripts/lib/cli-exit.cjs +12 -0
  452. package/scripts/lib/macos-conformance-tier.generated.cjs +34 -2
  453. package/scripts/lib/ndjson-reporter.cjs +31 -5
  454. package/scripts/lib/platform-conformance-tier.generated.cjs +45 -5
  455. package/scripts/lib/registration-ledger-preload.cjs +155 -0
  456. package/scripts/lib/vendor-bundle.cjs +59 -0
  457. package/scripts/lib/vendor-licenses/saxes-6.0.0.txt +64 -0
  458. package/scripts/lint-allow-test-rule-refs.effective-ceiling.json +1 -1
  459. package/scripts/lint-allow-test-rule-refs.unverified-ceiling.json +1 -1
  460. package/scripts/lint-completion-predicate-drift.cjs +18 -19
  461. package/scripts/lint-descriptions.cjs +7 -3
  462. package/scripts/lint-docs-guard-registration.exempt-baseline.cjs +38 -1
  463. package/scripts/lint-eslint-glob-coverage.allowlist.json +20 -0
  464. package/scripts/lint-frontmatter-fence-drift.cjs +313 -0
  465. package/scripts/lint-frontmatter-scalar-broad-grep.cjs +122 -16
  466. package/scripts/lint-phase-arg-assignment.cjs +257 -0
  467. package/scripts/lint-phase-enumeration-drift.cjs +12 -8
  468. package/scripts/lint-phase-id-drift.cjs +319 -5
  469. package/scripts/lint-planning-document-positive-control.cjs +329 -0
  470. package/scripts/lint-pr-branch-pattern-drift.cjs +148 -0
  471. package/scripts/lint-response-language-coverage.cjs +3 -0
  472. package/scripts/lint-retired-runtime-name.cjs +619 -0
  473. package/scripts/lint-skill-deps.cjs +7 -3
  474. package/scripts/lint-state-write-path-drift.cjs +93 -0
  475. package/scripts/lint-test-file-count.allowlist.json +38 -9
  476. package/scripts/lint-test-file-count.cjs +34 -1
  477. package/scripts/lint-vendored-deps.cjs +41 -5
  478. package/scripts/lint-workflow-shellcheck-baseline.json +25 -10
  479. package/scripts/mutation-matrix.cjs +50 -5
  480. package/scripts/prompt-injection-scan.sh +4 -0
  481. package/scripts/release-tarball-smoke.cjs +194 -1
  482. package/scripts/require-issue-link-policy.cjs +6 -2
  483. package/scripts/sync-runtime-launcher.cjs +184 -2
  484. package/scripts/verify-npm-publish.cjs +76 -20
  485. package/skills/gsd-add-tests/SKILL.md +6 -1
  486. package/skills/gsd-ai-integration-phase/SKILL.md +6 -1
  487. package/skills/gsd-audit-fix/SKILL.md +5 -0
  488. package/skills/gsd-audit-milestone/SKILL.md +6 -1
  489. package/skills/gsd-autonomous/SKILL.md +7 -2
  490. package/skills/gsd-capture/SKILL.md +9 -5
  491. package/skills/gsd-code-review/SKILL.md +7 -2
  492. package/skills/gsd-complete-milestone/SKILL.md +4 -0
  493. package/skills/gsd-config/SKILL.md +8 -4
  494. package/skills/gsd-debug/SKILL.md +11 -7
  495. package/skills/gsd-discuss-phase/SKILL.md +7 -3
  496. package/skills/gsd-docs-update/SKILL.md +12 -7
  497. package/skills/gsd-eval-review/SKILL.md +6 -1
  498. package/skills/gsd-execute-phase/SKILL.md +12 -7
  499. package/skills/gsd-extract-learnings/SKILL.md +5 -0
  500. package/skills/gsd-fast/SKILL.md +4 -0
  501. package/skills/gsd-forensics/SKILL.md +5 -1
  502. package/skills/gsd-graphify/SKILL.md +10 -6
  503. package/skills/gsd-health/SKILL.md +5 -0
  504. package/skills/gsd-help/SKILL.md +7 -2
  505. package/skills/gsd-import/SKILL.md +7 -3
  506. package/skills/gsd-inbox/SKILL.md +5 -0
  507. package/skills/gsd-ingest-docs/SKILL.md +5 -1
  508. package/skills/gsd-manager/SKILL.md +6 -1
  509. package/skills/gsd-map-codebase/SKILL.md +7 -3
  510. package/skills/gsd-mempalace-capture/SKILL.md +12 -4
  511. package/skills/gsd-mempalace-recall/SKILL.md +5 -1
  512. package/skills/gsd-milestone-summary/SKILL.md +5 -1
  513. package/skills/gsd-mvp-phase/SKILL.md +8 -3
  514. package/skills/gsd-new-milestone/SKILL.md +6 -1
  515. package/skills/gsd-new-project/SKILL.md +5 -0
  516. package/skills/gsd-next/SKILL.md +6 -1
  517. package/skills/gsd-ns-context/SKILL.md +4 -0
  518. package/skills/gsd-ns-ideate/SKILL.md +4 -0
  519. package/skills/gsd-ns-manage/SKILL.md +4 -0
  520. package/skills/gsd-ns-project/SKILL.md +4 -0
  521. package/skills/gsd-ns-review/SKILL.md +4 -0
  522. package/skills/gsd-ns-workflow/SKILL.md +4 -0
  523. package/skills/gsd-onboard/SKILL.md +6 -1
  524. package/skills/gsd-pause-work/SKILL.md +5 -1
  525. package/skills/gsd-phase/SKILL.md +8 -4
  526. package/skills/gsd-plan-phase/SKILL.md +6 -1
  527. package/skills/gsd-plan-review-convergence/SKILL.md +10 -6
  528. package/skills/gsd-pr-branch/SKILL.md +4 -0
  529. package/skills/gsd-profile-user/SKILL.md +5 -1
  530. package/skills/gsd-progress/SKILL.md +7 -2
  531. package/skills/gsd-quick/SKILL.md +16 -10
  532. package/skills/gsd-quick-batch/SKILL.md +21 -9
  533. package/skills/gsd-review/SKILL.md +7 -4
  534. package/skills/gsd-review-backlog/SKILL.md +3 -2
  535. package/skills/gsd-secure-phase/SKILL.md +6 -1
  536. package/skills/gsd-ship/SKILL.md +5 -0
  537. package/skills/gsd-sketch/SKILL.md +7 -2
  538. package/skills/gsd-spec-phase/SKILL.md +5 -1
  539. package/skills/gsd-spike/SKILL.md +8 -3
  540. package/skills/gsd-surface/SKILL.md +5 -1
  541. package/skills/gsd-thread/SKILL.md +4 -0
  542. package/skills/gsd-ui-phase/SKILL.md +6 -1
  543. package/skills/gsd-ui-review/SKILL.md +6 -1
  544. package/skills/gsd-ultraplan-phase/SKILL.md +5 -1
  545. package/skills/gsd-undo/SKILL.md +5 -1
  546. package/skills/gsd-update/SKILL.md +6 -2
  547. package/skills/gsd-validate-phase/SKILL.md +6 -1
  548. package/skills/gsd-verify-work/SKILL.md +6 -1
  549. package/skills/gsd-workspace/SKILL.md +7 -3
  550. package/skills/gsd-workstreams/SKILL.md +6 -6
  551. package/vscode/package.json +1 -1
@@ -0,0 +1,360 @@
1
+ "use strict";
2
+ /**
3
+ * Phase Status Module — the single owner of "what state is phase P in?"
4
+ * (ADR-5057 §1/§2, epic #5056 Phase 1, #5060).
5
+ *
6
+ * ADR-3180 §7.4 made `isPhaseComplete` the owner of "is phase P complete?".
7
+ * The richer question the UI, the health rules and the ROADMAP writers ask —
8
+ * which rung of the lifecycle is this phase on — had no owner: it was derived
9
+ * at eleven sites in seven vocabularies, and two of them disagreed on a stale
10
+ * `passed` report. This module is that owner.
11
+ *
12
+ * - `PHASE_STATUS` is a closed, frozen ladder. Its values are the upper-case
13
+ * rung names, spelled unlike every projection word, so a display label or
14
+ * a wire value can never pass for a status.
15
+ * - `phaseStatusFromFacts` is the ladder itself — pure. Callers that already
16
+ * hold the §7 owners' answers (the health rules over `PlanningSnapshot`,
17
+ * the pure Workstream Inventory builder, `update-plan-progress`'s stricter
18
+ * write gate) hand it those facts.
19
+ * - `phaseStatus(phaseDir)` gathers the facts from the §7 owners only —
20
+ * `scanPhasePlans` (§7.5) for counts and `isPhaseComplete` (§7.4) for
21
+ * completion and the verification verdict. It never reads VERIFICATION.md
22
+ * frontmatter itself.
23
+ * - Every other vocabulary is a projection exported here: display labels,
24
+ * the `state.json` / Workstream Inventory wire values, the ROADMAP
25
+ * `## Progress` Status cell (both directions), `roadmap analyze` /
26
+ * `init manager`'s `disk_status`, `init`'s `completion_status`, and
27
+ * `init progress`'s `status`. A consumer never maps raw inputs to a word.
28
+ * - Every function that takes a `PhaseStatus` throws `TypeError` on a value
29
+ * outside the ladder, so an out-of-vocabulary value fails where it is
30
+ * produced (ADR-5057 §1.2).
31
+ *
32
+ * LOAD-TIME LEAF. `verification.cjs` and `plan-scan.cjs` are required lazily
33
+ * inside `phaseStatus()`. `state-contract.cjs` imports this module at top
34
+ * level for its wire vocabulary, and `state-contract` sits on the documented
35
+ * `state -> state-contract -> smart-entry -> state` require cycle; keeping this
36
+ * module import-free at load keeps it off that cycle.
37
+ *
38
+ * ADR-457 build-at-publish: source in src/phase-status.cts, compiled to
39
+ * gsd-core/bin/lib/phase-status.cjs (gitignored).
40
+ */
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.COMPLETION_STATUS = exports.PROGRESS_STATUS = exports.DISK_STATUS = exports.ROADMAP_STATUS_TOKEN = exports.WIRE_STATUS = exports.PHASE_STATUS = void 0;
43
+ exports.phaseStatusFromFacts = phaseStatusFromFacts;
44
+ exports.phaseStatus = phaseStatus;
45
+ exports.foldPhaseStatuses = foldPhaseStatuses;
46
+ exports.toDisplayLabel = toDisplayLabel;
47
+ exports.toWireStatus = toWireStatus;
48
+ exports.toRoadmapStatusCell = toRoadmapStatusCell;
49
+ exports.toDiskStatus = toDiskStatus;
50
+ exports.toCompletionStatus = toCompletionStatus;
51
+ exports.toProgressStatus = toProgressStatus;
52
+ exports.matchRoadmapStatusCell = matchRoadmapStatusCell;
53
+ exports.parseRoadmapStatusCell = parseRoadmapStatusCell;
54
+ // ─── Closed vocabularies ───────────────────────────────────────────────────
55
+ /** The lifecycle ladder, lowest rung first. */
56
+ exports.PHASE_STATUS = Object.freeze({
57
+ NOT_STARTED: 'NOT_STARTED',
58
+ PLANNED: 'PLANNED',
59
+ IN_PROGRESS: 'IN_PROGRESS',
60
+ EXECUTED: 'EXECUTED',
61
+ NEEDS_REVIEW: 'NEEDS_REVIEW',
62
+ COMPLETE: 'COMPLETE',
63
+ });
64
+ /**
65
+ * The three-value wire vocabulary published by `.planning/state.json`
66
+ * (`phases[].status`) and the Workstream Inventory (`PhaseStatus.status`).
67
+ */
68
+ exports.WIRE_STATUS = Object.freeze({
69
+ COMPLETE: 'complete',
70
+ IN_PROGRESS: 'in_progress',
71
+ PENDING: 'pending',
72
+ });
73
+ /**
74
+ * The ROADMAP `## Progress` table Status-cell vocabulary: the template's
75
+ * `Not started | In progress | Complete | Deferred` plus the `Planned` word
76
+ * `roadmap update-plan-progress` writes. `In Progress` is spelled the way the
77
+ * writers have always written it.
78
+ */
79
+ exports.ROADMAP_STATUS_TOKEN = Object.freeze({
80
+ NOT_STARTED: 'Not started',
81
+ PLANNED: 'Planned',
82
+ IN_PROGRESS: 'In Progress',
83
+ COMPLETE: 'Complete',
84
+ DEFERRED: 'Deferred',
85
+ });
86
+ /** `roadmap analyze` / `init manager`'s `disk_status` vocabulary (ADR-5057 §1.2). */
87
+ exports.DISK_STATUS = Object.freeze({
88
+ COMPLETE: 'complete',
89
+ EXECUTED: 'executed',
90
+ PARTIAL: 'partial',
91
+ PLANNED: 'planned',
92
+ RESEARCHED: 'researched',
93
+ DISCUSSED: 'discussed',
94
+ EMPTY: 'empty',
95
+ NO_DIRECTORY: 'no_directory',
96
+ });
97
+ /** `init progress`'s per-phase `status` vocabulary (ADR-5057 §1.2). */
98
+ exports.PROGRESS_STATUS = Object.freeze({
99
+ COMPLETE: 'complete',
100
+ EXECUTED: 'executed',
101
+ IN_PROGRESS: 'in_progress',
102
+ RESEARCHED: 'researched',
103
+ PENDING: 'pending',
104
+ NOT_STARTED: 'not_started',
105
+ });
106
+ /** `init`'s `completion_status` vocabulary (ADR-5057 §1.2). */
107
+ exports.COMPLETION_STATUS = Object.freeze({
108
+ COMPLETE: 'complete',
109
+ EXECUTED: 'executed',
110
+ INCOMPLETE: 'incomplete',
111
+ });
112
+ const LADDER = Object.freeze([
113
+ exports.PHASE_STATUS.NOT_STARTED,
114
+ exports.PHASE_STATUS.PLANNED,
115
+ exports.PHASE_STATUS.IN_PROGRESS,
116
+ exports.PHASE_STATUS.EXECUTED,
117
+ exports.PHASE_STATUS.NEEDS_REVIEW,
118
+ exports.PHASE_STATUS.COMPLETE,
119
+ ]);
120
+ const LADDER_RANK = new Map(LADDER.map((s, i) => [s, i]));
121
+ function assertPhaseStatus(value, where) {
122
+ if (typeof value !== 'string' || !LADDER_RANK.has(value)) {
123
+ throw new TypeError(`${where}: ${JSON.stringify(value)} is not a PHASE_STATUS value`);
124
+ }
125
+ }
126
+ function assertCount(value, name) {
127
+ if (typeof value !== 'number' || !Number.isInteger(value) || value < 0) {
128
+ throw new TypeError(`phaseStatusFromFacts: ${name} must be a non-negative integer, got ${JSON.stringify(value)}`);
129
+ }
130
+ }
131
+ /**
132
+ * The ladder. First matching rung wins:
133
+ * complete → COMPLETE (disk-strict: no plan precondition, #3168)
134
+ * no plans → NOT_STARTED
135
+ * no summaries → PLANNED
136
+ * fewer summaries than plans → IN_PROGRESS
137
+ * verification `human_needed` → NEEDS_REVIEW
138
+ * otherwise → EXECUTED (gaps_found, stale, missing, unparseable, phase_dir_not_found)
139
+ *
140
+ * `verificationStatus`, when non-null, must be a VerificationStatus member
141
+ * (#5118) — the same fail-where-produced rule as `assertPhaseStatus`.
142
+ *
143
+ * Completion comes ONLY from `complete`. The ladder never restates a
144
+ * summary-versus-plan completion comparison (scripts/lint-completion-predicate-drift.cjs shape (c)).
145
+ */
146
+ function phaseStatusFromFacts(facts) {
147
+ if (facts === null || typeof facts !== 'object') {
148
+ throw new TypeError('phaseStatusFromFacts: facts object required');
149
+ }
150
+ const { planCount, summaryCount, complete, verificationStatus } = facts;
151
+ assertCount(planCount, 'planCount');
152
+ assertCount(summaryCount, 'summaryCount');
153
+ if (typeof complete !== 'boolean') {
154
+ throw new TypeError(`phaseStatusFromFacts: complete must be a boolean, got ${JSON.stringify(complete)}`);
155
+ }
156
+ const { verification } = owners();
157
+ if (verificationStatus !== null && verificationStatus !== undefined) {
158
+ // Called through a plain function type: a lazily-required owner's
159
+ // assertion signature cannot narrow here (TS2775), and needs not to.
160
+ const assertMember = verification.assertVerificationStatus;
161
+ assertMember(verificationStatus, 'phaseStatusFromFacts: verificationStatus');
162
+ }
163
+ if (complete)
164
+ return exports.PHASE_STATUS.COMPLETE;
165
+ if (planCount === 0)
166
+ return exports.PHASE_STATUS.NOT_STARTED;
167
+ if (summaryCount === 0)
168
+ return exports.PHASE_STATUS.PLANNED;
169
+ if (summaryCount < planCount)
170
+ return exports.PHASE_STATUS.IN_PROGRESS;
171
+ if (verificationStatus === verification.VERIFICATION_STATUS.HUMAN_NEEDED)
172
+ return exports.PHASE_STATUS.NEEDS_REVIEW;
173
+ return exports.PHASE_STATUS.EXECUTED;
174
+ }
175
+ const SCOPE_SEVERITY = Object.freeze({
176
+ complete: 0,
177
+ truncated: 1,
178
+ unscoped: 2,
179
+ unreadable: 3,
180
+ });
181
+ let _verification = null;
182
+ let _planScan = null;
183
+ function owners() {
184
+ /* eslint-disable @typescript-eslint/no-require-imports */
185
+ if (!_verification)
186
+ _verification = require('./verification.cjs');
187
+ if (!_planScan)
188
+ _planScan = require('./plan-scan.cjs');
189
+ /* eslint-enable @typescript-eslint/no-require-imports */
190
+ return { verification: _verification, planScan: _planScan };
191
+ }
192
+ /**
193
+ * What state is the phase in `phaseDir` in? Composes only ADR-3180's §7
194
+ * owners. `scope` is the worse of the plan scan's and the completion read's
195
+ * scopes, so a caller can tell "not started" from "could not look".
196
+ */
197
+ function phaseStatus(phaseDir, deps = {}) {
198
+ const { verification, planScan } = owners();
199
+ const scan = planScan.scanPhasePlans(phaseDir);
200
+ const completion = verification.isPhaseComplete(phaseDir, {
201
+ convention: deps.convention,
202
+ fs: deps.fs,
203
+ phaseCleanCommitTimesMs: deps.phaseCleanCommitTimesMs,
204
+ });
205
+ const status = phaseStatusFromFacts({
206
+ planCount: scan.planCount,
207
+ summaryCount: scan.summaryCount,
208
+ complete: completion.value.complete,
209
+ verificationStatus: completion.value.verification.status,
210
+ });
211
+ const scope = (SCOPE_SEVERITY[completion.scope] ?? 0) > (SCOPE_SEVERITY[scan.scope] ?? 0)
212
+ ? completion.scope
213
+ : scan.scope;
214
+ return {
215
+ value: {
216
+ status,
217
+ planCount: scan.planCount,
218
+ summaryCount: scan.summaryCount,
219
+ verification: completion.value.verification,
220
+ ...(completion.value.statusError ? { statusError: completion.value.statusError } : {}),
221
+ },
222
+ scope,
223
+ };
224
+ }
225
+ // ─── Fold (#2408) ──────────────────────────────────────────────────────────
226
+ /**
227
+ * Fold two statuses for directories that collide on one phase key (#2408):
228
+ * the further-along rung wins. Commutative, idempotent and associative, so
229
+ * `readdirSync` order cannot change the answer.
230
+ */
231
+ function foldPhaseStatuses(a, b) {
232
+ assertPhaseStatus(a, 'foldPhaseStatuses');
233
+ assertPhaseStatus(b, 'foldPhaseStatuses');
234
+ return LADDER_RANK.get(a) >= LADDER_RANK.get(b) ? a : b;
235
+ }
236
+ const DISPLAY_LABEL = Object.freeze({
237
+ [exports.PHASE_STATUS.NOT_STARTED]: 'Not Started',
238
+ [exports.PHASE_STATUS.PLANNED]: 'Planned',
239
+ [exports.PHASE_STATUS.IN_PROGRESS]: 'In Progress',
240
+ [exports.PHASE_STATUS.EXECUTED]: 'Executed',
241
+ [exports.PHASE_STATUS.NEEDS_REVIEW]: 'Needs Review',
242
+ [exports.PHASE_STATUS.COMPLETE]: 'Complete',
243
+ });
244
+ /**
245
+ * The label `progress`, `stats`, `init plan-phase` and `gsd-health` show. The
246
+ * NOT_STARTED word is the caller's display choice (`progress` and `init` say
247
+ * `Pending`, `stats` and the health rule say `Not Started`).
248
+ */
249
+ function toDisplayLabel(status, opts = {}) {
250
+ assertPhaseStatus(status, 'toDisplayLabel');
251
+ const pendingWord = opts.pendingWord ?? 'Not Started';
252
+ if (pendingWord !== 'Pending' && pendingWord !== 'Not Started') {
253
+ throw new TypeError(`toDisplayLabel: pendingWord must be 'Pending' or 'Not Started', got ${JSON.stringify(pendingWord)}`);
254
+ }
255
+ return status === exports.PHASE_STATUS.NOT_STARTED ? pendingWord : DISPLAY_LABEL[status];
256
+ }
257
+ /** `pending` means nothing is planned yet; every rung between that and COMPLETE is `in_progress`. */
258
+ function toWireStatus(status) {
259
+ assertPhaseStatus(status, 'toWireStatus');
260
+ if (status === exports.PHASE_STATUS.COMPLETE)
261
+ return exports.WIRE_STATUS.COMPLETE;
262
+ if (status === exports.PHASE_STATUS.NOT_STARTED)
263
+ return exports.WIRE_STATUS.PENDING;
264
+ return exports.WIRE_STATUS.IN_PROGRESS;
265
+ }
266
+ /** The word a ROADMAP writer puts in the Status cell for this rung. */
267
+ function toRoadmapStatusCell(status) {
268
+ assertPhaseStatus(status, 'toRoadmapStatusCell');
269
+ switch (status) {
270
+ case exports.PHASE_STATUS.COMPLETE: return exports.ROADMAP_STATUS_TOKEN.COMPLETE;
271
+ case exports.PHASE_STATUS.PLANNED: return exports.ROADMAP_STATUS_TOKEN.PLANNED;
272
+ case exports.PHASE_STATUS.NOT_STARTED: return exports.ROADMAP_STATUS_TOKEN.NOT_STARTED;
273
+ default: return exports.ROADMAP_STATUS_TOKEN.IN_PROGRESS;
274
+ }
275
+ }
276
+ /**
277
+ * `roadmap analyze` / `init manager`'s `disk_status`. Below NOT_STARTED the
278
+ * word records which pre-planning artifacts exist. (`no_directory` is the
279
+ * callers' own word for "no directory matched" — there is no phase to ask.)
280
+ */
281
+ function toDiskStatus(status, artifacts) {
282
+ assertPhaseStatus(status, 'toDiskStatus');
283
+ switch (status) {
284
+ case exports.PHASE_STATUS.COMPLETE: return exports.DISK_STATUS.COMPLETE;
285
+ case exports.PHASE_STATUS.NEEDS_REVIEW:
286
+ case exports.PHASE_STATUS.EXECUTED: return exports.DISK_STATUS.EXECUTED;
287
+ case exports.PHASE_STATUS.IN_PROGRESS: return exports.DISK_STATUS.PARTIAL;
288
+ case exports.PHASE_STATUS.PLANNED: return exports.DISK_STATUS.PLANNED;
289
+ default:
290
+ if (artifacts.hasResearch)
291
+ return exports.DISK_STATUS.RESEARCHED;
292
+ if (artifacts.hasContext)
293
+ return exports.DISK_STATUS.DISCUSSED;
294
+ return exports.DISK_STATUS.EMPTY;
295
+ }
296
+ }
297
+ /** `init`'s `completion_status`: complete / executed / incomplete. */
298
+ function toCompletionStatus(status) {
299
+ assertPhaseStatus(status, 'toCompletionStatus');
300
+ if (status === exports.PHASE_STATUS.COMPLETE)
301
+ return exports.COMPLETION_STATUS.COMPLETE;
302
+ if (status === exports.PHASE_STATUS.EXECUTED || status === exports.PHASE_STATUS.NEEDS_REVIEW)
303
+ return exports.COMPLETION_STATUS.EXECUTED;
304
+ return exports.COMPLETION_STATUS.INCOMPLETE;
305
+ }
306
+ /** `init progress`'s per-phase `status`. */
307
+ function toProgressStatus(status, artifacts) {
308
+ assertPhaseStatus(status, 'toProgressStatus');
309
+ switch (status) {
310
+ case exports.PHASE_STATUS.COMPLETE: return exports.PROGRESS_STATUS.COMPLETE;
311
+ case exports.PHASE_STATUS.NEEDS_REVIEW:
312
+ case exports.PHASE_STATUS.EXECUTED: return exports.PROGRESS_STATUS.EXECUTED;
313
+ case exports.PHASE_STATUS.IN_PROGRESS:
314
+ case exports.PHASE_STATUS.PLANNED: return exports.PROGRESS_STATUS.IN_PROGRESS;
315
+ default: return artifacts.hasResearch ? exports.PROGRESS_STATUS.RESEARCHED : exports.PROGRESS_STATUS.PENDING;
316
+ }
317
+ }
318
+ // ─── ROADMAP Status cell reader ────────────────────────────────────────────
319
+ // Leading token of a trimmed cell, case-insensitive, a whitespace run allowed
320
+ // inside the two-word tokens, and `(?!\w)` so `Completed` / `Planning` are not
321
+ // tokens. #4925 lets operator prose follow the token; that prose is ignored.
322
+ const CELL_TOKEN_RE = /^(not\s+started|planned|in\s+progress|complete|deferred)(?!\w)/i;
323
+ const TOKEN_BY_KEY = Object.freeze({
324
+ 'not started': exports.ROADMAP_STATUS_TOKEN.NOT_STARTED,
325
+ planned: exports.ROADMAP_STATUS_TOKEN.PLANNED,
326
+ 'in progress': exports.ROADMAP_STATUS_TOKEN.IN_PROGRESS,
327
+ complete: exports.ROADMAP_STATUS_TOKEN.COMPLETE,
328
+ deferred: exports.ROADMAP_STATUS_TOKEN.DEFERRED,
329
+ });
330
+ /**
331
+ * Read a Status cell's leading token. Returns the canonical token and the raw
332
+ * text it matched (writers compare `text` to decide whether a rewrite is a
333
+ * no-op), or null when the cell has no leading token. Never throws.
334
+ */
335
+ function matchRoadmapStatusCell(cell) {
336
+ if (typeof cell !== 'string')
337
+ return null;
338
+ const m = CELL_TOKEN_RE.exec(cell.trim());
339
+ if (!m)
340
+ return null;
341
+ const key = m[1].toLowerCase().replace(/\s+/g, ' ');
342
+ return { token: TOKEN_BY_KEY[key], text: m[1] };
343
+ }
344
+ /**
345
+ * A Status cell as a wire value. `Deferred`, `Not started`, a cell with no
346
+ * leading token, and a non-string all read `pending` — an unrecognized cell
347
+ * never becomes a fourth wire value. Inverse of `toRoadmapStatusCell` under
348
+ * `toWireStatus` (ADR-5057 Phase 1 property).
349
+ */
350
+ function parseRoadmapStatusCell(cell) {
351
+ const m = matchRoadmapStatusCell(cell);
352
+ if (m === null)
353
+ return exports.WIRE_STATUS.PENDING;
354
+ switch (m.token) {
355
+ case exports.ROADMAP_STATUS_TOKEN.COMPLETE: return exports.WIRE_STATUS.COMPLETE;
356
+ case exports.ROADMAP_STATUS_TOKEN.IN_PROGRESS:
357
+ case exports.ROADMAP_STATUS_TOKEN.PLANNED: return exports.WIRE_STATUS.IN_PROGRESS;
358
+ default: return exports.WIRE_STATUS.PENDING;
359
+ }
360
+ }