@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
@@ -28,13 +28,17 @@ export function buildGsdHomeModel(state, closeout) {
28
28
  const workLabel = activeWorkLabel(state);
29
29
  const strandedQuick = closeout?.strandedQuick ?? null;
30
30
  const unmergedMilestone = closeout?.unmergedMilestones?.[0];
31
+ const idleResidueHint = closeout?.idleResidueHint ?? null;
32
+ const hasIdleResidue = Boolean(idleResidueHint);
31
33
  const nextReason = complete
32
34
  ? "all milestones are complete"
33
35
  : blocked
34
36
  ? "the active milestone is blocked"
35
- : !hasActiveWork
36
- ? "there is no active milestone"
37
- : "";
37
+ : hasIdleResidue
38
+ ? "milestone git residue needs recovery"
39
+ : !hasActiveWork
40
+ ? "there is no active milestone"
41
+ : "";
38
42
  const canAdvance = hasActiveWork && !blocked && !complete;
39
43
  const unmappedActive = complete ? countUnmappedActiveRequirements() : 0;
40
44
  const recommended = strandedQuick
@@ -43,11 +47,13 @@ export function buildGsdHomeModel(state, closeout) {
43
47
  ? "finish_milestone"
44
48
  : blocked
45
49
  ? "fix_recover"
46
- : canAdvance
47
- ? "continue_step"
48
- : complete && unmappedActive > 0
49
- ? "review_requirements_backlog"
50
- : "start_configure";
50
+ : hasIdleResidue
51
+ ? "fix_recover"
52
+ : canAdvance
53
+ ? "continue_step"
54
+ : complete && unmappedActive > 0
55
+ ? "review_requirements_backlog"
56
+ : "start_configure";
51
57
  const completionSummary = complete
52
58
  ? appendRequirementsBacklogToSummary(state, [
53
59
  `All milestones complete${state.lastCompletedMilestone ? ` after ${state.lastCompletedMilestone.id}: ${state.lastCompletedMilestone.title}` : ""}.`,
@@ -57,7 +63,9 @@ export function buildGsdHomeModel(state, closeout) {
57
63
  ? [`Quick task Q${strandedQuick.taskNum} finished on ${strandedQuick.quickBranch} but is not merged to ${strandedQuick.originalBranch}.`]
58
64
  : unmergedMilestone
59
65
  ? [`${unmergedMilestone.milestoneId} is complete but not merged into ${unmergedMilestone.integrationBranch}.`]
60
- : completionSummary;
66
+ : idleResidueHint
67
+ ? [idleResidueHint.message]
68
+ : completionSummary;
61
69
  return {
62
70
  title: "GSD — What now?",
63
71
  summary: [
@@ -130,10 +138,12 @@ export function buildGsdHomeModel(state, closeout) {
130
138
  label: "Fix or recover",
131
139
  description: blocked
132
140
  ? "Review the blocker and recovery commands for the active milestone."
133
- : disabled("This becomes active when closeout, validation, or state recovery is needed.", "no blocker is active"),
134
- enabled: blocked,
141
+ : hasIdleResidue
142
+ ? "Review stranded milestone worktrees/branches and run the suggested recovery command."
143
+ : disabled("This becomes active when closeout, validation, or state recovery is needed.", "no blocker is active"),
144
+ enabled: blocked || hasIdleResidue,
135
145
  recommended: recommended === "fix_recover",
136
- disabledReason: blocked ? undefined : "no blocker is active",
146
+ disabledReason: blocked || hasIdleResidue ? undefined : "no blocker is active",
137
147
  },
138
148
  {
139
149
  id: "start_configure",
@@ -3,13 +3,15 @@
3
3
  //
4
4
  // ─── Single-writer invariant ─────────────────────────────────────────────
5
5
  // Every write-SQL statement against `.gsd/gsd.db` lives behind a typed
6
- // wrapper in the single-writer layer (this file plus db/writers/*). Connection
7
- // ownership, lifecycle, schema/migrations and transaction primitives live in
8
- // db/engine.ts and are re-exported here for backward compatibility, so callers
9
- // keep importing from "./gsd-db.js".
6
+ // wrapper in the explicit writer allowlist: this compatibility barrel,
7
+ // db/writers/*, typed coordination/runtime writers, schema/migration helpers,
8
+ // and ADR backfill helpers. Connection ownership, lifecycle, schema/migrations,
9
+ // and transaction primitives live in db/engine.ts and are re-exported here for
10
+ // backward compatibility, so callers keep importing from "./gsd-db.js".
10
11
  //
11
12
  // `_getAdapter()` (re-exported from the engine) is retained for read-only
12
- // SELECTs in query modules. Do NOT use it for writes — add a wrapper here.
13
+ // SELECTs in query modules. Do NOT use it for writes — add or call a typed
14
+ // wrapper in the explicit writer layer.
13
15
  //
14
16
  // The separate `.gsd/unit-claims.db` (unit-ownership.ts) is an intentionally
15
17
  // independent store and is excluded from this invariant.
@@ -22,10 +24,10 @@ import { isClosedStatus } from "./status-guards.js";
22
24
  // primitives now live in the engine; re-export the full public surface so
23
25
  // existing `from "./gsd-db.js"` imports keep working.
24
26
  export * from "./db/engine.js";
25
- import { transaction, getDbOrNull } from "./db/engine.js";
27
+ import { immediateTransaction, transaction, getDb, getDbOrNull } from "./db/engine.js";
26
28
  // ─── Single Writer Layer re-exports ──────────────────────────────────────
27
- // Write subsystems live in db/writers/*; re-exported here so callers keep
28
- // importing from "./gsd-db.js".
29
+ // Domain write subsystems live in db/writers/*; re-exported here so callers
30
+ // keep importing from "./gsd-db.js".
29
31
  export * from "./db/writers/memory.js";
30
32
  export * from "./db/writers/reconcile.js";
31
33
  export * from "./db/writers/import-restore.js";
@@ -169,7 +171,7 @@ export function insertArtifact(a) {
169
171
  export function insertMilestone(m) {
170
172
  if (!getDbOrNull())
171
173
  throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
172
- getDbOrNull().prepare(`INSERT OR IGNORE INTO milestones (
174
+ const result = getDbOrNull().prepare(`INSERT OR IGNORE INTO milestones (
173
175
  id, title, status, depends_on, created_at,
174
176
  vision, success_criteria, key_risks, proof_strategy,
175
177
  verification_contract, verification_integration, verification_operational, verification_uat,
@@ -199,6 +201,7 @@ export function insertMilestone(m) {
199
201
  ":requirement_coverage": m.planning?.requirementCoverage ?? "",
200
202
  ":boundary_map_markdown": m.planning?.boundaryMapMarkdown ?? "",
201
203
  });
204
+ return (result.changes ?? 0) > 0;
202
205
  }
203
206
  export function upsertMilestonePlanning(milestoneId, planning) {
204
207
  if (!getDbOrNull())
@@ -528,21 +531,14 @@ export function insertVerificationEvidence(e) {
528
531
  });
529
532
  }
530
533
  export function setMilestoneQueueOrder(order) {
531
- if (!getDbOrNull())
532
- throw new GSDError(GSD_STALE_STATE, "gsd-db: No database open");
533
- getDbOrNull().exec("BEGIN IMMEDIATE");
534
- try {
535
- getDbOrNull().prepare("UPDATE milestones SET sequence = 0").run();
536
- const stmt = getDbOrNull().prepare("UPDATE milestones SET sequence = :sequence WHERE id = :id");
534
+ const db = getDb();
535
+ immediateTransaction(() => {
536
+ db.prepare("UPDATE milestones SET sequence = 0").run();
537
+ const stmt = db.prepare("UPDATE milestones SET sequence = :sequence WHERE id = :id");
537
538
  order.forEach((id, index) => {
538
539
  stmt.run({ ":id": id, ":sequence": index + 1 });
539
540
  });
540
- getDbOrNull().exec("COMMIT");
541
- }
542
- catch (err) {
543
- getDbOrNull().exec("ROLLBACK");
544
- throw err;
545
- }
541
+ });
546
542
  }
547
543
  function getMilestoneStatusForUpdate(milestoneId) {
548
544
  if (!getDbOrNull())
@@ -55,6 +55,66 @@ export function needsRemediationBlockerGuidance(milestoneId) {
55
55
  `3. If this should wait, defer it explicitly: \`/gsd park ${milestoneId}\``,
56
56
  ].join("\n");
57
57
  }
58
+ // ─── Milestone closeout UAT sign-off blockers ───────────────────────────
59
+ // The first sentence is the blocker finding; the numbered steps are the
60
+ // resolution path. `verdict` is the recorded non-PASS verdict, or undefined
61
+ // when no verdict has been recorded at all.
62
+ export function uatSignoffBlockerGuidance(milestoneId, sliceId, verdict) {
63
+ const finding = verdict === undefined
64
+ ? `missing UAT PASS verdict for ${sliceId}`
65
+ : `UAT verdict for ${sliceId} is "${verdict}"`;
66
+ const sliceSpecificRerunStep = `If ${sliceId} is not the most recently completed slice, type a chat request to re-run UAT for ${sliceId}; run-uat will record the verdict through \`gsd_uat_result_save\`.`;
67
+ const steps = verdict === undefined
68
+ ? [
69
+ `1. Run UAT for the most recently completed slice to record a verdict: \`/gsd dispatch uat\``,
70
+ `2. ${sliceSpecificRerunStep}`,
71
+ `3. Review the UAT criteria and progress: \`/gsd status\``,
72
+ `4. After UAT records PASS, run \`/gsd auto\` to complete the milestone.`,
73
+ ]
74
+ : [
75
+ `1. Review the failing UAT findings: \`/gsd status\` (the ${sliceId} ASSESSMENT records what failed)`,
76
+ `2. Fix the issue, then re-run UAT for the most recently completed slice to record a fresh verdict: \`/gsd dispatch uat\``,
77
+ `3. ${sliceSpecificRerunStep}`,
78
+ `4. If the fix needs new implementation work, add remediation slices: \`/gsd dispatch reassess\``,
79
+ `5. After UAT records PASS, run \`/gsd auto\` to complete the milestone.`,
80
+ ];
81
+ return [
82
+ `Cannot complete milestone ${milestoneId}: ${finding}. Manual UAT sign-off (PASS) is required before milestone closure.`,
83
+ `Fix options:`,
84
+ ...steps,
85
+ ].join("\n");
86
+ }
87
+ // ─── Worktree isolation degradation ─────────────────────────────────────
88
+ // The first sentence of each notice is load-bearing for log matching and
89
+ // tests — keep it intact and append guidance after it.
90
+ function restoreIsolationHint(milestoneId) {
91
+ return `To restore isolation: close any processes using the old worktree, merge salvageable work with \`/gsd worktree merge ${milestoneId}\` or remove the stale worktree with \`/gsd worktree remove ${milestoneId}\`, then run \`/gsd doctor fix\`.`;
92
+ }
93
+ export function worktreeCreationFailedGuidance(milestoneId, error) {
94
+ return [
95
+ `Auto-worktree creation for ${milestoneId} failed: ${error}. Continuing in project root.`,
96
+ `Worktree isolation is degraded for this session.`,
97
+ restoreIsolationHint(milestoneId),
98
+ ].join("\n");
99
+ }
100
+ export function isolationDegradedFallbackGuidance(milestoneId) {
101
+ return [
102
+ `Worktree isolation is degraded. Fell back to branch milestone/${milestoneId}.`,
103
+ `Work continues safely on the milestone branch in the project root.`,
104
+ restoreIsolationHint(milestoneId),
105
+ ].join("\n");
106
+ }
107
+ /** Hard entry blockers from auto-start: bootstrap stopped, user must act. */
108
+ export function milestoneEntryBlockedGuidance(milestoneId, reason) {
109
+ const finding = reason === "creation-failed"
110
+ ? `worktree/branch creation failed. Isolation is degraded.`
111
+ : `isolation is degraded from a prior worktree failure.`;
112
+ return [
113
+ `Cannot enter milestone ${milestoneId}: ${finding}`,
114
+ restoreIsolationHint(milestoneId),
115
+ `Then run \`/gsd auto\` to retry.`,
116
+ ].join("\n");
117
+ }
58
118
  // ─── Crash recovery resume hints ────────────────────────────────────────
59
119
  /** Resume hint for an interrupted auto-mode unit, by unit class. */
60
120
  export function crashResumeHint(unitType, unitId) {
@@ -42,9 +42,15 @@ export { nextMilestoneIdReserved } from "./milestone-id-reservation.js";
42
42
  import { parkMilestone, discardMilestone } from "./milestone-actions.js";
43
43
  import { buildCloseoutMenuActions, buildIdleMenuSummary, getPrimaryCloseoutRecommendation, handleCloseoutChoice, loadCloseoutContext, } from "./closeout-wizard.js";
44
44
  import { buildRequirementsBacklogDiscussContext, countUnmappedActiveRequirements, showRequirementsBacklogReview, } from "./requirements-backlog.js";
45
- import { selectAndApplyModel } from "./auto-model-selection.js";
45
+ import { selectAndApplyModel, getRegisteredToolSnapshot } from "./auto-model-selection.js";
46
46
  import { DISCUSS_TOOLS_ALLOWLIST } from "./constants.js";
47
- import { getWorkflowTransportSupportError, getRequiredWorkflowToolsForGuidedUnit, supportsStructuredQuestions, } from "./workflow-mcp.js";
47
+ import { detectWorkflowMcpLaunchConfig, resolveWorkflowMcpProjectRoot, supportsStructuredQuestions, } from "./workflow-mcp.js";
48
+ import { usesWorkflowMcpTransport } from "./question-transport.js";
49
+ import { getCachedWorkflowMcpProbe, probeAndCacheWorkflowMcp, warmWorkflowMcpProbeInBackground, workflowMcpProbeAdvertisesSurface, WORKFLOW_MCP_PROBE_TIMEOUT_MS, } from "./workflow-mcp-readiness-cache.js";
50
+ import { probeCoversRequiredWorkflowTools } from "./tool-surface-readiness.js";
51
+ import { getRequiredWorkflowToolsForUnit } from "./unit-tool-contracts.js";
52
+ import { isWorkflowToolSurfaceName } from "./workflow-tool-surface.js";
53
+ import { getUnitWorkflowDispatchReadinessError } from "./tool-contract.js";
48
54
  import { runPreparation, formatCodebaseBrief, formatPriorContextBrief, } from "./preparation.js";
49
55
  import { verifyExpectedArtifact } from "./auto-recovery.js";
50
56
  import { clearPendingGate, extractDepthVerificationMilestoneId, getPendingGate } from "./bootstrap/write-gate.js";
@@ -368,6 +374,67 @@ async function dispatchNextDeepProjectSetupStage(entry) {
368
374
  export function resolveGuidedDispatchProjectRoot(basePath) {
369
375
  return basePath ?? process.cwd();
370
376
  }
377
+ /**
378
+ * Wait until the workflow MCP server is reachable and advertising its tool
379
+ * surface. Returns failure details when timed out, or null when ready (or MCP
380
+ * is not the transport). Called inside dispatchWorkflow() so every guided-flow
381
+ * dispatch path is gated automatically.
382
+ */
383
+ const MCP_READINESS_TIMEOUT_MS = 15_000;
384
+ const MCP_READINESS_POLL_MS = 200;
385
+ async function awaitWorkflowMcpReadiness(pi, ctx, basePath, options = {}) {
386
+ const provider = ctx.model?.provider;
387
+ const authMode = provider ? ctx.modelRegistry.getProviderAuthMode(provider) : undefined;
388
+ if (!usesWorkflowMcpTransport(authMode, ctx.model?.baseUrl))
389
+ return null;
390
+ const projectRoot = resolveWorkflowMcpProjectRoot(basePath);
391
+ const launch = detectWorkflowMcpLaunchConfig(projectRoot);
392
+ if (!launch)
393
+ return null;
394
+ const requiredTools = options.unitType
395
+ ? getRequiredWorkflowToolsForUnit(options.unitType).filter(isWorkflowToolSurfaceName)
396
+ : [];
397
+ const coversExpectedSurface = (tools) => requiredTools.length > 0
398
+ ? probeCoversRequiredWorkflowTools(tools, requiredTools)
399
+ : workflowMcpProbeAdvertisesSurface(tools);
400
+ const serverPrefix = `mcp__${launch.name}__`;
401
+ const systemPrompt = () => typeof ctx.getSystemPrompt === "function" ? ctx.getSystemPrompt() : "";
402
+ const systemPromptCoversExpectedSurface = () => {
403
+ const prompt = systemPrompt();
404
+ return requiredTools.length > 0
405
+ ? requiredTools.every((tool) => prompt.includes(`${serverPrefix}${tool}`))
406
+ : prompt.includes(serverPrefix);
407
+ };
408
+ const sessionAlreadyReady = () => coversExpectedSurface(getRegisteredToolSnapshot(pi)) ||
409
+ systemPromptCoversExpectedSurface();
410
+ if (sessionAlreadyReady())
411
+ return null;
412
+ if (coversExpectedSurface(getCachedWorkflowMcpProbe(projectRoot)?.tools ?? [])) {
413
+ return null;
414
+ }
415
+ const probe = options.probe ?? probeAndCacheWorkflowMcp;
416
+ const probeTimeoutMs = options.probeTimeoutMs ?? WORKFLOW_MCP_PROBE_TIMEOUT_MS;
417
+ ctx.ui.setStatus("gsd-step", `Waiting for ${launch.name} MCP server…`);
418
+ let lastError;
419
+ const deadline = Date.now() + (options.timeoutMs ?? MCP_READINESS_TIMEOUT_MS);
420
+ const pollMs = options.pollMs ?? MCP_READINESS_POLL_MS;
421
+ while (Date.now() < deadline) {
422
+ if (sessionAlreadyReady()) {
423
+ ctx.ui.setStatus("gsd-step", "");
424
+ return null;
425
+ }
426
+ const result = await probe(projectRoot, { timeoutMs: probeTimeoutMs });
427
+ if (result.ok && coversExpectedSurface(result.tools)) {
428
+ ctx.ui.setStatus("gsd-step", "");
429
+ return null;
430
+ }
431
+ lastError = result.error;
432
+ await new Promise((r) => setTimeout(r, pollMs));
433
+ }
434
+ ctx.ui.setStatus("gsd-step", "");
435
+ return lastError ? { server: launch.name, error: lastError } : { server: launch.name };
436
+ }
437
+ export const _awaitWorkflowMcpReadinessForTest = awaitWorkflowMcpReadiness;
371
438
  /**
372
439
  * Read GSD-WORKFLOW.md and dispatch it to the LLM with a contextual note.
373
440
  * This is the only way the wizard triggers work — everything else is the LLM's job.
@@ -382,7 +449,8 @@ async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType,
382
449
  const projectRoot = resolveGuidedDispatchProjectRoot(resolvedOptions.basePath);
383
450
  const loadPreferences = resolvedOptions.deps?.loadPreferences ?? loadEffectiveGSDPreferences;
384
451
  const selectModel = resolvedOptions.deps?.selectModel ?? selectAndApplyModel;
385
- const getTransportSupportError = resolvedOptions.deps?.getTransportSupportError ?? getWorkflowTransportSupportError;
452
+ const getDispatchReadinessError = resolvedOptions.deps?.getDispatchReadinessError
453
+ ?? getUnitWorkflowDispatchReadinessError;
386
454
  // Route through the dynamic routing pipeline (complexity classification,
387
455
  // tier downgrade, fallback chains) — same path as auto-mode dispatches (#2958).
388
456
  if (ctx && unitType) {
@@ -396,7 +464,8 @@ async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType,
396
464
  routing: result.routing,
397
465
  });
398
466
  }
399
- const compatibilityError = getTransportSupportError(result.appliedModel?.provider ?? ctx.model?.provider, getRequiredWorkflowToolsForGuidedUnit(unitType), {
467
+ const compatibilityError = getDispatchReadinessError({
468
+ provider: result.appliedModel?.provider ?? ctx.model?.provider,
400
469
  projectRoot,
401
470
  surface: "guided flow",
402
471
  unitType,
@@ -415,6 +484,25 @@ async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType,
415
484
  ctx.ui.notify(compatibilityError, "error");
416
485
  return;
417
486
  }
487
+ // ── Live MCP readiness gate ────────────────────────────────────────
488
+ // Units with required workflow tools must not dispatch until the MCP
489
+ // surface covers that exact contract; otherwise the model can race into
490
+ // "No such tool available" before recovery sees a clean readiness error.
491
+ warmWorkflowMcpProbeInBackground(projectRoot);
492
+ const requiredWorkflowTools = getRequiredWorkflowToolsForUnit(unitType).filter(isWorkflowToolSurfaceName);
493
+ const strictBlocking = requiredWorkflowTools.length > 0
494
+ && (process.env.GSD_GUIDED_MCP_BLOCKING ?? "").trim() !== "0";
495
+ if (strictBlocking) {
496
+ // If the workflow MCP server is configured but still connecting, wait
497
+ // for it instead of dispatching into a child session that will abort.
498
+ const readinessFailure = await awaitWorkflowMcpReadiness(pi, ctx, projectRoot, { unitType });
499
+ if (readinessFailure) {
500
+ const detail = readinessFailure.error ? ` ${readinessFailure.error}` : "";
501
+ ctx.ui.notify(`GSD workflow server "${readinessFailure.server}" did not connect in time.${detail} ` +
502
+ `Run \`/gsd mcp check ${readinessFailure.server}\` for details.`, "warning");
503
+ return;
504
+ }
505
+ }
418
506
  }
419
507
  // Scope tools for guided workflow turns (#2949, token-consumption savings).
420
508
  // Providers with grammar-based constrained decoding (xAI/Grok) return
@@ -1297,6 +1385,7 @@ async function handleMilestoneActions(ctx, pi, basePath, milestoneId, milestoneT
1297
1385
  }
1298
1386
  export async function showSmartEntry(ctx, pi, basePath, options) {
1299
1387
  const stepMode = options?.step ?? true;
1388
+ warmWorkflowMcpProbeInBackground(basePath);
1300
1389
  // ── Clear stale milestone ID reservations from previous cancelled sessions ──
1301
1390
  // Reservations only need to survive within a single /gsd interaction.
1302
1391
  // Without this, each cancelled session permanently bumps the next ID. (#2488)
@@ -1,7 +1,7 @@
1
1
  // Project/App: gsd-pi
2
2
  // File Purpose: Always-on ambient health signal rendered below the editor.
3
3
  import { runProviderChecks, summariseProviderIssues } from "./doctor-providers.js";
4
- import { runEnvironmentChecks } from "./doctor-environment.js";
4
+ import { runEnvironmentChecks, runEnvironmentChecksAsync } from "./doctor-environment.js";
5
5
  import { loadEffectiveGSDPreferences } from "./preferences.js";
6
6
  import { nativeIsRepo, nativeLastCommitEpoch, nativeGetCurrentBranch, nativeCommitSubject } from "./native-git-bridge.js";
7
7
  import { loadLedgerFromDisk, getProjectTotals } from "./metrics.js";
@@ -9,7 +9,28 @@ import { projectRoot } from "./commands/context.js";
9
9
  import { buildHealthLines, detectHealthWidgetProjectState, } from "./health-widget-core.js";
10
10
  export const HEALTH_WIDGET_ACTIVE_HINTS = " /gsd auto to run · /gsd status to inspect · /gsd report for snapshots · /gsd notifications for history · /gsd help";
11
11
  // ── Data loader ────────────────────────────────────────────────────────────────
12
- function loadHealthWidgetData(basePath) {
12
+ // Last-commit lookup is subprocess-backed (native-git-bridge → git spawns),
13
+ // so it is treated like the other expensive checks: skipped on first paint,
14
+ // run only by the background refresh.
15
+ function loadLastCommitInfo(basePath) {
16
+ try {
17
+ if (nativeIsRepo(basePath)) {
18
+ const branch = nativeGetCurrentBranch(basePath);
19
+ const epoch = nativeLastCommitEpoch(basePath, branch || "HEAD");
20
+ if (epoch > 0) {
21
+ return { epoch, message: nativeCommitSubject(basePath, branch || "HEAD") || null };
22
+ }
23
+ }
24
+ }
25
+ catch { /* non-fatal */ }
26
+ return { epoch: null, message: null };
27
+ }
28
+ function loadHealthWidgetData(basePath, options) {
29
+ // `includeChecks` gates the expensive subprocess-backed checks (provider +
30
+ // environment doctor: `lsof`, `docker`, `node --version`, ...). The initial
31
+ // synchronous render passes `false` so first paint is never blocked on them;
32
+ // the async refresh (off the first-paint path) runs the full suite.
33
+ const includeChecks = options?.includeChecks ?? true;
13
34
  let budgetCeiling;
14
35
  let budgetSpent = 0;
15
36
  let providerIssue = null;
@@ -28,13 +49,57 @@ function loadHealthWidgetData(basePath) {
28
49
  }
29
50
  }
30
51
  catch { /* non-fatal */ }
52
+ if (includeChecks) {
53
+ try {
54
+ const providerResults = runProviderChecks();
55
+ providerIssue = summariseProviderIssues(providerResults);
56
+ }
57
+ catch { /* non-fatal */ }
58
+ try {
59
+ const envResults = runEnvironmentChecks(basePath);
60
+ for (const r of envResults) {
61
+ if (r.status === "error")
62
+ environmentErrorCount++;
63
+ else if (r.status === "warning")
64
+ environmentWarningCount++;
65
+ }
66
+ }
67
+ catch { /* non-fatal */ }
68
+ }
69
+ // ── Last commit info ── (git spawns — gated like the other expensive checks)
70
+ if (includeChecks) {
71
+ const commit = loadLastCommitInfo(basePath);
72
+ lastCommitEpoch = commit.epoch;
73
+ lastCommitMessage = commit.message;
74
+ }
75
+ return {
76
+ projectState,
77
+ budgetCeiling,
78
+ budgetSpent,
79
+ providerIssue,
80
+ environmentErrorCount,
81
+ environmentWarningCount,
82
+ lastCommitEpoch,
83
+ lastCommitMessage,
84
+ lastRefreshed: Date.now(),
85
+ };
86
+ }
87
+ // Non-blocking variant used by the widget's background refresh: the cheap fields
88
+ // come from the synchronous snapshot, then provider + environment checks are
89
+ // layered in off the event-loop critical path (env checks run concurrently via
90
+ // runEnvironmentChecksAsync). Keeps the always-on widget from stalling the UI on
91
+ // its initial enrichment or its 60s refresh.
92
+ async function loadHealthWidgetDataAsync(basePath) {
93
+ const data = loadHealthWidgetData(basePath, { includeChecks: false });
94
+ let providerIssue = data.providerIssue;
95
+ let environmentErrorCount = 0;
96
+ let environmentWarningCount = 0;
31
97
  try {
32
- const providerResults = runProviderChecks();
33
- providerIssue = summariseProviderIssues(providerResults);
98
+ providerIssue = summariseProviderIssues(runProviderChecks());
34
99
  }
35
100
  catch { /* non-fatal */ }
36
101
  try {
37
- const envResults = runEnvironmentChecks(basePath);
102
+ const envResults = await runEnvironmentChecksAsync(basePath);
38
103
  for (const r of envResults) {
39
104
  if (r.status === "error")
40
105
  environmentErrorCount++;
@@ -43,27 +108,14 @@ function loadHealthWidgetData(basePath) {
43
108
  }
44
109
  }
45
110
  catch { /* non-fatal */ }
46
- // ── Last commit info ──
47
- try {
48
- if (nativeIsRepo(basePath)) {
49
- const branch = nativeGetCurrentBranch(basePath);
50
- const epoch = nativeLastCommitEpoch(basePath, branch || "HEAD");
51
- if (epoch > 0) {
52
- lastCommitEpoch = epoch;
53
- lastCommitMessage = nativeCommitSubject(basePath, branch || "HEAD") || null;
54
- }
55
- }
56
- }
57
- catch { /* non-fatal */ }
111
+ const commit = loadLastCommitInfo(basePath);
58
112
  return {
59
- projectState,
60
- budgetCeiling,
61
- budgetSpent,
113
+ ...data,
62
114
  providerIssue,
63
115
  environmentErrorCount,
64
116
  environmentWarningCount,
65
- lastCommitEpoch,
66
- lastCommitMessage,
117
+ lastCommitEpoch: commit.epoch,
118
+ lastCommitMessage: commit.message,
67
119
  lastRefreshed: Date.now(),
68
120
  };
69
121
  }
@@ -77,8 +129,13 @@ export function initHealthWidget(ctx) {
77
129
  if (!ctx.hasUI)
78
130
  return;
79
131
  const basePath = projectRoot();
80
- // String-array fallback — used in RPC mode (factory is a no-op there)
81
- const initialData = loadHealthWidgetData(basePath);
132
+ // String-array fallback — used in RPC mode (factory is a no-op there).
133
+ // Skip the expensive provider/environment doctor checks here: this runs
134
+ // synchronously on the interactive-startup path, where running them would
135
+ // block first paint by ~0.9s (lsof/docker probes, otherwise run again
136
+ // immediately by the factory below). The factory's async refresh fills in
137
+ // real health once the screen is up.
138
+ const initialData = loadHealthWidgetData(basePath, { includeChecks: false });
82
139
  ctx.ui.setWidget("gsd-health", buildHealthLines(initialData), { placement: "belowEditor" });
83
140
  // Factory-based widget for TUI mode — replaces the string-array above
84
141
  ctx.ui.setWidget("gsd-health", (_tui, _theme) => {
@@ -91,7 +148,7 @@ export function initHealthWidget(ctx) {
91
148
  return;
92
149
  refreshInFlight = true;
93
150
  try {
94
- data = loadHealthWidgetData(basePath);
151
+ data = await loadHealthWidgetDataAsync(basePath);
95
152
  cachedLines = undefined;
96
153
  if (!isDisposed)
97
154
  _tui.requestRender();
@@ -101,9 +158,11 @@ export function initHealthWidget(ctx) {
101
158
  refreshInFlight = false;
102
159
  }
103
160
  };
104
- // Fire first enrichment immediately. requestRender() inside is a no-op
105
- // if the widget has not yet rendered, so this is safe before factory return.
106
- void refresh();
161
+ // Fire the first full enrichment off the first-paint path. setTimeout(0)
162
+ // yields to the initial render + input loop, so the expensive doctor checks
163
+ // (provider + environment) never delay the moment the user sees the UI.
164
+ // requestRender() inside refresh repaints the widget once data is ready.
165
+ setTimeout(() => { void refresh(); }, 0);
107
166
  const refreshTimer = setInterval(() => {
108
167
  void refresh();
109
168
  }, REFRESH_INTERVAL_MS);
@@ -717,6 +717,16 @@ export function detectStaleRenders(basePath) {
717
717
  }
718
718
  return stale;
719
719
  }
720
+ /**
721
+ * Render-verification helper: does the rendered ROADMAP markdown mark a slice
722
+ * as done? Used by completion code to verify/repair the *projection* after a
723
+ * DB write — never as a source of truth for dispatch or completion decisions
724
+ * (ADR-017). Lives here so decision-path modules need not import
725
+ * parsers-legacy directly.
726
+ */
727
+ export function roadmapRenderMarksSliceDone(roadmapContent, sliceId) {
728
+ return parseRoadmap(roadmapContent).slices.some((slice) => slice.id === sliceId && slice.done);
729
+ }
720
730
  export async function renderReplanFromDb(basePath, milestoneId, sliceId, replanData) {
721
731
  const slicePath = resolveSlicePath(basePath, milestoneId, sliceId)
722
732
  ?? join(gsdRoot(basePath), "milestones", milestoneId, "slices", sliceId);
@@ -0,0 +1,10 @@
1
+ // mcp-bridge.ts — stable runtime seam for MCP server consumption (phase 1).
2
+ export { loadWriteGateSnapshot, shouldBlockPendingGateInSnapshot, shouldBlockQueueExecutionInSnapshot, } from "./bootstrap/write-gate.js";
3
+ export { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
4
+ export { _getAdapter, checkpointDatabase, closeDatabase, getAllMilestones, getDb, getGateResults, getMilestoneSlices, getPendingGates, getSliceTasks, insertDecision, insertMilestone, insertSlice, openDatabase, upsertMilestonePlanning, } from "./gsd-db.js";
5
+ export { invalidateStateCache, isReusableGhostMilestone } from "./state.js";
6
+ export { loadEffectiveGSDPreferences } from "./preferences.js";
7
+ export { saveDecisionToDb, saveRequirementToDb, updateRequirementInDb, } from "./db-writer.js";
8
+ export { rebuildState } from "./doctor.js";
9
+ export { queryJournal } from "./journal.js";
10
+ export { claimReservedId, findMilestoneIds, getReservedMilestoneIds, milestoneIdSort, nextMilestoneId, } from "./milestone-ids.js";
@@ -3,7 +3,7 @@
3
3
  // Phase 4 companion to memory-store.ts. Edges live in the `memory_relations`
4
4
  // table and are created by (a) explicit LINK actions emitted by the memory
5
5
  // extractor, or (b) future `/gsd memory link` CLI commands. All writes go
6
- // through the single-writer gate in `gsd-db.ts`.
6
+ // through typed writer wrappers re-exported by `gsd-db.ts`.
7
7
  import { _getAdapter, deleteMemoryRelationsFor, insertMemoryRelationRow, isDbAvailable, } from "./gsd-db.js";
8
8
  export const VALID_RELATIONS = [
9
9
  "related_to",