@opengsd/get-shit-done-redux 1.0.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 (1466) hide show
  1. package/LICENSE +21 -0
  2. package/README.ja-JP.md +870 -0
  3. package/README.ko-KR.md +861 -0
  4. package/README.md +300 -0
  5. package/README.pt-BR.md +492 -0
  6. package/README.zh-CN.md +842 -0
  7. package/agents/gsd-advisor-researcher.md +127 -0
  8. package/agents/gsd-ai-researcher.md +133 -0
  9. package/agents/gsd-assumptions-analyzer.md +105 -0
  10. package/agents/gsd-code-fixer.md +668 -0
  11. package/agents/gsd-code-reviewer.md +387 -0
  12. package/agents/gsd-codebase-mapper.md +853 -0
  13. package/agents/gsd-debug-session-manager.md +314 -0
  14. package/agents/gsd-debugger.md +1452 -0
  15. package/agents/gsd-doc-classifier.md +168 -0
  16. package/agents/gsd-doc-synthesizer.md +204 -0
  17. package/agents/gsd-doc-verifier.md +217 -0
  18. package/agents/gsd-doc-writer.md +615 -0
  19. package/agents/gsd-domain-researcher.md +153 -0
  20. package/agents/gsd-eval-auditor.md +191 -0
  21. package/agents/gsd-eval-planner.md +154 -0
  22. package/agents/gsd-executor.md +774 -0
  23. package/agents/gsd-framework-selector.md +160 -0
  24. package/agents/gsd-integration-checker.md +470 -0
  25. package/agents/gsd-intel-updater.md +342 -0
  26. package/agents/gsd-nyquist-auditor.md +203 -0
  27. package/agents/gsd-pattern-mapper.md +335 -0
  28. package/agents/gsd-phase-researcher.md +928 -0
  29. package/agents/gsd-plan-checker.md +978 -0
  30. package/agents/gsd-planner.md +1278 -0
  31. package/agents/gsd-project-researcher.md +677 -0
  32. package/agents/gsd-research-synthesizer.md +247 -0
  33. package/agents/gsd-roadmapper.md +688 -0
  34. package/agents/gsd-security-auditor.md +155 -0
  35. package/agents/gsd-ui-auditor.md +495 -0
  36. package/agents/gsd-ui-checker.md +309 -0
  37. package/agents/gsd-ui-researcher.md +380 -0
  38. package/agents/gsd-user-profiler.md +171 -0
  39. package/agents/gsd-verifier.md +917 -0
  40. package/bin/gsd-sdk.js +37 -0
  41. package/bin/install.js +11468 -0
  42. package/bin/lib/ui-safety-gate.cjs +107 -0
  43. package/commands/gsd/add-tests.md +42 -0
  44. package/commands/gsd/ai-integration-phase.md +37 -0
  45. package/commands/gsd/audit-fix.md +34 -0
  46. package/commands/gsd/audit-milestone.md +37 -0
  47. package/commands/gsd/audit-uat.md +24 -0
  48. package/commands/gsd/autonomous.md +46 -0
  49. package/commands/gsd/capture.md +62 -0
  50. package/commands/gsd/cleanup.md +24 -0
  51. package/commands/gsd/code-review.md +59 -0
  52. package/commands/gsd/complete-milestone.md +143 -0
  53. package/commands/gsd/config.md +58 -0
  54. package/commands/gsd/debug.md +52 -0
  55. package/commands/gsd/discuss-phase.md +76 -0
  56. package/commands/gsd/docs-update.md +49 -0
  57. package/commands/gsd/eval-review.md +33 -0
  58. package/commands/gsd/execute-phase.md +64 -0
  59. package/commands/gsd/explore.md +27 -0
  60. package/commands/gsd/extract-learnings.md +23 -0
  61. package/commands/gsd/fast.md +31 -0
  62. package/commands/gsd/forensics.md +57 -0
  63. package/commands/gsd/graphify.md +199 -0
  64. package/commands/gsd/health.md +31 -0
  65. package/commands/gsd/help.md +28 -0
  66. package/commands/gsd/import.md +41 -0
  67. package/commands/gsd/inbox.md +39 -0
  68. package/commands/gsd/ingest-docs.md +42 -0
  69. package/commands/gsd/manager.md +45 -0
  70. package/commands/gsd/map-codebase.md +83 -0
  71. package/commands/gsd/milestone-summary.md +51 -0
  72. package/commands/gsd/mvp-phase.md +45 -0
  73. package/commands/gsd/new-milestone.md +45 -0
  74. package/commands/gsd/new-project.md +47 -0
  75. package/commands/gsd/ns-context.md +23 -0
  76. package/commands/gsd/ns-ideate.md +24 -0
  77. package/commands/gsd/ns-manage.md +29 -0
  78. package/commands/gsd/ns-project.md +22 -0
  79. package/commands/gsd/ns-review.md +26 -0
  80. package/commands/gsd/ns-workflow.md +28 -0
  81. package/commands/gsd/pause-work.md +43 -0
  82. package/commands/gsd/phase.md +56 -0
  83. package/commands/gsd/plan-phase.md +62 -0
  84. package/commands/gsd/plan-review-convergence.md +59 -0
  85. package/commands/gsd/pr-branch.md +26 -0
  86. package/commands/gsd/profile-user.md +46 -0
  87. package/commands/gsd/progress.md +46 -0
  88. package/commands/gsd/quick.md +174 -0
  89. package/commands/gsd/resume-work.md +30 -0
  90. package/commands/gsd/review-backlog.md +63 -0
  91. package/commands/gsd/review.md +41 -0
  92. package/commands/gsd/secure-phase.md +36 -0
  93. package/commands/gsd/settings.md +29 -0
  94. package/commands/gsd/ship.md +24 -0
  95. package/commands/gsd/sketch.md +60 -0
  96. package/commands/gsd/spec-phase.md +63 -0
  97. package/commands/gsd/spike.md +57 -0
  98. package/commands/gsd/stats.md +19 -0
  99. package/commands/gsd/surface.md +155 -0
  100. package/commands/gsd/thread.md +24 -0
  101. package/commands/gsd/ui-phase.md +35 -0
  102. package/commands/gsd/ui-review.md +33 -0
  103. package/commands/gsd/ultraplan-phase.md +34 -0
  104. package/commands/gsd/undo.md +35 -0
  105. package/commands/gsd/update.md +48 -0
  106. package/commands/gsd/validate-phase.md +36 -0
  107. package/commands/gsd/verify-work.md +39 -0
  108. package/commands/gsd/workspace.md +52 -0
  109. package/commands/gsd/workstreams.md +70 -0
  110. package/get-shit-done/bin/check-latest-version.cjs +104 -0
  111. package/get-shit-done/bin/gsd-tools.cjs +1630 -0
  112. package/get-shit-done/bin/lib/active-workstream-store.cjs +85 -0
  113. package/get-shit-done/bin/lib/adr-parser.cjs +394 -0
  114. package/get-shit-done/bin/lib/artifacts.cjs +53 -0
  115. package/get-shit-done/bin/lib/audit.cjs +755 -0
  116. package/get-shit-done/bin/lib/cjs-command-router-adapter.cjs +39 -0
  117. package/get-shit-done/bin/lib/cjs-sdk-bridge.cjs +136 -0
  118. package/get-shit-done/bin/lib/clusters.cjs +135 -0
  119. package/get-shit-done/bin/lib/code-review-flags.cjs +74 -0
  120. package/get-shit-done/bin/lib/command-aliases.generated.cjs +824 -0
  121. package/get-shit-done/bin/lib/command-routing-hub.cjs +239 -0
  122. package/get-shit-done/bin/lib/commands.cjs +1035 -0
  123. package/get-shit-done/bin/lib/config-schema.cjs +31 -0
  124. package/get-shit-done/bin/lib/config.cjs +704 -0
  125. package/get-shit-done/bin/lib/configuration.generated.cjs +253 -0
  126. package/get-shit-done/bin/lib/context-utilization.cjs +47 -0
  127. package/get-shit-done/bin/lib/core.cjs +1922 -0
  128. package/get-shit-done/bin/lib/decisions.cjs +19 -0
  129. package/get-shit-done/bin/lib/decisions.generated.cjs +121 -0
  130. package/get-shit-done/bin/lib/docs.cjs +270 -0
  131. package/get-shit-done/bin/lib/drift.cjs +388 -0
  132. package/get-shit-done/bin/lib/fallow-runner.cjs +109 -0
  133. package/get-shit-done/bin/lib/frontmatter.cjs +389 -0
  134. package/get-shit-done/bin/lib/gap-checker.cjs +205 -0
  135. package/get-shit-done/bin/lib/graphify.cjs +592 -0
  136. package/get-shit-done/bin/lib/gsd2-import.cjs +514 -0
  137. package/get-shit-done/bin/lib/init-command-router.cjs +174 -0
  138. package/get-shit-done/bin/lib/init.cjs +2096 -0
  139. package/get-shit-done/bin/lib/install-profiles.cjs +603 -0
  140. package/get-shit-done/bin/lib/installer-migration-authoring.cjs +117 -0
  141. package/get-shit-done/bin/lib/installer-migration-report.cjs +354 -0
  142. package/get-shit-done/bin/lib/installer-migrations/000-first-time-baseline.cjs +220 -0
  143. package/get-shit-done/bin/lib/installer-migrations/001-legacy-orphan-files.cjs +41 -0
  144. package/get-shit-done/bin/lib/installer-migrations/002-codex-legacy-hooks-json.cjs +80 -0
  145. package/get-shit-done/bin/lib/installer-migrations.cjs +776 -0
  146. package/get-shit-done/bin/lib/intel.cjs +643 -0
  147. package/get-shit-done/bin/lib/learnings.cjs +379 -0
  148. package/get-shit-done/bin/lib/milestone.cjs +314 -0
  149. package/get-shit-done/bin/lib/model-catalog.cjs +136 -0
  150. package/get-shit-done/bin/lib/model-profiles.cjs +25 -0
  151. package/get-shit-done/bin/lib/phase-command-router.cjs +226 -0
  152. package/get-shit-done/bin/lib/phase.cjs +1490 -0
  153. package/get-shit-done/bin/lib/phases-command-router.cjs +97 -0
  154. package/get-shit-done/bin/lib/plan-scan.cjs +26 -0
  155. package/get-shit-done/bin/lib/plan-scan.generated.cjs +97 -0
  156. package/get-shit-done/bin/lib/planning-workspace.cjs +415 -0
  157. package/get-shit-done/bin/lib/profile-output.cjs +1130 -0
  158. package/get-shit-done/bin/lib/profile-pipeline.cjs +539 -0
  159. package/get-shit-done/bin/lib/project-root.generated.cjs +117 -0
  160. package/get-shit-done/bin/lib/prompt-budget.cjs +399 -0
  161. package/get-shit-done/bin/lib/review-reviewer-selection.cjs +125 -0
  162. package/get-shit-done/bin/lib/roadmap-command-router.cjs +99 -0
  163. package/get-shit-done/bin/lib/roadmap.cjs +642 -0
  164. package/get-shit-done/bin/lib/runtime-artifact-layout.cjs +301 -0
  165. package/get-shit-done/bin/lib/runtime-homes.cjs +185 -0
  166. package/get-shit-done/bin/lib/runtime-slash.cjs +109 -0
  167. package/get-shit-done/bin/lib/schema-detect.cjs +21 -0
  168. package/get-shit-done/bin/lib/schema-detect.generated.cjs +170 -0
  169. package/get-shit-done/bin/lib/secrets.cjs +20 -0
  170. package/get-shit-done/bin/lib/secrets.generated.cjs +37 -0
  171. package/get-shit-done/bin/lib/security.cjs +504 -0
  172. package/get-shit-done/bin/lib/shell-command-projection.cjs +552 -0
  173. package/get-shit-done/bin/lib/state-command-router.cjs +346 -0
  174. package/get-shit-done/bin/lib/state-document.cjs +12 -0
  175. package/get-shit-done/bin/lib/state-document.generated.cjs +127 -0
  176. package/get-shit-done/bin/lib/state.cjs +1940 -0
  177. package/get-shit-done/bin/lib/surface.cjs +430 -0
  178. package/get-shit-done/bin/lib/template.cjs +228 -0
  179. package/get-shit-done/bin/lib/uat.cjs +289 -0
  180. package/get-shit-done/bin/lib/validate-command-router.cjs +129 -0
  181. package/get-shit-done/bin/lib/verify-command-router.cjs +122 -0
  182. package/get-shit-done/bin/lib/verify.cjs +1458 -0
  183. package/get-shit-done/bin/lib/workstream-inventory-builder.generated.cjs +79 -0
  184. package/get-shit-done/bin/lib/workstream-inventory.cjs +132 -0
  185. package/get-shit-done/bin/lib/workstream-name-policy.cjs +19 -0
  186. package/get-shit-done/bin/lib/workstream-name-policy.generated.cjs +61 -0
  187. package/get-shit-done/bin/lib/workstream.cjs +374 -0
  188. package/get-shit-done/bin/lib/worktree-safety.cjs +985 -0
  189. package/get-shit-done/bin/verify-reapply-patches.cjs +336 -0
  190. package/get-shit-done/contexts/dev.md +21 -0
  191. package/get-shit-done/contexts/research.md +22 -0
  192. package/get-shit-done/contexts/review.md +23 -0
  193. package/get-shit-done/references/agent-contracts.md +79 -0
  194. package/get-shit-done/references/ai-evals.md +156 -0
  195. package/get-shit-done/references/ai-frameworks.md +186 -0
  196. package/get-shit-done/references/artifact-types.md +131 -0
  197. package/get-shit-done/references/autonomous-smart-discuss.md +277 -0
  198. package/get-shit-done/references/checkpoints.md +814 -0
  199. package/get-shit-done/references/common-bug-patterns.md +114 -0
  200. package/get-shit-done/references/context-budget.md +85 -0
  201. package/get-shit-done/references/continuation-format.md +253 -0
  202. package/get-shit-done/references/debugger-philosophy.md +76 -0
  203. package/get-shit-done/references/decimal-phase-calculation.md +64 -0
  204. package/get-shit-done/references/doc-conflict-engine.md +91 -0
  205. package/get-shit-done/references/domain-probes.md +125 -0
  206. package/get-shit-done/references/execute-mvp-tdd.md +81 -0
  207. package/get-shit-done/references/executor-examples.md +110 -0
  208. package/get-shit-done/references/few-shot-examples/plan-checker.md +73 -0
  209. package/get-shit-done/references/few-shot-examples/verifier.md +109 -0
  210. package/get-shit-done/references/gate-prompts.md +100 -0
  211. package/get-shit-done/references/gates.md +70 -0
  212. package/get-shit-done/references/git-integration.md +298 -0
  213. package/get-shit-done/references/git-planning-commit.md +40 -0
  214. package/get-shit-done/references/ios-scaffold.md +123 -0
  215. package/get-shit-done/references/mandatory-initial-read.md +2 -0
  216. package/get-shit-done/references/model-profile-resolution.md +38 -0
  217. package/get-shit-done/references/model-profiles.md +245 -0
  218. package/get-shit-done/references/mvp-concepts.md +49 -0
  219. package/get-shit-done/references/phase-argument-parsing.md +61 -0
  220. package/get-shit-done/references/planner-antipatterns.md +89 -0
  221. package/get-shit-done/references/planner-chunked.md +49 -0
  222. package/get-shit-done/references/planner-gap-closure.md +62 -0
  223. package/get-shit-done/references/planner-graphify-auto-update.md +67 -0
  224. package/get-shit-done/references/planner-human-verify-mode.md +57 -0
  225. package/get-shit-done/references/planner-mvp-mode.md +53 -0
  226. package/get-shit-done/references/planner-reviews.md +39 -0
  227. package/get-shit-done/references/planner-revision.md +87 -0
  228. package/get-shit-done/references/planner-source-audit.md +73 -0
  229. package/get-shit-done/references/planning-config.md +471 -0
  230. package/get-shit-done/references/project-skills-discovery.md +19 -0
  231. package/get-shit-done/references/questioning.md +162 -0
  232. package/get-shit-done/references/revision-loop.md +97 -0
  233. package/get-shit-done/references/scout-codebase.md +51 -0
  234. package/get-shit-done/references/skeleton-template.md +48 -0
  235. package/get-shit-done/references/sketch-interactivity.md +41 -0
  236. package/get-shit-done/references/sketch-theme-system.md +94 -0
  237. package/get-shit-done/references/sketch-tooling.md +45 -0
  238. package/get-shit-done/references/sketch-variant-patterns.md +81 -0
  239. package/get-shit-done/references/spidr-splitting.md +69 -0
  240. package/get-shit-done/references/tdd.md +330 -0
  241. package/get-shit-done/references/thinking-models-debug.md +44 -0
  242. package/get-shit-done/references/thinking-models-execution.md +50 -0
  243. package/get-shit-done/references/thinking-models-planning.md +62 -0
  244. package/get-shit-done/references/thinking-models-research.md +50 -0
  245. package/get-shit-done/references/thinking-models-verification.md +55 -0
  246. package/get-shit-done/references/thinking-partner.md +96 -0
  247. package/get-shit-done/references/ui-brand.md +160 -0
  248. package/get-shit-done/references/universal-anti-patterns.md +63 -0
  249. package/get-shit-done/references/user-profiling.md +681 -0
  250. package/get-shit-done/references/user-story-template.md +58 -0
  251. package/get-shit-done/references/verification-overrides.md +227 -0
  252. package/get-shit-done/references/verification-patterns.md +612 -0
  253. package/get-shit-done/references/verify-mvp-mode.md +85 -0
  254. package/get-shit-done/references/workstream-flag.md +111 -0
  255. package/get-shit-done/references/worktree-path-safety.md +89 -0
  256. package/get-shit-done/templates/AI-SPEC.md +246 -0
  257. package/get-shit-done/templates/DEBUG.md +169 -0
  258. package/get-shit-done/templates/README.md +77 -0
  259. package/get-shit-done/templates/SECURITY.md +61 -0
  260. package/get-shit-done/templates/UAT.md +265 -0
  261. package/get-shit-done/templates/UI-SPEC.md +100 -0
  262. package/get-shit-done/templates/VALIDATION.md +76 -0
  263. package/get-shit-done/templates/claude-md.md +145 -0
  264. package/get-shit-done/templates/codebase/architecture.md +255 -0
  265. package/get-shit-done/templates/codebase/concerns.md +310 -0
  266. package/get-shit-done/templates/codebase/conventions.md +307 -0
  267. package/get-shit-done/templates/codebase/integrations.md +280 -0
  268. package/get-shit-done/templates/codebase/stack.md +186 -0
  269. package/get-shit-done/templates/codebase/structure.md +285 -0
  270. package/get-shit-done/templates/codebase/testing.md +480 -0
  271. package/get-shit-done/templates/config.json +62 -0
  272. package/get-shit-done/templates/context.md +352 -0
  273. package/get-shit-done/templates/continue-here.md +78 -0
  274. package/get-shit-done/templates/copilot-instructions.md +7 -0
  275. package/get-shit-done/templates/debug-subagent-prompt.md +91 -0
  276. package/get-shit-done/templates/dev-preferences.md +21 -0
  277. package/get-shit-done/templates/discovery.md +146 -0
  278. package/get-shit-done/templates/discussion-log.md +63 -0
  279. package/get-shit-done/templates/milestone-archive.md +123 -0
  280. package/get-shit-done/templates/milestone.md +115 -0
  281. package/get-shit-done/templates/phase-prompt.md +610 -0
  282. package/get-shit-done/templates/planner-subagent-prompt.md +117 -0
  283. package/get-shit-done/templates/project.md +186 -0
  284. package/get-shit-done/templates/requirements.md +231 -0
  285. package/get-shit-done/templates/research-project/ARCHITECTURE.md +204 -0
  286. package/get-shit-done/templates/research-project/FEATURES.md +147 -0
  287. package/get-shit-done/templates/research-project/PITFALLS.md +200 -0
  288. package/get-shit-done/templates/research-project/STACK.md +120 -0
  289. package/get-shit-done/templates/research-project/SUMMARY.md +170 -0
  290. package/get-shit-done/templates/research.md +592 -0
  291. package/get-shit-done/templates/retrospective.md +54 -0
  292. package/get-shit-done/templates/roadmap.md +202 -0
  293. package/get-shit-done/templates/spec.md +307 -0
  294. package/get-shit-done/templates/state.md +184 -0
  295. package/get-shit-done/templates/summary-complex.md +59 -0
  296. package/get-shit-done/templates/summary-minimal.md +41 -0
  297. package/get-shit-done/templates/summary-standard.md +48 -0
  298. package/get-shit-done/templates/summary.md +248 -0
  299. package/get-shit-done/templates/user-profile.md +146 -0
  300. package/get-shit-done/templates/user-setup.md +311 -0
  301. package/get-shit-done/templates/verification-report.md +322 -0
  302. package/get-shit-done/workflows/add-backlog.md +101 -0
  303. package/get-shit-done/workflows/add-phase.md +123 -0
  304. package/get-shit-done/workflows/add-tests.md +365 -0
  305. package/get-shit-done/workflows/add-todo.md +171 -0
  306. package/get-shit-done/workflows/ai-integration-phase.md +305 -0
  307. package/get-shit-done/workflows/analyze-dependencies.md +96 -0
  308. package/get-shit-done/workflows/audit-fix.md +188 -0
  309. package/get-shit-done/workflows/audit-milestone.md +368 -0
  310. package/get-shit-done/workflows/audit-uat.md +120 -0
  311. package/get-shit-done/workflows/autonomous.md +805 -0
  312. package/get-shit-done/workflows/check-todos.md +190 -0
  313. package/get-shit-done/workflows/cleanup.md +165 -0
  314. package/get-shit-done/workflows/code-review-fix.md +512 -0
  315. package/get-shit-done/workflows/code-review.md +666 -0
  316. package/get-shit-done/workflows/complete-milestone.md +865 -0
  317. package/get-shit-done/workflows/debug.md +242 -0
  318. package/get-shit-done/workflows/diagnose-issues.md +251 -0
  319. package/get-shit-done/workflows/discovery-phase.md +291 -0
  320. package/get-shit-done/workflows/discuss-phase/modes/advisor.md +175 -0
  321. package/get-shit-done/workflows/discuss-phase/modes/all.md +28 -0
  322. package/get-shit-done/workflows/discuss-phase/modes/analyze.md +44 -0
  323. package/get-shit-done/workflows/discuss-phase/modes/auto.md +56 -0
  324. package/get-shit-done/workflows/discuss-phase/modes/batch.md +52 -0
  325. package/get-shit-done/workflows/discuss-phase/modes/chain.md +97 -0
  326. package/get-shit-done/workflows/discuss-phase/modes/default.md +141 -0
  327. package/get-shit-done/workflows/discuss-phase/modes/power.md +44 -0
  328. package/get-shit-done/workflows/discuss-phase/modes/text.md +55 -0
  329. package/get-shit-done/workflows/discuss-phase/templates/checkpoint.json +18 -0
  330. package/get-shit-done/workflows/discuss-phase/templates/context.md +136 -0
  331. package/get-shit-done/workflows/discuss-phase/templates/discussion-log.md +50 -0
  332. package/get-shit-done/workflows/discuss-phase-assumptions.md +685 -0
  333. package/get-shit-done/workflows/discuss-phase-power.md +291 -0
  334. package/get-shit-done/workflows/discuss-phase.md +499 -0
  335. package/get-shit-done/workflows/do.md +122 -0
  336. package/get-shit-done/workflows/docs-update.md +1172 -0
  337. package/get-shit-done/workflows/edit-phase.md +305 -0
  338. package/get-shit-done/workflows/eval-review.md +166 -0
  339. package/get-shit-done/workflows/execute-phase/steps/codebase-drift-gate.md +81 -0
  340. package/get-shit-done/workflows/execute-phase/steps/per-plan-worktree-gate.md +94 -0
  341. package/get-shit-done/workflows/execute-phase/steps/post-merge-gate.md +116 -0
  342. package/get-shit-done/workflows/execute-phase.md +1717 -0
  343. package/get-shit-done/workflows/execute-plan.md +536 -0
  344. package/get-shit-done/workflows/explore.md +154 -0
  345. package/get-shit-done/workflows/extract-learnings.md +253 -0
  346. package/get-shit-done/workflows/fast.md +124 -0
  347. package/get-shit-done/workflows/forensics.md +289 -0
  348. package/get-shit-done/workflows/graduation.md +206 -0
  349. package/get-shit-done/workflows/health.md +234 -0
  350. package/get-shit-done/workflows/help/modes/brief.md +22 -0
  351. package/get-shit-done/workflows/help/modes/default.md +50 -0
  352. package/get-shit-done/workflows/help/modes/full.md +784 -0
  353. package/get-shit-done/workflows/help/modes/topic.md +74 -0
  354. package/get-shit-done/workflows/help.md +24 -0
  355. package/get-shit-done/workflows/import.md +264 -0
  356. package/get-shit-done/workflows/inbox.md +387 -0
  357. package/get-shit-done/workflows/ingest-docs.md +339 -0
  358. package/get-shit-done/workflows/insert-phase.md +162 -0
  359. package/get-shit-done/workflows/list-phase-assumptions.md +178 -0
  360. package/get-shit-done/workflows/list-workspaces.md +67 -0
  361. package/get-shit-done/workflows/manager.md +403 -0
  362. package/get-shit-done/workflows/map-codebase.md +454 -0
  363. package/get-shit-done/workflows/milestone-summary.md +234 -0
  364. package/get-shit-done/workflows/mvp-phase.md +232 -0
  365. package/get-shit-done/workflows/new-milestone.md +645 -0
  366. package/get-shit-done/workflows/new-project.md +1487 -0
  367. package/get-shit-done/workflows/new-workspace.md +250 -0
  368. package/get-shit-done/workflows/next.md +231 -0
  369. package/get-shit-done/workflows/node-repair.md +92 -0
  370. package/get-shit-done/workflows/note.md +158 -0
  371. package/get-shit-done/workflows/pause-work.md +254 -0
  372. package/get-shit-done/workflows/plan-milestone-gaps.md +291 -0
  373. package/get-shit-done/workflows/plan-phase.md +1800 -0
  374. package/get-shit-done/workflows/plan-review-convergence.md +340 -0
  375. package/get-shit-done/workflows/plant-seed.md +240 -0
  376. package/get-shit-done/workflows/pr-branch.md +157 -0
  377. package/get-shit-done/workflows/profile-user.md +463 -0
  378. package/get-shit-done/workflows/progress.md +660 -0
  379. package/get-shit-done/workflows/quick.md +1049 -0
  380. package/get-shit-done/workflows/reapply-patches.md +426 -0
  381. package/get-shit-done/workflows/remove-phase.md +166 -0
  382. package/get-shit-done/workflows/remove-workspace.md +118 -0
  383. package/get-shit-done/workflows/resume-project.md +342 -0
  384. package/get-shit-done/workflows/review.md +633 -0
  385. package/get-shit-done/workflows/scan.md +115 -0
  386. package/get-shit-done/workflows/secure-phase.md +190 -0
  387. package/get-shit-done/workflows/session-report.md +146 -0
  388. package/get-shit-done/workflows/settings-advanced.md +590 -0
  389. package/get-shit-done/workflows/settings-integrations.md +292 -0
  390. package/get-shit-done/workflows/settings.md +545 -0
  391. package/get-shit-done/workflows/ship.md +366 -0
  392. package/get-shit-done/workflows/sketch-wrap-up.md +296 -0
  393. package/get-shit-done/workflows/sketch.md +371 -0
  394. package/get-shit-done/workflows/spec-phase.md +262 -0
  395. package/get-shit-done/workflows/spike-wrap-up.md +317 -0
  396. package/get-shit-done/workflows/spike.md +463 -0
  397. package/get-shit-done/workflows/stats.md +90 -0
  398. package/get-shit-done/workflows/sync-skills.md +182 -0
  399. package/get-shit-done/workflows/thread.md +232 -0
  400. package/get-shit-done/workflows/transition.md +704 -0
  401. package/get-shit-done/workflows/ui-phase.md +338 -0
  402. package/get-shit-done/workflows/ui-review.md +203 -0
  403. package/get-shit-done/workflows/ultraplan-phase.md +209 -0
  404. package/get-shit-done/workflows/undo.md +314 -0
  405. package/get-shit-done/workflows/update.md +664 -0
  406. package/get-shit-done/workflows/validate-phase.md +189 -0
  407. package/get-shit-done/workflows/verify-phase.md +554 -0
  408. package/get-shit-done/workflows/verify-work.md +791 -0
  409. package/hooks/dist/gsd-check-update-worker.js +117 -0
  410. package/hooks/dist/gsd-check-update.js +64 -0
  411. package/hooks/dist/gsd-context-monitor.js +192 -0
  412. package/hooks/dist/gsd-graphify-update.sh +158 -0
  413. package/hooks/dist/gsd-phase-boundary.sh +47 -0
  414. package/hooks/dist/gsd-prompt-guard.js +97 -0
  415. package/hooks/dist/gsd-read-guard.js +101 -0
  416. package/hooks/dist/gsd-read-injection-scanner.js +152 -0
  417. package/hooks/dist/gsd-session-state.sh +59 -0
  418. package/hooks/dist/gsd-statusline.js +537 -0
  419. package/hooks/dist/gsd-update-banner.js +134 -0
  420. package/hooks/dist/gsd-validate-commit.sh +57 -0
  421. package/hooks/dist/gsd-workflow-guard.js +94 -0
  422. package/hooks/dist/lib/git-cmd.js +150 -0
  423. package/hooks/dist/lib/gsd-graphify-rebuild.sh +65 -0
  424. package/hooks/gsd-check-update-worker.js +117 -0
  425. package/hooks/gsd-check-update.js +64 -0
  426. package/hooks/gsd-context-monitor.js +192 -0
  427. package/hooks/gsd-graphify-update.sh +158 -0
  428. package/hooks/gsd-phase-boundary.sh +47 -0
  429. package/hooks/gsd-prompt-guard.js +97 -0
  430. package/hooks/gsd-read-guard.js +101 -0
  431. package/hooks/gsd-read-injection-scanner.js +152 -0
  432. package/hooks/gsd-session-state.sh +59 -0
  433. package/hooks/gsd-statusline.js +537 -0
  434. package/hooks/gsd-update-banner.js +134 -0
  435. package/hooks/gsd-validate-commit.sh +57 -0
  436. package/hooks/gsd-workflow-guard.js +94 -0
  437. package/hooks/lib/git-cmd.js +150 -0
  438. package/hooks/lib/gsd-graphify-rebuild.sh +65 -0
  439. package/package.json +98 -0
  440. package/scripts/audit-workflow-script-paths.cjs +73 -0
  441. package/scripts/base64-scan.sh +262 -0
  442. package/scripts/build-hooks.js +227 -0
  443. package/scripts/changeset/cli.cjs +408 -0
  444. package/scripts/changeset/github-release-notes.cjs +198 -0
  445. package/scripts/changeset/lint.cjs +110 -0
  446. package/scripts/changeset/new.cjs +137 -0
  447. package/scripts/changeset/parse.cjs +114 -0
  448. package/scripts/changeset/render.cjs +34 -0
  449. package/scripts/changeset/serialize.cjs +130 -0
  450. package/scripts/command-contract-helpers.cjs +64 -0
  451. package/scripts/diff-touches-shipped-paths.cjs +147 -0
  452. package/scripts/fix-slash-commands.cjs +147 -0
  453. package/scripts/gen-inventory-manifest.cjs +109 -0
  454. package/scripts/lint-command-contract.cjs +108 -0
  455. package/scripts/lint-descriptions.cjs +83 -0
  456. package/scripts/lint-docs-required.cjs +222 -0
  457. package/scripts/lint-no-source-grep-extras.cjs +81 -0
  458. package/scripts/lint-no-source-grep.cjs +174 -0
  459. package/scripts/lint-pr-check-project-dir.cjs +98 -0
  460. package/scripts/lint-shared-module-handsync.cjs +331 -0
  461. package/scripts/lint-shell-command-projection-drift.cjs +57 -0
  462. package/scripts/lint-skill-deps.cjs +180 -0
  463. package/scripts/lint-test-file-count.allowlist.json +35 -0
  464. package/scripts/lint-test-file-count.cjs +190 -0
  465. package/scripts/pr-template-policy.cjs +268 -0
  466. package/scripts/prompt-injection-scan.sh +203 -0
  467. package/scripts/release-tarball-smoke.cjs +677 -0
  468. package/scripts/run-tests.cjs +178 -0
  469. package/scripts/secret-scan.sh +229 -0
  470. package/scripts/shared-module-handsync-allowlist.json +145 -0
  471. package/scripts/strip-prose-atrefs.cjs +106 -0
  472. package/scripts/sync-rulesets.sh +34 -0
  473. package/scripts/verify-tarball-sdk-dist.sh +69 -0
  474. package/sdk/dist/cli-transport.d.ts +19 -0
  475. package/sdk/dist/cli-transport.d.ts.map +1 -0
  476. package/sdk/dist/cli-transport.js +104 -0
  477. package/sdk/dist/cli-transport.js.map +1 -0
  478. package/sdk/dist/cli.d.ts +46 -0
  479. package/sdk/dist/cli.d.ts.map +1 -0
  480. package/sdk/dist/cli.js +511 -0
  481. package/sdk/dist/cli.js.map +1 -0
  482. package/sdk/dist/config.d.ts +108 -0
  483. package/sdk/dist/config.d.ts.map +1 -0
  484. package/sdk/dist/config.js +116 -0
  485. package/sdk/dist/config.js.map +1 -0
  486. package/sdk/dist/configuration/index.d.ts +85 -0
  487. package/sdk/dist/configuration/index.d.ts.map +1 -0
  488. package/sdk/dist/configuration/index.js +257 -0
  489. package/sdk/dist/configuration/index.js.map +1 -0
  490. package/sdk/dist/context-engine.d.ts +49 -0
  491. package/sdk/dist/context-engine.d.ts.map +1 -0
  492. package/sdk/dist/context-engine.js +142 -0
  493. package/sdk/dist/context-engine.js.map +1 -0
  494. package/sdk/dist/context-truncation.d.ts +33 -0
  495. package/sdk/dist/context-truncation.d.ts.map +1 -0
  496. package/sdk/dist/context-truncation.js +197 -0
  497. package/sdk/dist/context-truncation.js.map +1 -0
  498. package/sdk/dist/errors.d.ts +46 -0
  499. package/sdk/dist/errors.d.ts.map +1 -0
  500. package/sdk/dist/errors.js +64 -0
  501. package/sdk/dist/errors.js.map +1 -0
  502. package/sdk/dist/event-stream.d.ts +53 -0
  503. package/sdk/dist/event-stream.d.ts.map +1 -0
  504. package/sdk/dist/event-stream.js +321 -0
  505. package/sdk/dist/event-stream.js.map +1 -0
  506. package/sdk/dist/golden/capture.d.ts +15 -0
  507. package/sdk/dist/golden/capture.d.ts.map +1 -0
  508. package/sdk/dist/golden/capture.js +67 -0
  509. package/sdk/dist/golden/capture.js.map +1 -0
  510. package/sdk/dist/golden/golden-integration-covered.d.ts +6 -0
  511. package/sdk/dist/golden/golden-integration-covered.d.ts.map +1 -0
  512. package/sdk/dist/golden/golden-integration-covered.js +30 -0
  513. package/sdk/dist/golden/golden-integration-covered.js.map +1 -0
  514. package/sdk/dist/golden/golden-mutation-covered.d.ts +7 -0
  515. package/sdk/dist/golden/golden-mutation-covered.d.ts.map +1 -0
  516. package/sdk/dist/golden/golden-mutation-covered.js +17 -0
  517. package/sdk/dist/golden/golden-mutation-covered.js.map +1 -0
  518. package/sdk/dist/golden/golden-policy.d.ts +10 -0
  519. package/sdk/dist/golden/golden-policy.d.ts.map +1 -0
  520. package/sdk/dist/golden/golden-policy.js +98 -0
  521. package/sdk/dist/golden/golden-policy.js.map +1 -0
  522. package/sdk/dist/golden/init-golden-normalize.d.ts +8 -0
  523. package/sdk/dist/golden/init-golden-normalize.d.ts.map +1 -0
  524. package/sdk/dist/golden/init-golden-normalize.js +14 -0
  525. package/sdk/dist/golden/init-golden-normalize.js.map +1 -0
  526. package/sdk/dist/golden/read-only-golden-rows.d.ts +20 -0
  527. package/sdk/dist/golden/read-only-golden-rows.d.ts.map +1 -0
  528. package/sdk/dist/golden/read-only-golden-rows.js +67 -0
  529. package/sdk/dist/golden/read-only-golden-rows.js.map +1 -0
  530. package/sdk/dist/golden/registry-canonical-commands.d.ts +6 -0
  531. package/sdk/dist/golden/registry-canonical-commands.d.ts.map +1 -0
  532. package/sdk/dist/golden/registry-canonical-commands.js +30 -0
  533. package/sdk/dist/golden/registry-canonical-commands.js.map +1 -0
  534. package/sdk/dist/gsd-tools-error.d.ts +23 -0
  535. package/sdk/dist/gsd-tools-error.d.ts.map +1 -0
  536. package/sdk/dist/gsd-tools-error.js +29 -0
  537. package/sdk/dist/gsd-tools-error.js.map +1 -0
  538. package/sdk/dist/gsd-tools.d.ts +97 -0
  539. package/sdk/dist/gsd-tools.d.ts.map +1 -0
  540. package/sdk/dist/gsd-tools.js +168 -0
  541. package/sdk/dist/gsd-tools.js.map +1 -0
  542. package/sdk/dist/gsd-transport-policy.d.ts +10 -0
  543. package/sdk/dist/gsd-transport-policy.d.ts.map +1 -0
  544. package/sdk/dist/gsd-transport-policy.js +32 -0
  545. package/sdk/dist/gsd-transport-policy.js.map +1 -0
  546. package/sdk/dist/gsd-transport.d.ts +39 -0
  547. package/sdk/dist/gsd-transport.d.ts.map +1 -0
  548. package/sdk/dist/gsd-transport.js +78 -0
  549. package/sdk/dist/gsd-transport.js.map +1 -0
  550. package/sdk/dist/index.d.ts +127 -0
  551. package/sdk/dist/index.d.ts.map +1 -0
  552. package/sdk/dist/index.js +300 -0
  553. package/sdk/dist/index.js.map +1 -0
  554. package/sdk/dist/init-runner.d.ts +90 -0
  555. package/sdk/dist/init-runner.d.ts.map +1 -0
  556. package/sdk/dist/init-runner.js +613 -0
  557. package/sdk/dist/init-runner.js.map +1 -0
  558. package/sdk/dist/logger.d.ts +50 -0
  559. package/sdk/dist/logger.d.ts.map +1 -0
  560. package/sdk/dist/logger.js +70 -0
  561. package/sdk/dist/logger.js.map +1 -0
  562. package/sdk/dist/model-catalog.d.ts +31 -0
  563. package/sdk/dist/model-catalog.d.ts.map +1 -0
  564. package/sdk/dist/model-catalog.js +31 -0
  565. package/sdk/dist/model-catalog.js.map +1 -0
  566. package/sdk/dist/phase-prompt.d.ts +72 -0
  567. package/sdk/dist/phase-prompt.d.ts.map +1 -0
  568. package/sdk/dist/phase-prompt.js +213 -0
  569. package/sdk/dist/phase-prompt.js.map +1 -0
  570. package/sdk/dist/phase-runner.d.ts +145 -0
  571. package/sdk/dist/phase-runner.d.ts.map +1 -0
  572. package/sdk/dist/phase-runner.js +1206 -0
  573. package/sdk/dist/phase-runner.js.map +1 -0
  574. package/sdk/dist/plan-parser.d.ts +55 -0
  575. package/sdk/dist/plan-parser.d.ts.map +1 -0
  576. package/sdk/dist/plan-parser.js +389 -0
  577. package/sdk/dist/plan-parser.js.map +1 -0
  578. package/sdk/dist/planning-journal.d.ts +64 -0
  579. package/sdk/dist/planning-journal.d.ts.map +1 -0
  580. package/sdk/dist/planning-journal.js +88 -0
  581. package/sdk/dist/planning-journal.js.map +1 -0
  582. package/sdk/dist/planning-runtime.d.ts +67 -0
  583. package/sdk/dist/planning-runtime.d.ts.map +1 -0
  584. package/sdk/dist/planning-runtime.js +58 -0
  585. package/sdk/dist/planning-runtime.js.map +1 -0
  586. package/sdk/dist/project-root/index.d.ts +46 -0
  587. package/sdk/dist/project-root/index.d.ts.map +1 -0
  588. package/sdk/dist/project-root/index.js +138 -0
  589. package/sdk/dist/project-root/index.js.map +1 -0
  590. package/sdk/dist/prompt-builder.d.ts +44 -0
  591. package/sdk/dist/prompt-builder.d.ts.map +1 -0
  592. package/sdk/dist/prompt-builder.js +180 -0
  593. package/sdk/dist/prompt-builder.js.map +1 -0
  594. package/sdk/dist/prompt-sanitizer.d.ts +35 -0
  595. package/sdk/dist/prompt-sanitizer.d.ts.map +1 -0
  596. package/sdk/dist/prompt-sanitizer.js +101 -0
  597. package/sdk/dist/prompt-sanitizer.js.map +1 -0
  598. package/sdk/dist/query/active-workstream-store.d.ts +7 -0
  599. package/sdk/dist/query/active-workstream-store.d.ts.map +1 -0
  600. package/sdk/dist/query/active-workstream-store.js +56 -0
  601. package/sdk/dist/query/active-workstream-store.js.map +1 -0
  602. package/sdk/dist/query/agent-failure-classifier.d.ts +38 -0
  603. package/sdk/dist/query/agent-failure-classifier.d.ts.map +1 -0
  604. package/sdk/dist/query/agent-failure-classifier.js +83 -0
  605. package/sdk/dist/query/agent-failure-classifier.js.map +1 -0
  606. package/sdk/dist/query/audit-open.d.ts +46 -0
  607. package/sdk/dist/query/audit-open.d.ts.map +1 -0
  608. package/sdk/dist/query/audit-open.js +662 -0
  609. package/sdk/dist/query/audit-open.js.map +1 -0
  610. package/sdk/dist/query/check-auto-mode.d.ts +13 -0
  611. package/sdk/dist/query/check-auto-mode.d.ts.map +1 -0
  612. package/sdk/dist/query/check-auto-mode.js +40 -0
  613. package/sdk/dist/query/check-auto-mode.js.map +1 -0
  614. package/sdk/dist/query/check-completion.d.ts +10 -0
  615. package/sdk/dist/query/check-completion.d.ts.map +1 -0
  616. package/sdk/dist/query/check-completion.js +157 -0
  617. package/sdk/dist/query/check-completion.js.map +1 -0
  618. package/sdk/dist/query/check-decision-coverage.d.ts +33 -0
  619. package/sdk/dist/query/check-decision-coverage.d.ts.map +1 -0
  620. package/sdk/dist/query/check-decision-coverage.js +472 -0
  621. package/sdk/dist/query/check-decision-coverage.js.map +1 -0
  622. package/sdk/dist/query/check-gates.d.ts +10 -0
  623. package/sdk/dist/query/check-gates.d.ts.map +1 -0
  624. package/sdk/dist/query/check-gates.js +89 -0
  625. package/sdk/dist/query/check-gates.js.map +1 -0
  626. package/sdk/dist/query/check-ship-ready.d.ts +17 -0
  627. package/sdk/dist/query/check-ship-ready.d.ts.map +1 -0
  628. package/sdk/dist/query/check-ship-ready.js +121 -0
  629. package/sdk/dist/query/check-ship-ready.js.map +1 -0
  630. package/sdk/dist/query/check-verification-status.d.ts +10 -0
  631. package/sdk/dist/query/check-verification-status.d.ts.map +1 -0
  632. package/sdk/dist/query/check-verification-status.js +142 -0
  633. package/sdk/dist/query/check-verification-status.js.map +1 -0
  634. package/sdk/dist/query/command-aliases.generated.d.ts +31 -0
  635. package/sdk/dist/query/command-aliases.generated.d.ts.map +1 -0
  636. package/sdk/dist/query/command-aliases.generated.js +133 -0
  637. package/sdk/dist/query/command-aliases.generated.js.map +1 -0
  638. package/sdk/dist/query/command-catalog.d.ts +9 -0
  639. package/sdk/dist/query/command-catalog.d.ts.map +1 -0
  640. package/sdk/dist/query/command-catalog.js +17 -0
  641. package/sdk/dist/query/command-catalog.js.map +1 -0
  642. package/sdk/dist/query/command-definition.d.ts +19 -0
  643. package/sdk/dist/query/command-definition.d.ts.map +1 -0
  644. package/sdk/dist/query/command-definition.js +44 -0
  645. package/sdk/dist/query/command-definition.js.map +1 -0
  646. package/sdk/dist/query/command-family-handlers.d.ts +3 -0
  647. package/sdk/dist/query/command-family-handlers.d.ts.map +1 -0
  648. package/sdk/dist/query/command-family-handlers.js +101 -0
  649. package/sdk/dist/query/command-family-handlers.js.map +1 -0
  650. package/sdk/dist/query/command-manifest.d.ts +2 -0
  651. package/sdk/dist/query/command-manifest.d.ts.map +1 -0
  652. package/sdk/dist/query/command-manifest.init.d.ts +6 -0
  653. package/sdk/dist/query/command-manifest.init.d.ts.map +1 -0
  654. package/sdk/dist/query/command-manifest.init.js +23 -0
  655. package/sdk/dist/query/command-manifest.init.js.map +1 -0
  656. package/sdk/dist/query/command-manifest.js +17 -0
  657. package/sdk/dist/query/command-manifest.js.map +1 -0
  658. package/sdk/dist/query/command-manifest.non-family.d.ts +9 -0
  659. package/sdk/dist/query/command-manifest.non-family.d.ts.map +1 -0
  660. package/sdk/dist/query/command-manifest.non-family.js +60 -0
  661. package/sdk/dist/query/command-manifest.non-family.js.map +1 -0
  662. package/sdk/dist/query/command-manifest.phase.d.ts +6 -0
  663. package/sdk/dist/query/command-manifest.phase.d.ts.map +1 -0
  664. package/sdk/dist/query/command-manifest.phase.js +16 -0
  665. package/sdk/dist/query/command-manifest.phase.js.map +1 -0
  666. package/sdk/dist/query/command-manifest.phases.d.ts +7 -0
  667. package/sdk/dist/query/command-manifest.phases.d.ts.map +1 -0
  668. package/sdk/dist/query/command-manifest.phases.js +10 -0
  669. package/sdk/dist/query/command-manifest.phases.js.map +1 -0
  670. package/sdk/dist/query/command-manifest.roadmap.d.ts +6 -0
  671. package/sdk/dist/query/command-manifest.roadmap.d.ts.map +1 -0
  672. package/sdk/dist/query/command-manifest.roadmap.js +10 -0
  673. package/sdk/dist/query/command-manifest.roadmap.js.map +1 -0
  674. package/sdk/dist/query/command-manifest.state.d.ts +9 -0
  675. package/sdk/dist/query/command-manifest.state.d.ts.map +1 -0
  676. package/sdk/dist/query/command-manifest.state.js +30 -0
  677. package/sdk/dist/query/command-manifest.state.js.map +1 -0
  678. package/sdk/dist/query/command-manifest.types.d.ts +12 -0
  679. package/sdk/dist/query/command-manifest.types.d.ts.map +1 -0
  680. package/sdk/dist/query/command-manifest.types.js +2 -0
  681. package/sdk/dist/query/command-manifest.types.js.map +1 -0
  682. package/sdk/dist/query/command-manifest.validate.d.ts +6 -0
  683. package/sdk/dist/query/command-manifest.validate.d.ts.map +1 -0
  684. package/sdk/dist/query/command-manifest.validate.js +10 -0
  685. package/sdk/dist/query/command-manifest.validate.js.map +1 -0
  686. package/sdk/dist/query/command-manifest.verify.d.ts +6 -0
  687. package/sdk/dist/query/command-manifest.verify.d.ts.map +1 -0
  688. package/sdk/dist/query/command-manifest.verify.js +16 -0
  689. package/sdk/dist/query/command-manifest.verify.js.map +1 -0
  690. package/sdk/dist/query/command-static-catalog-domain.d.ts +3 -0
  691. package/sdk/dist/query/command-static-catalog-domain.d.ts.map +1 -0
  692. package/sdk/dist/query/command-static-catalog-domain.js +110 -0
  693. package/sdk/dist/query/command-static-catalog-domain.js.map +1 -0
  694. package/sdk/dist/query/command-static-catalog-foundation.d.ts +7 -0
  695. package/sdk/dist/query/command-static-catalog-foundation.d.ts.map +1 -0
  696. package/sdk/dist/query/command-static-catalog-foundation.js +106 -0
  697. package/sdk/dist/query/command-static-catalog-foundation.js.map +1 -0
  698. package/sdk/dist/query/command-topology.d.ts +32 -0
  699. package/sdk/dist/query/command-topology.d.ts.map +1 -0
  700. package/sdk/dist/query/command-topology.js +66 -0
  701. package/sdk/dist/query/command-topology.js.map +1 -0
  702. package/sdk/dist/query/commands-list.d.ts +14 -0
  703. package/sdk/dist/query/commands-list.d.ts.map +1 -0
  704. package/sdk/dist/query/commands-list.js +18 -0
  705. package/sdk/dist/query/commands-list.js.map +1 -0
  706. package/sdk/dist/query/commit.d.ts +179 -0
  707. package/sdk/dist/query/commit.d.ts.map +1 -0
  708. package/sdk/dist/query/commit.js +632 -0
  709. package/sdk/dist/query/commit.js.map +1 -0
  710. package/sdk/dist/query/config-gates.d.ts +12 -0
  711. package/sdk/dist/query/config-gates.d.ts.map +1 -0
  712. package/sdk/dist/query/config-gates.js +66 -0
  713. package/sdk/dist/query/config-gates.js.map +1 -0
  714. package/sdk/dist/query/config-mutation.d.ts +86 -0
  715. package/sdk/dist/query/config-mutation.d.ts.map +1 -0
  716. package/sdk/dist/query/config-mutation.js +602 -0
  717. package/sdk/dist/query/config-mutation.js.map +1 -0
  718. package/sdk/dist/query/config-query.d.ts +57 -0
  719. package/sdk/dist/query/config-query.d.ts.map +1 -0
  720. package/sdk/dist/query/config-query.js +277 -0
  721. package/sdk/dist/query/config-query.js.map +1 -0
  722. package/sdk/dist/query/config-schema.d.ts +19 -0
  723. package/sdk/dist/query/config-schema.d.ts.map +1 -0
  724. package/sdk/dist/query/config-schema.js +26 -0
  725. package/sdk/dist/query/config-schema.js.map +1 -0
  726. package/sdk/dist/query/decisions.d.ts +58 -0
  727. package/sdk/dist/query/decisions.d.ts.map +1 -0
  728. package/sdk/dist/query/decisions.js +165 -0
  729. package/sdk/dist/query/decisions.js.map +1 -0
  730. package/sdk/dist/query/detect-custom-files.d.ts +11 -0
  731. package/sdk/dist/query/detect-custom-files.d.ts.map +1 -0
  732. package/sdk/dist/query/detect-custom-files.js +89 -0
  733. package/sdk/dist/query/detect-custom-files.js.map +1 -0
  734. package/sdk/dist/query/detect-phase-type.d.ts +9 -0
  735. package/sdk/dist/query/detect-phase-type.d.ts.map +1 -0
  736. package/sdk/dist/query/detect-phase-type.js +124 -0
  737. package/sdk/dist/query/detect-phase-type.js.map +1 -0
  738. package/sdk/dist/query/docs-init.d.ts +26 -0
  739. package/sdk/dist/query/docs-init.d.ts.map +1 -0
  740. package/sdk/dist/query/docs-init.js +231 -0
  741. package/sdk/dist/query/docs-init.js.map +1 -0
  742. package/sdk/dist/query/fallow-audit.d.ts +44 -0
  743. package/sdk/dist/query/fallow-audit.d.ts.map +1 -0
  744. package/sdk/dist/query/fallow-audit.js +44 -0
  745. package/sdk/dist/query/fallow-audit.js.map +1 -0
  746. package/sdk/dist/query/frontmatter-mutation.d.ts +77 -0
  747. package/sdk/dist/query/frontmatter-mutation.d.ts.map +1 -0
  748. package/sdk/dist/query/frontmatter-mutation.js +299 -0
  749. package/sdk/dist/query/frontmatter-mutation.js.map +1 -0
  750. package/sdk/dist/query/frontmatter.d.ts +93 -0
  751. package/sdk/dist/query/frontmatter.d.ts.map +1 -0
  752. package/sdk/dist/query/frontmatter.js +364 -0
  753. package/sdk/dist/query/frontmatter.js.map +1 -0
  754. package/sdk/dist/query/helpers.d.ts +194 -0
  755. package/sdk/dist/query/helpers.d.ts.map +1 -0
  756. package/sdk/dist/query/helpers.js +540 -0
  757. package/sdk/dist/query/helpers.js.map +1 -0
  758. package/sdk/dist/query/index.d.ts +8 -0
  759. package/sdk/dist/query/index.d.ts.map +1 -0
  760. package/sdk/dist/query/index.js +6 -0
  761. package/sdk/dist/query/index.js.map +1 -0
  762. package/sdk/dist/query/init-complex.d.ts +47 -0
  763. package/sdk/dist/query/init-complex.d.ts.map +1 -0
  764. package/sdk/dist/query/init-complex.js +735 -0
  765. package/sdk/dist/query/init-complex.js.map +1 -0
  766. package/sdk/dist/query/init.d.ts +106 -0
  767. package/sdk/dist/query/init.d.ts.map +1 -0
  768. package/sdk/dist/query/init.js +1228 -0
  769. package/sdk/dist/query/init.js.map +1 -0
  770. package/sdk/dist/query/intel.d.ts +43 -0
  771. package/sdk/dist/query/intel.d.ts.map +1 -0
  772. package/sdk/dist/query/intel.js +416 -0
  773. package/sdk/dist/query/intel.js.map +1 -0
  774. package/sdk/dist/query/mutation-event-decorator.d.ts +5 -0
  775. package/sdk/dist/query/mutation-event-decorator.d.ts.map +1 -0
  776. package/sdk/dist/query/mutation-event-decorator.js +28 -0
  777. package/sdk/dist/query/mutation-event-decorator.js.map +1 -0
  778. package/sdk/dist/query/mutation-event-mapper.d.ts +4 -0
  779. package/sdk/dist/query/mutation-event-mapper.d.ts.map +1 -0
  780. package/sdk/dist/query/mutation-event-mapper.js +70 -0
  781. package/sdk/dist/query/mutation-event-mapper.js.map +1 -0
  782. package/sdk/dist/query/mvp.d.ts +113 -0
  783. package/sdk/dist/query/mvp.d.ts.map +1 -0
  784. package/sdk/dist/query/mvp.js +225 -0
  785. package/sdk/dist/query/mvp.js.map +1 -0
  786. package/sdk/dist/query/phase-filesystem-adapter.d.ts +4 -0
  787. package/sdk/dist/query/phase-filesystem-adapter.d.ts.map +1 -0
  788. package/sdk/dist/query/phase-filesystem-adapter.js +33 -0
  789. package/sdk/dist/query/phase-filesystem-adapter.js.map +1 -0
  790. package/sdk/dist/query/phase-lifecycle-policy.d.ts +34 -0
  791. package/sdk/dist/query/phase-lifecycle-policy.d.ts.map +1 -0
  792. package/sdk/dist/query/phase-lifecycle-policy.js +138 -0
  793. package/sdk/dist/query/phase-lifecycle-policy.js.map +1 -0
  794. package/sdk/dist/query/phase-lifecycle.d.ts +116 -0
  795. package/sdk/dist/query/phase-lifecycle.d.ts.map +1 -0
  796. package/sdk/dist/query/phase-lifecycle.js +1823 -0
  797. package/sdk/dist/query/phase-lifecycle.js.map +1 -0
  798. package/sdk/dist/query/phase-list-queries.d.ts +20 -0
  799. package/sdk/dist/query/phase-list-queries.d.ts.map +1 -0
  800. package/sdk/dist/query/phase-list-queries.js +129 -0
  801. package/sdk/dist/query/phase-list-queries.js.map +1 -0
  802. package/sdk/dist/query/phase-ready.d.ts +9 -0
  803. package/sdk/dist/query/phase-ready.d.ts.map +1 -0
  804. package/sdk/dist/query/phase-ready.js +132 -0
  805. package/sdk/dist/query/phase-ready.js.map +1 -0
  806. package/sdk/dist/query/phase-roadmap-mutation.d.ts +25 -0
  807. package/sdk/dist/query/phase-roadmap-mutation.d.ts.map +1 -0
  808. package/sdk/dist/query/phase-roadmap-mutation.js +76 -0
  809. package/sdk/dist/query/phase-roadmap-mutation.js.map +1 -0
  810. package/sdk/dist/query/phase-uat-passed.d.ts +46 -0
  811. package/sdk/dist/query/phase-uat-passed.d.ts.map +1 -0
  812. package/sdk/dist/query/phase-uat-passed.js +238 -0
  813. package/sdk/dist/query/phase-uat-passed.js.map +1 -0
  814. package/sdk/dist/query/phase.d.ts +104 -0
  815. package/sdk/dist/query/phase.d.ts.map +1 -0
  816. package/sdk/dist/query/phase.js +617 -0
  817. package/sdk/dist/query/phase.js.map +1 -0
  818. package/sdk/dist/query/pipeline.d.ts +53 -0
  819. package/sdk/dist/query/pipeline.d.ts.map +1 -0
  820. package/sdk/dist/query/pipeline.js +198 -0
  821. package/sdk/dist/query/pipeline.js.map +1 -0
  822. package/sdk/dist/query/plan-scan.d.ts +14 -0
  823. package/sdk/dist/query/plan-scan.d.ts.map +1 -0
  824. package/sdk/dist/query/plan-scan.js +70 -0
  825. package/sdk/dist/query/plan-scan.js.map +1 -0
  826. package/sdk/dist/query/plan-task-structure.d.ts +9 -0
  827. package/sdk/dist/query/plan-task-structure.d.ts.map +1 -0
  828. package/sdk/dist/query/plan-task-structure.js +59 -0
  829. package/sdk/dist/query/plan-task-structure.js.map +1 -0
  830. package/sdk/dist/query/profile-extract-messages.d.ts +40 -0
  831. package/sdk/dist/query/profile-extract-messages.d.ts.map +1 -0
  832. package/sdk/dist/query/profile-extract-messages.js +195 -0
  833. package/sdk/dist/query/profile-extract-messages.js.map +1 -0
  834. package/sdk/dist/query/profile-output.d.ts +11 -0
  835. package/sdk/dist/query/profile-output.d.ts.map +1 -0
  836. package/sdk/dist/query/profile-output.js +873 -0
  837. package/sdk/dist/query/profile-output.js.map +1 -0
  838. package/sdk/dist/query/profile-questionnaire-data.d.ts +21 -0
  839. package/sdk/dist/query/profile-questionnaire-data.d.ts.map +1 -0
  840. package/sdk/dist/query/profile-questionnaire-data.js +171 -0
  841. package/sdk/dist/query/profile-questionnaire-data.js.map +1 -0
  842. package/sdk/dist/query/profile-sample.d.ts +22 -0
  843. package/sdk/dist/query/profile-sample.d.ts.map +1 -0
  844. package/sdk/dist/query/profile-sample.js +136 -0
  845. package/sdk/dist/query/profile-sample.js.map +1 -0
  846. package/sdk/dist/query/profile-scan-sessions.d.ts +49 -0
  847. package/sdk/dist/query/profile-scan-sessions.d.ts.map +1 -0
  848. package/sdk/dist/query/profile-scan-sessions.js +137 -0
  849. package/sdk/dist/query/profile-scan-sessions.js.map +1 -0
  850. package/sdk/dist/query/profile.d.ts +61 -0
  851. package/sdk/dist/query/profile.d.ts.map +1 -0
  852. package/sdk/dist/query/profile.js +307 -0
  853. package/sdk/dist/query/profile.js.map +1 -0
  854. package/sdk/dist/query/progress.d.ts +77 -0
  855. package/sdk/dist/query/progress.d.ts.map +1 -0
  856. package/sdk/dist/query/progress.js +481 -0
  857. package/sdk/dist/query/progress.js.map +1 -0
  858. package/sdk/dist/query/prompt-budget.d.ts +14 -0
  859. package/sdk/dist/query/prompt-budget.d.ts.map +1 -0
  860. package/sdk/dist/query/prompt-budget.js +417 -0
  861. package/sdk/dist/query/prompt-budget.js.map +1 -0
  862. package/sdk/dist/query/query-cli-adapter.d.ts +8 -0
  863. package/sdk/dist/query/query-cli-adapter.d.ts.map +1 -0
  864. package/sdk/dist/query/query-cli-adapter.js +32 -0
  865. package/sdk/dist/query/query-cli-adapter.js.map +1 -0
  866. package/sdk/dist/query/query-cli-output.d.ts +9 -0
  867. package/sdk/dist/query/query-cli-output.d.ts.map +1 -0
  868. package/sdk/dist/query/query-cli-output.js +28 -0
  869. package/sdk/dist/query/query-cli-output.js.map +1 -0
  870. package/sdk/dist/query/query-command-diagnosis.d.ts +6 -0
  871. package/sdk/dist/query/query-command-diagnosis.d.ts.map +1 -0
  872. package/sdk/dist/query/query-command-diagnosis.js +6 -0
  873. package/sdk/dist/query/query-command-diagnosis.js.map +1 -0
  874. package/sdk/dist/query/query-command-resolution-strategy.d.ts +29 -0
  875. package/sdk/dist/query/query-command-resolution-strategy.d.ts.map +1 -0
  876. package/sdk/dist/query/query-command-resolution-strategy.js +103 -0
  877. package/sdk/dist/query/query-command-resolution-strategy.js.map +1 -0
  878. package/sdk/dist/query/query-command-semantics.d.ts +7 -0
  879. package/sdk/dist/query/query-command-semantics.d.ts.map +1 -0
  880. package/sdk/dist/query/query-command-semantics.js +7 -0
  881. package/sdk/dist/query/query-command-semantics.js.map +1 -0
  882. package/sdk/dist/query/query-dispatch-contract.d.ts +21 -0
  883. package/sdk/dist/query/query-dispatch-contract.d.ts.map +1 -0
  884. package/sdk/dist/query/query-dispatch-contract.js +2 -0
  885. package/sdk/dist/query/query-dispatch-contract.js.map +1 -0
  886. package/sdk/dist/query/query-dispatch-error-mapper.d.ts +6 -0
  887. package/sdk/dist/query/query-dispatch-error-mapper.d.ts.map +1 -0
  888. package/sdk/dist/query/query-dispatch-error-mapper.js +6 -0
  889. package/sdk/dist/query/query-dispatch-error-mapper.js.map +1 -0
  890. package/sdk/dist/query/query-dispatch-formatting.d.ts +6 -0
  891. package/sdk/dist/query/query-dispatch-formatting.d.ts.map +1 -0
  892. package/sdk/dist/query/query-dispatch-formatting.js +6 -0
  893. package/sdk/dist/query/query-dispatch-formatting.js.map +1 -0
  894. package/sdk/dist/query/query-dispatch-observability.d.ts +2 -0
  895. package/sdk/dist/query/query-dispatch-observability.d.ts.map +1 -0
  896. package/sdk/dist/query/query-dispatch-observability.js +7 -0
  897. package/sdk/dist/query/query-dispatch-observability.js.map +1 -0
  898. package/sdk/dist/query/query-dispatch.d.ts +48 -0
  899. package/sdk/dist/query/query-dispatch.d.ts.map +1 -0
  900. package/sdk/dist/query/query-dispatch.js +175 -0
  901. package/sdk/dist/query/query-dispatch.js.map +1 -0
  902. package/sdk/dist/query/query-error-details-schema.d.ts +19 -0
  903. package/sdk/dist/query/query-error-details-schema.d.ts.map +1 -0
  904. package/sdk/dist/query/query-error-details-schema.js +10 -0
  905. package/sdk/dist/query/query-error-details-schema.js.map +1 -0
  906. package/sdk/dist/query/query-error-taxonomy.d.ts +38 -0
  907. package/sdk/dist/query/query-error-taxonomy.d.ts.map +1 -0
  908. package/sdk/dist/query/query-error-taxonomy.js +74 -0
  909. package/sdk/dist/query/query-error-taxonomy.js.map +1 -0
  910. package/sdk/dist/query/query-fallback-bridge-adapter.d.ts +14 -0
  911. package/sdk/dist/query/query-fallback-bridge-adapter.d.ts.map +1 -0
  912. package/sdk/dist/query/query-fallback-bridge-adapter.js +33 -0
  913. package/sdk/dist/query/query-fallback-bridge-adapter.js.map +1 -0
  914. package/sdk/dist/query/query-fallback-executor.d.ts +11 -0
  915. package/sdk/dist/query/query-fallback-executor.d.ts.map +1 -0
  916. package/sdk/dist/query/query-fallback-executor.js +31 -0
  917. package/sdk/dist/query/query-fallback-executor.js.map +1 -0
  918. package/sdk/dist/query/query-fallback-output-classifier.d.ts +6 -0
  919. package/sdk/dist/query/query-fallback-output-classifier.d.ts.map +1 -0
  920. package/sdk/dist/query/query-fallback-output-classifier.js +27 -0
  921. package/sdk/dist/query/query-fallback-output-classifier.js.map +1 -0
  922. package/sdk/dist/query/query-fallback-policy.d.ts +6 -0
  923. package/sdk/dist/query/query-fallback-policy.d.ts.map +1 -0
  924. package/sdk/dist/query/query-fallback-policy.js +7 -0
  925. package/sdk/dist/query/query-fallback-policy.js.map +1 -0
  926. package/sdk/dist/query/query-native-dispatch-adapter.d.ts +7 -0
  927. package/sdk/dist/query/query-native-dispatch-adapter.d.ts.map +1 -0
  928. package/sdk/dist/query/query-native-dispatch-adapter.js +6 -0
  929. package/sdk/dist/query/query-native-dispatch-adapter.js.map +1 -0
  930. package/sdk/dist/query/query-policy-capability.d.ts +10 -0
  931. package/sdk/dist/query/query-policy-capability.d.ts.map +1 -0
  932. package/sdk/dist/query/query-policy-capability.js +17 -0
  933. package/sdk/dist/query/query-policy-capability.js.map +1 -0
  934. package/sdk/dist/query/query-runtime-context.d.ts +19 -0
  935. package/sdk/dist/query/query-runtime-context.d.ts.map +1 -0
  936. package/sdk/dist/query/query-runtime-context.js +31 -0
  937. package/sdk/dist/query/query-runtime-context.js.map +1 -0
  938. package/sdk/dist/query/query-unknown-command-hints.d.ts +2 -0
  939. package/sdk/dist/query/query-unknown-command-hints.d.ts.map +1 -0
  940. package/sdk/dist/query/query-unknown-command-hints.js +6 -0
  941. package/sdk/dist/query/query-unknown-command-hints.js.map +1 -0
  942. package/sdk/dist/query/registry-assembly-descriptor.d.ts +12 -0
  943. package/sdk/dist/query/registry-assembly-descriptor.d.ts.map +1 -0
  944. package/sdk/dist/query/registry-assembly-descriptor.js +61 -0
  945. package/sdk/dist/query/registry-assembly-descriptor.js.map +1 -0
  946. package/sdk/dist/query/registry-assembly-invariants.d.ts +30 -0
  947. package/sdk/dist/query/registry-assembly-invariants.d.ts.map +1 -0
  948. package/sdk/dist/query/registry-assembly-invariants.js +77 -0
  949. package/sdk/dist/query/registry-assembly-invariants.js.map +1 -0
  950. package/sdk/dist/query/registry-assembly.d.ts +10 -0
  951. package/sdk/dist/query/registry-assembly.d.ts.map +1 -0
  952. package/sdk/dist/query/registry-assembly.js +53 -0
  953. package/sdk/dist/query/registry-assembly.js.map +1 -0
  954. package/sdk/dist/query/registry.d.ts +90 -0
  955. package/sdk/dist/query/registry.d.ts.map +1 -0
  956. package/sdk/dist/query/registry.js +129 -0
  957. package/sdk/dist/query/registry.js.map +1 -0
  958. package/sdk/dist/query/requirements-extract-from-plans.d.ts +9 -0
  959. package/sdk/dist/query/requirements-extract-from-plans.d.ts.map +1 -0
  960. package/sdk/dist/query/requirements-extract-from-plans.js +76 -0
  961. package/sdk/dist/query/requirements-extract-from-plans.js.map +1 -0
  962. package/sdk/dist/query/roadmap-update-plan-progress.d.ts +11 -0
  963. package/sdk/dist/query/roadmap-update-plan-progress.d.ts.map +1 -0
  964. package/sdk/dist/query/roadmap-update-plan-progress.js +124 -0
  965. package/sdk/dist/query/roadmap-update-plan-progress.js.map +1 -0
  966. package/sdk/dist/query/roadmap.d.ts +160 -0
  967. package/sdk/dist/query/roadmap.d.ts.map +1 -0
  968. package/sdk/dist/query/roadmap.js +982 -0
  969. package/sdk/dist/query/roadmap.js.map +1 -0
  970. package/sdk/dist/query/route-next-action.d.ts +9 -0
  971. package/sdk/dist/query/route-next-action.d.ts.map +1 -0
  972. package/sdk/dist/query/route-next-action.js +318 -0
  973. package/sdk/dist/query/route-next-action.js.map +1 -0
  974. package/sdk/dist/query/schema-detect.d.ts +21 -0
  975. package/sdk/dist/query/schema-detect.d.ts.map +1 -0
  976. package/sdk/dist/query/schema-detect.js +146 -0
  977. package/sdk/dist/query/schema-detect.js.map +1 -0
  978. package/sdk/dist/query/secrets.d.ts +27 -0
  979. package/sdk/dist/query/secrets.d.ts.map +1 -0
  980. package/sdk/dist/query/secrets.js +42 -0
  981. package/sdk/dist/query/secrets.js.map +1 -0
  982. package/sdk/dist/query/skill-manifest.d.ts +50 -0
  983. package/sdk/dist/query/skill-manifest.d.ts.map +1 -0
  984. package/sdk/dist/query/skill-manifest.js +171 -0
  985. package/sdk/dist/query/skill-manifest.js.map +1 -0
  986. package/sdk/dist/query/skills.d.ts +27 -0
  987. package/sdk/dist/query/skills.d.ts.map +1 -0
  988. package/sdk/dist/query/skills.js +137 -0
  989. package/sdk/dist/query/skills.js.map +1 -0
  990. package/sdk/dist/query/state-document.d.ts +14 -0
  991. package/sdk/dist/query/state-document.d.ts.map +1 -0
  992. package/sdk/dist/query/state-document.js +110 -0
  993. package/sdk/dist/query/state-document.js.map +1 -0
  994. package/sdk/dist/query/state-mutation.d.ts +224 -0
  995. package/sdk/dist/query/state-mutation.d.ts.map +1 -0
  996. package/sdk/dist/query/state-mutation.js +1635 -0
  997. package/sdk/dist/query/state-mutation.js.map +1 -0
  998. package/sdk/dist/query/state-project-load.d.ts +23 -0
  999. package/sdk/dist/query/state-project-load.d.ts.map +1 -0
  1000. package/sdk/dist/query/state-project-load.js +75 -0
  1001. package/sdk/dist/query/state-project-load.js.map +1 -0
  1002. package/sdk/dist/query/state.d.ts +78 -0
  1003. package/sdk/dist/query/state.d.ts.map +1 -0
  1004. package/sdk/dist/query/state.js +443 -0
  1005. package/sdk/dist/query/state.js.map +1 -0
  1006. package/sdk/dist/query/summary.d.ts +18 -0
  1007. package/sdk/dist/query/summary.d.ts.map +1 -0
  1008. package/sdk/dist/query/summary.js +249 -0
  1009. package/sdk/dist/query/summary.js.map +1 -0
  1010. package/sdk/dist/query/template.d.ts +46 -0
  1011. package/sdk/dist/query/template.d.ts.map +1 -0
  1012. package/sdk/dist/query/template.js +210 -0
  1013. package/sdk/dist/query/template.js.map +1 -0
  1014. package/sdk/dist/query/uat.d.ts +42 -0
  1015. package/sdk/dist/query/uat.d.ts.map +1 -0
  1016. package/sdk/dist/query/uat.js +339 -0
  1017. package/sdk/dist/query/uat.js.map +1 -0
  1018. package/sdk/dist/query/utils.d.ts +59 -0
  1019. package/sdk/dist/query/utils.d.ts.map +1 -0
  1020. package/sdk/dist/query/utils.js +74 -0
  1021. package/sdk/dist/query/utils.js.map +1 -0
  1022. package/sdk/dist/query/validate.d.ts +67 -0
  1023. package/sdk/dist/query/validate.d.ts.map +1 -0
  1024. package/sdk/dist/query/validate.js +1001 -0
  1025. package/sdk/dist/query/validate.js.map +1 -0
  1026. package/sdk/dist/query/verify.d.ts +98 -0
  1027. package/sdk/dist/query/verify.d.ts.map +1 -0
  1028. package/sdk/dist/query/verify.js +593 -0
  1029. package/sdk/dist/query/verify.js.map +1 -0
  1030. package/sdk/dist/query/websearch.d.ts +24 -0
  1031. package/sdk/dist/query/websearch.d.ts.map +1 -0
  1032. package/sdk/dist/query/websearch.js +68 -0
  1033. package/sdk/dist/query/websearch.js.map +1 -0
  1034. package/sdk/dist/query/workspace.d.ts +62 -0
  1035. package/sdk/dist/query/workspace.d.ts.map +1 -0
  1036. package/sdk/dist/query/workspace.js +104 -0
  1037. package/sdk/dist/query/workspace.js.map +1 -0
  1038. package/sdk/dist/query/workstream-inventory.d.ts +24 -0
  1039. package/sdk/dist/query/workstream-inventory.d.ts.map +1 -0
  1040. package/sdk/dist/query/workstream-inventory.js +120 -0
  1041. package/sdk/dist/query/workstream-inventory.js.map +1 -0
  1042. package/sdk/dist/query/workstream.d.ts +35 -0
  1043. package/sdk/dist/query/workstream.d.ts.map +1 -0
  1044. package/sdk/dist/query/workstream.js +298 -0
  1045. package/sdk/dist/query/workstream.js.map +1 -0
  1046. package/sdk/dist/query/worktree.d.ts +9 -0
  1047. package/sdk/dist/query/worktree.d.ts.map +1 -0
  1048. package/sdk/dist/query/worktree.js +79 -0
  1049. package/sdk/dist/query/worktree.js.map +1 -0
  1050. package/sdk/dist/query-command-executor.d.ts +22 -0
  1051. package/sdk/dist/query-command-executor.d.ts.map +1 -0
  1052. package/sdk/dist/query-command-executor.js +22 -0
  1053. package/sdk/dist/query-command-executor.js.map +1 -0
  1054. package/sdk/dist/query-execution-policy.d.ts +24 -0
  1055. package/sdk/dist/query-execution-policy.d.ts.map +1 -0
  1056. package/sdk/dist/query-execution-policy.js +27 -0
  1057. package/sdk/dist/query-execution-policy.js.map +1 -0
  1058. package/sdk/dist/query-failure-classification.d.ts +9 -0
  1059. package/sdk/dist/query-failure-classification.d.ts.map +1 -0
  1060. package/sdk/dist/query-failure-classification.js +32 -0
  1061. package/sdk/dist/query-failure-classification.js.map +1 -0
  1062. package/sdk/dist/query-gsd-tools-path.d.ts +2 -0
  1063. package/sdk/dist/query-gsd-tools-path.d.ts.map +1 -0
  1064. package/sdk/dist/query-gsd-tools-path.js +2 -0
  1065. package/sdk/dist/query-gsd-tools-path.js.map +1 -0
  1066. package/sdk/dist/query-gsd-tools-runtime.d.ts +20 -0
  1067. package/sdk/dist/query-gsd-tools-runtime.d.ts.map +1 -0
  1068. package/sdk/dist/query-gsd-tools-runtime.js +47 -0
  1069. package/sdk/dist/query-gsd-tools-runtime.js.map +1 -0
  1070. package/sdk/dist/query-hotpath-methods.d.ts +19 -0
  1071. package/sdk/dist/query-hotpath-methods.d.ts.map +1 -0
  1072. package/sdk/dist/query-hotpath-methods.js +34 -0
  1073. package/sdk/dist/query-hotpath-methods.js.map +1 -0
  1074. package/sdk/dist/query-native-direct-adapter.d.ts +20 -0
  1075. package/sdk/dist/query-native-direct-adapter.d.ts.map +1 -0
  1076. package/sdk/dist/query-native-direct-adapter.js +52 -0
  1077. package/sdk/dist/query-native-direct-adapter.js.map +1 -0
  1078. package/sdk/dist/query-native-hotpath-adapter.d.ts +15 -0
  1079. package/sdk/dist/query-native-hotpath-adapter.d.ts.map +1 -0
  1080. package/sdk/dist/query-native-hotpath-adapter.js +32 -0
  1081. package/sdk/dist/query-native-hotpath-adapter.js.map +1 -0
  1082. package/sdk/dist/query-raw-output-projection.d.ts +6 -0
  1083. package/sdk/dist/query-raw-output-projection.d.ts.map +1 -0
  1084. package/sdk/dist/query-raw-output-projection.js +86 -0
  1085. package/sdk/dist/query-raw-output-projection.js.map +1 -0
  1086. package/sdk/dist/query-runtime-bridge.d.ts +61 -0
  1087. package/sdk/dist/query-runtime-bridge.d.ts.map +1 -0
  1088. package/sdk/dist/query-runtime-bridge.js +144 -0
  1089. package/sdk/dist/query-runtime-bridge.js.map +1 -0
  1090. package/sdk/dist/query-subprocess-adapter.d.ts +18 -0
  1091. package/sdk/dist/query-subprocess-adapter.d.ts.map +1 -0
  1092. package/sdk/dist/query-subprocess-adapter.js +92 -0
  1093. package/sdk/dist/query-subprocess-adapter.js.map +1 -0
  1094. package/sdk/dist/query-tools-error-factory.d.ts +16 -0
  1095. package/sdk/dist/query-tools-error-factory.d.ts.map +1 -0
  1096. package/sdk/dist/query-tools-error-factory.js +33 -0
  1097. package/sdk/dist/query-tools-error-factory.js.map +1 -0
  1098. package/sdk/dist/research-gate.d.ts +24 -0
  1099. package/sdk/dist/research-gate.d.ts.map +1 -0
  1100. package/sdk/dist/research-gate.js +70 -0
  1101. package/sdk/dist/research-gate.js.map +1 -0
  1102. package/sdk/dist/runtime-bridge-sync/index.d.ts +96 -0
  1103. package/sdk/dist/runtime-bridge-sync/index.d.ts.map +1 -0
  1104. package/sdk/dist/runtime-bridge-sync/index.js +109 -0
  1105. package/sdk/dist/runtime-bridge-sync/index.js.map +1 -0
  1106. package/sdk/dist/runtime-bridge-sync/worker.d.ts +2 -0
  1107. package/sdk/dist/runtime-bridge-sync/worker.d.ts.map +1 -0
  1108. package/sdk/dist/runtime-bridge-sync/worker.js +180 -0
  1109. package/sdk/dist/runtime-bridge-sync/worker.js.map +1 -0
  1110. package/sdk/dist/runtime-gate.d.ts +14 -0
  1111. package/sdk/dist/runtime-gate.d.ts.map +1 -0
  1112. package/sdk/dist/runtime-gate.js +48 -0
  1113. package/sdk/dist/runtime-gate.js.map +1 -0
  1114. package/sdk/dist/sdk-package-compatibility.d.ts +38 -0
  1115. package/sdk/dist/sdk-package-compatibility.d.ts.map +1 -0
  1116. package/sdk/dist/sdk-package-compatibility.js +90 -0
  1117. package/sdk/dist/sdk-package-compatibility.js.map +1 -0
  1118. package/sdk/dist/session-runner.d.ts +40 -0
  1119. package/sdk/dist/session-runner.d.ts.map +1 -0
  1120. package/sdk/dist/session-runner.js +274 -0
  1121. package/sdk/dist/session-runner.js.map +1 -0
  1122. package/sdk/dist/tool-scoping.d.ts +31 -0
  1123. package/sdk/dist/tool-scoping.d.ts.map +1 -0
  1124. package/sdk/dist/tool-scoping.js +54 -0
  1125. package/sdk/dist/tool-scoping.js.map +1 -0
  1126. package/sdk/dist/types.d.ts +794 -0
  1127. package/sdk/dist/types.d.ts.map +1 -0
  1128. package/sdk/dist/types.js +77 -0
  1129. package/sdk/dist/types.js.map +1 -0
  1130. package/sdk/dist/workstream-inventory/builder.d.ts +88 -0
  1131. package/sdk/dist/workstream-inventory/builder.d.ts.map +1 -0
  1132. package/sdk/dist/workstream-inventory/builder.js +84 -0
  1133. package/sdk/dist/workstream-inventory/builder.js.map +1 -0
  1134. package/sdk/dist/workstream-name-policy.d.ts +37 -0
  1135. package/sdk/dist/workstream-name-policy.d.ts.map +1 -0
  1136. package/sdk/dist/workstream-name-policy.js +53 -0
  1137. package/sdk/dist/workstream-name-policy.js.map +1 -0
  1138. package/sdk/dist/workstream-utils.d.ts +23 -0
  1139. package/sdk/dist/workstream-utils.d.ts.map +1 -0
  1140. package/sdk/dist/workstream-utils.js +34 -0
  1141. package/sdk/dist/workstream-utils.js.map +1 -0
  1142. package/sdk/dist/ws-transport.d.ts +32 -0
  1143. package/sdk/dist/ws-transport.d.ts.map +1 -0
  1144. package/sdk/dist/ws-transport.js +84 -0
  1145. package/sdk/dist/ws-transport.js.map +1 -0
  1146. package/sdk/package-lock.json +2530 -0
  1147. package/sdk/package.json +77 -0
  1148. package/sdk/prompts/templates/project.md +186 -0
  1149. package/sdk/prompts/templates/requirements.md +231 -0
  1150. package/sdk/prompts/templates/research-project/ARCHITECTURE.md +204 -0
  1151. package/sdk/prompts/templates/research-project/FEATURES.md +147 -0
  1152. package/sdk/prompts/templates/research-project/PITFALLS.md +200 -0
  1153. package/sdk/prompts/templates/research-project/STACK.md +120 -0
  1154. package/sdk/prompts/templates/research-project/SUMMARY.md +170 -0
  1155. package/sdk/prompts/templates/roadmap.md +202 -0
  1156. package/sdk/prompts/templates/state.md +175 -0
  1157. package/sdk/shared/config-defaults.manifest.json +75 -0
  1158. package/sdk/shared/config-schema.manifest.json +151 -0
  1159. package/sdk/shared/model-catalog.json +122 -0
  1160. package/sdk/src/assembled-prompts.test.ts +349 -0
  1161. package/sdk/src/bug-3589-planning-paths-validation.test.ts +89 -0
  1162. package/sdk/src/bug-3591-gsdtools-runtime-workstream.test.ts +179 -0
  1163. package/sdk/src/cli-transport.test.ts +388 -0
  1164. package/sdk/src/cli-transport.ts +130 -0
  1165. package/sdk/src/cli.test.ts +426 -0
  1166. package/sdk/src/cli.ts +589 -0
  1167. package/sdk/src/config.test.ts +277 -0
  1168. package/sdk/src/config.ts +202 -0
  1169. package/sdk/src/configuration/index.test.ts +318 -0
  1170. package/sdk/src/configuration/index.ts +325 -0
  1171. package/sdk/src/context-engine.test.ts +295 -0
  1172. package/sdk/src/context-engine.ts +170 -0
  1173. package/sdk/src/context-truncation.test.ts +163 -0
  1174. package/sdk/src/context-truncation.ts +233 -0
  1175. package/sdk/src/e2e.integration.test.ts +181 -0
  1176. package/sdk/src/errors.ts +72 -0
  1177. package/sdk/src/event-stream.test.ts +661 -0
  1178. package/sdk/src/event-stream.ts +441 -0
  1179. package/sdk/src/golden/capture.ts +95 -0
  1180. package/sdk/src/golden/fixtures/generate-slug.golden.json +1 -0
  1181. package/sdk/src/golden/fixtures/profile-sample-sessions/demo-project/sample.jsonl +3 -0
  1182. package/sdk/src/golden/fixtures/summary-extract-sample.md +26 -0
  1183. package/sdk/src/golden/fixtures/uat-render-checkpoint-sample.md +15 -0
  1184. package/sdk/src/golden/golden-integration-covered.ts +30 -0
  1185. package/sdk/src/golden/golden-mutation-covered.ts +17 -0
  1186. package/sdk/src/golden/golden-policy.test.ts +8 -0
  1187. package/sdk/src/golden/golden-policy.ts +120 -0
  1188. package/sdk/src/golden/golden.integration.test.ts +1031 -0
  1189. package/sdk/src/golden/init-golden-normalize.ts +15 -0
  1190. package/sdk/src/golden/read-only-golden-rows.ts +77 -0
  1191. package/sdk/src/golden/read-only-parity.integration.test.ts +133 -0
  1192. package/sdk/src/golden/registry-canonical-commands.ts +31 -0
  1193. package/sdk/src/gsd-tools-error.test.ts +21 -0
  1194. package/sdk/src/gsd-tools-error.ts +65 -0
  1195. package/sdk/src/gsd-tools.test.ts +472 -0
  1196. package/sdk/src/gsd-tools.ts +237 -0
  1197. package/sdk/src/gsd-transport-policy.test.ts +34 -0
  1198. package/sdk/src/gsd-transport-policy.ts +48 -0
  1199. package/sdk/src/gsd-transport.test.ts +299 -0
  1200. package/sdk/src/gsd-transport.ts +118 -0
  1201. package/sdk/src/index.ts +366 -0
  1202. package/sdk/src/init-e2e.integration.test.ts +138 -0
  1203. package/sdk/src/init-runner.test.ts +740 -0
  1204. package/sdk/src/init-runner.ts +734 -0
  1205. package/sdk/src/lifecycle-e2e.integration.test.ts +258 -0
  1206. package/sdk/src/logger.test.ts +149 -0
  1207. package/sdk/src/logger.ts +113 -0
  1208. package/sdk/src/milestone-runner.test.ts +421 -0
  1209. package/sdk/src/model-catalog.ts +70 -0
  1210. package/sdk/src/phase-prompt.ts +259 -0
  1211. package/sdk/src/phase-runner.integration.test.ts +377 -0
  1212. package/sdk/src/phase-runner.test.ts +3660 -0
  1213. package/sdk/src/phase-runner.ts +1442 -0
  1214. package/sdk/src/plan-parser.test.ts +579 -0
  1215. package/sdk/src/plan-parser.ts +431 -0
  1216. package/sdk/src/planning-journal.test.ts +70 -0
  1217. package/sdk/src/planning-journal.ts +153 -0
  1218. package/sdk/src/planning-runtime.test.ts +29 -0
  1219. package/sdk/src/planning-runtime.ts +100 -0
  1220. package/sdk/src/project-root/index.test.ts +186 -0
  1221. package/sdk/src/project-root/index.ts +144 -0
  1222. package/sdk/src/prompt-builder.test.ts +318 -0
  1223. package/sdk/src/prompt-builder.ts +218 -0
  1224. package/sdk/src/prompt-sanitizer.test.ts +260 -0
  1225. package/sdk/src/prompt-sanitizer.ts +116 -0
  1226. package/sdk/src/query/QUERY-HANDLERS.md +349 -0
  1227. package/sdk/src/query/active-workstream-store.ts +50 -0
  1228. package/sdk/src/query/agent-failure-classifier.test.ts +157 -0
  1229. package/sdk/src/query/agent-failure-classifier.ts +105 -0
  1230. package/sdk/src/query/audit-open.ts +722 -0
  1231. package/sdk/src/query/check-auto-mode.test.ts +77 -0
  1232. package/sdk/src/query/check-auto-mode.ts +49 -0
  1233. package/sdk/src/query/check-completion.test.ts +113 -0
  1234. package/sdk/src/query/check-completion.ts +182 -0
  1235. package/sdk/src/query/check-decision-coverage.test.ts +519 -0
  1236. package/sdk/src/query/check-decision-coverage.ts +554 -0
  1237. package/sdk/src/query/check-gates.test.ts +103 -0
  1238. package/sdk/src/query/check-gates.ts +112 -0
  1239. package/sdk/src/query/check-ship-ready.test.ts +303 -0
  1240. package/sdk/src/query/check-ship-ready.ts +136 -0
  1241. package/sdk/src/query/check-verification-status.test.ts +143 -0
  1242. package/sdk/src/query/check-verification-status.ts +160 -0
  1243. package/sdk/src/query/command-aliases.generated.ts +154 -0
  1244. package/sdk/src/query/command-catalog.ts +31 -0
  1245. package/sdk/src/query/command-definition.test.ts +47 -0
  1246. package/sdk/src/query/command-definition.ts +70 -0
  1247. package/sdk/src/query/command-family-handlers.ts +123 -0
  1248. package/sdk/src/query/command-manifest.init.ts +24 -0
  1249. package/sdk/src/query/command-manifest.non-family.ts +86 -0
  1250. package/sdk/src/query/command-manifest.phase.ts +17 -0
  1251. package/sdk/src/query/command-manifest.phases.ts +11 -0
  1252. package/sdk/src/query/command-manifest.roadmap.ts +11 -0
  1253. package/sdk/src/query/command-manifest.state.ts +31 -0
  1254. package/sdk/src/query/command-manifest.ts +17 -0
  1255. package/sdk/src/query/command-manifest.types.ts +13 -0
  1256. package/sdk/src/query/command-manifest.validate.ts +11 -0
  1257. package/sdk/src/query/command-manifest.verify.ts +17 -0
  1258. package/sdk/src/query/command-resolution.test.ts +70 -0
  1259. package/sdk/src/query/command-seam-coverage.test.ts +118 -0
  1260. package/sdk/src/query/command-static-catalog-domain.ts +111 -0
  1261. package/sdk/src/query/command-static-catalog-foundation.ts +111 -0
  1262. package/sdk/src/query/command-topology.test.ts +28 -0
  1263. package/sdk/src/query/command-topology.ts +114 -0
  1264. package/sdk/src/query/commands-list.test.ts +36 -0
  1265. package/sdk/src/query/commands-list.ts +19 -0
  1266. package/sdk/src/query/commit.test.ts +485 -0
  1267. package/sdk/src/query/commit.ts +717 -0
  1268. package/sdk/src/query/config-gates.test.ts +89 -0
  1269. package/sdk/src/query/config-gates.ts +69 -0
  1270. package/sdk/src/query/config-mutation.test.ts +598 -0
  1271. package/sdk/src/query/config-mutation.ts +705 -0
  1272. package/sdk/src/query/config-query.test.ts +472 -0
  1273. package/sdk/src/query/config-query.ts +314 -0
  1274. package/sdk/src/query/config-schema.ts +35 -0
  1275. package/sdk/src/query/decisions.test.ts +221 -0
  1276. package/sdk/src/query/decisions.ts +196 -0
  1277. package/sdk/src/query/decomposed-handlers.test.ts +431 -0
  1278. package/sdk/src/query/detect-custom-files.test.ts +115 -0
  1279. package/sdk/src/query/detect-custom-files.ts +96 -0
  1280. package/sdk/src/query/detect-phase-type.test.ts +105 -0
  1281. package/sdk/src/query/detect-phase-type.ts +141 -0
  1282. package/sdk/src/query/docs-init.ts +258 -0
  1283. package/sdk/src/query/fallow-audit.ts +88 -0
  1284. package/sdk/src/query/frontmatter-array.test.ts +14 -0
  1285. package/sdk/src/query/frontmatter-mutation.test.ts +259 -0
  1286. package/sdk/src/query/frontmatter-mutation.ts +328 -0
  1287. package/sdk/src/query/frontmatter.test.ts +326 -0
  1288. package/sdk/src/query/frontmatter.ts +395 -0
  1289. package/sdk/src/query/helpers.test.ts +615 -0
  1290. package/sdk/src/query/helpers.ts +566 -0
  1291. package/sdk/src/query/index-thin-seam.test.ts +16 -0
  1292. package/sdk/src/query/index.ts +9 -0
  1293. package/sdk/src/query/init-complex.test.ts +788 -0
  1294. package/sdk/src/query/init-complex.ts +815 -0
  1295. package/sdk/src/query/init-workstream-milestone-op.test.ts +321 -0
  1296. package/sdk/src/query/init.test.ts +791 -0
  1297. package/sdk/src/query/init.ts +1335 -0
  1298. package/sdk/src/query/intel.test.ts +90 -0
  1299. package/sdk/src/query/intel.ts +404 -0
  1300. package/sdk/src/query/mutation-event-decorator.test.ts +45 -0
  1301. package/sdk/src/query/mutation-event-decorator.ts +37 -0
  1302. package/sdk/src/query/mutation-event-mapper.test.ts +33 -0
  1303. package/sdk/src/query/mutation-event-mapper.ts +102 -0
  1304. package/sdk/src/query/mvp.test.ts +335 -0
  1305. package/sdk/src/query/mvp.ts +292 -0
  1306. package/sdk/src/query/normalize-query-command.test.ts +102 -0
  1307. package/sdk/src/query/phase-filesystem-adapter.ts +35 -0
  1308. package/sdk/src/query/phase-lifecycle-policy.ts +171 -0
  1309. package/sdk/src/query/phase-lifecycle.test.ts +1971 -0
  1310. package/sdk/src/query/phase-lifecycle.ts +2210 -0
  1311. package/sdk/src/query/phase-list-queries.test.ts +88 -0
  1312. package/sdk/src/query/phase-list-queries.ts +152 -0
  1313. package/sdk/src/query/phase-ready.test.ts +65 -0
  1314. package/sdk/src/query/phase-ready.ts +159 -0
  1315. package/sdk/src/query/phase-roadmap-mutation.ts +82 -0
  1316. package/sdk/src/query/phase-uat-passed.test.ts +593 -0
  1317. package/sdk/src/query/phase-uat-passed.ts +297 -0
  1318. package/sdk/src/query/phase.test.ts +693 -0
  1319. package/sdk/src/query/phase.ts +741 -0
  1320. package/sdk/src/query/pipeline.test.ts +169 -0
  1321. package/sdk/src/query/pipeline.ts +243 -0
  1322. package/sdk/src/query/plan-scan.test.ts +35 -0
  1323. package/sdk/src/query/plan-scan.ts +82 -0
  1324. package/sdk/src/query/plan-task-structure.test.ts +65 -0
  1325. package/sdk/src/query/plan-task-structure.ts +63 -0
  1326. package/sdk/src/query/policy-convergence.test.ts +28 -0
  1327. package/sdk/src/query/profile-extract-messages.ts +247 -0
  1328. package/sdk/src/query/profile-output.ts +929 -0
  1329. package/sdk/src/query/profile-questionnaire-data.ts +181 -0
  1330. package/sdk/src/query/profile-sample.ts +184 -0
  1331. package/sdk/src/query/profile-scan-sessions.ts +174 -0
  1332. package/sdk/src/query/profile.test.ts +136 -0
  1333. package/sdk/src/query/profile.ts +337 -0
  1334. package/sdk/src/query/progress.test.ts +156 -0
  1335. package/sdk/src/query/progress.ts +566 -0
  1336. package/sdk/src/query/prompt-budget.ts +556 -0
  1337. package/sdk/src/query/query-cli-adapter.test.ts +79 -0
  1338. package/sdk/src/query/query-cli-adapter.ts +39 -0
  1339. package/sdk/src/query/query-cli-output.test.ts +33 -0
  1340. package/sdk/src/query/query-cli-output.ts +35 -0
  1341. package/sdk/src/query/query-command-diagnosis.test.ts +22 -0
  1342. package/sdk/src/query/query-command-diagnosis.ts +5 -0
  1343. package/sdk/src/query/query-command-resolution-strategy.test.ts +34 -0
  1344. package/sdk/src/query/query-command-resolution-strategy.ts +121 -0
  1345. package/sdk/src/query/query-command-semantics.test.ts +22 -0
  1346. package/sdk/src/query/query-command-semantics.ts +22 -0
  1347. package/sdk/src/query/query-dispatch-contract.ts +30 -0
  1348. package/sdk/src/query/query-dispatch-error-mapper.ts +5 -0
  1349. package/sdk/src/query/query-dispatch-formatting.ts +5 -0
  1350. package/sdk/src/query/query-dispatch-observability.ts +6 -0
  1351. package/sdk/src/query/query-dispatch.test.ts +699 -0
  1352. package/sdk/src/query/query-dispatch.ts +243 -0
  1353. package/sdk/src/query/query-error-details-schema.ts +29 -0
  1354. package/sdk/src/query/query-error-taxonomy.test.ts +39 -0
  1355. package/sdk/src/query/query-error-taxonomy.ts +117 -0
  1356. package/sdk/src/query/query-fallback-bridge-adapter.test.ts +32 -0
  1357. package/sdk/src/query/query-fallback-bridge-adapter.ts +54 -0
  1358. package/sdk/src/query/query-fallback-executor.test.ts +82 -0
  1359. package/sdk/src/query/query-fallback-executor.ts +44 -0
  1360. package/sdk/src/query/query-fallback-output-classifier.test.ts +36 -0
  1361. package/sdk/src/query/query-fallback-output-classifier.ts +31 -0
  1362. package/sdk/src/query/query-fallback-policy.test.ts +13 -0
  1363. package/sdk/src/query/query-fallback-policy.ts +11 -0
  1364. package/sdk/src/query/query-native-dispatch-adapter.ts +16 -0
  1365. package/sdk/src/query/query-policy-capability.test.ts +10 -0
  1366. package/sdk/src/query/query-policy-capability.ts +26 -0
  1367. package/sdk/src/query/query-policy-snapshot.test.ts +9 -0
  1368. package/sdk/src/query/query-registry-capability.test.ts +14 -0
  1369. package/sdk/src/query/query-runtime-context.ts +44 -0
  1370. package/sdk/src/query/query-unknown-command-hints.test.ts +9 -0
  1371. package/sdk/src/query/query-unknown-command-hints.ts +5 -0
  1372. package/sdk/src/query/registry-assembly-descriptor.ts +87 -0
  1373. package/sdk/src/query/registry-assembly-invariants.ts +127 -0
  1374. package/sdk/src/query/registry-assembly.test.ts +138 -0
  1375. package/sdk/src/query/registry-assembly.ts +78 -0
  1376. package/sdk/src/query/registry.test.ts +208 -0
  1377. package/sdk/src/query/registry.ts +142 -0
  1378. package/sdk/src/query/requirements-extract-from-plans.test.ts +58 -0
  1379. package/sdk/src/query/requirements-extract-from-plans.ts +86 -0
  1380. package/sdk/src/query/roadmap-update-plan-progress.test.ts +233 -0
  1381. package/sdk/src/query/roadmap-update-plan-progress.ts +159 -0
  1382. package/sdk/src/query/roadmap.test.ts +1250 -0
  1383. package/sdk/src/query/roadmap.ts +1131 -0
  1384. package/sdk/src/query/route-next-action.test.ts +61 -0
  1385. package/sdk/src/query/route-next-action.ts +345 -0
  1386. package/sdk/src/query/schema-detect.ts +189 -0
  1387. package/sdk/src/query/secrets.test.ts +66 -0
  1388. package/sdk/src/query/secrets.ts +43 -0
  1389. package/sdk/src/query/skill-manifest.test.ts +62 -0
  1390. package/sdk/src/query/skill-manifest.ts +216 -0
  1391. package/sdk/src/query/skills.test.ts +234 -0
  1392. package/sdk/src/query/skills.ts +143 -0
  1393. package/sdk/src/query/state-document.test.ts +197 -0
  1394. package/sdk/src/query/state-document.ts +129 -0
  1395. package/sdk/src/query/state-mutation.test.ts +1210 -0
  1396. package/sdk/src/query/state-mutation.ts +1814 -0
  1397. package/sdk/src/query/state-project-load.ts +80 -0
  1398. package/sdk/src/query/state.test.ts +616 -0
  1399. package/sdk/src/query/state.ts +476 -0
  1400. package/sdk/src/query/sub-repos-root.integration.test.ts +79 -0
  1401. package/sdk/src/query/summary.test.ts +95 -0
  1402. package/sdk/src/query/summary.ts +296 -0
  1403. package/sdk/src/query/template.test.ts +180 -0
  1404. package/sdk/src/query/template.ts +242 -0
  1405. package/sdk/src/query/uat.test.ts +77 -0
  1406. package/sdk/src/query/uat.ts +365 -0
  1407. package/sdk/src/query/utils.test.ts +82 -0
  1408. package/sdk/src/query/utils.ts +106 -0
  1409. package/sdk/src/query/validate.test.ts +924 -0
  1410. package/sdk/src/query/validate.ts +1054 -0
  1411. package/sdk/src/query/verify.test.ts +414 -0
  1412. package/sdk/src/query/verify.ts +656 -0
  1413. package/sdk/src/query/websearch.test.ts +31 -0
  1414. package/sdk/src/query/websearch.ts +82 -0
  1415. package/sdk/src/query/workspace.test.ts +120 -0
  1416. package/sdk/src/query/workspace.ts +145 -0
  1417. package/sdk/src/query/workstream-inventory.ts +143 -0
  1418. package/sdk/src/query/workstream.test.ts +153 -0
  1419. package/sdk/src/query/workstream.ts +324 -0
  1420. package/sdk/src/query/worktree.ts +84 -0
  1421. package/sdk/src/query-command-executor.ts +31 -0
  1422. package/sdk/src/query-execution-policy.test.ts +52 -0
  1423. package/sdk/src/query-execution-policy.ts +46 -0
  1424. package/sdk/src/query-failure-classification.test.ts +23 -0
  1425. package/sdk/src/query-failure-classification.ts +42 -0
  1426. package/sdk/src/query-gsd-tools-path.ts +1 -0
  1427. package/sdk/src/query-gsd-tools-runtime.ts +89 -0
  1428. package/sdk/src/query-hotpath-methods.ts +48 -0
  1429. package/sdk/src/query-native-direct-adapter.test.ts +35 -0
  1430. package/sdk/src/query-native-direct-adapter.ts +70 -0
  1431. package/sdk/src/query-native-hotpath-adapter.test.ts +43 -0
  1432. package/sdk/src/query-native-hotpath-adapter.ts +45 -0
  1433. package/sdk/src/query-raw-output-projection.test.ts +39 -0
  1434. package/sdk/src/query-raw-output-projection.ts +93 -0
  1435. package/sdk/src/query-runtime-bridge.test.ts +150 -0
  1436. package/sdk/src/query-runtime-bridge.ts +215 -0
  1437. package/sdk/src/query-runtime-seam-coverage.test.ts +20 -0
  1438. package/sdk/src/query-subprocess-adapter.test.ts +84 -0
  1439. package/sdk/src/query-subprocess-adapter.ts +146 -0
  1440. package/sdk/src/query-tools-error-factory.test.ts +35 -0
  1441. package/sdk/src/query-tools-error-factory.ts +76 -0
  1442. package/sdk/src/research-gate.test.ts +190 -0
  1443. package/sdk/src/research-gate.ts +94 -0
  1444. package/sdk/src/runtime-bridge-options.test.ts +33 -0
  1445. package/sdk/src/runtime-bridge-sync/index.test.ts +164 -0
  1446. package/sdk/src/runtime-bridge-sync/index.ts +154 -0
  1447. package/sdk/src/runtime-bridge-sync/projectdir-regression.test.ts +150 -0
  1448. package/sdk/src/runtime-bridge-sync/worker.ts +224 -0
  1449. package/sdk/src/runtime-gate.test.ts +84 -0
  1450. package/sdk/src/runtime-gate.ts +52 -0
  1451. package/sdk/src/sdk-package-compatibility.test.ts +97 -0
  1452. package/sdk/src/sdk-package-compatibility.ts +141 -0
  1453. package/sdk/src/session-runner.test.ts +164 -0
  1454. package/sdk/src/session-runner.ts +327 -0
  1455. package/sdk/src/tool-scoping.test.ts +160 -0
  1456. package/sdk/src/tool-scoping.ts +61 -0
  1457. package/sdk/src/types.ts +927 -0
  1458. package/sdk/src/workflow-agent-skills-consistency.test.ts +98 -0
  1459. package/sdk/src/workstream-inventory/builder.test.ts +241 -0
  1460. package/sdk/src/workstream-inventory/builder.ts +170 -0
  1461. package/sdk/src/workstream-name-policy.ts +57 -0
  1462. package/sdk/src/workstream-utils.ts +36 -0
  1463. package/sdk/src/ws-flag.test.ts +285 -0
  1464. package/sdk/src/ws-transport.test.ts +161 -0
  1465. package/sdk/src/ws-transport.ts +93 -0
  1466. package/sdk/tsconfig.json +20 -0
