@opengsd/gsd-pi 1.1.1-dev.b2556262 → 1.2.0-dev.4813ead6

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 (500) hide show
  1. package/dist/cli-web-branch.d.ts +2 -0
  2. package/dist/cli-web-branch.js +9 -2
  3. package/dist/help-text.js +5 -0
  4. package/dist/project-sessions.js +4 -2
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/extensions/ask-user-questions.js +78 -23
  7. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +101 -237
  8. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +224 -0
  9. package/dist/resources/extensions/github-sync/templates.js +3 -3
  10. package/dist/resources/extensions/gsd/artifact-projection.js +14 -0
  11. package/dist/resources/extensions/gsd/auto/contracts.js +8 -1
  12. package/dist/resources/extensions/gsd/auto/loop.js +74 -56
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +763 -63
  14. package/dist/resources/extensions/gsd/auto/phases.js +28 -3
  15. package/dist/resources/extensions/gsd/auto/run-unit.js +2 -1
  16. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  17. package/dist/resources/extensions/gsd/auto-dashboard.js +16 -4
  18. package/dist/resources/extensions/gsd/auto-dispatch.js +6 -5
  19. package/dist/resources/extensions/gsd/auto-model-selection.js +8 -0
  20. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
  21. package/dist/resources/extensions/gsd/auto-prompts.js +191 -9
  22. package/dist/resources/extensions/gsd/auto-recovery.js +48 -49
  23. package/dist/resources/extensions/gsd/auto-runtime-state.js +17 -0
  24. package/dist/resources/extensions/gsd/auto-start.js +12 -23
  25. package/dist/resources/extensions/gsd/auto-timers.js +16 -2
  26. package/dist/resources/extensions/gsd/auto-tool-tracking.js +37 -0
  27. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +33 -29
  28. package/dist/resources/extensions/gsd/auto-verification.js +7 -7
  29. package/dist/resources/extensions/gsd/auto-worktree.js +45 -36
  30. package/dist/resources/extensions/gsd/auto.js +73 -471
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +28 -37
  32. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +11 -37
  33. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +103 -138
  35. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +63 -4
  36. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +21 -4
  37. package/dist/resources/extensions/gsd/codebase-generator.js +8 -4
  38. package/dist/resources/extensions/gsd/commands/handlers/auto.js +3 -0
  39. package/dist/resources/extensions/gsd/commands-handlers.js +20 -0
  40. package/dist/resources/extensions/gsd/commands-inspect.js +4 -8
  41. package/dist/resources/extensions/gsd/commands-maintenance.js +61 -41
  42. package/dist/resources/extensions/gsd/commands-ship.js +2 -2
  43. package/dist/resources/extensions/gsd/commands-verdict.js +12 -2
  44. package/dist/resources/extensions/gsd/db-workspace.js +103 -0
  45. package/dist/resources/extensions/gsd/debug-logger.js +10 -0
  46. package/dist/resources/extensions/gsd/delegation-policy.js +2 -10
  47. package/dist/resources/extensions/gsd/discussion-handoff.js +218 -0
  48. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  49. package/dist/resources/extensions/gsd/doctor-proactive.js +7 -2
  50. package/dist/resources/extensions/gsd/doctor.js +16 -9
  51. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  52. package/dist/resources/extensions/gsd/git-conflict-state.js +16 -1
  53. package/dist/resources/extensions/gsd/gsd-db.js +12 -0
  54. package/dist/resources/extensions/gsd/guided-flow.js +36 -470
  55. package/dist/resources/extensions/gsd/guided-unit-completion.js +225 -0
  56. package/dist/resources/extensions/gsd/markdown-renderer.js +33 -33
  57. package/dist/resources/extensions/gsd/mcp-filter.js +8 -1
  58. package/dist/resources/extensions/gsd/mcp-tool-name.js +26 -0
  59. package/dist/resources/extensions/gsd/md-importer.js +4 -3
  60. package/dist/resources/extensions/gsd/migrate/safety.js +2 -2
  61. package/dist/resources/extensions/gsd/migration-auto-check.js +3 -2
  62. package/dist/resources/extensions/gsd/milestone-closeout-proof.js +72 -0
  63. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -4
  64. package/dist/resources/extensions/gsd/milestone-merge-transaction.js +10 -0
  65. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +156 -0
  66. package/dist/resources/extensions/gsd/milestone-readiness.js +77 -0
  67. package/dist/resources/extensions/gsd/milestone-settlement.js +50 -0
  68. package/dist/resources/extensions/gsd/milestone-validation-evidence.js +73 -0
  69. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +57 -0
  70. package/dist/resources/extensions/gsd/native-git-bridge.js +45 -0
  71. package/dist/resources/extensions/gsd/parallel-eligibility.js +3 -6
  72. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -2
  73. package/dist/resources/extensions/gsd/preferences-diagnostics.js +67 -0
  74. package/dist/resources/extensions/gsd/preferences.js +147 -29
  75. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  76. package/dist/resources/extensions/gsd/prompts/discuss.md +6 -7
  77. package/dist/resources/extensions/gsd/prompts/execute-task.md +2 -0
  78. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
  79. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
  80. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
  81. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
  82. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  83. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  84. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  85. package/dist/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  86. package/dist/resources/extensions/gsd/prompts/system.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
  88. package/dist/resources/extensions/gsd/provider-payload-policy.js +83 -0
  89. package/dist/resources/extensions/gsd/pull-request-process.js +13 -0
  90. package/dist/resources/extensions/gsd/quality-gate-closure.js +109 -0
  91. package/dist/resources/extensions/gsd/question-transport.js +86 -0
  92. package/dist/resources/extensions/gsd/roadmap-slices.js +8 -2
  93. package/dist/resources/extensions/gsd/schemas/parsers.js +6 -1
  94. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -2
  95. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +21 -1
  96. package/dist/resources/extensions/gsd/state.js +13 -5
  97. package/dist/resources/extensions/gsd/templates/plan.md +7 -0
  98. package/dist/resources/extensions/gsd/templates/project.md +1 -0
  99. package/dist/resources/extensions/gsd/templates/roadmap.md +1 -1
  100. package/dist/resources/extensions/gsd/templates/uat.md +5 -1
  101. package/dist/resources/extensions/gsd/tool-contract.js +52 -8
  102. package/dist/resources/extensions/gsd/tool-presentation-plan.js +15 -34
  103. package/dist/resources/extensions/gsd/tool-surface-snapshot.js +17 -0
  104. package/dist/resources/extensions/gsd/tools/plan-milestone.js +15 -143
  105. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +39 -0
  106. package/dist/resources/extensions/gsd/tools/validate-milestone.js +15 -78
  107. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +169 -20
  108. package/dist/resources/extensions/gsd/uat-policy.js +16 -10
  109. package/dist/resources/extensions/gsd/uat-run.js +9 -14
  110. package/dist/resources/extensions/gsd/unit-context-composer.js +40 -20
  111. package/dist/resources/extensions/gsd/unit-runtime.js +3 -2
  112. package/dist/resources/extensions/gsd/unit-tool-contracts.js +2 -1
  113. package/dist/resources/extensions/gsd/user-input-boundary.js +65 -4
  114. package/dist/resources/extensions/gsd/validation-block-guard.js +2 -0
  115. package/dist/resources/extensions/gsd/web-app-uat.js +80 -0
  116. package/dist/resources/extensions/gsd/workflow-mcp.js +15 -102
  117. package/dist/resources/extensions/gsd/workflow-reconcile.js +4 -3
  118. package/dist/resources/extensions/gsd/workflow-tool-surface.js +46 -0
  119. package/dist/resources/extensions/gsd/workspace-git-guard.js +2 -0
  120. package/dist/resources/extensions/gsd/worktree-state-projection.js +33 -4
  121. package/dist/resources/extensions/gsd/worktree-telemetry.js +12 -0
  122. package/dist/resources/extensions/shared/interview-ui.js +2 -2
  123. package/dist/resources/shared/claude-runtime-floor.js +182 -0
  124. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  125. package/dist/update-cmd.js +20 -0
  126. package/dist/web/standalone/.next/BUILD_ID +1 -1
  127. package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
  128. package/dist/web/standalone/.next/build-manifest.json +3 -3
  129. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  130. package/dist/web/standalone/.next/react-loadable-manifest.json +8 -8
  131. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/index.html +1 -1
  183. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  187. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
  190. package/dist/web/standalone/.next/server/chunks/5047.js +2 -0
  191. package/dist/web/standalone/.next/server/chunks/5124.js +1 -0
  192. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  193. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  196. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  197. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  198. package/dist/web/standalone/.next/static/chunks/2659.b7b129ee6a769448.js +1 -0
  199. package/dist/web/standalone/.next/static/chunks/2772.bfa657f49f955239.js +1 -0
  200. package/dist/web/standalone/.next/static/chunks/{3616.4113d484a994e411.js → 3616.3c60753b8ffcbd2e.js} +1 -1
  201. package/dist/web/standalone/.next/static/chunks/4283.e4873b058df143a1.js +2 -0
  202. package/dist/web/standalone/.next/static/chunks/5826.a46ecdd1cfe8dabc.js +1 -0
  203. package/dist/web/standalone/.next/static/chunks/796.cf859a427a2cb2ac.js +10 -0
  204. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +1 -0
  205. package/dist/web/standalone/.next/static/chunks/{webpack-dda80a1ef5587410.js → webpack-fbea77b5f9953368.js} +1 -1
  206. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  207. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  208. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  209. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  210. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  211. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  212. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  213. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  214. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  215. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  216. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  217. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  218. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  219. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  220. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  221. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  222. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  223. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  224. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  225. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  226. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  227. package/dist/web-mode.d.ts +2 -0
  228. package/dist/web-mode.js +20 -8
  229. package/package.json +17 -11
  230. package/packages/cloud-mcp-gateway/package.json +2 -2
  231. package/packages/contracts/package.json +1 -1
  232. package/packages/daemon/package.json +4 -4
  233. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +2 -0
  234. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  235. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +14 -0
  236. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  237. package/packages/gsd-agent-core/package.json +5 -5
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -0
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +1 -1
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  244. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +106 -40
  245. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  246. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +6 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  249. package/packages/gsd-agent-modes/package.json +7 -7
  250. package/packages/mcp-server/dist/server.d.ts +10 -0
  251. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  252. package/packages/mcp-server/dist/server.js +8 -0
  253. package/packages/mcp-server/dist/server.js.map +1 -1
  254. package/packages/mcp-server/dist/workflow-tools.d.ts +41 -0
  255. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  256. package/packages/mcp-server/dist/workflow-tools.js +2 -1
  257. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  258. package/packages/mcp-server/package.json +3 -3
  259. package/packages/native/package.json +1 -1
  260. package/packages/pi-agent-core/package.json +1 -1
  261. package/packages/pi-ai/dist/image-models.generated.d.ts +30 -0
  262. package/packages/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  263. package/packages/pi-ai/dist/image-models.generated.js +30 -0
  264. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  265. package/packages/pi-ai/dist/models.generated.d.ts +8 -127
  266. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  267. package/packages/pi-ai/dist/models.generated.js +47 -166
  268. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  269. package/packages/pi-ai/package.json +1 -1
  270. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/auth-storage.js +11 -3
  272. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  273. package/packages/pi-coding-agent/package.json +7 -7
  274. package/packages/pi-tui/dist/components/input.js +1 -1
  275. package/packages/pi-tui/dist/components/input.js.map +1 -1
  276. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  277. package/packages/pi-tui/dist/keys.js +39 -30
  278. package/packages/pi-tui/dist/keys.js.map +1 -1
  279. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  280. package/packages/pi-tui/dist/stdin-buffer.js +22 -0
  281. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  282. package/packages/pi-tui/package.json +2 -2
  283. package/packages/rpc-client/package.json +2 -2
  284. package/pkg/package.json +1 -1
  285. package/scripts/install/deps.js +10 -0
  286. package/scripts/link-workspace-packages.cjs +7 -40
  287. package/src/resources/extensions/ask-user-questions.ts +87 -24
  288. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +126 -289
  289. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +242 -2
  290. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +287 -0
  291. package/src/resources/extensions/github-sync/templates.ts +3 -3
  292. package/src/resources/extensions/github-sync/tests/templates.test.ts +2 -2
  293. package/src/resources/extensions/gsd/artifact-projection.ts +31 -0
  294. package/src/resources/extensions/gsd/auto/contracts.ts +40 -121
  295. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -0
  296. package/src/resources/extensions/gsd/auto/loop.ts +83 -61
  297. package/src/resources/extensions/gsd/auto/orchestrator.ts +913 -64
  298. package/src/resources/extensions/gsd/auto/phases.ts +35 -3
  299. package/src/resources/extensions/gsd/auto/run-unit.ts +2 -1
  300. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  301. package/src/resources/extensions/gsd/auto-dashboard.ts +18 -4
  302. package/src/resources/extensions/gsd/auto-dispatch.ts +20 -7
  303. package/src/resources/extensions/gsd/auto-model-selection.ts +8 -0
  304. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -3
  305. package/src/resources/extensions/gsd/auto-prompts.ts +220 -9
  306. package/src/resources/extensions/gsd/auto-recovery.ts +50 -50
  307. package/src/resources/extensions/gsd/auto-runtime-state.ts +30 -0
  308. package/src/resources/extensions/gsd/auto-start.ts +17 -20
  309. package/src/resources/extensions/gsd/auto-timers.ts +16 -2
  310. package/src/resources/extensions/gsd/auto-tool-tracking.ts +40 -0
  311. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +42 -30
  312. package/src/resources/extensions/gsd/auto-verification.ts +7 -8
  313. package/src/resources/extensions/gsd/auto-worktree.ts +57 -42
  314. package/src/resources/extensions/gsd/auto.ts +96 -508
  315. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +29 -37
  316. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +10 -37
  317. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  318. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +120 -151
  319. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +107 -3
  320. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +27 -5
  321. package/src/resources/extensions/gsd/codebase-generator.ts +9 -5
  322. package/src/resources/extensions/gsd/commands/handlers/auto.ts +3 -0
  323. package/src/resources/extensions/gsd/commands-handlers.ts +18 -0
  324. package/src/resources/extensions/gsd/commands-inspect.ts +7 -8
  325. package/src/resources/extensions/gsd/commands-maintenance.ts +74 -40
  326. package/src/resources/extensions/gsd/commands-ship.ts +2 -2
  327. package/src/resources/extensions/gsd/commands-verdict.ts +19 -2
  328. package/src/resources/extensions/gsd/db-workspace.ts +170 -0
  329. package/src/resources/extensions/gsd/debug-logger.ts +11 -0
  330. package/src/resources/extensions/gsd/delegation-policy.ts +3 -11
  331. package/src/resources/extensions/gsd/discussion-handoff.ts +276 -0
  332. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -0
  333. package/src/resources/extensions/gsd/doctor-proactive.ts +8 -2
  334. package/src/resources/extensions/gsd/doctor.ts +15 -5
  335. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  336. package/src/resources/extensions/gsd/git-conflict-state.ts +17 -1
  337. package/src/resources/extensions/gsd/gsd-db.ts +12 -0
  338. package/src/resources/extensions/gsd/guided-flow.ts +49 -560
  339. package/src/resources/extensions/gsd/guided-unit-completion.ts +275 -0
  340. package/src/resources/extensions/gsd/markdown-renderer.ts +40 -20
  341. package/src/resources/extensions/gsd/mcp-filter.ts +9 -1
  342. package/src/resources/extensions/gsd/mcp-tool-name.ts +35 -0
  343. package/src/resources/extensions/gsd/md-importer.ts +3 -3
  344. package/src/resources/extensions/gsd/migrate/safety.ts +2 -2
  345. package/src/resources/extensions/gsd/migration-auto-check.ts +2 -2
  346. package/src/resources/extensions/gsd/milestone-closeout-proof.ts +131 -0
  347. package/src/resources/extensions/gsd/milestone-closeout.ts +12 -4
  348. package/src/resources/extensions/gsd/milestone-merge-transaction.ts +47 -0
  349. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +224 -0
  350. package/src/resources/extensions/gsd/milestone-readiness.ts +125 -0
  351. package/src/resources/extensions/gsd/milestone-settlement.ts +81 -0
  352. package/src/resources/extensions/gsd/milestone-validation-evidence.ts +95 -0
  353. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +80 -0
  354. package/src/resources/extensions/gsd/native-git-bridge.ts +48 -0
  355. package/src/resources/extensions/gsd/parallel-eligibility.ts +4 -5
  356. package/src/resources/extensions/gsd/parallel-orchestrator.ts +6 -2
  357. package/src/resources/extensions/gsd/preferences-diagnostics.ts +98 -0
  358. package/src/resources/extensions/gsd/preferences-types.ts +16 -0
  359. package/src/resources/extensions/gsd/preferences.ts +173 -28
  360. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -0
  361. package/src/resources/extensions/gsd/prompts/discuss.md +6 -7
  362. package/src/resources/extensions/gsd/prompts/execute-task.md +2 -0
  363. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +5 -7
  364. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +6 -6
  365. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +1 -2
  366. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +5 -6
  367. package/src/resources/extensions/gsd/prompts/plan-milestone.md +2 -0
  368. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -1
  369. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -0
  370. package/src/resources/extensions/gsd/prompts/research-milestone.md +2 -2
  371. package/src/resources/extensions/gsd/prompts/system.md +1 -1
  372. package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -3
  373. package/src/resources/extensions/gsd/provider-payload-policy.ts +140 -0
  374. package/src/resources/extensions/gsd/pull-request-process.ts +41 -0
  375. package/src/resources/extensions/gsd/quality-gate-closure.ts +140 -0
  376. package/src/resources/extensions/gsd/question-transport.ts +138 -0
  377. package/src/resources/extensions/gsd/roadmap-slices.ts +8 -2
  378. package/src/resources/extensions/gsd/schemas/parsers.ts +6 -1
  379. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +6 -2
  380. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +31 -10
  381. package/src/resources/extensions/gsd/state.ts +15 -5
  382. package/src/resources/extensions/gsd/templates/plan.md +7 -0
  383. package/src/resources/extensions/gsd/templates/project.md +1 -0
  384. package/src/resources/extensions/gsd/templates/roadmap.md +1 -1
  385. package/src/resources/extensions/gsd/templates/uat.md +5 -1
  386. package/src/resources/extensions/gsd/tests/artifact-db-drift-memo.test.ts +66 -0
  387. package/src/resources/extensions/gsd/tests/ask-user-questions-render.test.ts +92 -0
  388. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +29 -1
  389. package/src/resources/extensions/gsd/tests/auto-dispatch-baseline-harness.test.ts +53 -0
  390. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +321 -5
  391. package/src/resources/extensions/gsd/tests/auto-milestone-target.test.ts +23 -0
  392. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +18 -0
  393. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +709 -845
  394. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +38 -10
  395. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +34 -0
  396. package/src/resources/extensions/gsd/tests/canonical-milestone-root.test.ts +20 -0
  397. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  398. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +11 -0
  399. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +38 -1
  400. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +15 -0
  401. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +34 -3
  402. package/src/resources/extensions/gsd/tests/dispatch-run-uat-browser-tools.test.ts +88 -0
  403. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +18 -0
  404. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +64 -1
  405. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -0
  406. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +1 -5
  407. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +1 -5
  408. package/src/resources/extensions/gsd/tests/gate-state-canonicalization.test.ts +48 -1
  409. package/src/resources/extensions/gsd/tests/integration/merge-strategy-regular.test.ts +157 -0
  410. package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +75 -0
  411. package/src/resources/extensions/gsd/tests/mcp-tool-name.test.ts +34 -0
  412. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +58 -0
  413. package/src/resources/extensions/gsd/tests/milestone-closeout-proof.test.ts +99 -0
  414. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +25 -0
  415. package/src/resources/extensions/gsd/tests/milestone-merge-transaction.test.ts +46 -0
  416. package/src/resources/extensions/gsd/tests/milestone-readiness.test.ts +65 -0
  417. package/src/resources/extensions/gsd/tests/milestone-validation-evidence.test.ts +41 -0
  418. package/src/resources/extensions/gsd/tests/milestone-validation-verdict.test.ts +55 -0
  419. package/src/resources/extensions/gsd/tests/native-merge-regular.test.ts +139 -0
  420. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +127 -0
  421. package/src/resources/extensions/gsd/tests/parse-project-milestone-bridge.test.ts +77 -0
  422. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +45 -0
  423. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +6 -2
  424. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +45 -0
  425. package/src/resources/extensions/gsd/tests/preferences-diagnostics.test.ts +67 -0
  426. package/src/resources/extensions/gsd/tests/preferences.test.ts +183 -0
  427. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +75 -2
  428. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +9 -0
  429. package/src/resources/extensions/gsd/tests/provider-payload-policy.test.ts +165 -0
  430. package/src/resources/extensions/gsd/tests/pull-request-process.test.ts +47 -0
  431. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +94 -0
  432. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +65 -0
  433. package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +40 -0
  434. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +25 -1
  435. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +80 -0
  436. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +101 -1
  437. package/src/resources/extensions/gsd/tests/stale-queued-milestone.test.ts +27 -0
  438. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +21 -6
  439. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +38 -0
  440. package/src/resources/extensions/gsd/tests/tool-availability-audit.test.ts +35 -0
  441. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +35 -42
  442. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +23 -0
  443. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +47 -0
  444. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +147 -0
  445. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +39 -0
  446. package/src/resources/extensions/gsd/tests/web-app-uat.test.ts +150 -0
  447. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +126 -9
  448. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +15 -0
  449. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +21 -0
  450. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  451. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +24 -0
  452. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +22 -0
  453. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +15 -3
  454. package/src/resources/extensions/gsd/tests/write-gate.test.ts +79 -0
  455. package/src/resources/extensions/gsd/tool-contract.ts +86 -8
  456. package/src/resources/extensions/gsd/tool-presentation-plan.ts +16 -33
  457. package/src/resources/extensions/gsd/tool-surface-snapshot.ts +47 -0
  458. package/src/resources/extensions/gsd/tools/plan-milestone.ts +19 -160
  459. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +43 -0
  460. package/src/resources/extensions/gsd/tools/validate-milestone.ts +25 -84
  461. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +183 -21
  462. package/src/resources/extensions/gsd/uat-policy.ts +19 -10
  463. package/src/resources/extensions/gsd/uat-run.ts +10 -14
  464. package/src/resources/extensions/gsd/unit-context-composer.ts +85 -20
  465. package/src/resources/extensions/gsd/unit-runtime.ts +3 -2
  466. package/src/resources/extensions/gsd/unit-tool-contracts.ts +2 -1
  467. package/src/resources/extensions/gsd/user-input-boundary.ts +55 -5
  468. package/src/resources/extensions/gsd/validation-block-guard.ts +2 -0
  469. package/src/resources/extensions/gsd/web-app-uat.ts +101 -0
  470. package/src/resources/extensions/gsd/workflow-mcp.ts +22 -110
  471. package/src/resources/extensions/gsd/workflow-reconcile.ts +3 -3
  472. package/src/resources/extensions/gsd/workflow-tool-surface.ts +73 -0
  473. package/src/resources/extensions/gsd/workspace-git-guard.ts +1 -0
  474. package/src/resources/extensions/gsd/worktree-lifecycle.ts +7 -16
  475. package/src/resources/extensions/gsd/worktree-state-projection.ts +55 -7
  476. package/src/resources/extensions/gsd/worktree-telemetry.ts +16 -0
  477. package/src/resources/extensions/shared/interview-ui.ts +15 -2
  478. package/src/resources/shared/claude-runtime-floor.ts +248 -0
  479. package/dist/web/standalone/.next/server/chunks/678.js +0 -2
  480. package/dist/web/standalone/.next/static/chunks/2659.feb6499ca863ebfc.js +0 -1
  481. package/dist/web/standalone/.next/static/chunks/2772.151789db0edea835.js +0 -1
  482. package/dist/web/standalone/.next/static/chunks/4283.10a065467b5340d8.js +0 -2
  483. package/dist/web/standalone/.next/static/chunks/5826.960dc4634cc9b0d3.js +0 -1
  484. package/dist/web/standalone/.next/static/chunks/796.46f811c0fac23aab.js +0 -10
  485. package/dist/web/standalone/.next/static/chunks/8785.d32f7a61f55c1600.js +0 -1
  486. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts +0 -21
  487. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.d.ts.map +0 -1
  488. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js +0 -213
  489. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/gsd-widget-prototype.js.map +0 -1
  490. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts +0 -28
  491. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.d.ts.map +0 -1
  492. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js +0 -249
  493. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-density-prototype.js.map +0 -1
  494. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts +0 -19
  495. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.d.ts.map +0 -1
  496. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js +0 -797
  497. package/packages/gsd-agent-modes/dist/modes/interactive/components/__prototype__/transcript-design-prototype.js.map +0 -1
  498. package/scripts/ensure-workspace-builds.cjs +0 -129
  499. /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_buildManifest.js +0 -0
  500. /package/dist/web/standalone/.next/static/{tJOKQbQRO-9MiFDO8DIDS → tkLHUSzPA2kMmWz4DmGwI}/_ssgManifest.js +0 -0
