gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.04f5ccf82

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 (653) hide show
  1. package/README.md +93 -18
  2. package/dist/cli.js +20 -9
  3. package/dist/headless-ui.js +13 -6
  4. package/dist/headless.js +9 -2
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/GSD-WORKFLOW.md +10 -1
  7. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  8. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
  9. package/dist/resources/extensions/cmux/index.js +5 -0
  10. package/dist/resources/extensions/gsd/auto/detect-stuck.js +1 -1
  11. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  12. package/dist/resources/extensions/gsd/auto/loop.js +122 -40
  13. package/dist/resources/extensions/gsd/auto/orchestrator.js +15 -4
  14. package/dist/resources/extensions/gsd/auto/phases.js +146 -49
  15. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  16. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  17. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  18. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  19. package/dist/resources/extensions/gsd/auto-budget.js +9 -0
  20. package/dist/resources/extensions/gsd/auto-dashboard.js +72 -5
  21. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +185 -30
  23. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  24. package/dist/resources/extensions/gsd/auto-post-unit.js +329 -137
  25. package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
  26. package/dist/resources/extensions/gsd/auto-recovery.js +82 -16
  27. package/dist/resources/extensions/gsd/auto-start.js +99 -16
  28. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  29. package/dist/resources/extensions/gsd/auto-verification.js +146 -34
  30. package/dist/resources/extensions/gsd/auto-worktree.js +185 -26
  31. package/dist/resources/extensions/gsd/auto.js +135 -74
  32. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +65 -10
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +13 -10
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +14 -4
  35. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  36. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  37. package/dist/resources/extensions/gsd/clean-root-preflight.js +267 -8
  38. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  39. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
  40. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  41. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  42. package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
  43. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  44. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +16 -4
  45. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  46. package/dist/resources/extensions/gsd/crash-recovery.js +55 -7
  47. package/dist/resources/extensions/gsd/db/auto-workers.js +30 -0
  48. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  49. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  50. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  51. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  52. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  53. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  54. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  55. package/dist/resources/extensions/gsd/doctor-git-checks.js +74 -3
  56. package/dist/resources/extensions/gsd/doctor-proactive.js +14 -2
  57. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  58. package/dist/resources/extensions/gsd/doctor.js +2 -28
  59. package/dist/resources/extensions/gsd/export-html.js +27 -425
  60. package/dist/resources/extensions/gsd/forensics.js +10 -3
  61. package/dist/resources/extensions/gsd/git-conflict-state.js +21 -0
  62. package/dist/resources/extensions/gsd/git-service.js +152 -15
  63. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  64. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  65. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  66. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  67. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  68. package/dist/resources/extensions/gsd/markdown-renderer.js +14 -11
  69. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  70. package/dist/resources/extensions/gsd/migrate/parsers.js +121 -2
  71. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  72. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  73. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  74. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  75. package/dist/resources/extensions/gsd/paths.js +4 -0
  76. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  77. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  78. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  79. package/dist/resources/extensions/gsd/pre-execution-checks.js +54 -19
  80. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  81. package/dist/resources/extensions/gsd/preferences-models.js +6 -4
  82. package/dist/resources/extensions/gsd/preferences-types.js +3 -0
  83. package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
  84. package/dist/resources/extensions/gsd/preferences.js +35 -0
  85. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  86. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  88. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  89. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  90. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  91. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  92. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  93. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  94. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  95. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  96. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  97. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  98. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  99. package/dist/resources/extensions/gsd/repo-identity.js +39 -22
  100. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  101. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  102. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  103. package/dist/resources/extensions/gsd/session-lock.js +15 -2
  104. package/dist/resources/extensions/gsd/slice-parallel-conflict.js +2 -2
  105. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +84 -5
  106. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  107. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  108. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  109. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  110. package/dist/resources/extensions/gsd/state.js +28 -7
  111. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  112. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  113. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  114. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  115. package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -9
  116. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
  117. package/dist/resources/extensions/gsd/tools/exec-tool.js +87 -5
  118. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  119. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  120. package/dist/resources/extensions/gsd/tools/validate-milestone.js +32 -1
  121. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
  122. package/dist/resources/extensions/gsd/tui/render-kit.js +33 -0
  123. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  124. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  125. package/dist/resources/extensions/gsd/validation.js +23 -1
  126. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  127. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  128. package/dist/resources/extensions/gsd/watch/header-renderer.js +34 -25
  129. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  130. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  131. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  132. package/dist/resources/extensions/gsd/worktree-lifecycle.js +86 -19
  133. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  134. package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
  135. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  136. package/dist/resources/extensions/gsd/worktree-telemetry.js +32 -0
  137. package/dist/resources/extensions/shared/html-shell.js +388 -0
  138. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  139. package/dist/resources/extensions/shared/next-action-ui.js +13 -5
  140. package/dist/resources/extensions/subagent/index.js +448 -78
  141. package/dist/resources/extensions/subagent/launch.js +77 -0
  142. package/dist/resources/extensions/subagent/run-store.js +148 -0
  143. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  144. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  145. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  146. package/dist/resources/extensions/visual-brief/index.js +5 -0
  147. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  148. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  149. package/dist/resources/skills/forensics/SKILL.md +1 -1
  150. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  151. package/dist/web/standalone/.next/BUILD_ID +1 -1
  152. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  153. package/dist/web/standalone/.next/build-manifest.json +3 -3
  154. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  155. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  156. package/dist/web/standalone/.next/required-server-files.json +1 -1
  157. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  159. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  163. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  167. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  171. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  172. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  174. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  177. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  179. package/dist/web/standalone/.next/server/app/index.html +1 -1
  180. package/dist/web/standalone/.next/server/app/index.rsc +4 -7
  181. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  182. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
  183. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  185. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  186. package/dist/web/standalone/.next/server/app/page.js +2 -2
  187. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  190. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  191. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/next-font-manifest.json +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/2973.33f26573894b6153.js +2 -0
  199. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  200. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  201. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  202. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  203. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  204. package/dist/web/standalone/server.js +1 -1
  205. package/dist/welcome-screen.js +7 -8
  206. package/package.json +4 -4
  207. package/packages/contracts/dist/rpc.test.js +7 -0
  208. package/packages/contracts/dist/rpc.test.js.map +1 -1
  209. package/packages/contracts/dist/workflow.d.ts +21 -0
  210. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  211. package/packages/contracts/dist/workflow.js +24 -0
  212. package/packages/contracts/dist/workflow.js.map +1 -1
  213. package/packages/contracts/src/rpc.test.ts +8 -0
  214. package/packages/contracts/src/workflow.ts +24 -0
  215. package/packages/daemon/package.json +2 -2
  216. package/packages/mcp-server/README.md +13 -4
  217. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  218. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  219. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  220. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  221. package/packages/mcp-server/package.json +2 -2
  222. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  223. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  224. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  225. package/packages/native/package.json +1 -1
  226. package/packages/native/src/__tests__/stream-process.test.mjs +32 -12
  227. package/packages/native/tsconfig.json +2 -1
  228. package/packages/native/tsconfig.tsbuildinfo +1 -1
  229. package/packages/pi-agent-core/package.json +1 -1
  230. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  231. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  232. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  233. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  234. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  235. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  236. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  237. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  238. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  239. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  240. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  241. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  242. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  243. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  244. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  245. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  246. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  247. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  248. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  249. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  250. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  251. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  252. package/packages/pi-ai/package.json +1 -1
  253. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  254. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  255. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  256. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  257. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  258. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  259. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  260. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  261. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  262. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  263. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  264. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  265. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  266. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  267. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  269. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  271. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  273. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  275. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +3 -0
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +16 -0
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +82 -97
  290. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  291. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  292. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  296. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  297. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  298. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  299. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  300. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  301. package/packages/pi-coding-agent/package.json +1 -1
  302. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  303. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  304. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  305. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  306. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  307. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  308. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  309. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +20 -0
  310. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -0
  311. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  312. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  313. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +91 -102
  314. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  315. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  316. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  317. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  318. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  319. package/packages/pi-tui/dist/__tests__/loader.test.d.ts +2 -0
  320. package/packages/pi-tui/dist/__tests__/loader.test.d.ts.map +1 -0
  321. package/packages/pi-tui/dist/__tests__/loader.test.js +24 -0
  322. package/packages/pi-tui/dist/__tests__/loader.test.js.map +1 -0
  323. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  324. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  325. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  326. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  327. package/packages/pi-tui/dist/__tests__/tui.test.js +72 -4
  328. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  329. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  330. package/packages/pi-tui/dist/components/loader.js +3 -0
  331. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  332. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  333. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  334. package/packages/pi-tui/dist/terminal.js +12 -0
  335. package/packages/pi-tui/dist/terminal.js.map +1 -1
  336. package/packages/pi-tui/dist/tui.d.ts +1 -0
  337. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  338. package/packages/pi-tui/dist/tui.js +117 -33
  339. package/packages/pi-tui/dist/tui.js.map +1 -1
  340. package/packages/pi-tui/package.json +1 -1
  341. package/packages/pi-tui/src/__tests__/loader.test.ts +30 -0
  342. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  343. package/packages/pi-tui/src/__tests__/tui.test.ts +90 -4
  344. package/packages/pi-tui/src/components/loader.ts +3 -0
  345. package/packages/pi-tui/src/terminal.ts +11 -0
  346. package/packages/pi-tui/src/tui.ts +116 -33
  347. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  348. package/packages/rpc-client/package.json +1 -1
  349. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  350. package/pkg/package.json +1 -1
  351. package/src/resources/GSD-WORKFLOW.md +10 -1
  352. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  353. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  354. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  355. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  356. package/src/resources/extensions/cmux/index.ts +6 -0
  357. package/src/resources/extensions/gsd/auto/contracts.ts +19 -6
  358. package/src/resources/extensions/gsd/auto/detect-stuck.ts +1 -0
  359. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  360. package/src/resources/extensions/gsd/auto/loop.ts +123 -40
  361. package/src/resources/extensions/gsd/auto/orchestrator.ts +15 -4
  362. package/src/resources/extensions/gsd/auto/phases.ts +172 -60
  363. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  364. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  365. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  366. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  367. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  368. package/src/resources/extensions/gsd/auto-budget.ts +11 -0
  369. package/src/resources/extensions/gsd/auto-dashboard.ts +78 -5
  370. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  371. package/src/resources/extensions/gsd/auto-dispatch.ts +208 -29
  372. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  373. package/src/resources/extensions/gsd/auto-post-unit.ts +369 -148
  374. package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
  375. package/src/resources/extensions/gsd/auto-recovery.ts +86 -13
  376. package/src/resources/extensions/gsd/auto-start.ts +109 -14
  377. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  378. package/src/resources/extensions/gsd/auto-verification.ts +174 -42
  379. package/src/resources/extensions/gsd/auto-worktree.ts +202 -30
  380. package/src/resources/extensions/gsd/auto.ts +172 -81
  381. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
  382. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -10
  383. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -4
  384. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  385. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  386. package/src/resources/extensions/gsd/clean-root-preflight.ts +284 -8
  387. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  388. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
  389. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  390. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  391. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  392. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  393. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +17 -4
  394. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  395. package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
  396. package/src/resources/extensions/gsd/db/auto-workers.ts +37 -0
  397. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  398. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  399. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  400. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  401. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  402. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  403. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  404. package/src/resources/extensions/gsd/doctor-git-checks.ts +73 -3
  405. package/src/resources/extensions/gsd/doctor-proactive.ts +18 -2
  406. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  407. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  408. package/src/resources/extensions/gsd/doctor.ts +2 -27
  409. package/src/resources/extensions/gsd/export-html.ts +27 -427
  410. package/src/resources/extensions/gsd/forensics.ts +9 -3
  411. package/src/resources/extensions/gsd/git-conflict-state.ts +23 -0
  412. package/src/resources/extensions/gsd/git-service.ts +182 -16
  413. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  414. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  415. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  416. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  417. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  418. package/src/resources/extensions/gsd/journal.ts +8 -1
  419. package/src/resources/extensions/gsd/markdown-renderer.ts +14 -11
  420. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  421. package/src/resources/extensions/gsd/migrate/parsers.ts +139 -2
  422. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  423. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  424. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  425. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  426. package/src/resources/extensions/gsd/paths.ts +5 -0
  427. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  428. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  429. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  430. package/src/resources/extensions/gsd/pre-execution-checks.ts +67 -19
  431. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  432. package/src/resources/extensions/gsd/preferences-models.ts +6 -4
  433. package/src/resources/extensions/gsd/preferences-types.ts +35 -0
  434. package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
  435. package/src/resources/extensions/gsd/preferences.ts +39 -0
  436. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  437. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  438. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  439. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  440. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  441. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  442. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  443. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  444. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  445. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  446. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  448. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  449. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  450. package/src/resources/extensions/gsd/repo-identity.ts +45 -25
  451. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  452. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  453. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  454. package/src/resources/extensions/gsd/session-lock.ts +15 -2
  455. package/src/resources/extensions/gsd/slice-parallel-conflict.ts +2 -2
  456. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +75 -3
  457. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  458. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  459. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  460. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  461. package/src/resources/extensions/gsd/state.ts +33 -7
  462. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  463. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  464. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  465. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  466. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  467. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  468. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  469. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  470. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +775 -34
  471. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +245 -28
  472. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  473. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  474. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  475. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +136 -13
  476. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
  477. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  478. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  479. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  480. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +29 -0
  481. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  482. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  483. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  484. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  485. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +170 -3
  486. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  487. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  488. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  489. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +55 -2
  490. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -9
  491. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  492. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  493. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  494. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  495. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  496. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  497. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +139 -1
  498. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  499. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +140 -1
  500. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  501. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  502. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  503. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +99 -1
  504. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +15 -1
  505. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  506. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  507. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  508. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  509. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  510. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  511. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  512. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  513. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  514. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  515. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  516. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  517. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  518. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +36 -1
  519. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +33 -1
  520. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  521. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +226 -2
  522. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +5 -21
  523. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
  524. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  525. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +40 -0
  526. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  527. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  528. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  529. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  530. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  531. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +21 -40
  532. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +59 -1
  533. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  534. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +60 -0
  535. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  536. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  537. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  538. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  539. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  540. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  541. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  542. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  543. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  544. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  545. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  546. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  547. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +8 -1
  548. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  549. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +147 -0
  550. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  551. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  552. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  553. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +148 -0
  554. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +79 -0
  555. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +42 -1
  556. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  557. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  558. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  559. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  560. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  561. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +28 -1
  562. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  563. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  564. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +35 -0
  565. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
  566. package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +2 -2
  567. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +112 -1
  568. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  569. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +94 -2
  570. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  571. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  572. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  573. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  574. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  575. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  576. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +22 -0
  577. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  578. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  579. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  580. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  581. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +68 -0
  582. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  583. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +188 -1
  584. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  585. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  586. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  587. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  588. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +153 -1
  589. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  590. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  591. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +73 -2
  592. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  593. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
  594. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  595. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +16 -0
  596. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  597. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  598. package/src/resources/extensions/gsd/tools/complete-milestone.ts +18 -10
  599. package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
  600. package/src/resources/extensions/gsd/tools/exec-tool.ts +98 -5
  601. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  602. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  603. package/src/resources/extensions/gsd/tools/validate-milestone.ts +31 -0
  604. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
  605. package/src/resources/extensions/gsd/tui/render-kit.ts +44 -0
  606. package/src/resources/extensions/gsd/types.ts +1 -1
  607. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  608. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  609. package/src/resources/extensions/gsd/validation.ts +23 -1
  610. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  611. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  612. package/src/resources/extensions/gsd/watch/header-renderer.ts +35 -24
  613. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  614. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  615. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  616. package/src/resources/extensions/gsd/worktree-lifecycle.ts +98 -20
  617. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  618. package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
  619. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  620. package/src/resources/extensions/gsd/worktree-telemetry.ts +39 -0
  621. package/src/resources/extensions/shared/html-shell.ts +412 -0
  622. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  623. package/src/resources/extensions/shared/next-action-ui.ts +11 -5
  624. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  625. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -0
  626. package/src/resources/extensions/subagent/index.ts +567 -103
  627. package/src/resources/extensions/subagent/launch.ts +131 -0
  628. package/src/resources/extensions/subagent/run-store.ts +218 -0
  629. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  630. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  631. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  632. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  633. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  634. package/src/resources/extensions/visual-brief/index.ts +8 -0
  635. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  636. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  637. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  638. package/src/resources/skills/forensics/SKILL.md +1 -1
  639. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  640. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  641. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  642. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  643. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  644. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  645. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  646. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  647. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  648. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  649. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  650. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  651. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  652. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → w_ikFkx_-OHxisG9xjz4u}/_buildManifest.js +0 -0
  653. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → w_ikFkx_-OHxisG9xjz4u}/_ssgManifest.js +0 -0