@@ -0,0 +1,1210 @@
1
+ /**
2
+ * Unit tests for STATE.md mutation handlers.
3
+ */
4
+
5
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
+ import { mkdtemp, writeFile, readFile, rm, mkdir } from 'node:fs/promises';
7
+ import { join } from 'node:path';
8
+ import { tmpdir } from 'node:os';
9
+ import { existsSync } from 'node:fs';
10
+
11
+ // ─── Helpers (internal) ─────────────────────────────────────────────────────
12
+
13
+ /** Minimal STATE.md for testing. */
14
+ const MINIMAL_STATE = `---
15
+ gsd_state_version: 1.0
16
+ milestone: v3.0
17
+ milestone_name: SDK-First Migration
18
+ status: executing
19
+ ---
20
+
21
+ # Project State
22
+
23
+ ## Project Reference
24
+
25
+ **Core value:** Test project
26
+
27
+ ## Current Position
28
+
29
+ Phase: 10 (Read-Only Queries) — EXECUTING
30
+ Plan: 2 of 3
31
+ Status: Executing Phase 10
32
+ Last activity: 2026-04-08 -- Phase 10 execution started
33
+
34
+ Progress: [░░░░░░░░░░] 50%
35
+
36
+ ## Performance Metrics
37
+
38
+ **Velocity:**
39
+
40
+ | Phase | Duration | Tasks | Files |
41
+ |-------|----------|-------|-------|
42
+
43
+ ## Accumulated Context
44
+
45
+ ### Decisions
46
+
47
+ None yet.
48
+
49
+ ### Pending Todos
50
+
51
+ None yet.
52
+
53
+ ### Blockers/Concerns
54
+
55
+ None yet.
56
+
57
+ ## Session Continuity
58
+
59
+ Last session: 2026-04-07T10:00:00.000Z
60
+ Stopped at: Completed 10-02-PLAN.md
61
+ Resume file: None
62
+ `;
63
+
64
+ /** Create a minimal .planning directory for testing. */
65
+ async function setupTestProject(tmpDir: string, stateContent?: string): Promise<string> {
66
+ const planningDir = join(tmpDir, '.planning');
67
+ await mkdir(planningDir, { recursive: true });
68
+ await mkdir(join(planningDir, 'phases'), { recursive: true });
69
+ await writeFile(join(planningDir, 'STATE.md'), stateContent || MINIMAL_STATE, 'utf-8');
70
+ // Minimal ROADMAP.md for buildStateFrontmatter
71
+ await writeFile(join(planningDir, 'ROADMAP.md'), '# Roadmap\n\n## Current Milestone: v3.0 SDK-First Migration\n\n### Phase 10: Read-Only Queries\n\nGoal: Port queries.\n', 'utf-8');
72
+ await writeFile(join(planningDir, 'config.json'), '{"model_profile":"balanced"}', 'utf-8');
73
+ return tmpDir;
74
+ }
75
+
76
+ // ─── Import tests ───────────────────────────────────────────────────────────
77
+
78
+ describe('state-mutation imports', () => {
79
+ it('exports stateUpdate handler', async () => {
80
+ const mod = await import('./state-mutation.js');
81
+ expect(typeof mod.stateUpdate).toBe('function');
82
+ });
83
+
84
+ it('exports statePatch handler', async () => {
85
+ const mod = await import('./state-mutation.js');
86
+ expect(typeof mod.statePatch).toBe('function');
87
+ });
88
+
89
+ it('exports stateBeginPhase handler', async () => {
90
+ const mod = await import('./state-mutation.js');
91
+ expect(typeof mod.stateBeginPhase).toBe('function');
92
+ });
93
+
94
+ it('exports stateAdvancePlan handler', async () => {
95
+ const mod = await import('./state-mutation.js');
96
+ expect(typeof mod.stateAdvancePlan).toBe('function');
97
+ });
98
+
99
+ it('exports stateRecordMetric handler', async () => {
100
+ const mod = await import('./state-mutation.js');
101
+ expect(typeof mod.stateRecordMetric).toBe('function');
102
+ });
103
+
104
+ it('exports stateUpdateProgress handler', async () => {
105
+ const mod = await import('./state-mutation.js');
106
+ expect(typeof mod.stateUpdateProgress).toBe('function');
107
+ });
108
+
109
+ it('exports stateAddDecision handler', async () => {
110
+ const mod = await import('./state-mutation.js');
111
+ expect(typeof mod.stateAddDecision).toBe('function');
112
+ });
113
+
114
+ it('exports stateAddBlocker handler', async () => {
115
+ const mod = await import('./state-mutation.js');
116
+ expect(typeof mod.stateAddBlocker).toBe('function');
117
+ });
118
+
119
+ it('exports stateResolveBlocker handler', async () => {
120
+ const mod = await import('./state-mutation.js');
121
+ expect(typeof mod.stateResolveBlocker).toBe('function');
122
+ });
123
+
124
+ it('exports stateRecordSession handler', async () => {
125
+ const mod = await import('./state-mutation.js');
126
+ expect(typeof mod.stateRecordSession).toBe('function');
127
+ });
128
+ });
129
+
130
+ // ─── stateReplaceField ──────────────────────────────────────────────────────
131
+
132
+ describe('stateReplaceField', () => {
133
+ it('replaces bold format field', async () => {
134
+ const { stateReplaceField } = await import('./state-mutation.js');
135
+ const content = '**Status:** executing\n**Plan:** 1';
136
+ const result = stateReplaceField(content, 'Status', 'done');
137
+ expect(result).toContain('**Status:** done');
138
+ });
139
+
140
+ it('replaces plain format field', async () => {
141
+ const { stateReplaceField } = await import('./state-mutation.js');
142
+ const content = 'Status: executing\nPlan: 1';
143
+ const result = stateReplaceField(content, 'Status', 'done');
144
+ expect(result).toContain('Status: done');
145
+ });
146
+
147
+ it('returns null when field not found', async () => {
148
+ const { stateReplaceField } = await import('./state-mutation.js');
149
+ const result = stateReplaceField('no fields here', 'Missing', 'value');
150
+ expect(result).toBeNull();
151
+ });
152
+
153
+ it('is case-insensitive', async () => {
154
+ const { stateReplaceField } = await import('./state-mutation.js');
155
+ const content = '**status:** executing';
156
+ const result = stateReplaceField(content, 'Status', 'done');
157
+ expect(result).toContain('done');
158
+ });
159
+ });
160
+
161
+ // ─── acquireStateLock / releaseStateLock ─────────────────────────────────────
162
+
163
+ describe('acquireStateLock / releaseStateLock', () => {
164
+ let tmpDir: string;
165
+
166
+ beforeEach(async () => {
167
+ tmpDir = await mkdtemp(join(tmpdir(), 'gsd-lock-'));
168
+ });
169
+
170
+ afterEach(async () => {
171
+ await rm(tmpDir, { recursive: true, force: true });
172
+ });
173
+
174
+ it('creates and removes lockfile', async () => {
175
+ const { acquireStateLock, releaseStateLock } = await import('./state-mutation.js');
176
+ const statePath = join(tmpDir, 'STATE.md');
177
+ await writeFile(statePath, 'test', 'utf-8');
178
+
179
+ const lockPath = await acquireStateLock(statePath);
180
+ expect(existsSync(lockPath)).toBe(true);
181
+
182
+ await releaseStateLock(lockPath);
183
+ expect(existsSync(lockPath)).toBe(false);
184
+ });
185
+
186
+ it('tracks lockPath in _heldStateLocks on acquire and removes on release', async () => {
187
+ const { acquireStateLock, releaseStateLock, _heldStateLocks } = await import('./state-mutation.js');
188
+ const statePath = join(tmpDir, 'STATE.md');
189
+ await writeFile(statePath, 'test', 'utf-8');
190
+
191
+ const lockPath = await acquireStateLock(statePath);
192
+ expect(_heldStateLocks.has(lockPath)).toBe(true);
193
+
194
+ await releaseStateLock(lockPath);
195
+ expect(_heldStateLocks.has(lockPath)).toBe(false);
196
+ });
197
+
198
+ it('returns lockPath on non-EEXIST errors instead of throwing', async () => {
199
+ // Simulate a non-EEXIST error by using a path in a non-existent directory
200
+ // This triggers ENOENT (not EEXIST), which should return lockPath gracefully
201
+ const { acquireStateLock } = await import('./state-mutation.js');
202
+ const badPath = join(tmpDir, 'nonexistent-dir', 'subdir', 'STATE.md');
203
+
204
+ // Should NOT throw — should return lockPath gracefully
205
+ const lockPath = await acquireStateLock(badPath);
206
+ expect(lockPath).toBe(badPath + '.lock');
207
+ });
208
+ });
209
+
210
+ // ─── stateUpdate ────────────────────────────────────────────────────────────
211
+
212
+ describe('stateUpdate', () => {
213
+ let tmpDir: string;
214
+
215
+ beforeEach(async () => {
216
+ tmpDir = await mkdtemp(join(tmpdir(), 'gsd-state-update-'));
217
+ await setupTestProject(tmpDir);
218
+ });
219
+
220
+ afterEach(async () => {
221
+ await rm(tmpDir, { recursive: true, force: true });
222
+ });
223
+
224
+ it('updates a single field and round-trips through stateLoad', async () => {
225
+ const { stateUpdate } = await import('./state-mutation.js');
226
+ const { stateJson } = await import('./state.js');
227
+
228
+ const result = await stateUpdate(['Status', 'Phase complete'], tmpDir);
229
+ const data = result.data as Record<string, unknown>;
230
+ expect(data.updated).toBe(true);
231
+
232
+ // Verify round-trip
233
+ const loaded = await stateJson([], tmpDir);
234
+ const loadedData = loaded.data as Record<string, unknown>;
235
+ // Status gets normalized by buildStateFrontmatter
236
+ expect(loadedData.status).toBeTruthy();
237
+ });
238
+
239
+ it('returns updated false when field not found', async () => {
240
+ const { stateUpdate } = await import('./state-mutation.js');
241
+
242
+ const result = await stateUpdate(['NonExistentField', 'value'], tmpDir);
243
+ const data = result.data as Record<string, unknown>;
244
+ expect(data.updated).toBe(false);
245
+ });
246
+
247
+ it('preserves curated progress frontmatter during body-only updates', async () => {
248
+ const stateContent = `---
249
+ gsd_state_version: 1.0
250
+ milestone: v3.0
251
+ milestone_name: SDK-First Migration
252
+ status: executing
253
+ progress:
254
+ total_phases: 12
255
+ completed_phases: 6
256
+ total_plans: 22
257
+ completed_plans: 22
258
+ percent: 50
259
+ ---
260
+
261
+ # Project State
262
+
263
+ ## Current Position
264
+
265
+ Status: Executing
266
+ Last Activity: 2026-01-01
267
+ Progress: [█████░░░░░] 50%
268
+ `;
269
+ await setupTestProject(tmpDir, stateContent);
270
+
271
+ const { stateUpdate } = await import('./state-mutation.js');
272
+ const { stateJson } = await import('./state.js');
273
+
274
+ const result = await stateUpdate(['Last Activity', '2026-05-07'], tmpDir);
275
+ expect((result.data as Record<string, unknown>).updated).toBe(true);
276
+
277
+ const loaded = await stateJson([], tmpDir);
278
+ const progress = (loaded.data as Record<string, unknown>).progress as Record<string, unknown>;
279
+ expect(Number(progress.total_phases)).toBe(12);
280
+ expect(Number(progress.completed_phases)).toBe(6);
281
+ expect(Number(progress.total_plans)).toBe(22);
282
+ expect(Number(progress.completed_plans)).toBe(22);
283
+ expect(Number(progress.percent)).toBe(50);
284
+
285
+ const after = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
286
+ expect(after).toContain('Last Activity: 2026-05-07');
287
+ });
288
+
289
+ it('resyncs progress frontmatter when updating the Progress body field', async () => {
290
+ const stateContent = `---
291
+ gsd_state_version: 1.0
292
+ milestone: v3.0
293
+ milestone_name: SDK-First Migration
294
+ status: executing
295
+ progress:
296
+ total_phases: 12
297
+ completed_phases: 6
298
+ total_plans: 22
299
+ completed_plans: 22
300
+ percent: 50
301
+ ---
302
+
303
+ # Project State
304
+
305
+ ## Current Position
306
+
307
+ Status: Executing
308
+ Progress: [█████░░░░░] 50%
309
+ `;
310
+ await setupTestProject(tmpDir, stateContent);
311
+ await rm(join(tmpDir, '.planning', 'ROADMAP.md'), { force: true });
312
+
313
+ const { stateUpdate } = await import('./state-mutation.js');
314
+ await stateUpdate(['Progress', '[████████░░] 80%'], tmpDir);
315
+
316
+ const after = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
317
+ const { extractFrontmatter } = await import('./frontmatter.js');
318
+ const fm = extractFrontmatter(after);
319
+ const progress = fm.progress as Record<string, unknown>;
320
+ expect(Number(progress.percent)).toBe(80);
321
+ });
322
+
323
+ it('syncs full-file workstream STATE.md frontmatter from the selected workstream', async () => {
324
+ const planningDir = join(tmpDir, '.planning');
325
+ const wsDir = join(planningDir, 'workstreams', 'feature');
326
+ await mkdir(join(wsDir, 'phases'), { recursive: true });
327
+
328
+ await writeFile(
329
+ join(planningDir, 'STATE.md'),
330
+ [
331
+ '---',
332
+ 'milestone: v0.1',
333
+ 'milestone_name: Root Milestone',
334
+ '---',
335
+ '',
336
+ '# Root State',
337
+ '',
338
+ 'Status: Root',
339
+ '',
340
+ ].join('\n'),
341
+ 'utf-8',
342
+ );
343
+ await writeFile(join(planningDir, 'ROADMAP.md'), '# Roadmap\n\n## v0.1 Root Milestone\n', 'utf-8');
344
+ await writeFile(
345
+ join(wsDir, 'STATE.md'),
346
+ [
347
+ '---',
348
+ 'milestone: v2.0',
349
+ 'milestone_name: Feature Milestone',
350
+ '---',
351
+ '',
352
+ '# Workstream State',
353
+ '',
354
+ 'Status: Executing',
355
+ '',
356
+ ].join('\n'),
357
+ 'utf-8',
358
+ );
359
+ await writeFile(join(wsDir, 'ROADMAP.md'), '# Roadmap\n\n## v2.0 Feature Milestone\n', 'utf-8');
360
+
361
+ const { readModifyWriteStateMdFull } = await import('./state-mutation.js');
362
+ await readModifyWriteStateMdFull(tmpDir, content => content.replace('Status: Executing', 'Status: Complete'), 'feature');
363
+
364
+ const after = await readFile(join(wsDir, 'STATE.md'), 'utf-8');
365
+ const { extractFrontmatter } = await import('./frontmatter.js');
366
+ const fm = extractFrontmatter(after);
367
+ expect(fm.milestone).toBe('v2.0');
368
+ expect(fm.milestone_name).toBe('Feature Milestone');
369
+ expect(fm.status).toBe('completed');
370
+ });
371
+
372
+ it('throws on missing args', async () => {
373
+ const { stateUpdate } = await import('./state-mutation.js');
374
+
375
+ await expect(stateUpdate([], tmpDir)).rejects.toThrow(/field and value required/);
376
+ });
377
+ });
378
+
379
+ // ─── statePatch ─────────────────────────────────────────────────────────────
380
+
381
+ describe('statePatch', () => {
382
+ let tmpDir: string;
383
+
384
+ beforeEach(async () => {
385
+ tmpDir = await mkdtemp(join(tmpdir(), 'gsd-state-patch-'));
386
+ await setupTestProject(tmpDir);
387
+ });
388
+
389
+ afterEach(async () => {
390
+ await rm(tmpDir, { recursive: true, force: true });
391
+ });
392
+
393
+ it('updates multiple fields in one lock cycle', async () => {
394
+ const { statePatch } = await import('./state-mutation.js');
395
+
396
+ const patches = JSON.stringify({ Status: 'done', Progress: '100%' });
397
+ const result = await statePatch([patches], tmpDir);
398
+ const data = result.data as Record<string, unknown>;
399
+ expect((data.updated as string[]).length).toBeGreaterThan(0);
400
+
401
+ // Verify file was updated
402
+ const content = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
403
+ expect(content).toContain('done');
404
+ });
405
+
406
+ it('preserves curated progress frontmatter when patching body-only fields', async () => {
407
+ const stateContent = `---
408
+ gsd_state_version: 1.0
409
+ milestone: v3.0
410
+ milestone_name: SDK-First Migration
411
+ status: executing
412
+ progress:
413
+ total_phases: 12
414
+ completed_phases: 6
415
+ total_plans: 22
416
+ completed_plans: 22
417
+ percent: 50
418
+ ---
419
+
420
+ # Project State
421
+
422
+ ## Current Position
423
+
424
+ Status: Executing
425
+ Last Activity: 2026-01-01
426
+ Progress: [█████░░░░░] 50%
427
+ `;
428
+ await setupTestProject(tmpDir, stateContent);
429
+
430
+ const { statePatch } = await import('./state-mutation.js');
431
+ await statePatch([JSON.stringify({ 'Last Activity': '2026-05-07' })], tmpDir);
432
+
433
+ const after = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
434
+ const { extractFrontmatter } = await import('./frontmatter.js');
435
+ const fm = extractFrontmatter(after);
436
+ const progress = fm.progress as Record<string, unknown>;
437
+ expect(Number(progress.total_phases)).toBe(12);
438
+ expect(Number(progress.completed_phases)).toBe(6);
439
+ expect(Number(progress.total_plans)).toBe(22);
440
+ expect(Number(progress.completed_plans)).toBe(22);
441
+ expect(Number(progress.percent)).toBe(50);
442
+ expect(after).toContain('Last Activity: 2026-05-07');
443
+ });
444
+ });
445
+
446
+ // ─── stateBeginPhase ────────────────────────────────────────────────────────
447
+
448
+ describe('stateBeginPhase', () => {
449
+ let tmpDir: string;
450
+
451
+ beforeEach(async () => {
452
+ tmpDir = await mkdtemp(join(tmpdir(), 'gsd-state-begin-'));
453
+ await setupTestProject(tmpDir);
454
+ });
455
+
456
+ afterEach(async () => {
457
+ await rm(tmpDir, { recursive: true, force: true });
458
+ });
459
+
460
+ it('sets all expected fields', async () => {
461
+ const { stateBeginPhase } = await import('./state-mutation.js');
462
+
463
+ const result = await stateBeginPhase(['11', 'State Mutations', '3'], tmpDir);
464
+ const data = result.data as Record<string, unknown>;
465
+ expect(data.phase).toBe('11');
466
+
467
+ const content = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
468
+ expect(content).toContain('Executing Phase 11');
469
+ expect(content).toContain('State Mutations');
470
+ });
471
+
472
+ // ─── Bug #2420: flag-form args not parsed ────────────────────────────
473
+ it('bug-2420: parses --phase/--name/--plans flag-form args correctly', async () => {
474
+ const { stateBeginPhase } = await import('./state-mutation.js');
475
+
476
+ // This is how execute-phase.md calls it: flag form
477
+ const result = await stateBeginPhase(
478
+ ['--phase', '99', '--name', 'probe-test', '--plans', '1'],
479
+ tmpDir
480
+ );
481
+ const data = result.data as Record<string, unknown>;
482
+
483
+ // Must return the actual values, not the flag names
484
+ expect(data.phase).toBe('99');
485
+ expect(data.phase_name).toBe('probe-test');
486
+ expect(data.plan_count).toBe(1);
487
+
488
+ // STATE.md must contain clean output, not literal "--phase"
489
+ const content = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
490
+ expect(content).not.toContain('--phase');
491
+ expect(content).not.toContain('--name');
492
+ expect(content).not.toContain('--plans');
493
+ expect(content).toContain('Executing Phase 99');
494
+ expect(content).toContain('probe-test');
495
+ });
496
+
497
+ it('bug-2420: positional args still work after flag-parsing fix', async () => {
498
+ const { stateBeginPhase } = await import('./state-mutation.js');
499
+
500
+ const result = await stateBeginPhase(['42', 'Positional Test', '5'], tmpDir);
501
+ const data = result.data as Record<string, unknown>;
502
+ expect(data.phase).toBe('42');
503
+ expect(data.phase_name).toBe('Positional Test');
504
+ expect(data.plan_count).toBe(5);
505
+ });
506
+
507
+ it('bug-2420: flag parser throws when a flag value is missing (next token is a flag)', async () => {
508
+ const { stateBeginPhase } = await import('./state-mutation.js');
509
+
510
+ // --phase has no value — next token is --name, which is itself a flag.
511
+ await expect(
512
+ stateBeginPhase(['--phase', '--name', 'Title', '--plans', '1'], tmpDir)
513
+ ).rejects.toThrow('missing value for --phase');
514
+ });
515
+
516
+ it('bug-2420: flag parser throws when a flag is last token with no value', async () => {
517
+ const { stateBeginPhase } = await import('./state-mutation.js');
518
+
519
+ await expect(
520
+ stateBeginPhase(['--name', 'Title', '--plans', '1', '--phase'], tmpDir)
521
+ ).rejects.toThrow('missing value for --phase');
522
+ });
523
+
524
+ it('does not treat argv after named flags as positional name/plans', async () => {
525
+ const { stateBeginPhase } = await import('./state-mutation.js');
526
+
527
+ const result = await stateBeginPhase(['--phase', '2', '--plans', '3'], tmpDir);
528
+ const data = result.data as Record<string, unknown>;
529
+ expect(data.phase).toBe('2');
530
+ expect(data.phase_name).toBeFalsy();
531
+ expect(data.plan_count).toBe(3);
532
+
533
+ const content = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
534
+ expect(content).toContain('Plan: 1 of 3');
535
+ });
536
+
537
+ it('preserves literal dollar amounts in Current Position body', async () => {
538
+ const { stateBeginPhase } = await import('./state-mutation.js');
539
+ const withBudget = MINIMAL_STATE.replace(
540
+ 'Last activity: 2026-04-08 -- Phase 10 execution started',
541
+ 'Last activity: 2026-04-08 -- Phase 10 execution started\nBudget: $2,500 max test',
542
+ );
543
+ await setupTestProject(tmpDir, withBudget);
544
+
545
+ await stateBeginPhase(['11', 'State Mutations', '3'], tmpDir);
546
+
547
+ const content = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
548
+ expect(content).toContain('Budget: $2,500 max test');
549
+ expect((content.match(/^Budget:/gm) || []).length).toBe(1);
550
+ });
551
+ });
552
+
553
+ // ─── stateAdvancePlan ───────────────────────────────────────────────────────
554
+
555
+ describe('stateAdvancePlan', () => {
556
+ let tmpDir: string;
557
+
558
+ beforeEach(async () => {
559
+ tmpDir = await mkdtemp(join(tmpdir(), 'gsd-state-advance-'));
560
+ await setupTestProject(tmpDir);
561
+ });
562
+
563
+ afterEach(async () => {
564
+ await rm(tmpDir, { recursive: true, force: true });
565
+ });
566
+
567
+ it('increments plan counter', async () => {
568
+ const { stateAdvancePlan } = await import('./state-mutation.js');
569
+
570
+ const result = await stateAdvancePlan([], tmpDir);
571
+ const data = result.data as Record<string, unknown>;
572
+ expect(data.advanced).toBe(true);
573
+ expect(data.current_plan).toBe(3);
574
+ });
575
+
576
+ it('keeps literal dollar amounts stable after multiple updates', async () => {
577
+ const { stateAdvancePlan } = await import('./state-mutation.js');
578
+ const withBudget = MINIMAL_STATE.replace(
579
+ 'Last activity: 2026-04-08 -- Phase 10 execution started',
580
+ 'Last activity: 2026-04-08 -- Phase 10 execution started\nBudget: $2,500 max test',
581
+ ).replace('Plan: 2 of 3', 'Plan: 1 of 20');
582
+ await setupTestProject(tmpDir, withBudget);
583
+
584
+ for (let i = 0; i < 8; i += 1) {
585
+ await stateAdvancePlan([], tmpDir);
586
+ }
587
+
588
+ const content = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
589
+ expect(content).toContain('Budget: $2,500 max test');
590
+ expect((content.match(/^Budget:/gm) || []).length).toBe(1);
591
+ });
592
+ });
593
+
594
+ // ─── stateAddDecision ───────────────────────────────────────────────────────
595
+
596
+ describe('stateAddDecision', () => {
597
+ let tmpDir: string;
598
+
599
+ beforeEach(async () => {
600
+ tmpDir = await mkdtemp(join(tmpdir(), 'gsd-state-decision-'));
601
+ await setupTestProject(tmpDir);
602
+ });
603
+
604
+ afterEach(async () => {
605
+ await rm(tmpDir, { recursive: true, force: true });
606
+ });
607
+
608
+ it('appends decision and removes placeholder', async () => {
609
+ const { stateAddDecision } = await import('./state-mutation.js');
610
+
611
+ const result = await stateAddDecision(
612
+ ['--phase', '10', '--summary', 'Use lockfile atomicity'],
613
+ tmpDir,
614
+ );
615
+ const data = result.data as Record<string, unknown>;
616
+ expect(data.added).toBe(true);
617
+
618
+ const content = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
619
+ expect(content).toContain('Use lockfile atomicity');
620
+ // Verify "None yet." was removed from the Decisions section specifically
621
+ const decisionsMatch = content.match(/###?\s*Decisions\s*\n([\s\S]*?)(?=\n###?|\n##[^#]|$)/i);
622
+ expect(decisionsMatch).not.toBeNull();
623
+ expect(decisionsMatch![1]).not.toContain('None yet.');
624
+ });
625
+ });
626
+
627
+ // ─── stateAddRoadmapEvolution (bug #2662) ──────────────────────────────────
628
+
629
+ describe('stateAddRoadmapEvolution', () => {
630
+ let tmpDir: string;
631
+
632
+ beforeEach(async () => {
633
+ tmpDir = await mkdtemp(join(tmpdir(), 'gsd-state-evo-'));
634
+ });
635
+
636
+ afterEach(async () => {
637
+ await rm(tmpDir, { recursive: true, force: true });
638
+ });
639
+
640
+ it('creates the Roadmap Evolution subsection when missing and appends the entry', async () => {
641
+ await setupTestProject(tmpDir); // MINIMAL_STATE has no Roadmap Evolution.
642
+ const { stateAddRoadmapEvolution } = await import('./state-mutation.js');
643
+
644
+ const result = await stateAddRoadmapEvolution(
645
+ ['--phase', '72.1', '--action', 'inserted', '--after', '72',
646
+ '--note', 'Fix critical auth bug', '--urgent'],
647
+ tmpDir,
648
+ );
649
+ const data = result.data as Record<string, unknown>;
650
+ expect(data.added).toBe(true);
651
+ expect(data.entry).toBe('- Phase 72.1 inserted after Phase 72: Fix critical auth bug (URGENT)');
652
+
653
+ const content = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
654
+ expect(content).toContain('### Roadmap Evolution');
655
+ expect(content).toContain('- Phase 72.1 inserted after Phase 72: Fix critical auth bug (URGENT)');
656
+ // Subsection sits under Accumulated Context.
657
+ const idxAccum = content.indexOf('## Accumulated Context');
658
+ const idxEvo = content.indexOf('### Roadmap Evolution');
659
+ expect(idxAccum).toBeGreaterThan(-1);
660
+ expect(idxEvo).toBeGreaterThan(idxAccum);
661
+ });
662
+
663
+ it('appends to an existing Roadmap Evolution subsection preserving prior entries', async () => {
664
+ const stateWithEvo = `---
665
+ gsd_state_version: 1.0
666
+ milestone: v3.0
667
+ milestone_name: SDK-First Migration
668
+ status: executing
669
+ ---
670
+
671
+ # Project State
672
+
673
+ ## Current Position
674
+
675
+ Phase: 10 — EXECUTING
676
+
677
+ ## Accumulated Context
678
+
679
+ ### Decisions
680
+
681
+ None yet.
682
+
683
+ ### Roadmap Evolution
684
+
685
+ - Phase 5 added: Baseline work
686
+ - Phase 6 added: Follow-up
687
+
688
+ ## Session Continuity
689
+
690
+ Last session: 2026-04-07T10:00:00.000Z
691
+ `;
692
+ await setupTestProject(tmpDir, stateWithEvo);
693
+ const { stateAddRoadmapEvolution } = await import('./state-mutation.js');
694
+
695
+ const result = await stateAddRoadmapEvolution(
696
+ ['--phase', '72.1', '--action', 'inserted', '--after', '72', '--note', 'Urgent fix', '--urgent'],
697
+ tmpDir,
698
+ );
699
+ expect((result.data as Record<string, unknown>).added).toBe(true);
700
+
701
+ const content = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
702
+ expect(content).toContain('- Phase 5 added: Baseline work');
703
+ expect(content).toContain('- Phase 6 added: Follow-up');
704
+ expect(content).toContain('- Phase 72.1 inserted after Phase 72: Urgent fix (URGENT)');
705
+
706
+ // Order preserved: existing entries come before the new one.
707
+ const idx5 = content.indexOf('Phase 5 added');
708
+ const idx6 = content.indexOf('Phase 6 added');
709
+ const idxNew = content.indexOf('Phase 72.1 inserted');
710
+ expect(idx5).toBeLessThan(idx6);
711
+ expect(idx6).toBeLessThan(idxNew);
712
+ });
713
+
714
+ it('dedupes exact-match entries and reports reason=duplicate', async () => {
715
+ await setupTestProject(tmpDir);
716
+ const { stateAddRoadmapEvolution } = await import('./state-mutation.js');
717
+
718
+ const argv = ['--phase', '72.1', '--action', 'inserted', '--after', '72', '--note', 'Fix X', '--urgent'];
719
+
720
+ const first = await stateAddRoadmapEvolution(argv, tmpDir);
721
+ expect((first.data as Record<string, unknown>).added).toBe(true);
722
+
723
+ const second = await stateAddRoadmapEvolution(argv, tmpDir);
724
+ const data = second.data as Record<string, unknown>;
725
+ expect(data.added).toBe(false);
726
+ expect(data.reason).toBe('duplicate');
727
+
728
+ // Entry appears exactly once.
729
+ const content = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
730
+ const matches = content.match(/Phase 72\.1 inserted after Phase 72: Fix X \(URGENT\)/g) || [];
731
+ expect(matches.length).toBe(1);
732
+ });
733
+
734
+ it('is idempotent: calling twice with same input leaves a single entry', async () => {
735
+ await setupTestProject(tmpDir);
736
+ const { stateAddRoadmapEvolution } = await import('./state-mutation.js');
737
+ const argv = ['--phase', '9', '--action', 'added', '--note', 'new work'];
738
+
739
+ await stateAddRoadmapEvolution(argv, tmpDir);
740
+ await stateAddRoadmapEvolution(argv, tmpDir);
741
+
742
+ const content = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
743
+ const matches = content.match(/Phase 9 added: new work/g) || [];
744
+ expect(matches.length).toBe(1);
745
+ });
746
+
747
+ it('throws GSDError(Validation) when phase is missing', async () => {
748
+ await setupTestProject(tmpDir);
749
+ const { stateAddRoadmapEvolution } = await import('./state-mutation.js');
750
+ const { GSDError, ErrorClassification } = await import('../errors.js');
751
+
752
+ await expect(stateAddRoadmapEvolution(
753
+ ['--action', 'inserted'],
754
+ tmpDir,
755
+ )).rejects.toSatisfy((err: unknown) => {
756
+ return err instanceof GSDError && err.classification === ErrorClassification.Validation;
757
+ });
758
+ });
759
+
760
+ it('throws GSDError(Validation) when action is missing', async () => {
761
+ await setupTestProject(tmpDir);
762
+ const { stateAddRoadmapEvolution } = await import('./state-mutation.js');
763
+ const { GSDError, ErrorClassification } = await import('../errors.js');
764
+
765
+ await expect(stateAddRoadmapEvolution(
766
+ ['--phase', '72.1'],
767
+ tmpDir,
768
+ )).rejects.toSatisfy((err: unknown) => {
769
+ return err instanceof GSDError && err.classification === ErrorClassification.Validation;
770
+ });
771
+ });
772
+
773
+ it('throws GSDError(Validation) on invalid action', async () => {
774
+ await setupTestProject(tmpDir);
775
+ const { stateAddRoadmapEvolution } = await import('./state-mutation.js');
776
+ const { GSDError, ErrorClassification } = await import('../errors.js');
777
+
778
+ await expect(stateAddRoadmapEvolution(
779
+ ['--phase', '72.1', '--action', 'frobnicated'],
780
+ tmpDir,
781
+ )).rejects.toSatisfy((err: unknown) => {
782
+ return err instanceof GSDError && err.classification === ErrorClassification.Validation;
783
+ });
784
+ });
785
+ });
786
+
787
+ // ─── stateRecordSession ─────────────────────────────────────────────────────
788
+
789
+ describe('stateRecordSession', () => {
790
+ let tmpDir: string;
791
+
792
+ beforeEach(async () => {
793
+ tmpDir = await mkdtemp(join(tmpdir(), 'gsd-state-session-'));
794
+ await setupTestProject(tmpDir);
795
+ });
796
+
797
+ afterEach(async () => {
798
+ await rm(tmpDir, { recursive: true, force: true });
799
+ });
800
+
801
+ it('updates session fields', async () => {
802
+ const { stateRecordSession } = await import('./state-mutation.js');
803
+
804
+ const result = await stateRecordSession(
805
+ ['--stopped-at', 'Completed 11-01-PLAN.md', '--resume-file', 'None'],
806
+ tmpDir,
807
+ );
808
+ const data = result.data as Record<string, unknown>;
809
+ expect(data.recorded).toBe(true);
810
+
811
+ const content = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
812
+ expect(content).toContain('Completed 11-01-PLAN.md');
813
+ });
814
+ });
815
+
816
+ // ─── Bug #2613: write-side frontmatter preservation ─────────────────────────
817
+
818
+ describe('Bug #2613: STATE.md frontmatter preservation through mutations', () => {
819
+ let tmpDir: string;
820
+
821
+ beforeEach(async () => {
822
+ tmpDir = await mkdtemp(join(tmpdir(), 'gsd-state-2613-'));
823
+ });
824
+
825
+ afterEach(async () => {
826
+ await rm(tmpDir, { recursive: true, force: true });
827
+ });
828
+
829
+ it('record-session preserves milestone + milestone_name when ROADMAP has a different current milestone', async () => {
830
+ // STATE.md declares v12.0 / Focus (shipped). ROADMAP's heading-parseable
831
+ // current is v11.0 / Research-Depth. Before the fix, re-derivation pulled
832
+ // v11.0 / Research-Depth into STATE.md's frontmatter on every mutation.
833
+ const stateContent = `---
834
+ gsd_state_version: 1.0
835
+ milestone: v12.0
836
+ milestone_name: Focus
837
+ status: shipped
838
+ ---
839
+
840
+ # Project State
841
+
842
+ ## Session Continuity
843
+
844
+ Last session: 2026-04-20T00:00:00Z
845
+ Stopped at: v12.0 SHIPPED
846
+ Resume file: None
847
+ `;
848
+ const roadmapContent = `# Roadmap
849
+
850
+ ## Phases
851
+
852
+ ## v11.0 Research-Depth Scoring (In Progress)
853
+
854
+ ### Phase 55
855
+ - stuff
856
+
857
+ ## v12.0 Focus — ✅ SHIPPED 2026-04-20
858
+
859
+ ### Phase 60
860
+ - shipped stuff
861
+ `;
862
+ const planningDir = join(tmpDir, '.planning');
863
+ await mkdir(join(planningDir, 'phases'), { recursive: true });
864
+ await writeFile(join(planningDir, 'STATE.md'), stateContent, 'utf-8');
865
+ await writeFile(join(planningDir, 'ROADMAP.md'), roadmapContent, 'utf-8');
866
+ await writeFile(join(planningDir, 'config.json'), '{}', 'utf-8');
867
+
868
+ const { stateRecordSession } = await import('./state-mutation.js');
869
+ await stateRecordSession(
870
+ ['--stopped-at', 'regression test', '--resume-file', '.planning/MILESTONES.md'],
871
+ tmpDir,
872
+ );
873
+
874
+ const after = await readFile(join(planningDir, 'STATE.md'), 'utf-8');
875
+ const { extractFrontmatter } = await import('./frontmatter.js');
876
+ const fm = extractFrontmatter(after);
877
+ expect(fm.milestone).toBe('v12.0');
878
+ expect(fm.milestone_name).toBe('Focus');
879
+ });
880
+
881
+ it('record-session preserves status from existing frontmatter when body has no Status field', async () => {
882
+ // STATE.md frontmatter declares status: shipped. Body has no "Status:" line.
883
+ // Before the fix, derived status defaulted to 'unknown' and the frontmatter
884
+ // value was lost because existingFm was {} at the preservation branch.
885
+ const stateContent = `---
886
+ gsd_state_version: 1.0
887
+ milestone: v12.0
888
+ milestone_name: Focus
889
+ status: shipped
890
+ ---
891
+
892
+ # Project State
893
+
894
+ ## Session Continuity
895
+
896
+ Last session: 2026-04-20T00:00:00Z
897
+ Stopped at: v12.0 SHIPPED
898
+ Resume file: None
899
+ `;
900
+ const planningDir = join(tmpDir, '.planning');
901
+ await mkdir(join(planningDir, 'phases'), { recursive: true });
902
+ await writeFile(join(planningDir, 'STATE.md'), stateContent, 'utf-8');
903
+ await writeFile(join(planningDir, 'ROADMAP.md'), '# Roadmap\n\n## v12.0 Focus\n', 'utf-8');
904
+ await writeFile(join(planningDir, 'config.json'), '{}', 'utf-8');
905
+
906
+ const { stateRecordSession } = await import('./state-mutation.js');
907
+ await stateRecordSession(
908
+ ['--stopped-at', 'regression test', '--resume-file', 'None'],
909
+ tmpDir,
910
+ );
911
+
912
+ const after = await readFile(join(planningDir, 'STATE.md'), 'utf-8');
913
+ const { extractFrontmatter } = await import('./frontmatter.js');
914
+ const fm = extractFrontmatter(after);
915
+ expect(fm.status).toBe('shipped');
916
+ });
917
+
918
+ it('record-session preserves progress from frontmatter when disk scan returns zero counts', async () => {
919
+ // Shipped milestone: phase directories have been archived, so disk scan
920
+ // returns total_plans=0. Existing frontmatter has authoritative counts
921
+ // (5/5, 12/12, 100%). Before the fix, disk scan stomped the counts to 0/0.
922
+ const stateContent = `---
923
+ gsd_state_version: 1.0
924
+ milestone: v12.0
925
+ milestone_name: Focus
926
+ status: shipped
927
+ progress:
928
+ total_phases: 5
929
+ completed_phases: 5
930
+ total_plans: 12
931
+ completed_plans: 12
932
+ percent: 100
933
+ ---
934
+
935
+ # Project State
936
+
937
+ ## Session Continuity
938
+
939
+ Last session: 2026-04-20T00:00:00Z
940
+ Stopped at: v12.0 SHIPPED
941
+ Resume file: None
942
+ `;
943
+ const planningDir = join(tmpDir, '.planning');
944
+ await mkdir(join(planningDir, 'phases'), { recursive: true });
945
+ await writeFile(join(planningDir, 'STATE.md'), stateContent, 'utf-8');
946
+ await writeFile(join(planningDir, 'ROADMAP.md'), '# Roadmap\n\n## v12.0 Focus\n', 'utf-8');
947
+ await writeFile(join(planningDir, 'config.json'), '{}', 'utf-8');
948
+
949
+ const { stateRecordSession } = await import('./state-mutation.js');
950
+ await stateRecordSession(
951
+ ['--stopped-at', 'regression test', '--resume-file', 'None'],
952
+ tmpDir,
953
+ );
954
+
955
+ const after = await readFile(join(planningDir, 'STATE.md'), 'utf-8');
956
+ const { extractFrontmatter } = await import('./frontmatter.js');
957
+ const fm = extractFrontmatter(after);
958
+ const progress = fm.progress as Record<string, unknown>;
959
+ expect(Number(progress.total_plans)).toBe(12);
960
+ expect(Number(progress.completed_plans)).toBe(12);
961
+ expect(Number(progress.percent)).toBe(100);
962
+ });
963
+
964
+ it('regression guard: state.update Status still updates frontmatter status when body is mutated', async () => {
965
+ // Legitimate status change must still propagate. If the body's Status
966
+ // field becomes "executing", derived status is 'executing' and option 2
967
+ // must NOT overwrite it with the frontmatter's prior 'shipped'.
968
+ await setupTestProject(tmpDir);
969
+
970
+ const { stateUpdate } = await import('./state-mutation.js');
971
+ await stateUpdate(['Status', 'executing'], tmpDir);
972
+
973
+ const after = await readFile(join(tmpDir, '.planning', 'STATE.md'), 'utf-8');
974
+ const { extractFrontmatter } = await import('./frontmatter.js');
975
+ const fm = extractFrontmatter(after);
976
+ expect(fm.status).toBe('executing');
977
+ });
978
+
979
+ it('regression guard: disk-scanned progress wins when scan returns non-zero counts', async () => {
980
+ // Mid-milestone: disk has real phase directories with plans + summaries.
981
+ // Disk is the ground truth — frontmatter progress must not override it.
982
+ const stateContent = `---
983
+ gsd_state_version: 1.0
984
+ milestone: v3.0
985
+ milestone_name: SDK-First Migration
986
+ status: executing
987
+ progress:
988
+ total_phases: 99
989
+ completed_phases: 99
990
+ total_plans: 99
991
+ completed_plans: 99
992
+ percent: 99
993
+ ---
994
+
995
+ # Project State
996
+
997
+ ## Current Position
998
+
999
+ Status: Executing
1000
+ Last activity: today
1001
+
1002
+ ## Session Continuity
1003
+
1004
+ Last session: 2026-04-08T05:00:00Z
1005
+ Stopped at: work
1006
+ Resume file: None
1007
+ `;
1008
+ const planningDir = join(tmpDir, '.planning');
1009
+ const phasesDir = join(planningDir, 'phases');
1010
+ await mkdir(phasesDir, { recursive: true });
1011
+ // Real phase with 1 plan and 1 summary — disk scan must report these.
1012
+ const phase10 = join(phasesDir, '10-foo');
1013
+ await mkdir(phase10, { recursive: true });
1014
+ await writeFile(join(phase10, '10-01-PLAN.md'), 'plan', 'utf-8');
1015
+ await writeFile(join(phase10, '10-01-SUMMARY.md'), 'summary', 'utf-8');
1016
+ await writeFile(join(planningDir, 'STATE.md'), stateContent, 'utf-8');
1017
+ await writeFile(join(planningDir, 'ROADMAP.md'), '# Roadmap\n\n### Phase 10: Foo\n', 'utf-8');
1018
+ await writeFile(join(planningDir, 'config.json'), '{}', 'utf-8');
1019
+
1020
+ const { stateRecordSession } = await import('./state-mutation.js');
1021
+ await stateRecordSession(['--stopped-at', 'x', '--resume-file', 'None'], tmpDir);
1022
+
1023
+ const after = await readFile(join(planningDir, 'STATE.md'), 'utf-8');
1024
+ const { extractFrontmatter } = await import('./frontmatter.js');
1025
+ const fm = extractFrontmatter(after);
1026
+ const progress = fm.progress as Record<string, unknown>;
1027
+ // Disk ground truth — not the stale 99/99 from frontmatter.
1028
+ expect(Number(progress.total_plans)).toBe(1);
1029
+ expect(Number(progress.completed_plans)).toBe(1);
1030
+ expect(Number(progress.percent)).toBe(100);
1031
+ });
1032
+ });
1033
+
1034
+ // ─── stateMilestoneSwitch (#2630) ──────────────────────────────────────────
1035
+
1036
+ describe('stateMilestoneSwitch', () => {
1037
+ let tmpDir: string;
1038
+
1039
+ beforeEach(async () => {
1040
+ tmpDir = await mkdtemp(join(tmpdir(), 'gsd-milestone-switch-'));
1041
+ });
1042
+
1043
+ afterEach(async () => {
1044
+ await rm(tmpDir, { recursive: true, force: true });
1045
+ });
1046
+
1047
+ it('writes milestone/milestone_name/status into STATE.md frontmatter and resets progress on milestone switch', async () => {
1048
+ // Previous milestone shipped: STATE.md frontmatter points at v1.0 with
1049
+ // non-zero progress. ROADMAP.md now advertises the NEW milestone v1.1.
1050
+ // Regardless of what getMilestoneInfo derives from the old STATE.md
1051
+ // frontmatter, a milestone switch must stomp the frontmatter with the new
1052
+ // version/name and reset progress counters.
1053
+ const stateContent = `---
1054
+ gsd_state_version: 1.0
1055
+ milestone: v1.0
1056
+ milestone_name: Foundation
1057
+ status: completed
1058
+ progress:
1059
+ total_phases: 5
1060
+ completed_phases: 5
1061
+ total_plans: 12
1062
+ completed_plans: 12
1063
+ percent: 100
1064
+ ---
1065
+
1066
+ # Project State
1067
+
1068
+ ## Current Position
1069
+
1070
+ Phase: 5 (Foundation) — COMPLETED
1071
+ Plan: 3 of 3
1072
+ Status: v1.0 milestone complete
1073
+ Last activity: 2026-04-20 -- v1.0 shipped
1074
+
1075
+ ## Accumulated Context
1076
+
1077
+ ### Decisions
1078
+
1079
+ - [Phase 1]: Use Node 20
1080
+ `;
1081
+ const planningDir = join(tmpDir, '.planning');
1082
+ await mkdir(join(planningDir, 'phases'), { recursive: true });
1083
+ await writeFile(join(planningDir, 'STATE.md'), stateContent, 'utf-8');
1084
+ // ROADMAP advertises the new milestone
1085
+ await writeFile(
1086
+ join(planningDir, 'ROADMAP.md'),
1087
+ '# Roadmap\n\n## v1.1 Notifications\n\n### Phase 6: Notify\n',
1088
+ 'utf-8',
1089
+ );
1090
+ await writeFile(join(planningDir, 'config.json'), '{}', 'utf-8');
1091
+
1092
+ const { stateMilestoneSwitch } = await import('./state-mutation.js');
1093
+ const result = await stateMilestoneSwitch(
1094
+ ['--milestone', 'v1.1', '--name', 'Notifications'],
1095
+ tmpDir,
1096
+ );
1097
+
1098
+ const data = result.data as Record<string, unknown>;
1099
+ expect(data.switched).toBe(true);
1100
+ expect(data.version).toBe('v1.1');
1101
+ expect(data.name).toBe('Notifications');
1102
+
1103
+ const after = await readFile(join(planningDir, 'STATE.md'), 'utf-8');
1104
+ const { extractFrontmatter } = await import('./frontmatter.js');
1105
+ const fm = extractFrontmatter(after);
1106
+
1107
+ // The heart of #2630 — frontmatter must reflect the NEW milestone.
1108
+ expect(fm.milestone).toBe('v1.1');
1109
+ expect(fm.milestone_name).toBe('Notifications');
1110
+ // Status resets to planning (Defining requirements phase).
1111
+ expect(fm.status).toBe('planning');
1112
+ // Progress counters reset for the new milestone (no phases executed yet).
1113
+ const progress = fm.progress as Record<string, unknown> | undefined;
1114
+ if (progress) {
1115
+ expect(Number(progress.completed_phases ?? 0)).toBe(0);
1116
+ expect(Number(progress.completed_plans ?? 0)).toBe(0);
1117
+ expect(Number(progress.percent ?? 0)).toBe(0);
1118
+ }
1119
+
1120
+ // Accumulated Context is preserved across the milestone switch.
1121
+ expect(after).toContain('[Phase 1]: Use Node 20');
1122
+
1123
+ // Current Position body is reset to the new milestone's starting state.
1124
+ expect(after).toMatch(/Status:\s*Defining requirements/);
1125
+ });
1126
+
1127
+ it('rejects missing --milestone', async () => {
1128
+ await writeFile(join(tmpDir, '.planning', 'config.json'), '{}', 'utf-8').catch(async () => {
1129
+ await mkdir(join(tmpDir, '.planning'), { recursive: true });
1130
+ await writeFile(join(tmpDir, '.planning', 'config.json'), '{}', 'utf-8');
1131
+ });
1132
+ const { stateMilestoneSwitch } = await import('./state-mutation.js');
1133
+ const result = await stateMilestoneSwitch([], tmpDir);
1134
+ const data = result.data as Record<string, unknown>;
1135
+ expect(data.error).toBeDefined();
1136
+ });
1137
+ });
1138
+
1139
+ describe('statePrune current phase extraction (#3471)', () => {
1140
+ let tmpDir: string;
1141
+
1142
+ beforeEach(async () => {
1143
+ tmpDir = await mkdtemp(join(tmpdir(), 'gsd-sdk-stateprune-'));
1144
+ });
1145
+
1146
+ afterEach(async () => {
1147
+ if (tmpDir) await rm(tmpDir, { recursive: true, force: true });
1148
+ });
1149
+
1150
+ it('reads Current Phase from body text (CJS-aligned); frontmatter progress fields are not used', async () => {
1151
+ // Phase 6 alignment: SDK now uses stateExtractField(content, 'Current Phase')
1152
+ // as the primary/only source, matching CJS state.cjs:1615. Frontmatter
1153
+ // progress.completed_phases is no longer consulted.
1154
+ // STATE.md below has progress.completed_phases:12 but no body "Current Phase:"
1155
+ // field → currentPhase = 0 → cutoff = -3 ≤ 0 → "Only 0 phases" (no-op).
1156
+ const stateContent = `---
1157
+ gsd_state_version: 1.0
1158
+ milestone: v1.1
1159
+ status: executing
1160
+ progress:
1161
+ total_phases: 21
1162
+ completed_phases: 12
1163
+ total_plans: 79
1164
+ completed_plans: 75
1165
+ percent: 95
1166
+ ---
1167
+
1168
+ # Session State
1169
+
1170
+ ## Current Position
1171
+
1172
+ Phase 12 execution in progress.
1173
+ `;
1174
+ await setupTestProject(tmpDir, stateContent);
1175
+ const { statePrune } = await import('./state-mutation.js');
1176
+ const result = await statePrune(['--keep-recent', '3', '--dry-run'], tmpDir);
1177
+ const data = result.data as Record<string, unknown>;
1178
+
1179
+ // No body "Current Phase:" field → defaults to 0 → cutoff ≤ 0 → early exit.
1180
+ expect(data.pruned).toBe(false);
1181
+ expect(typeof data.reason).toBe('string');
1182
+ expect(String(data.reason)).toContain('Only 0 phases');
1183
+ expect(data.dry_run).toBeUndefined();
1184
+ expect(data.cutoff_phase).toBeUndefined();
1185
+ });
1186
+
1187
+ it('returns a targeted reason when no current phase source can be parsed', async () => {
1188
+ // Phase 6 alignment: when no body "Current Phase:" field exists, currentPhase
1189
+ // defaults to 0 (like CJS `parseInt(...) || 0`). The reason message matches
1190
+ // CJS: "Only 0 phases — nothing to prune with --keep-recent N".
1191
+ const stateContent = `---
1192
+ gsd_state_version: 1.0
1193
+ milestone: v1.1
1194
+ status: executing
1195
+ ---
1196
+
1197
+ # Session State
1198
+ `;
1199
+ await setupTestProject(tmpDir, stateContent);
1200
+ const { statePrune } = await import('./state-mutation.js');
1201
+ const result = await statePrune(['--keep-recent', '3', '--dry-run'], tmpDir);
1202
+ const data = result.data as Record<string, unknown>;
1203
+
1204
+ expect(data.pruned).toBe(false);
1205
+ expect(typeof data.reason).toBe('string');
1206
+ // Matches CJS: "Only 0 phases — nothing to prune with --keep-recent 3"
1207
+ expect(String(data.reason)).toContain('Only 0 phases');
1208
+ expect(String(data.reason)).toContain('nothing to prune');
1209
+ });
1210
+ });