@opengsd/gsd-pi 1.2.0-dev.fb12b103 → 1.2.0-dev.fbdca60b

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 (580) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli.js +1 -18
  4. package/dist/headless-events.js +7 -5
  5. package/dist/loader.js +6 -4
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/register-agent-bundles.d.ts +11 -2
  8. package/dist/register-agent-bundles.js +18 -4
  9. package/dist/resource-loader.d.ts +10 -5
  10. package/dist/resource-loader.js +121 -6
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/ask-user-questions.js +3 -2
  14. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
  15. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  16. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  17. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  18. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  19. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  20. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  21. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  22. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  23. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  24. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  25. package/dist/resources/extensions/gsd/auto/orchestrator.js +167 -64
  26. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  27. package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
  28. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  29. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  30. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  31. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  32. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  33. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  34. package/dist/resources/extensions/gsd/auto-dispatch.js +39 -58
  35. package/dist/resources/extensions/gsd/auto-model-selection.js +11 -7
  36. package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
  37. package/dist/resources/extensions/gsd/auto-prompts.js +66 -9
  38. package/dist/resources/extensions/gsd/auto-start.js +26 -8
  39. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  40. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
  41. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  42. package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
  43. package/dist/resources/extensions/gsd/auto.js +52 -2
  44. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  45. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
  46. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
  47. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  48. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +107 -45
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
  50. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  51. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  52. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  53. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  54. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  55. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  56. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  57. package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
  58. package/dist/resources/extensions/gsd/db/engine.js +24 -6
  59. package/dist/resources/extensions/gsd/db/queries.js +56 -0
  60. package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
  61. package/dist/resources/extensions/gsd/db-transaction.js +27 -23
  62. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  63. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  64. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  65. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  66. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  67. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  68. package/dist/resources/extensions/gsd/files.js +33 -19
  69. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  70. package/dist/resources/extensions/gsd/gsd-db.js +17 -21
  71. package/dist/resources/extensions/gsd/guidance.js +60 -0
  72. package/dist/resources/extensions/gsd/guided-flow.js +93 -4
  73. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  74. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  75. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  76. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  77. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  78. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  79. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  80. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  81. package/dist/resources/extensions/gsd/notifications.js +12 -7
  82. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  83. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  84. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  85. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  86. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  88. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  89. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  90. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  91. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  92. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  93. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  94. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  95. package/dist/resources/extensions/gsd/prompts/run-uat.md +8 -4
  96. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  97. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  99. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  100. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  101. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  102. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  103. package/dist/resources/extensions/gsd/state.js +11 -2
  104. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  105. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  106. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  107. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  108. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  109. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  110. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
  111. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  112. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  113. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  114. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  115. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  116. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  117. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  118. package/dist/resources/extensions/gsd/uat-policy.js +40 -15
  119. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  120. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  121. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  122. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  123. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  124. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  125. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  126. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  127. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  128. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  129. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  130. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  131. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  132. package/dist/resources/extensions/gsd/worktree.js +8 -1
  133. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  134. package/dist/resources/extensions/shared/gsd-browser-cli.js +21 -2
  135. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  136. package/dist/resources/shared/package-manager-detection.js +1 -1
  137. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  138. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  139. package/dist/runtime-checks.d.ts +10 -0
  140. package/dist/runtime-checks.js +27 -0
  141. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  142. package/dist/update-check.d.ts +2 -0
  143. package/dist/update-check.js +24 -1
  144. package/dist/update-cmd.js +20 -3
  145. package/dist/web/standalone/.next/BUILD_ID +1 -1
  146. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  147. package/dist/web/standalone/.next/build-manifest.json +2 -2
  148. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  149. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  150. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  155. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  156. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  158. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  163. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/index.html +1 -1
  200. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  201. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  207. package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
  208. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  209. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  211. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  212. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  213. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  214. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  215. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  216. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  217. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  218. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  219. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  220. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  221. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  222. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  223. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  224. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  225. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  226. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  227. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  228. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  229. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  230. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  231. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  232. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  233. package/package.json +3 -3
  234. package/packages/cloud-mcp-gateway/package.json +2 -2
  235. package/packages/contracts/package.json +1 -1
  236. package/packages/daemon/package.json +4 -4
  237. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  238. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  239. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  240. package/packages/gsd-agent-core/package.json +5 -5
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  244. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +8 -0
  246. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +50 -6
  248. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  250. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  252. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +17 -0
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  260. package/packages/gsd-agent-modes/package.json +7 -7
  261. package/packages/mcp-server/README.md +12 -3
  262. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  263. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  264. package/packages/mcp-server/dist/cli-runner.js +137 -0
  265. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  266. package/packages/mcp-server/dist/cli.js +2 -53
  267. package/packages/mcp-server/dist/cli.js.map +1 -1
  268. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  269. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  270. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  271. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  272. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  273. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  274. package/packages/mcp-server/dist/pid-registry.js +459 -0
  275. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  276. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  277. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  278. package/packages/mcp-server/dist/probe-mode.js +10 -0
  279. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  280. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  281. package/packages/mcp-server/dist/server.js +4 -0
  282. package/packages/mcp-server/dist/server.js.map +1 -1
  283. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  284. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  285. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  286. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  287. package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
  288. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  289. package/packages/mcp-server/dist/workflow-tools.js +161 -81
  290. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  291. package/packages/mcp-server/package.json +5 -4
  292. package/packages/native/package.json +1 -1
  293. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  294. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  295. package/packages/pi-agent-core/package.json +1 -1
  296. package/packages/pi-ai/README.md +1 -0
  297. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  298. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  299. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  300. package/packages/pi-ai/dist/index.d.ts +2 -0
  301. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/index.js +2 -0
  303. package/packages/pi-ai/dist/index.js.map +1 -1
  304. package/packages/pi-ai/dist/models.generated.d.ts +419 -221
  305. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  306. package/packages/pi-ai/dist/models.generated.js +468 -269
  307. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  308. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  309. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  310. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  311. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  312. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  313. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  314. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  315. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  316. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  317. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  318. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  319. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  320. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  321. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  322. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  323. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  324. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  325. package/packages/pi-ai/package.json +3 -2
  326. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  327. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  329. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  332. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  333. package/packages/pi-coding-agent/package.json +7 -7
  334. package/packages/pi-tui/README.md +15 -0
  335. package/packages/pi-tui/dist/index.d.ts +2 -2
  336. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  337. package/packages/pi-tui/dist/index.js +2 -2
  338. package/packages/pi-tui/dist/index.js.map +1 -1
  339. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  340. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  341. package/packages/pi-tui/dist/terminal-image.js +54 -2
  342. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  343. package/packages/pi-tui/dist/terminal.d.ts +12 -0
  344. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  345. package/packages/pi-tui/dist/terminal.js +70 -25
  346. package/packages/pi-tui/dist/terminal.js.map +1 -1
  347. package/packages/pi-tui/dist/tui.d.ts +15 -0
  348. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  349. package/packages/pi-tui/dist/tui.js +106 -21
  350. package/packages/pi-tui/dist/tui.js.map +1 -1
  351. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  352. package/packages/pi-tui/dist/utils.js +110 -36
  353. package/packages/pi-tui/dist/utils.js.map +1 -1
  354. package/packages/pi-tui/package.json +2 -2
  355. package/packages/rpc-client/package.json +2 -2
  356. package/pkg/dist/theme/theme.d.ts.map +1 -1
  357. package/pkg/dist/theme/theme.js +45 -17
  358. package/pkg/dist/theme/theme.js.map +1 -1
  359. package/pkg/package.json +1 -1
  360. package/src/resources/GSD-WORKFLOW.md +5 -4
  361. package/src/resources/extensions/ask-user-questions.ts +7 -2
  362. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +11 -0
  363. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  364. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  365. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  366. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  367. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  368. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  369. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  370. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  371. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  372. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  373. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  374. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  375. package/src/resources/extensions/gsd/auto/orchestrator.ts +186 -66
  376. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  377. package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
  378. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  379. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  380. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  381. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  382. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  383. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  384. package/src/resources/extensions/gsd/auto-dispatch.ts +37 -62
  385. package/src/resources/extensions/gsd/auto-model-selection.ts +16 -7
  386. package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
  387. package/src/resources/extensions/gsd/auto-prompts.ts +78 -9
  388. package/src/resources/extensions/gsd/auto-start.ts +27 -11
  389. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  390. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
  391. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  392. package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
  393. package/src/resources/extensions/gsd/auto.ts +64 -2
  394. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  395. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
  396. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
  397. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  398. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +118 -50
  399. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
  400. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  401. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  402. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  403. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  404. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  405. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  406. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  407. package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
  408. package/src/resources/extensions/gsd/db/engine.ts +26 -6
  409. package/src/resources/extensions/gsd/db/queries.ts +66 -0
  410. package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
  411. package/src/resources/extensions/gsd/db-transaction.ts +37 -20
  412. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  413. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  414. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  415. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  416. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  417. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  418. package/src/resources/extensions/gsd/files.ts +33 -12
  419. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  420. package/src/resources/extensions/gsd/gsd-db.ts +19 -22
  421. package/src/resources/extensions/gsd/guidance.ts +78 -0
  422. package/src/resources/extensions/gsd/guided-flow.ts +145 -24
  423. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  424. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  425. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  426. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  427. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  428. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  429. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  430. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  431. package/src/resources/extensions/gsd/notifications.ts +13 -6
  432. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  433. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  434. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  435. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  436. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  437. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  438. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  439. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  440. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  441. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  442. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  443. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  444. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  445. package/src/resources/extensions/gsd/prompts/run-uat.md +8 -4
  446. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  448. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  449. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  450. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  451. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  452. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  453. package/src/resources/extensions/gsd/state.ts +12 -1
  454. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  455. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  456. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  457. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +75 -1
  458. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +257 -18
  459. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  460. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
  461. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  462. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  463. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  464. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  465. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  466. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  467. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  468. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  469. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  470. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
  471. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
  472. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  473. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  474. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
  475. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  476. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  477. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  478. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  479. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  480. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  481. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  482. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  483. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +46 -0
  484. package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
  485. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  486. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  487. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  488. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  489. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  490. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  491. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  492. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  493. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  494. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  495. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  496. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  497. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  498. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  499. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  500. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  501. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  503. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  504. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  505. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  506. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  507. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  508. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  509. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  510. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
  511. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
  512. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  513. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  514. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  515. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  516. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
  517. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  518. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  519. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  520. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +88 -0
  521. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  522. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  523. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  524. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  525. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  526. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  527. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  528. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  529. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  530. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
  531. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  532. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  533. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  534. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  535. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  536. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  537. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  538. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  539. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  540. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  541. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  542. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  543. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  544. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  545. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
  546. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  547. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  548. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  549. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  550. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  551. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  552. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  553. package/src/resources/extensions/gsd/uat-policy.ts +60 -15
  554. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  555. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  556. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  557. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  558. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  559. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  560. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  561. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  562. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  563. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  564. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  565. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  566. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  567. package/src/resources/extensions/gsd/worktree.ts +7 -1
  568. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  569. package/src/resources/extensions/shared/gsd-browser-cli.ts +23 -2
  570. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  571. package/src/resources/shared/package-manager-detection.ts +1 -1
  572. package/src/resources/skills/create-skill/SKILL.md +3 -0
  573. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  574. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  575. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  576. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  577. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  578. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  579. /package/dist/web/standalone/.next/static/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_buildManifest.js +0 -0
  580. /package/dist/web/standalone/.next/static/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_ssgManifest.js +0 -0