@@ -3,6 +3,7 @@ import { join, resolve } from "node:path";
3
3
 
4
4
  import { loadRegistry } from "../workflow-templates.js";
5
5
  import { gsdHome } from "../gsd-home.js";
6
+ import { VISUAL_BRIEF_MODES } from "../../visual-brief/prompts.js";
6
7
 
7
8
 
8
9
  export interface GsdCommandDefinition {
@@ -13,7 +14,7 @@ export interface GsdCommandDefinition {
13
14
  type CompletionMap = Record<string, readonly GsdCommandDefinition[]>;
14
15
 
15
16
  export const GSD_COMMAND_DESCRIPTION =
16
- "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|model|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|debug|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|new-project|parallel|cmux|park|unpark|init|setup|onboarding|inspect|extensions|update|fast|mcp|rethink|workflow|codebase|notifications|ship|do|session-report|backlog|pr-branch|add-tests|scan|language|worktree|eval-review";
17
+ "GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|brief|queue|quick|discuss|capture|triage|dispatch|verdict|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|model|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|debug|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|new-project|parallel|cmux|park|unpark|init|setup|onboarding|inspect|extensions|update|fast|mcp|rethink|workflow|codebase|notifications|ship|do|session-report|backlog|pr-branch|add-tests|scan|language|worktree|eval-review";
17
18
 
18
19
  export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
19
20
  { cmd: "help", desc: "Categorized command reference with descriptions" },
@@ -24,6 +25,7 @@ export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
24
25
  { cmd: "status", desc: "Progress dashboard" },
25
26
  { cmd: "widget", desc: "Cycle widget: full → small → min → off" },
26
27
  { cmd: "visualize", desc: "Open 10-tab workflow visualizer (progress, timeline, deps, metrics, health, agent, changes, knowledge, captures, export)" },
28
+ { cmd: "brief", desc: "Generate a visual HTML brief: diagram, plan, diff review, recap, table, or slides" },
27
29
  { cmd: "queue", desc: "Queue and reorder future milestones" },
28
30
  { cmd: "quick", desc: "Execute a quick task without full planning overhead" },
29
31
  { cmd: "discuss", desc: "Discuss architecture and decisions" },
@@ -31,6 +33,7 @@ export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
31
33
  { cmd: "changelog", desc: "Show categorized release notes" },
32
34
  { cmd: "triage", desc: "Manually trigger triage of pending captures" },
33
35
  { cmd: "dispatch", desc: "Dispatch a specific phase directly" },
36
+ { cmd: "verdict", desc: "Override the recorded milestone validation verdict (pass|needs-attention|needs-remediation)" },
34
37
  { cmd: "history", desc: "View execution history" },
35
38
  { cmd: "undo", desc: "Revert last completed unit" },
36
39
  { cmd: "undo-task", desc: "Reset a specific task's completion state (DB + markdown)" },
@@ -88,6 +91,7 @@ export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
88
91
  ];
89
92
 
90
93
  const NESTED_COMPLETIONS: CompletionMap = {
94
+ brief: VISUAL_BRIEF_MODES.map((mode) => ({ cmd: mode.mode, desc: mode.description })),
91
95
  auto: [
92
96
  { cmd: "--verbose", desc: "Show detailed execution output" },
93
97
  { cmd: "--debug", desc: "Enable debug logging" },
@@ -245,6 +249,11 @@ const NESTED_COMPLETIONS: CompletionMap = {
245
249
  { cmd: "uat", desc: "Run user acceptance testing" },
246
250
  { cmd: "replan", desc: "Replan the current slice" },
247
251
  ],
252
+ verdict: [
253
+ { cmd: "pass", desc: "Override the milestone validation verdict to pass" },
254
+ { cmd: "needs-attention", desc: "Override the verdict to needs-attention (requires --rationale)" },
255
+ { cmd: "needs-remediation", desc: "Override the verdict to needs-remediation (requires --rationale)" },
256
+ ],
248
257
  rate: [
249
258
  { cmd: "over", desc: "Model was overqualified for this task" },
250
259
  { cmd: "ok", desc: "Model was appropriate for this task" },
@@ -1,6 +1,7 @@
1
1
  import type { ExtensionAPI, ExtensionCommandContext, ExtensionContext } from "@gsd/pi-coding-agent";
2
2
  import type { Model } from "@gsd/pi-ai";
3
3
  import type { GSDState } from "../../types.js";
4
+ import { createRequire } from "node:module";
4
5
 
5
6
  import { computeProgressScore, formatProgressLine } from "../../progress-score.js";
6
7
  import { loadEffectiveGSDPreferences, getGlobalGSDPreferencesPath, getProjectGSDPreferencesPath } from "../../preferences.js";
@@ -11,6 +12,8 @@ import { handleCmux } from "../../commands-cmux.js";
11
12
  import { setSessionModelOverride } from "../../session-model-override.js";
12
13
  import { projectRoot } from "../context.js";
13
14
  import { formattedShortcutPair } from "../../shortcut-defs.js";
15
+ import { getVisualBriefOutputDir } from "../../../visual-brief/artifact-policy.js";
16
+ import { buildVisualBriefPrompt, parseVisualBriefArgs, VISUAL_BRIEF_USAGE } from "../../../visual-brief/prompts.js";
14
17
 
15
18
  export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
16
19
  const summaryLines = [
@@ -27,6 +30,7 @@ export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
27
30
  ` /gsd parallel watch Parallel monitor (${formattedShortcutPair("parallel")})`,
28
31
  ` /gsd notifications Notification history (${formattedShortcutPair("notifications")})`,
29
32
  " /gsd visualize Interactive 10-tab TUI",
33
+ " /gsd brief <mode> Visual HTML brief (diagram, plan, diff, recap, table, slides)",
30
34
  " /gsd queue Show queued/dispatched units",
31
35
  "",
32
36
  "COURSE CORRECTION",
@@ -67,6 +71,7 @@ export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
67
71
  " /gsd new-project Bootstrap a new project (use --deep for staged project-level discovery)",
68
72
  " /gsd quick Execute a quick task without full planning overhead",
69
73
  " /gsd dispatch Dispatch a specific phase directly [research|plan|execute|complete|uat|replan]",
74
+ " /gsd verdict <v> Override milestone validation verdict [pass|needs-attention|needs-remediation] [--milestone Mxxx] [--rationale \"...\"]",
70
75
  " /gsd parallel Parallel milestone orchestration [start|status|stop|pause|resume|merge|watch]",
71
76
  " /gsd workflow Custom workflow lifecycle [new|run|list|validate|pause|resume]",
72
77
  "",
@@ -75,6 +80,7 @@ export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
75
80
  ` /gsd parallel watch Open parallel worker monitor (${formattedShortcutPair("parallel")})`,
76
81
  " /gsd widget Cycle status widget [full|small|min|off]",
77
82
  " /gsd visualize Interactive 10-tab TUI (progress, timeline, deps, metrics, health, agent, changes, knowledge, captures, export)",
83
+ " /gsd brief <mode> Generate a visual HTML brief [diagram|plan|diff|recap|table|slides] [topic] [--slides]",
78
84
  " /gsd queue Show queued/dispatched units and execution order",
79
85
  " /gsd history View execution history [--cost] [--phase] [--model] [N]",
80
86
  " /gsd changelog Show categorized release notes [version]",
@@ -203,6 +209,37 @@ export async function handleVisualize(ctx: ExtensionCommandContext): Promise<voi
203
209
  }
204
210
  }
205
211
 
212
+ export async function handleBrief(args: string, ctx: ExtensionCommandContext, pi?: ExtensionAPI): Promise<void> {
213
+ const request = parseVisualBriefArgs(args);
214
+ if (!request) {
215
+ ctx.ui.notify(VISUAL_BRIEF_USAGE, "info");
216
+ return;
217
+ }
218
+
219
+ if (!pi?.sendUserMessage) {
220
+ ctx.ui.notify("Visual brief generation is unavailable in this context.", "warning");
221
+ return;
222
+ }
223
+
224
+ const outputDir = getVisualBriefOutputDir();
225
+ const version = resolveGsdVersion();
226
+ pi.sendUserMessage(buildVisualBriefPrompt(request, { outputDir, version }));
227
+ }
228
+
229
+ const briefRequire = createRequire(import.meta.url);
230
+
231
+ function resolveGsdVersion(): string | undefined {
232
+ const envVersion = process.env.GSD_VERSION?.trim();
233
+ if (envVersion) return envVersion;
234
+ try {
235
+ const pkg = briefRequire("../../../../../../package.json") as { version?: unknown };
236
+ const fromPkg = typeof pkg.version === "string" ? pkg.version.trim() : "";
237
+ return fromPkg || undefined;
238
+ } catch {
239
+ return undefined;
240
+ }
241
+ }
242
+
206
243
  export async function handleSetup(args: string, ctx: ExtensionCommandContext, pi?: ExtensionAPI): Promise<void> {
207
244
  const { detectProjectState, hasGlobalSetup } = await import("../../detection.js");
208
245
  const { isOnboardingComplete, readOnboardingRecord } = await import("../../onboarding-state.js");
@@ -429,6 +466,10 @@ export async function handleCoreCommand(
429
466
  await handleVisualize(ctx);
430
467
  return true;
431
468
  }
469
+ if (trimmed === "brief" || trimmed.startsWith("brief ")) {
470
+ await handleBrief(trimmed.replace(/^brief\s*/, "").trim(), ctx, pi);
471
+ return true;
472
+ }
432
473
  if (trimmed === "widget" || trimmed.startsWith("widget ")) {
433
474
  const { cycleWidgetMode, setWidgetMode, getWidgetMode } = await import("../../auto-dashboard.js");
434
475
  const arg = trimmed.replace(/^widget\s*/, "").trim();
@@ -20,6 +20,22 @@ import { handlePrBranch } from "../../commands-pr-branch.js";
20
20
  import { currentDirectoryRoot, projectRoot } from "../context.js";
21
21
 
22
22
  export async function handleOpsCommand(trimmed: string, ctx: ExtensionCommandContext, pi: ExtensionAPI): Promise<boolean> {
23
+ const directDispatchAlias = new Map<string, string>([
24
+ ["research-milestone", "research"],
25
+ ["research-slice", "research"],
26
+ ["plan-milestone", "plan"],
27
+ ["plan-slice", "plan"],
28
+ ["execute-task", "execute"],
29
+ ["complete-slice", "complete"],
30
+ ["validate-milestone", "uat"],
31
+ ["complete-milestone", "complete"],
32
+ ]);
33
+ const aliasPhase = directDispatchAlias.get(trimmed);
34
+ if (aliasPhase) {
35
+ await dispatchDirectPhase(ctx, pi, aliasPhase, projectRoot());
36
+ return true;
37
+ }
38
+
23
39
  if (trimmed === "init") {
24
40
  const { detectProjectState } = await import("../../detection.js");
25
41
  const { handleReinit, showProjectInit } = await import("../../init-wizard.js");
@@ -188,6 +204,11 @@ Examples:
188
204
  await dispatchDirectPhase(ctx, pi, phase, projectRoot());
189
205
  return true;
190
206
  }
207
+ if (trimmed === "verdict" || trimmed.startsWith("verdict ")) {
208
+ const { handleVerdict } = await import("../../commands-verdict.js");
209
+ await handleVerdict(trimmed.replace(/^verdict\s*/, "").trim(), ctx, projectRoot());
210
+ return true;
211
+ }
191
212
  if (trimmed === "notifications" || trimmed.startsWith("notifications ")) {
192
213
  const { handleNotificationsCommand } = await import("./notifications-handler.js");
193
214
  await handleNotificationsCommand(trimmed.replace(/^notifications\s*/, "").trim(), ctx, pi);
@@ -1,4 +1,5 @@
1
1
  import { importExtensionModule, type ExtensionAPI, type ExtensionCommandContext } from "@gsd/pi-coding-agent";
2
+ import { VISUAL_BRIEF_MODES } from "../visual-brief/prompts.js";
2
3
 
3
4
  const TOP_LEVEL_SUBCOMMANDS = [
4
5
  { cmd: "help", desc: "Categorized command reference with descriptions" },
@@ -8,6 +9,7 @@ const TOP_LEVEL_SUBCOMMANDS = [
8
9
  { cmd: "pause", desc: "Pause auto-mode (preserves state, /gsd auto to resume)" },
9
10
  { cmd: "status", desc: "Progress dashboard" },
10
11
  { cmd: "visualize", desc: "Open workflow visualizer" },
12
+ { cmd: "brief", desc: "Generate a visual HTML brief" },
11
13
  { cmd: "queue", desc: "Queue and reorder future milestones" },
12
14
  { cmd: "quick", desc: "Execute a quick task without full planning overhead" },
13
15
  { cmd: "discuss", desc: "Discuss architecture and decisions" },
@@ -87,6 +89,14 @@ function getGsdArgumentCompletions(prefix: string) {
87
89
  ], "next");
88
90
  }
89
91
 
92
+ if (parts[0] === "brief" && parts.length <= 2) {
93
+ return filterStartsWith(
94
+ partial,
95
+ VISUAL_BRIEF_MODES.map((mode) => ({ cmd: mode.mode, desc: mode.description })),
96
+ "brief",
97
+ );
98
+ }
99
+
90
100
  if ((parts[0] === "new-project" || parts[0] === "new-milestone") && parts.length <= 2) {
91
101
  return filterStartsWith(partial, [
92
102
  { cmd: "--deep", desc: "Enable deep planning mode (staged project-level discovery)" },
@@ -123,6 +123,8 @@ export async function handleDoctor(args: string, ctx: ExtensionCommandContext, p
123
123
  const { jsonMode, dryRun, fixFlag, includeBuild, includeTests, mode, requestedScope } = parseDoctorArgs(args);
124
124
  const scope = await selectDoctorScope(projectRoot(), requestedScope);
125
125
  const effectiveScope = mode === "audit" ? requestedScope : scope;
126
+ const { ensureDbOpen } = await import("./bootstrap/dynamic-tools.js");
127
+ await ensureDbOpen(projectRoot());
126
128
  const report = await runGSDDoctor(projectRoot(), {
127
129
  fix: mode === "fix" || mode === "heal" || dryRun || fixFlag,
128
130
  dryRun,
@@ -32,6 +32,11 @@ export interface McpServerDetail extends McpServerStatus {
32
32
  tools: string[];
33
33
  }
34
34
 
35
+ export function hasHostMcpTool(systemPrompt: string, serverName: string): boolean {
36
+ const marker = `mcp__${serverName}__`;
37
+ return systemPrompt.includes(marker);
38
+ }
39
+
35
40
  export function formatMcpInitResult(
36
41
  status: "created" | "updated" | "unchanged",
37
42
  configPath: string,
@@ -184,6 +189,7 @@ export async function handleMcpStatus(
184
189
  const trimmed = args.trim();
185
190
  const lowered = trimmed.toLowerCase();
186
191
  const configs = readMcpConfigs();
192
+ const systemPrompt = ctx.getSystemPrompt();
187
193
 
188
194
  // /gsd mcp init [dir]
189
195
  if (!lowered || lowered === "status") {
@@ -233,6 +239,7 @@ export async function handleMcpStatus(
233
239
  } catch {
234
240
  // mcp-client may not expose status helpers — that's fine
235
241
  }
242
+ if (!connected && !error && hasHostMcpTool(systemPrompt, serverName)) connected = true;
236
243
 
237
244
  ctx.ui.notify(
238
245
  formatMcpServerDetail({
@@ -270,6 +277,7 @@ export async function handleMcpStatus(
270
277
  } catch {
271
278
  // Fall back to unknown state
272
279
  }
280
+ if (!connected && !error && hasHostMcpTool(systemPrompt, config.name)) connected = true;
273
281
 
274
282
  statuses.push({
275
283
  name: config.name,
@@ -17,6 +17,7 @@ import {
17
17
  loadGlobalGSDPreferences,
18
18
  loadProjectGSDPreferences,
19
19
  loadEffectiveGSDPreferences,
20
+ normalizePreferencesShape,
20
21
  resolveAllSkillReferences,
21
22
  } from "./preferences.js";
22
23
  import { loadFile, saveFile, splitFrontmatter, parseFrontmatterMap } from "./files.js";
@@ -587,10 +588,18 @@ async function configureModels(ctx: ExtensionCommandContext, prefs: Record<strin
587
588
  const models: Record<string, unknown> = (prefs.models as Record<string, unknown>) ?? {};
588
589
 
589
590
  const availableModels = ctx.modelRegistry.getAvailable();
590
- if (availableModels.length > 0) {
591
+ // Call getAllWithDiscovered as a method so `this` stays bound to the
592
+ // registry — invoking a detached reference loses `this` and the method's
593
+ // internal `this.models` access throws.
594
+ const registry = ctx.modelRegistry as { getAllWithDiscovered?: () => typeof availableModels };
595
+ const availableProviders = new Set(availableModels.map((m) => m.provider));
596
+ const selectableModels = typeof registry.getAllWithDiscovered === "function"
597
+ ? registry.getAllWithDiscovered().filter((m) => availableProviders.has(m.provider))
598
+ : availableModels;
599
+ if (selectableModels.length > 0) {
591
600
  // Group models by provider, sorted alphabetically
592
- const byProvider = new Map<string, typeof availableModels>();
593
- for (const m of availableModels) {
601
+ const byProvider = new Map<string, typeof selectableModels>();
602
+ for (const m of selectableModels) {
594
603
  let group = byProvider.get(m.provider);
595
604
  if (!group) {
596
605
  group = [];
@@ -1563,8 +1572,12 @@ export async function handlePrefsWizard(
1563
1572
  // Order: existing-on-disk values, overlaid with prefill (caller's seeded answers).
1564
1573
  // Callers like /gsd init pass freshly-collected init answers as prefill so the
1565
1574
  // wizard menu shows them populated and writeable in one place.
1575
+ // `normalizePreferencesShape` tolerates a missing preferences file, a malformed
1576
+ // wrapper (`{ preferences: undefined }`), or a bare prefs object so the wizard
1577
+ // never reaches the category menu with a half-formed root. See issue: /gsd setup
1578
+ // prefs crashed with "Cannot read properties of undefined (reading 'models')".
1566
1579
  const prefs: Record<string, unknown> = {
1567
- ...(existing?.preferences ?? {}),
1580
+ ...normalizePreferencesShape(existing),
1568
1581
  ...(prefill ?? {}),
1569
1582
  };
1570
1583
 
@@ -0,0 +1,202 @@
1
+ import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
2
+
3
+ import { loadFile } from "./files.js";
4
+ import { resolveMilestoneFile } from "./paths.js";
5
+ import { deriveState } from "./state.js";
6
+ import { executeValidateMilestone } from "./tools/workflow-tool-executors.js";
7
+ import {
8
+ VALIDATION_VERDICTS,
9
+ extractVerdict,
10
+ isValidMilestoneVerdict,
11
+ type ValidationVerdict,
12
+ } from "./verdict-parser.js";
13
+
14
+ const USAGE =
15
+ 'Usage: /gsd verdict <pass|needs-attention|needs-remediation> [--milestone Mxxx] [--rationale "..."]';
16
+
17
+ interface ParsedArgs {
18
+ verdict?: ValidationVerdict;
19
+ milestoneId?: string;
20
+ rationale?: string;
21
+ }
22
+
23
+ interface ParsedValidation {
24
+ verdict: string | undefined;
25
+ remediationRound: number;
26
+ successCriteriaChecklist: string;
27
+ sliceDeliveryAudit: string;
28
+ crossSliceIntegration: string;
29
+ requirementCoverage: string;
30
+ verificationClasses?: string;
31
+ verdictRationale: string;
32
+ remediationPlan?: string;
33
+ }
34
+
35
+ function tokenize(raw: string): string[] {
36
+ const tokens: string[] = [];
37
+ const re = /"([^"]*)"|(\S+)/g;
38
+ let match: RegExpExecArray | null;
39
+ while ((match = re.exec(raw)) !== null) {
40
+ tokens.push(match[1] ?? match[2]);
41
+ }
42
+ return tokens;
43
+ }
44
+
45
+ function parseArgs(raw: string): ParsedArgs | { error: string } {
46
+ const tokens = tokenize(raw);
47
+ const out: ParsedArgs = {};
48
+ for (let i = 0; i < tokens.length; i++) {
49
+ const t = tokens[i];
50
+ if (t === "--milestone") {
51
+ const next = tokens[++i];
52
+ if (!next) return { error: "--milestone requires a milestone ID" };
53
+ out.milestoneId = next;
54
+ } else if (t === "--rationale") {
55
+ const next = tokens[++i];
56
+ if (next == null) return { error: "--rationale requires a value" };
57
+ out.rationale = next;
58
+ } else if (!out.verdict) {
59
+ if (!isValidMilestoneVerdict(t)) {
60
+ return {
61
+ error: `Invalid verdict "${t}". Must be one of: ${VALIDATION_VERDICTS.join(", ")}`,
62
+ };
63
+ }
64
+ out.verdict = t;
65
+ } else {
66
+ return { error: `Unexpected argument: ${t}` };
67
+ }
68
+ }
69
+ return out;
70
+ }
71
+
72
+ function extractRemediationRound(content: string): number {
73
+ const fm = content.match(/^---\n([\s\S]*?)\n---/);
74
+ if (!fm) return 0;
75
+ const m = fm[1].match(/^remediation_round:\s*(\d+)/im);
76
+ return m ? Number.parseInt(m[1], 10) : 0;
77
+ }
78
+
79
+ function extractSection(content: string, heading: string): string | undefined {
80
+ const escaped = heading.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
81
+ // Match section bodies bounded by the next "## " heading or end-of-string.
82
+ // Leading "\n" prefix lets a single pattern handle first-line headings too.
83
+ // No /m flag — we want `$` to mean end-of-string, not end-of-line.
84
+ const re = new RegExp(`\\n## ${escaped}\\s*\\n([\\s\\S]*?)(?=\\n## |$)`);
85
+ const m = ("\n" + content).match(re);
86
+ if (!m) return undefined;
87
+ return m[1].replace(/\s+$/, "");
88
+ }
89
+
90
+ export function parseValidationFile(content: string): ParsedValidation {
91
+ return {
92
+ verdict: extractVerdict(content),
93
+ remediationRound: extractRemediationRound(content),
94
+ successCriteriaChecklist: extractSection(content, "Success Criteria Checklist") ?? "",
95
+ sliceDeliveryAudit: extractSection(content, "Slice Delivery Audit") ?? "",
96
+ crossSliceIntegration: extractSection(content, "Cross-Slice Integration") ?? "",
97
+ requirementCoverage: extractSection(content, "Requirement Coverage") ?? "",
98
+ verificationClasses: extractSection(content, "Verification Class Compliance"),
99
+ verdictRationale: extractSection(content, "Verdict Rationale") ?? "",
100
+ remediationPlan: extractSection(content, "Remediation Plan"),
101
+ };
102
+ }
103
+
104
+ export async function handleVerdict(
105
+ rawArgs: string,
106
+ ctx: ExtensionCommandContext,
107
+ basePath: string,
108
+ ): Promise<void> {
109
+ if (!rawArgs.trim()) {
110
+ ctx.ui.notify(USAGE, "warning");
111
+ return;
112
+ }
113
+
114
+ const parsed = parseArgs(rawArgs);
115
+ if ("error" in parsed) {
116
+ ctx.ui.notify(`${parsed.error}\n${USAGE}`, "warning");
117
+ return;
118
+ }
119
+ if (!parsed.verdict) {
120
+ ctx.ui.notify(USAGE, "warning");
121
+ return;
122
+ }
123
+
124
+ let milestoneId = parsed.milestoneId;
125
+ if (!milestoneId) {
126
+ const state = await deriveState(basePath);
127
+ if (!state.activeMilestone) {
128
+ ctx.ui.notify(
129
+ "No active milestone — pass --milestone Mxxx to target a specific milestone.",
130
+ "warning",
131
+ );
132
+ return;
133
+ }
134
+ milestoneId = state.activeMilestone.id;
135
+ }
136
+
137
+ const validationPath = resolveMilestoneFile(basePath, milestoneId, "VALIDATION");
138
+ if (!validationPath) {
139
+ ctx.ui.notify(
140
+ `No VALIDATION file found for ${milestoneId}. Run gsd_validate_milestone first to produce one.`,
141
+ "warning",
142
+ );
143
+ return;
144
+ }
145
+ const existing = await loadFile(validationPath);
146
+ if (!existing) {
147
+ ctx.ui.notify(
148
+ `Could not read VALIDATION file for ${milestoneId} (${validationPath}).`,
149
+ "warning",
150
+ );
151
+ return;
152
+ }
153
+
154
+ const current = parseValidationFile(existing);
155
+
156
+ if (parsed.verdict !== "pass" && !parsed.rationale) {
157
+ ctx.ui.notify(
158
+ `--rationale is required when overriding to ${parsed.verdict}.`,
159
+ "warning",
160
+ );
161
+ return;
162
+ }
163
+
164
+ const verdictRationale =
165
+ parsed.rationale ?? "Manually overridden via /gsd verdict";
166
+
167
+ const result = await executeValidateMilestone(
168
+ {
169
+ milestoneId,
170
+ verdict: parsed.verdict,
171
+ remediationRound: current.remediationRound,
172
+ successCriteriaChecklist: current.successCriteriaChecklist,
173
+ sliceDeliveryAudit: current.sliceDeliveryAudit,
174
+ crossSliceIntegration: current.crossSliceIntegration,
175
+ requirementCoverage: current.requirementCoverage,
176
+ verificationClasses: current.verificationClasses,
177
+ verdictRationale,
178
+ remediationPlan: current.remediationPlan,
179
+ },
180
+ basePath,
181
+ );
182
+
183
+ if (result.isError) {
184
+ const msg =
185
+ result.content[0]?.type === "text" ? result.content[0].text : "Unknown error";
186
+ ctx.ui.notify(msg, "error");
187
+ return;
188
+ }
189
+
190
+ const prevVerdict = current.verdict ?? "unknown";
191
+ ctx.ui.notify(
192
+ `Milestone ${milestoneId} verdict: ${prevVerdict} -> ${parsed.verdict}`,
193
+ "success",
194
+ );
195
+
196
+ if (parsed.verdict === "needs-remediation") {
197
+ ctx.ui.notify(
198
+ "Follow up with gsd_reassess_roadmap to add remediation slices, then re-run /gsd auto.",
199
+ "info",
200
+ );
201
+ }
202
+ }
@@ -30,9 +30,13 @@ import { join } from "node:path";
30
30
  import {
31
31
  findStaleWorkerForProject,
32
32
  getAllAutoWorkers,
33
+ markWorkerCrashed,
34
+ markWorkerStopping,
35
+ markWorkerStoppingByPid,
33
36
  type AutoWorkerRow,
34
37
  } from "./db/auto-workers.js";
35
- import { getLatestForUnit, type DispatchStatus } from "./db/unit-dispatches.js";
38
+ import { forceReleaseLeasesForWorker } from "./db/milestone-leases.js";
39
+ import { markLatestActiveForWorkerCanceled, type DispatchStatus } from "./db/unit-dispatches.js";
36
40
  import { getRuntimeKv, setRuntimeKv, deleteRuntimeKv } from "./db/runtime-kv.js";
37
41
  import { _getAdapter, isDbAvailable } from "./gsd-db.js";
38
42
  import { gsdRoot, normalizeRealPath } from "./paths.js";
@@ -56,6 +60,15 @@ function lockPath(basePath: string): string {
56
60
  return join(gsdRoot(basePath), effectiveLockFile());
57
61
  }
58
62
 
63
+ function clearLegacyLockFile(basePath: string): void {
64
+ try {
65
+ const p = lockPath(basePath);
66
+ if (existsSync(p)) unlinkSync(p);
67
+ } catch {
68
+ // Best-effort.
69
+ }
70
+ }
71
+
59
72
  function readLegacyLock(basePath: string): LockData | null {
60
73
  try {
61
74
  const p = lockPath(basePath);
@@ -185,12 +198,18 @@ export function writeLock(
185
198
  // Best-effort — never throw from the lock writer.
186
199
  }
187
200
 
188
- if (!isDbAvailable() || !sessionFile) return;
201
+ if (!isDbAvailable()) return;
189
202
  try {
190
203
  const projectRoot = normalizeRealPath(basePath);
191
204
  const worker = findActiveWorkerForCurrentProcess(projectRoot);
192
205
  if (!worker) return;
193
- setRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY, sessionFile);
206
+ if (sessionFile) {
207
+ setRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY, sessionFile);
208
+ } else {
209
+ // Preliminary unit locks (before runUnit/newSession settles) must clear
210
+ // any prior pointer so crash recovery cannot ingest stale cross-unit context.
211
+ deleteRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY);
212
+ }
194
213
  } catch {
195
214
  // Best-effort — never throw from the lock writer.
196
215
  }
@@ -204,18 +223,48 @@ export function writeLock(
204
223
  * stale session-file pointer.
205
224
  */
206
225
  export function clearLock(basePath: string): void {
226
+ clearLegacyLockFile(basePath);
227
+
228
+ if (!isDbAvailable()) return;
207
229
  try {
208
- const p = lockPath(basePath);
209
- if (existsSync(p)) unlinkSync(p);
230
+ const projectRoot = normalizeRealPath(basePath);
231
+ const staleWorker = findStaleWorkerForProject(projectRoot);
232
+ if (staleWorker) {
233
+ markWorkerCrashed(staleWorker.worker_id);
234
+ forceReleaseLeasesForWorker(staleWorker.worker_id);
235
+ deleteRuntimeKv("worker", staleWorker.worker_id, SESSION_FILE_KV_KEY);
236
+ return;
237
+ }
238
+ const lock = readLegacyLock(basePath);
239
+ if (lock?.pid) markWorkerStoppingByPid(projectRoot, lock.pid);
240
+ const worker = findActiveWorkerForCurrentProcess(projectRoot);
241
+ if (worker) deleteRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY);
242
+
243
+ const stale = findStaleWorkerForProject(projectRoot);
244
+ if (stale) {
245
+ markWorkerStopping(stale.worker_id);
246
+ deleteRuntimeKv("worker", stale.worker_id, SESSION_FILE_KV_KEY);
247
+ }
210
248
  } catch {
211
249
  // Best-effort.
212
250
  }
251
+ }
252
+
253
+ /**
254
+ * Clear a stale DB-backed worker lock after readCrashLock/findStaleWorkerForProject
255
+ * has identified a dead worker. Unlike clearLock(), this targets the stale
256
+ * worker row instead of the current process's active worker.
257
+ */
258
+ export function clearStaleWorkerLock(basePath: string): void {
259
+ clearLegacyLockFile(basePath);
213
260
 
214
261
  if (!isDbAvailable()) return;
215
262
  try {
216
263
  const projectRoot = normalizeRealPath(basePath);
217
- const worker = findActiveWorkerForCurrentProcess(projectRoot);
264
+ const worker = findStaleWorkerForProject(projectRoot);
218
265
  if (!worker) return;
266
+ markLatestActiveForWorkerCanceled(worker.worker_id, "crash-recovered");
267
+ markWorkerCrashed(worker.worker_id);
219
268
  deleteRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY);
220
269
  } catch {
221
270
  // Best-effort.
@@ -157,6 +157,31 @@ export function markWorkerStopping(workerId: string): void {
157
157
  });
158
158
  }
159
159
 
160
+ /**
161
+ * Mark the active worker row for a specific PID/project root as stopping.
162
+ * Used when we detect a dead PID from lock metadata before heartbeat expiry.
163
+ */
164
+ export function markWorkerStoppingByPid(
165
+ projectRootRealpath: string,
166
+ pid: number,
167
+ ): void {
168
+ if (!isDbAvailable()) return;
169
+ if (!Number.isInteger(pid) || pid <= 0) return;
170
+ const db = _getAdapter()!;
171
+ transaction(() => {
172
+ db.prepare(
173
+ `UPDATE workers
174
+ SET status = 'stopping'
175
+ WHERE pid = :pid
176
+ AND project_root_realpath = :project_root
177
+ AND status = 'active'`,
178
+ ).run({
179
+ ":pid": pid,
180
+ ":project_root": projectRootRealpath,
181
+ });
182
+ });
183
+ }
184
+
160
185
  /**
161
186
  * Return all workers whose status is 'active' AND whose heartbeat is within
162
187
  * the TTL window. Workers older than the TTL are NOT auto-marked crashed
@@ -242,6 +267,18 @@ export function findStaleWorkerForProject(
242
267
  const db = _getAdapter()!;
243
268
  const cutoffMs = Date.now() - HEARTBEAT_TTL_SECONDS * 1000;
244
269
  const cutoffIso = new Date(cutoffMs).toISOString();
270
+
271
+ const latestActiveRow = db.prepare(
272
+ `SELECT worker_id, host, pid, started_at, version,
273
+ last_heartbeat_at, status, project_root_realpath
274
+ FROM workers
275
+ WHERE project_root_realpath = :project_root
276
+ AND status = 'active'
277
+ ORDER BY started_at DESC
278
+ LIMIT 1`,
279
+ ).get({ ":project_root": projectRootRealpath }) as AutoWorkerRow | undefined;
280
+ if (latestActiveRow && !isWorkerProcessAlive(latestActiveRow)) return latestActiveRow;
281
+
245
282
  const row = db.prepare(
246
283
  `SELECT worker_id, host, pid, started_at, version,
247
284
  last_heartbeat_at, status, project_root_realpath