@@ -28,6 +28,7 @@ import { isAutoActive, checkRemoteAutoSession } from "./auto.js";
28
28
  import { getAutoWorktreePath } from "./auto-worktree.js";
29
29
  import { currentDirectoryRoot, projectRoot } from "./commands/context.js";
30
30
  import { loadPrompt } from "./prompt-loader.js";
31
+ import { buildClaudeRuntimeFloorAdvisory } from "../../shared/claude-runtime-floor.js";
31
32
  import { isPnpmInstall } from "../../shared/package-manager-detection.js";
32
33
  import {
33
34
  buildDoctorHealIssuePayload,
@@ -67,6 +68,21 @@ function resolveInstallCommand(pkg: string): string {
67
68
  return `npm install -g ${pkg}`;
68
69
  }
69
70
 
71
+ function notifyClaudeRuntimeFloorAdvisory(ctx: ExtensionCommandContext): void {
72
+ let advisory: string | null = null;
73
+ try {
74
+ advisory = buildClaudeRuntimeFloorAdvisory({
75
+ agentDir: join(gsdHome(), "agent"),
76
+ cwd: process.cwd(),
77
+ });
78
+ } catch {
79
+ return;
80
+ }
81
+ if (advisory) {
82
+ ctx.ui.notify(advisory, "warning");
83
+ }
84
+ }
85
+
70
86
  async function fetchLatestVersionForCommand(registryUrl: string = UPDATE_REGISTRY_URL): Promise<string | null> {
71
87
  const controller = new AbortController();
72
88
  const timeout = setTimeout(() => controller.abort(), UPDATE_FETCH_TIMEOUT_MS);
@@ -549,6 +565,7 @@ export async function handleUpdate(ctx: ExtensionCommandContext, args = ""): Pro
549
565
 
550
566
  if (current && compareSemverLocal(latest, current) <= 0) {
551
567
  ctx.ui.notify(`Already up to date (${formatCommandVersion(current)}).`, "info");
568
+ if (!browserUpdate) notifyClaudeRuntimeFloorAdvisory(ctx);
552
569
  return;
553
570
  }
554
571
 
@@ -568,6 +585,7 @@ export async function handleUpdate(ctx: ExtensionCommandContext, args = ""): Pro
568
585
  : `Updated to v${latest}. Restart your GSD session to use the new version.`,
569
586
  "info",
570
587
  );
588
+ if (!browserUpdate) notifyClaudeRuntimeFloorAdvisory(ctx);
571
589
  } catch {
572
590
  ctx.ui.notify(
573
591
  `Update failed. Try manually: ${installCmd}`,
@@ -5,9 +5,10 @@
5
5
  */
6
6
 
7
7
  import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
8
- import { existsSync } from "node:fs";
9
- import { join } from "node:path";
10
- import { gsdRoot } from "./paths.js";
8
+ import {
9
+ isWorkflowDatabaseOpen,
10
+ openExistingWorkflowDatabase,
11
+ } from "./db-workspace.js";
11
12
  import { logWarning } from "./workflow-logger.js";
12
13
  import { getErrorMessage } from "./error-utils.js";
13
14
 
@@ -48,12 +49,10 @@ export function formatInspectOutput(data: InspectData): string {
48
49
 
49
50
  export async function handleInspect(ctx: ExtensionCommandContext): Promise<void> {
50
51
  try {
51
- const { isDbAvailable, _getAdapter, openDatabase } = await import("./gsd-db.js");
52
+ const { _getAdapter } = await import("./gsd-db.js");
52
53
 
53
- if (!isDbAvailable()) {
54
- const gsdDir = gsdRoot(process.cwd());
55
- const dbPath = join(gsdDir, "gsd.db");
56
- if (!existsSync(gsdDir) || !existsSync(dbPath) || !openDatabase(dbPath)) {
54
+ if (!isWorkflowDatabaseOpen()) {
55
+ if (!openExistingWorkflowDatabase(process.cwd()).ok) {
57
56
  ctx.ui.notify("No GSD database available. Run /gsd auto to create one.", "info");
58
57
  return;
59
58
  }
@@ -11,6 +11,7 @@ import { deriveState } from "./state.js";
11
11
  import { gsdProjectionRoot, gsdRoot } from "./paths.js";
12
12
  import { nativeBranchList, nativeDetectMainBranch, nativeBranchListMerged, nativeBranchDelete, nativeForEachRef, nativeUpdateRef } from "./native-git-bridge.js";
13
13
  import { logWarning } from "./workflow-logger.js";
14
+ import { backupWorkflowDatabaseSnapshot, refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
14
15
 
15
16
  export async function handleCleanupBranches(ctx: ExtensionCommandContext, basePath: string): Promise<void> {
16
17
  let branches: string[];
@@ -581,7 +582,7 @@ async function confirmRecover(
581
582
  * Prints counts of recovered items and the resulting project phase.
582
583
  */
583
584
  export async function handleRecover(ctx: ExtensionCommandContext, basePath: string, args = ""): Promise<void> {
584
- const { isDbAvailable: dbAvailable, clearEngineHierarchy, transaction: dbTransaction, backupDatabaseSnapshot } = await import("./gsd-db.js");
585
+ const { isDbAvailable: dbAvailable, clearEngineHierarchy, transaction: dbTransaction } = await import("./gsd-db.js");
585
586
  const { migrateHierarchyToDb } = await import("./md-importer.js");
586
587
  const { invalidateStateCache } = await import("./state.js");
587
588
  const { countDbHierarchy, countMarkdownHierarchy, recoverWouldDeleteDbRows } = await import("./migration-auto-check.js");
@@ -604,7 +605,7 @@ export async function handleRecover(ctx: ExtensionCommandContext, basePath: stri
604
605
 
605
606
  try {
606
607
  // 0. Snapshot the DB before the destructive clear so recover is reversible.
607
- const backupPath = backupDatabaseSnapshot("pre-recover");
608
+ const backupPath = backupWorkflowDatabaseSnapshot("pre-recover");
608
609
 
609
610
  // 1. Delete + re-populate inside a single transaction for atomicity.
610
611
  // clearEngineHierarchy() uses transaction() internally but transaction()
@@ -749,6 +750,62 @@ function parseRebuildTarget(args: string): RebuildTarget {
749
750
  return "usage";
750
751
  }
751
752
 
753
+ export interface RebuildMarkdownProjectionsResult {
754
+ rendered: number;
755
+ skipped: number;
756
+ errors: string[];
757
+ quarantined: number;
758
+ quarantinedPaths: string[];
759
+ }
760
+
761
+ /**
762
+ * Re-render markdown planning projections from the authoritative DB.
763
+ *
764
+ * Quarantines open-unit SUMMARY files that contradict DB status before
765
+ * rendering. Safe to call after milestone merge/transition or during startup
766
+ * self-heal when the DB holds rows markdown lacks.
767
+ */
768
+ export async function rebuildMarkdownProjectionsFromDb(
769
+ basePath: string,
770
+ ): Promise<RebuildMarkdownProjectionsResult> {
771
+ const { deleteArtifactByPath } = await import("./gsd-db.js");
772
+ const { detectArtifactDbDrift } = await import("./state-reconciliation/drift/artifact-db.js");
773
+ const { renderAllFromDb } = await import("./markdown-renderer.js");
774
+ const { invalidateStateCache } = await import("./state.js");
775
+
776
+ invalidateStateCache();
777
+ refreshWorkflowDatabaseFromDisk();
778
+
779
+ const state = await deriveState(basePath);
780
+ const drifts = detectArtifactDbDrift(state, { basePath, state });
781
+ const stamp = new Date().toISOString().replace(/[:.]/g, "-");
782
+ const quarantined: string[] = [];
783
+ const seen = new Set<string>();
784
+
785
+ for (const drift of drifts) {
786
+ if (drift.kind !== "artifact-db-status-divergence") continue;
787
+ if (drift.artifactType !== "SUMMARY" || !drift.artifactPath) continue;
788
+ const absPath = resolveDiskArtifactPath(basePath, drift.artifactPath);
789
+ if (seen.has(absPath) || !existsSync(absPath)) continue;
790
+ seen.add(absPath);
791
+ const artifactDbPath = artifactPathForDb(basePath, absPath);
792
+ const target = quarantineProjectionFile(basePath, absPath, stamp);
793
+ deleteArtifactByPath(artifactDbPath);
794
+ quarantined.push(target);
795
+ }
796
+
797
+ const rendered = await renderAllFromDb(basePath);
798
+ invalidateStateCache();
799
+
800
+ return {
801
+ rendered: rendered.rendered,
802
+ skipped: rendered.skipped,
803
+ errors: rendered.errors,
804
+ quarantined: quarantined.length,
805
+ quarantinedPaths: quarantined,
806
+ };
807
+ }
808
+
752
809
  /**
753
810
  * `gsd rebuild markdown` — Re-render markdown projections from the authoritative DB.
754
811
  *
@@ -757,10 +814,7 @@ function parseRebuildTarget(args: string): RebuildTarget {
757
814
  * under `.gsd/quarantine/projections/` before DB projections are rendered.
758
815
  */
759
816
  export async function handleRebuild(ctx: ExtensionCommandContext, basePath: string, args = ""): Promise<void> {
760
- const { isDbAvailable: dbAvailable, deleteArtifactByPath } = await import("./gsd-db.js");
761
- const { detectArtifactDbDrift } = await import("./state-reconciliation/drift/artifact-db.js");
762
- const { renderAllFromDb } = await import("./markdown-renderer.js");
763
- const { invalidateStateCache } = await import("./state.js");
817
+ const { isDbAvailable: dbAvailable } = await import("./gsd-db.js");
764
818
 
765
819
  const target = parseRebuildTarget(args);
766
820
  if (target === "usage") {
@@ -794,54 +848,34 @@ export async function handleRebuild(ctx: ExtensionCommandContext, basePath: stri
794
848
  }
795
849
 
796
850
  try {
797
- invalidateStateCache();
798
- const state = await deriveState(basePath);
799
- const drifts = detectArtifactDbDrift(state, { basePath, state });
800
- const stamp = new Date().toISOString().replace(/[:.]/g, "-");
801
- const quarantined: string[] = [];
802
- const seen = new Set<string>();
803
-
804
- for (const drift of drifts) {
805
- if (drift.kind !== "artifact-db-status-divergence") continue;
806
- if (drift.artifactType !== "SUMMARY" || !drift.artifactPath) continue;
807
- const absPath = resolveDiskArtifactPath(basePath, drift.artifactPath);
808
- if (seen.has(absPath) || !existsSync(absPath)) continue;
809
- seen.add(absPath);
810
- const artifactDbPath = artifactPathForDb(basePath, absPath);
811
- const target = quarantineProjectionFile(basePath, absPath, stamp);
812
- deleteArtifactByPath(artifactDbPath);
813
- quarantined.push(target);
814
- }
815
-
816
- const rendered = await renderAllFromDb(basePath);
817
- invalidateStateCache();
851
+ const result = await rebuildMarkdownProjectionsFromDb(basePath);
818
852
 
819
853
  const lines = [
820
854
  "gsd rebuild markdown: rebuilt markdown projections from the canonical DB",
821
- ` Rendered: ${rendered.rendered}`,
822
- ` Skipped: ${rendered.skipped}`,
823
- ` Quarantined: ${quarantined.length}`,
855
+ ` Rendered: ${result.rendered}`,
856
+ ` Skipped: ${result.skipped}`,
857
+ ` Quarantined: ${result.quarantined}`,
824
858
  ];
825
- if (rendered.errors.length > 0) {
826
- lines.push(` Errors: ${rendered.errors.length}`);
827
- for (const err of rendered.errors.slice(0, 5)) {
859
+ if (result.errors.length > 0) {
860
+ lines.push(` Errors: ${result.errors.length}`);
861
+ for (const err of result.errors.slice(0, 5)) {
828
862
  lines.push(` - ${err}`);
829
863
  }
830
- if (rendered.errors.length > 5) {
831
- lines.push(` - ${rendered.errors.length - 5} more`);
864
+ if (result.errors.length > 5) {
865
+ lines.push(` - ${result.errors.length - 5} more`);
832
866
  }
833
867
  }
834
- if (quarantined.length > 0) {
868
+ if (result.quarantined > 0) {
835
869
  lines.push("", " Quarantine:");
836
- for (const target of quarantined.slice(0, 5)) {
870
+ for (const target of result.quarantinedPaths.slice(0, 5)) {
837
871
  lines.push(` - ${target}`);
838
872
  }
839
- if (quarantined.length > 5) {
840
- lines.push(` - ${quarantined.length - 5} more`);
873
+ if (result.quarantined > 5) {
874
+ lines.push(` - ${result.quarantined - 5} more`);
841
875
  }
842
876
  }
843
877
 
844
- ctx.ui.notify(lines.join("\n"), rendered.errors.length > 0 ? "warning" : "success");
878
+ ctx.ui.notify(lines.join("\n"), result.errors.length > 0 ? "warning" : "success");
845
879
  } catch (err) {
846
880
  const msg = err instanceof Error ? err.message : String(err);
847
881
  logWarning("command", `rebuild failed: ${msg}`);
@@ -21,7 +21,7 @@ import { nativeGetCurrentBranch, nativeDetectMainBranch } from "./native-git-bri
21
21
  import { formatDuration } from "../shared/format-utils.js";
22
22
  import { parseEvalReviewFrontmatter, type Verdict } from "./eval-review-schema.js";
23
23
  import { currentDirectoryRoot } from "./commands/context.js";
24
- import { buildPrEvidence } from "./pr-evidence.js";
24
+ import { buildPullRequestEvidence } from "./pull-request-process.js";
25
25
 
26
26
  function git(basePath: string, args: readonly string[]): string {
27
27
  return execFileSync("git", args, { cwd: basePath, encoding: "utf-8" }).trim();
@@ -178,7 +178,7 @@ function generatePRContent(basePath: string, milestoneId: string, milestoneTitle
178
178
  }
179
179
  }
180
180
 
181
- return buildPrEvidence({
181
+ return buildPullRequestEvidence({
182
182
  milestoneId,
183
183
  milestoneTitle,
184
184
  changeType: "feat",
@@ -4,11 +4,14 @@
4
4
  import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
5
5
 
6
6
  import { loadFile } from "./files.js";
7
- import { resolveMilestoneFile } from "./paths.js";
7
+ import { gsdProjectionRoot, resolveMilestoneFile } from "./paths.js";
8
+ import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
9
+ import { join } from "node:path";
8
10
  import { deriveState } from "./state.js";
9
11
  import { executeValidateMilestone } from "./tools/workflow-tool-executors.js";
10
12
  import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
11
13
  import { getLatestAssessmentByScope } from "./gsd-db.js";
14
+ import { checkpointWorkflowDatabase } from "./db-workspace.js";
12
15
  import {
13
16
  VALIDATION_VERDICTS,
14
17
  extractVerdict,
@@ -122,8 +125,20 @@ async function loadExistingValidation(
122
125
  basePath: string,
123
126
  milestoneId: string,
124
127
  ): Promise<ExistingValidation | null> {
128
+ const canonicalBase = resolveCanonicalMilestoneRoot(basePath, milestoneId);
129
+ const canonicalValidationPath = join(
130
+ gsdProjectionRoot(canonicalBase),
131
+ "milestones",
132
+ milestoneId,
133
+ `${milestoneId}-VALIDATION.md`,
134
+ );
135
+ const canonicalContent = await loadFile(canonicalValidationPath);
136
+ if (canonicalContent) {
137
+ return { content: canonicalContent, source: canonicalValidationPath };
138
+ }
139
+
125
140
  const validationPath = resolveMilestoneFile(basePath, milestoneId, "VALIDATION");
126
- if (validationPath) {
141
+ if (validationPath && validationPath !== canonicalValidationPath) {
127
142
  const content = await loadFile(validationPath);
128
143
  if (content) return { content, source: validationPath };
129
144
  }
@@ -222,6 +237,8 @@ export async function handleVerdict(
222
237
  return;
223
238
  }
224
239
 
240
+ checkpointWorkflowDatabase();
241
+
225
242
  const prevVerdict = current.verdict ?? "unknown";
226
243
  const effectiveVerdict = extractEffectiveVerdict(result.details, parsed.verdict);
227
244
  if (effectiveVerdict !== parsed.verdict) {
@@ -0,0 +1,170 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Workspace-facing Interface for opening and maintaining the workflow database.
3
+
4
+ import { existsSync } from "node:fs";
5
+ import { dirname } from "node:path";
6
+
7
+ import type { GsdWorkspace, MilestoneScope } from "./workspace.js";
8
+ import {
9
+ backupDatabaseSnapshot,
10
+ checkpointDatabase,
11
+ closeAllDatabases,
12
+ closeDatabase,
13
+ closeDatabaseByWorkspace,
14
+ getDbPath,
15
+ getDbStatus,
16
+ getDbProvider,
17
+ isDbAvailable,
18
+ openDatabase,
19
+ openDatabaseByScope,
20
+ openDatabaseByWorkspace,
21
+ refreshOpenDatabaseFromDisk,
22
+ vacuumDatabase,
23
+ wasDbOpenAttempted,
24
+ } from "./gsd-db.js";
25
+ import { resolveGsdPathContract } from "./paths.js";
26
+ import { setLogBasePath } from "./workflow-logger.js";
27
+
28
+ export interface WorkflowDatabaseLocation {
29
+ projectRoot: string;
30
+ projectGsd: string;
31
+ projectDb: string;
32
+ }
33
+
34
+ export type WorkflowDatabaseOpenReason =
35
+ | "opened-existing"
36
+ | "created-empty"
37
+ | "missing-database"
38
+ | "missing-gsd-dir"
39
+ | "open-failed";
40
+
41
+ export type WorkflowDatabaseOpenResult =
42
+ | {
43
+ ok: true;
44
+ reason: "opened-existing" | "created-empty";
45
+ location: WorkflowDatabaseLocation;
46
+ }
47
+ | {
48
+ ok: false;
49
+ reason: "missing-database" | "missing-gsd-dir" | "open-failed";
50
+ location: WorkflowDatabaseLocation;
51
+ error?: Error;
52
+ };
53
+
54
+ export type WorkflowDatabaseStatus = ReturnType<typeof getDbStatus>;
55
+ export type WorkflowDatabaseProvider = ReturnType<typeof getDbProvider>;
56
+
57
+ export function resolveWorkflowDatabaseLocation(basePath: string): WorkflowDatabaseLocation {
58
+ const contract = resolveGsdPathContract(basePath);
59
+ return {
60
+ projectRoot: dirname(dirname(contract.projectDb)),
61
+ projectGsd: contract.projectGsd,
62
+ projectDb: contract.projectDb,
63
+ };
64
+ }
65
+
66
+ /**
67
+ * Resolve the correct DB path for the current working directory.
68
+ * If `basePath` is inside a `.gsd/worktrees/<MID>/` directory, returns
69
+ * the project root's `.gsd/gsd.db` (shared WAL — R012). Otherwise returns
70
+ * `<basePath>/.gsd/gsd.db`.
71
+ */
72
+ export function resolveProjectRootDbPath(basePath: string): string {
73
+ return resolveWorkflowDatabaseLocation(basePath).projectDb;
74
+ }
75
+
76
+ export function openWorkflowDatabase(basePath: string): WorkflowDatabaseOpenResult {
77
+ const location = resolveWorkflowDatabaseLocation(basePath);
78
+ if (!existsSync(location.projectGsd)) {
79
+ return { ok: false, reason: "missing-gsd-dir", location };
80
+ }
81
+
82
+ const existed = existsSync(location.projectDb);
83
+ try {
84
+ const opened = openDatabase(location.projectDb);
85
+ if (!opened) {
86
+ return { ok: false, reason: "open-failed", location };
87
+ }
88
+ setLogBasePath(location.projectRoot);
89
+ return {
90
+ ok: true,
91
+ reason: existed ? "opened-existing" : "created-empty",
92
+ location,
93
+ };
94
+ } catch (err) {
95
+ return {
96
+ ok: false,
97
+ reason: "open-failed",
98
+ location,
99
+ error: err instanceof Error ? err : new Error(String(err)),
100
+ };
101
+ }
102
+ }
103
+
104
+ export function openExistingWorkflowDatabase(basePath: string): WorkflowDatabaseOpenResult {
105
+ const location = resolveWorkflowDatabaseLocation(basePath);
106
+ if (!existsSync(location.projectDb)) {
107
+ return { ok: false, reason: "missing-database", location };
108
+ }
109
+ return openWorkflowDatabase(basePath);
110
+ }
111
+
112
+ export function openWorkflowDatabasePath(path: string): boolean {
113
+ return openDatabase(path);
114
+ }
115
+
116
+ export function openWorkflowDatabaseByWorkspace(workspace: GsdWorkspace): boolean {
117
+ return openDatabaseByWorkspace(workspace);
118
+ }
119
+
120
+ export function openWorkflowDatabaseByScope(scope: MilestoneScope): boolean {
121
+ return openDatabaseByScope(scope);
122
+ }
123
+
124
+ export function closeWorkflowDatabase(): void {
125
+ closeDatabase();
126
+ }
127
+
128
+ export function closeWorkflowDatabaseByWorkspace(workspace: GsdWorkspace): void {
129
+ closeDatabaseByWorkspace(workspace);
130
+ }
131
+
132
+ export function closeAllWorkflowDatabases(): void {
133
+ closeAllDatabases();
134
+ }
135
+
136
+ export function isWorkflowDatabaseOpen(): boolean {
137
+ return isDbAvailable();
138
+ }
139
+
140
+ export function wasWorkflowDatabaseOpenAttempted(): boolean {
141
+ return wasDbOpenAttempted();
142
+ }
143
+
144
+ export function getWorkflowDatabaseStatus(): WorkflowDatabaseStatus {
145
+ return getDbStatus();
146
+ }
147
+
148
+ export function getWorkflowDatabaseProvider(): WorkflowDatabaseProvider {
149
+ return getDbProvider();
150
+ }
151
+
152
+ export function getWorkflowDatabasePath(): string | null {
153
+ return getDbPath();
154
+ }
155
+
156
+ export function refreshWorkflowDatabaseFromDisk(): boolean {
157
+ return refreshOpenDatabaseFromDisk();
158
+ }
159
+
160
+ export function checkpointWorkflowDatabase(): void {
161
+ checkpointDatabase();
162
+ }
163
+
164
+ export function vacuumWorkflowDatabase(): void {
165
+ vacuumDatabase();
166
+ }
167
+
168
+ export function backupWorkflowDatabaseSnapshot(label: string): string | null {
169
+ return backupDatabaseSnapshot(label);
170
+ }
@@ -25,6 +25,7 @@ const _counters = {
25
25
  parsePlanTotalMs: 0,
26
26
  dispatches: 0,
27
27
  renders: 0,
28
+ gitInvocations: 0,
28
29
  };
29
30
 
30
31
  /** Max debug log files to keep. Older ones are pruned on enable. */
@@ -131,6 +132,15 @@ export function debugCount(counter: keyof typeof _counters, value = 1): void {
131
132
  _counters[counter] += value;
132
133
  }
133
134
 
135
+ /**
136
+ * Snapshot the current debug counters. Used by the per-dispatch benchmark
137
+ * harness (#442) to read counts without disabling debug (which is what
138
+ * writeDebugSummary does). Returns a copy so callers can't mutate internal state.
139
+ */
140
+ export function getDebugCounters(): Readonly<typeof _counters> {
141
+ return { ..._counters };
142
+ }
143
+
134
144
  /** Record a peak value (only updates if new value is higher). */
135
145
  export function debugPeak(counter: keyof typeof _counters, value: number): void {
136
146
  if (!_enabled) return;
@@ -168,6 +178,7 @@ export function writeDebugSummary(): string | null {
168
178
  avgTtsrCheck_ms,
169
179
  ttsrPeakBuffer: _counters.ttsrPeakBuffer,
170
180
  renders: _counters.renders,
181
+ gitInvocations: _counters.gitInvocations,
171
182
  });
172
183
 
173
184
  return disableDebug();
@@ -35,6 +35,8 @@
35
35
  // existing entry is the place to lift any of these out of default-deny
36
36
  // when the analysis has been done.
37
37
 
38
+ import { canonicalWorkflowSurfaceToolName } from "./workflow-tool-surface.js";
39
+
38
40
  export type BackgroundabilityVerdict = "good" | "risky" | "no";
39
41
 
40
42
  export interface DelegationPolicyEntry {
@@ -123,18 +125,8 @@ const POLICY: Record<string, DelegationPolicyEntry> = {
123
125
  },
124
126
  };
125
127
 
126
- // Alias map keyed on the secondary name; resolves to the canonical entry above.
127
- // Sourced from packages/mcp-server/src/workflow-tools.ts alias registrations
128
- // (gsd_milestone_validate, gsd_roadmap_reassess, gsd_slice_replan, gsd_task_plan).
129
- const ALIASES: Record<string, string> = {
130
- gsd_milestone_validate: "gsd_validate_milestone",
131
- gsd_roadmap_reassess: "gsd_reassess_roadmap",
132
- gsd_slice_replan: "gsd_replan_slice",
133
- gsd_task_plan: "gsd_plan_task",
134
- };
135
-
136
128
  function resolveCanonical(name: string): string {
137
- return ALIASES[name] ?? name;
129
+ return canonicalWorkflowSurfaceToolName(name);
138
130
  }
139
131
 
140
132
  export function getDelegationVerdict(toolName: string): DelegationPolicyEntry | null {