@@ -1,10 +1,11 @@
1
1
  /**
2
- * engine-interfaces-contract.test.ts — Source-level contract tests for the
3
- * engine abstraction layer (S01).
2
+ * engine-interfaces-contract.test.ts — Runtime and type-level contract tests for
3
+ * the engine abstraction layer (S01).
4
4
  *
5
- * TypeScript interfaces are erased by --experimental-strip-types, so these
6
- * tests use source-level regex assertions on the .ts files to verify shapes.
7
- * Runtime assertions cover AutoSession.activeEngineId and resolveEngine().
5
+ * TypeScript interfaces are erased by --experimental-strip-types, so shape
6
+ * contracts are verified by constructing values that satisfy the types and
7
+ * asserting on their runtime fields. Type-level assertions guard compile-time
8
+ * contracts; pnpm run typecheck:extensions validates those.
8
9
  *
9
10
  * Follows the same conventions as auto-session-encapsulation.test.ts.
10
11
  */
@@ -15,15 +16,21 @@ import { readFileSync } from "node:fs";
15
16
  import { join, dirname } from "node:path";
16
17
  import { fileURLToPath } from "node:url";
17
18
 
19
+ import type {
20
+ EngineState,
21
+ EngineDispatchAction,
22
+ StepContract,
23
+ ReconcileResult,
24
+ RecoveryAction,
25
+ CloseoutResult,
26
+ DisplayMetadata,
27
+ } from "../engine-types.js";
28
+ import type { WorkflowEngine } from "../workflow-engine.js";
29
+ import type { ExecutionPolicy } from "../execution-policy.js";
30
+ import type { ResolvedEngine } from "../engine-resolver.js";
31
+
18
32
  const __dirname = dirname(fileURLToPath(import.meta.url));
19
33
  const ENGINE_TYPES_PATH = join(__dirname, "..", "engine-types.ts");
20
- const WORKFLOW_ENGINE_PATH = join(__dirname, "..", "workflow-engine.ts");
21
- const EXECUTION_POLICY_PATH = join(__dirname, "..", "execution-policy.ts");
22
- const ENGINE_RESOLVER_PATH = join(__dirname, "..", "engine-resolver.ts");
23
-
24
- function readSource(path: string): string {
25
- return readFileSync(path, "utf-8");
26
- }
27
34
 
28
35
  // ── Import smoke tests ──────────────────────────────────────────────────────
29
36
 
@@ -55,9 +62,10 @@ describe("Import smoke tests", () => {
55
62
 
56
63
  // ── Leaf-node constraint ────────────────────────────────────────────────────
57
64
 
65
+ // allow-source-grep: verifies engine-types.ts is a leaf node by design
58
66
  describe("Leaf-node constraint", () => {
59
67
  test("engine-types.ts has zero imports from GSD modules (only node: allowed)", () => {
60
- const source = readSource(ENGINE_TYPES_PATH);
68
+ const source = readFileSync(ENGINE_TYPES_PATH, "utf-8");
61
69
  const lines = source.split("\n");
62
70
  const violations: string[] = [];
63
71
 
@@ -81,97 +89,111 @@ describe("Leaf-node constraint", () => {
81
89
  // ── EngineState shape ───────────────────────────────────────────────────────
82
90
 
83
91
  describe("EngineState shape", () => {
84
- test("EngineState has all required fields with correct types", () => {
85
- const source = readSource(ENGINE_TYPES_PATH);
86
-
87
- const requiredFields = [
88
- "phase",
89
- "currentMilestoneId",
90
- "activeSliceId",
91
- "activeTaskId",
92
- "isComplete",
93
- "raw",
94
- ];
95
-
96
- for (const field of requiredFields) {
97
- assert.ok(
98
- source.includes(field),
99
- `EngineState must contain field: ${field}`,
100
- );
101
- }
92
+ test("EngineState accepts all required fields with correct runtime types", () => {
93
+ const state: EngineState = {
94
+ phase: "research",
95
+ currentMilestoneId: "M001",
96
+ activeSliceId: "S01",
97
+ activeTaskId: "T01",
98
+ isComplete: false,
99
+ raw: { arbitrary: "engine-specific-state" },
100
+ };
101
+
102
+ assert.equal(state.phase, "research");
103
+ assert.equal(state.currentMilestoneId, "M001");
104
+ assert.equal(state.activeSliceId, "S01");
105
+ assert.equal(state.activeTaskId, "T01");
106
+ assert.equal(state.isComplete, false);
107
+ assert.deepEqual(state.raw, { arbitrary: "engine-specific-state" });
108
+ });
102
109
 
103
- // raw must be typed unknown not a GSD-specific type
104
- assert.ok(
105
- /raw:\s*unknown/.test(source),
106
- "EngineState.raw must be typed 'unknown', not a GSD-specific type",
107
- );
110
+ test("EngineState.raw accepts unknown opaque values", () => {
111
+ const state: EngineState = {
112
+ phase: "planning",
113
+ currentMilestoneId: null,
114
+ activeSliceId: null,
115
+ activeTaskId: null,
116
+ isComplete: true,
117
+ raw: null,
118
+ };
119
+
120
+ assert.equal(state.raw, null);
108
121
  });
109
122
  });
110
123
 
111
124
  // ── EngineDispatchAction shape ──────────────────────────────────────────────
112
125
 
113
126
  describe("EngineDispatchAction shape", () => {
114
- test("EngineDispatchAction has dispatch, stop, and skip variants", () => {
115
- const source = readSource(ENGINE_TYPES_PATH);
116
-
117
- assert.ok(
118
- /action:\s*"dispatch"/.test(source),
119
- 'EngineDispatchAction must have action: "dispatch" variant',
120
- );
121
- assert.ok(
122
- /action:\s*"stop"/.test(source),
123
- 'EngineDispatchAction must have action: "stop" variant',
124
- );
125
- assert.ok(
126
- /action:\s*"skip"/.test(source),
127
- 'EngineDispatchAction must have action: "skip" variant',
128
- );
127
+ test("EngineDispatchAction supports dispatch, stop, and skip variants at runtime", () => {
128
+ const step: StepContract = {
129
+ unitType: "execute-task",
130
+ unitId: "M001/S01/T01",
131
+ prompt: "execute the task",
132
+ };
133
+
134
+ const dispatchAction: EngineDispatchAction = { action: "dispatch", step };
135
+ assert.equal(dispatchAction.action, "dispatch");
136
+ assert.deepEqual(dispatchAction.step, step);
137
+
138
+ const stopAction: EngineDispatchAction = { action: "stop", reason: "blocked", level: "error" };
139
+ assert.equal(stopAction.action, "stop");
140
+ assert.equal(stopAction.reason, "blocked");
141
+ assert.equal(stopAction.level, "error");
142
+
143
+ const skipAction: EngineDispatchAction = { action: "skip" };
144
+ assert.equal(skipAction.action, "skip");
129
145
  });
130
146
  });
131
147
 
132
148
  // ── WorkflowEngine interface shape ──────────────────────────────────────────
133
149
 
134
150
  describe("WorkflowEngine interface shape", () => {
135
- test("WorkflowEngine has engineId and all required methods", () => {
136
- const source = readSource(WORKFLOW_ENGINE_PATH);
137
-
138
- const requiredMembers = [
139
- "engineId",
140
- "deriveState",
141
- "resolveDispatch",
142
- "reconcile",
143
- "getDisplayMetadata",
144
- ];
145
-
146
- for (const member of requiredMembers) {
147
- assert.ok(
148
- source.includes(member),
149
- `WorkflowEngine must contain member: ${member}`,
150
- );
151
- }
151
+ test("WorkflowEngine accepts an object with engineId and all required methods", () => {
152
+ const engine: WorkflowEngine = {
153
+ engineId: "test-engine",
154
+ deriveState: async () => ({
155
+ phase: "test",
156
+ currentMilestoneId: null,
157
+ activeSliceId: null,
158
+ activeTaskId: null,
159
+ isComplete: false,
160
+ raw: null,
161
+ }),
162
+ resolveDispatch: async () => ({ action: "skip" }),
163
+ reconcile: async () => ({ outcome: "continue" }),
164
+ getDisplayMetadata: () => ({
165
+ engineLabel: "Test Engine",
166
+ currentPhase: "test",
167
+ progressSummary: "testing",
168
+ stepCount: null,
169
+ }),
170
+ };
171
+
172
+ assert.equal(engine.engineId, "test-engine");
173
+ assert.equal(typeof engine.deriveState, "function");
174
+ assert.equal(typeof engine.resolveDispatch, "function");
175
+ assert.equal(typeof engine.reconcile, "function");
176
+ assert.equal(typeof engine.getDisplayMetadata, "function");
152
177
  });
153
178
  });
154
179
 
155
180
  // ── ExecutionPolicy interface shape ─────────────────────────────────────────
156
181
 
157
182
  describe("ExecutionPolicy interface shape", () => {
158
- test("ExecutionPolicy has all required methods", () => {
159
- const source = readSource(EXECUTION_POLICY_PATH);
160
-
161
- const requiredMethods = [
162
- "prepareWorkspace",
163
- "selectModel",
164
- "verify",
165
- "recover",
166
- "closeout",
167
- ];
168
-
169
- for (const method of requiredMethods) {
170
- assert.ok(
171
- source.includes(method),
172
- `ExecutionPolicy must contain method: ${method}`,
173
- );
174
- }
183
+ test("ExecutionPolicy accepts an object with all required methods", () => {
184
+ const policy: ExecutionPolicy = {
185
+ prepareWorkspace: async () => {},
186
+ selectModel: async () => null,
187
+ verify: async () => "continue",
188
+ recover: async () => ({ outcome: "retry" } as RecoveryAction),
189
+ closeout: async () => ({ committed: true, artifacts: [] } as CloseoutResult),
190
+ };
191
+
192
+ assert.equal(typeof policy.prepareWorkspace, "function");
193
+ assert.equal(typeof policy.selectModel, "function");
194
+ assert.equal(typeof policy.verify, "function");
195
+ assert.equal(typeof policy.recover, "function");
196
+ assert.equal(typeof policy.closeout, "function");
175
197
  });
176
198
  });
177
199
 
@@ -220,12 +242,16 @@ describe("Resolver stub behavior", () => {
220
242
  );
221
243
  });
222
244
 
223
- test("ResolvedEngine type is exported (source check)", () => {
224
- const source = readSource(ENGINE_RESOLVER_PATH);
225
- assert.ok(
226
- /export\s+(interface|type)\s+ResolvedEngine/.test(source),
227
- "engine-resolver.ts must export ResolvedEngine type",
228
- );
245
+ test("ResolvedEngine type is exported and has the expected shape", () => {
246
+ // Type-level assertion: ResolvedEngine must be { engine: WorkflowEngine; policy: ExecutionPolicy }.
247
+ // If the export or shape changes, the typecheck step fails.
248
+ type _AssertResolvedEngine = ResolvedEngine extends { engine: WorkflowEngine; policy: ExecutionPolicy }
249
+ ? true
250
+ : false;
251
+ const _assertResolvedEngine: true = {} as _AssertResolvedEngine;
252
+
253
+ // Runtime sanity check that the import path resolves.
254
+ assert.ok(_assertResolvedEngine === undefined || true);
229
255
  });
230
256
  });
231
257
 
@@ -11,7 +11,10 @@ import * as path from 'node:path';
11
11
  import * as os from 'node:os';
12
12
  import * as fs from 'node:fs';
13
13
  import { createRequire } from 'node:module';
14
+ import { spawnSync } from 'node:child_process';
15
+ import { fileURLToPath, pathToFileURL } from 'node:url';
14
16
  import { closeDatabase, isDbAvailable, getDecisionById, SCHEMA_VERSION, _getAdapter } from '../gsd-db.ts';
17
+ import { formatWorkflowDatabaseOpenFailure } from '../bootstrap/dynamic-tools.ts';
15
18
 
16
19
  const _require = createRequire(import.meta.url);
17
20
 
@@ -288,6 +291,116 @@ function createLegacyV15Db(dbPath: string): void {
288
291
  // ═══════════════════════════════════════════════════════════════════════════
289
292
 
290
293
  describe('ensure-db-open', () => {
294
+ test('formatWorkflowDatabaseOpenFailure: open failure without provider gives actionable SQLite guidance', () => {
295
+ const message = formatWorkflowDatabaseOpenFailure(
296
+ {
297
+ ok: false,
298
+ reason: 'open-failed',
299
+ location: {
300
+ projectRoot: '/tmp/example',
301
+ projectGsd: '/tmp/example/.gsd',
302
+ projectDb: '/tmp/example/.gsd/gsd.db',
303
+ },
304
+ },
305
+ {
306
+ available: false,
307
+ provider: null,
308
+ attempted: true,
309
+ lastError: null,
310
+ lastPhase: null,
311
+ },
312
+ '22.15.0',
313
+ );
314
+
315
+ assert.match(message, /\/tmp\/example\/\.gsd\/gsd\.db/);
316
+ assert.match(message, /No SQLite provider available/);
317
+ assert.match(message, /node:sqlite/);
318
+ assert.match(message, /better-sqlite3/);
319
+ });
320
+
321
+ test('formatWorkflowDatabaseOpenFailure: old Node includes upgrade guidance', () => {
322
+ const message = formatWorkflowDatabaseOpenFailure(
323
+ {
324
+ ok: false,
325
+ reason: 'open-failed',
326
+ location: {
327
+ projectRoot: '/tmp/example',
328
+ projectGsd: '/tmp/example/.gsd',
329
+ projectDb: '/tmp/example/.gsd/gsd.db',
330
+ },
331
+ },
332
+ {
333
+ available: false,
334
+ provider: null,
335
+ attempted: true,
336
+ lastError: null,
337
+ lastPhase: null,
338
+ },
339
+ '20.11.1',
340
+ );
341
+
342
+ assert.match(message, />= 22\.0\.0/);
343
+ assert.match(message, /current: v20\.11\.1/);
344
+ });
345
+
346
+ test('ensureDbOpen: source-mode runtime without node:sqlite records actionable guidance', () => {
347
+ const loaderPath = fileURLToPath(new URL('./resolve-ts.mjs', import.meta.url));
348
+ const runningFromDistTest = fileURLToPath(import.meta.url).includes(`${path.sep}dist-test${path.sep}`);
349
+ const dynamicToolsImportUrl = pathToFileURL(
350
+ path.resolve(
351
+ runningFromDistTest
352
+ ? 'dist-test/src/resources/extensions/gsd/bootstrap/dynamic-tools.js'
353
+ : 'src/resources/extensions/gsd/bootstrap/dynamic-tools.ts',
354
+ ),
355
+ ).href;
356
+ const loggerImportUrl = pathToFileURL(
357
+ path.resolve(
358
+ runningFromDistTest
359
+ ? 'dist-test/src/resources/extensions/gsd/workflow-logger.ts'
360
+ : 'src/resources/extensions/gsd/workflow-logger.ts',
361
+ ),
362
+ ).href;
363
+ const script = `
364
+ const fs = require('node:fs');
365
+ const os = require('node:os');
366
+ const path = require('node:path');
367
+ (async () => {
368
+ const base = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-missing-sqlite-'));
369
+ try {
370
+ fs.mkdirSync(path.join(base, '.gsd'), { recursive: true });
371
+ const dynamicTools = await import(${JSON.stringify(dynamicToolsImportUrl)});
372
+ const logger = await import(${JSON.stringify(loggerImportUrl)});
373
+ await dynamicTools.ensureDbOpen(base);
374
+ const messages = logger.peekLogs().map((entry) => entry.message);
375
+ console.log(JSON.stringify(messages));
376
+ } finally {
377
+ fs.rmSync(base, { recursive: true, force: true });
378
+ }
379
+ })().catch((error) => {
380
+ console.error(error.stack || error.message || String(error));
381
+ process.exit(1);
382
+ });
383
+ `;
384
+ const result = spawnSync(
385
+ process.execPath,
386
+ [
387
+ '--no-experimental-sqlite',
388
+ '--import',
389
+ loaderPath,
390
+ '--experimental-strip-types',
391
+ '-e',
392
+ script,
393
+ ],
394
+ { cwd: process.cwd(), encoding: 'utf-8' },
395
+ );
396
+
397
+ assert.equal(result.status, 0, result.stderr);
398
+ const messages = JSON.parse(result.stdout.trim()) as string[];
399
+ assert.ok(messages.some((message) => /No SQLite provider available/.test(message)), result.stdout);
400
+ assert.ok(messages.some((message) => /node:sqlite/.test(message)), result.stdout);
401
+ assert.ok(messages.some((message) => /better-sqlite3/.test(message)), result.stdout);
402
+ });
403
+
291
404
  test('ensureDbOpen: creates empty DB without importing Markdown', async () => {
292
405
  const tmpDir = makeTmpDir();
293
406
  const gsdDir = path.join(tmpDir, '.gsd');
@@ -4,10 +4,13 @@
4
4
  import test from "node:test";
5
5
  import assert from "node:assert/strict";
6
6
  import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
7
+ import { execFileSync } from "node:child_process";
7
8
  import { join } from "node:path";
8
9
  import { tmpdir } from "node:os";
9
10
 
10
11
  import { buildGsdHomeModel, showGsdHome } from "../gsd-command-home.ts";
12
+ import { buildIdleMenuSummary, detectIdleMilestoneResidueHint } from "../closeout-wizard.ts";
13
+ import { closeDatabase, insertMilestone, openDatabase } from "../gsd-db.ts";
11
14
  import type { GSDState } from "../types.ts";
12
15
 
13
16
  function baseState(overrides: Partial<GSDState> = {}): GSDState {
@@ -118,6 +121,123 @@ test("/gsd home recommends start or configure after all milestones complete", ()
118
121
  assert.match(model.summary.join("\n"), /All milestones complete/);
119
122
  });
120
123
 
124
+ test("/gsd home recommends fix or recover when milestone git residue is stranded", () => {
125
+ const model = buildGsdHomeModel(baseState({
126
+ activeMilestone: null,
127
+ activeSlice: null,
128
+ activeTask: null,
129
+ phase: "complete",
130
+ nextAction: "All milestones complete.",
131
+ }), {
132
+ strandedQuick: null,
133
+ unmergedMilestones: [],
134
+ idleResidueHint: {
135
+ milestoneIds: ["M008"],
136
+ message:
137
+ "Stranded milestone git residue detected (M008: worktree dir and/or milestone/* branch). " +
138
+ "Run /gsd dispatch complete-milestone M008 or /gsd status to recover closeout before starting new work.",
139
+ },
140
+ });
141
+
142
+ assert.equal(action(model, "fix_recover").recommended, true);
143
+ assert.equal(action(model, "fix_recover").enabled, true);
144
+ assert.match(model.summary[0], /Stranded milestone git residue/);
145
+ assert.equal(action(model, "continue_step").enabled, false);
146
+ });
147
+
148
+ test("detectIdleMilestoneResidueHint reports missing workflow database in a git repo", () => {
149
+ const base = mkdtempSync(join(tmpdir(), "gsd-home-residue-"));
150
+ try {
151
+ execFileSync("git", ["init", "-b", "main"], { cwd: base, stdio: "ignore" });
152
+ const hint = detectIdleMilestoneResidueHint(base);
153
+ assert.ok(hint);
154
+ assert.match(hint!.message, /\.gsd\/gsd\.db/);
155
+ } finally {
156
+ rmSync(base, { recursive: true, force: true });
157
+ }
158
+ });
159
+
160
+ test("detectIdleMilestoneResidueHint matches unique-format milestone ids (M###-abc123)", () => {
161
+ const base = mkdtempSync(join(tmpdir(), "gsd-home-residue-unique-"));
162
+ try {
163
+ execFileSync("git", ["init", "-b", "main"], { cwd: base, stdio: "ignore" });
164
+ mkdirSync(join(base, ".gsd-worktrees", "M042-abc123"), { recursive: true });
165
+ mkdirSync(join(base, ".gsd"), { recursive: true });
166
+
167
+ openDatabase(join(base, ".gsd", "gsd.db"));
168
+ try {
169
+ // Closed milestone with lingering worktree dir — classic residue.
170
+ insertMilestone({ id: "M042-abc123", title: "Closed Unique", status: "complete" });
171
+ const hint = detectIdleMilestoneResidueHint(base);
172
+ assert.ok(hint, "unique-format closed milestone with worktree should be detected");
173
+ assert.deepEqual(hint!.milestoneIds, ["M042-abc123"]);
174
+ assert.match(hint!.message, /M042-abc123/);
175
+ } finally {
176
+ closeDatabase();
177
+ }
178
+ } finally {
179
+ rmSync(base, { recursive: true, force: true });
180
+ }
181
+ });
182
+
183
+ test("detectIdleMilestoneResidueHint ignores in-flight milestones with worktree artifacts", () => {
184
+ const base = mkdtempSync(join(tmpdir(), "gsd-home-residue-active-"));
185
+ try {
186
+ execFileSync("git", ["init", "-b", "main"], { cwd: base, stdio: "ignore" });
187
+ mkdirSync(join(base, ".gsd-worktrees", "M001"), { recursive: true });
188
+ mkdirSync(join(base, ".gsd-worktrees", "M002-abc123"), { recursive: true });
189
+ mkdirSync(join(base, ".gsd"), { recursive: true });
190
+
191
+ openDatabase(join(base, ".gsd", "gsd.db"));
192
+ try {
193
+ // Active and pending milestones must not be flagged as stranded residue.
194
+ insertMilestone({ id: "M001", title: "Active milestone", status: "active" });
195
+ insertMilestone({ id: "M002-abc123", title: "Pending milestone", status: "pending" });
196
+ const hint = detectIdleMilestoneResidueHint(base);
197
+ assert.equal(hint, null, "active/pending milestone worktrees must not be classified as residue");
198
+ } finally {
199
+ closeDatabase();
200
+ }
201
+ } finally {
202
+ rmSync(base, { recursive: true, force: true });
203
+ }
204
+ });
205
+
206
+ test("buildIdleMenuSummary surfaces idle residue hint even when phase is complete", () => {
207
+ const summary = buildIdleMenuSummary(
208
+ {
209
+ activeMilestone: null,
210
+ activeSlice: null,
211
+ activeTask: null,
212
+ phase: "complete",
213
+ recentDecisions: [],
214
+ blockers: [],
215
+ nextAction: "All milestones complete.",
216
+ lastCompletedMilestone: { id: "M001", title: "Menu Cleanup" },
217
+ registry: [{ id: "M001", title: "Menu Cleanup", status: "complete" }],
218
+ requirements: { active: 0, validated: 0, deferred: 0, outOfScope: 0, blocked: 0, total: 0 },
219
+ progress: {
220
+ milestones: { done: 1, total: 1 },
221
+ slices: { done: 0, total: 0 },
222
+ tasks: { done: 0, total: 0 },
223
+ },
224
+ },
225
+ {
226
+ strandedQuick: null,
227
+ unmergedMilestones: [],
228
+ idleResidueHint: {
229
+ milestoneIds: ["M008"],
230
+ message:
231
+ "Stranded milestone git residue detected (M008: worktree dir and/or milestone/* branch). " +
232
+ "Run /gsd dispatch complete-milestone M008 or /gsd status to recover closeout before starting new work.",
233
+ },
234
+ },
235
+ );
236
+
237
+ assert.match(summary[0] ?? "", /Stranded milestone git residue/);
238
+ assert.doesNotMatch(summary.join("\n"), /All milestones complete/);
239
+ });
240
+
121
241
  test("showGsdHome renders the five-slot home text without an interactive TUI", async () => {
122
242
  const base = mkdtempSync(join(tmpdir(), "gsd-home-"));
123
243
  const notifications: Array<{ message: string; level: string }> = [];
@@ -30,6 +30,8 @@ import {
30
30
  insertTask,
31
31
  getTask,
32
32
  getSliceTasks,
33
+ getMilestoneSliceSummaries,
34
+ getClosedSliceIds,
33
35
  getActiveMilestoneFromDb,
34
36
  deleteMilestone,
35
37
  clearEngineHierarchy,
@@ -39,7 +41,9 @@ import {
39
41
  refreshOpenDatabaseFromDisk,
40
42
  tryCreateMemoriesFts,
41
43
  _isLikelyWslDrvFsPathForTest,
44
+ _shouldAttemptVacuumRecoveryForTest,
42
45
  } from '../gsd-db.ts';
46
+ import { MigrationBackupError } from '../db-migration-backup.ts';
43
47
  import { _resetLogs, peekLogs, setStderrLoggingEnabled } from '../workflow-logger.ts';
44
48
 
45
49
  const _require = createRequire(import.meta.url);
@@ -537,6 +541,23 @@ describe('gsd-db', () => {
537
541
  cleanup(dbPath);
538
542
  });
539
543
 
544
+ test('gsd-db: migration backup errors bypass malformed-DB VACUUM recovery', () => {
545
+ assert.equal(
546
+ _shouldAttemptVacuumRecoveryForTest(
547
+ true,
548
+ new MigrationBackupError('database disk image is malformed during backup'),
549
+ ),
550
+ false,
551
+ );
552
+ assert.equal(
553
+ _shouldAttemptVacuumRecoveryForTest(
554
+ true,
555
+ new Error('database disk image is malformed'),
556
+ ),
557
+ true,
558
+ );
559
+ });
560
+
540
561
  test('gsd-db: pre-v18 DB with memory_sources missing scope opens without crash (issue #4607)', () => {
541
562
  // Regression: initSchema() ran CREATE INDEX on memories.scope and
542
563
  // memory_sources.scope unconditionally, before the v18 migration adds those
@@ -947,6 +968,31 @@ describe('gsd-db', () => {
947
968
  closeDatabase();
948
969
  });
949
970
 
971
+ test('gsd-db: slice summaries use the canonical closed vocabulary; getClosedSliceIds filters to closed ids', () => {
972
+ openDatabase(':memory:');
973
+ insertMilestone({ id: 'M001', status: 'active' });
974
+ insertSlice({ milestoneId: 'M001', id: 'S01', title: 'Complete', status: 'complete', depends: [], sequence: 1 });
975
+ insertSlice({ milestoneId: 'M001', id: 'S02', title: 'Done', status: 'done', depends: ['S01'], sequence: 2 });
976
+ insertSlice({ milestoneId: 'M001', id: 'S03', title: 'Skipped', status: 'skipped', depends: [], sequence: 3 });
977
+ insertSlice({ milestoneId: 'M001', id: 'S04', title: 'Closed', status: 'closed', depends: [], sequence: 4 });
978
+ insertSlice({ milestoneId: 'M001', id: 'S05', title: 'Active', status: 'active', depends: [], sequence: 5 });
979
+ insertSlice({ milestoneId: 'M001', id: 'S06', title: 'Pending', status: 'pending', depends: ['S05'], sequence: 6 });
980
+
981
+ const summaries = getMilestoneSliceSummaries('M001');
982
+ assert.deepStrictEqual(summaries[0], { id: 'S01', title: 'Complete', done: true, depends: [] });
983
+ assert.deepStrictEqual(summaries[5], { id: 'S06', title: 'Pending', done: false, depends: ['S05'] });
984
+ assert.deepStrictEqual(
985
+ summaries.map((s) => s.done),
986
+ [true, true, true, true, false, false],
987
+ 'complete/done/skipped/closed are closed; active/pending are not',
988
+ );
989
+
990
+ assert.deepStrictEqual(getClosedSliceIds('M001'), ['S01', 'S02', 'S03', 'S04']);
991
+ assert.deepStrictEqual(getClosedSliceIds('M999'), [], 'unknown milestone yields no closed ids');
992
+
993
+ closeDatabase();
994
+ });
995
+
950
996
  test('gsd-db: FTS5 unavailable warning normalizes provider typo', () => {
951
997
  const previousStderr = setStderrLoggingEnabled(false);
952
998
  _resetLogs();
@@ -10,6 +10,8 @@ import {
10
10
  recoveryRemediation,
11
11
  needsAttentionBlockerGuidance,
12
12
  needsRemediationBlockerGuidance,
13
+ uatSignoffBlockerGuidance,
14
+ worktreeCreationFailedGuidance,
13
15
  crashResumeHint,
14
16
  doctorFixHint,
15
17
  type RecoveryGuidanceKey,
@@ -95,6 +97,27 @@ describe("milestone blocker guidance", () => {
95
97
  assert.match(text, /\/gsd status/);
96
98
  assert.match(text, /\/gsd validate-milestone/);
97
99
  });
100
+
101
+ test("UAT sign-off guidance explains direct dispatch target", () => {
102
+ const missing = uatSignoffBlockerGuidance("M007", "S02");
103
+ const failing = uatSignoffBlockerGuidance("M007", "S02", "FAIL");
104
+
105
+ for (const text of [missing, failing]) {
106
+ assert.match(text, /Manual UAT sign-off \(PASS\) is required before milestone closure/);
107
+ assert.match(text, /\/gsd dispatch uat/);
108
+ assert.match(text, /most recently completed slice/);
109
+ assert.match(text, /re-run UAT for S02/);
110
+ assert.match(text, /gsd_uat_result_save/);
111
+ }
112
+ });
113
+
114
+ test("worktree creation failure guidance does not claim bootstrap continues", () => {
115
+ const text = worktreeCreationFailedGuidance("M007", "boom");
116
+
117
+ assert.match(text, /Auto-worktree creation for M007 failed: boom\. Continuing in project root\./);
118
+ assert.match(text, /Worktree isolation is degraded for this session\./);
119
+ assert.doesNotMatch(text, /work continues in the project root/i);
120
+ });
98
121
  });
99
122
 
100
123
  describe("crash resume hints", () => {