gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.1b44e695b

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 (619) 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 +134 -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 +66 -1
  21. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +144 -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 +170 -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 +10 -2
  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 +46 -1
  56. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  57. package/dist/resources/extensions/gsd/doctor.js +2 -28
  58. package/dist/resources/extensions/gsd/export-html.js +27 -425
  59. package/dist/resources/extensions/gsd/forensics.js +10 -3
  60. package/dist/resources/extensions/gsd/git-service.js +152 -15
  61. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  62. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  63. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  64. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  65. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  66. package/dist/resources/extensions/gsd/markdown-renderer.js +14 -11
  67. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  68. package/dist/resources/extensions/gsd/migrate/parsers.js +121 -2
  69. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  70. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  71. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  72. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  73. package/dist/resources/extensions/gsd/paths.js +4 -0
  74. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  75. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  76. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  77. package/dist/resources/extensions/gsd/pre-execution-checks.js +54 -19
  78. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  79. package/dist/resources/extensions/gsd/preferences-types.js +3 -0
  80. package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
  81. package/dist/resources/extensions/gsd/preferences.js +6 -0
  82. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  83. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  84. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  85. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  86. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  87. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  88. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  89. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  90. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  91. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  92. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  93. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  94. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  95. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  96. package/dist/resources/extensions/gsd/repo-identity.js +39 -22
  97. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  98. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  99. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  100. package/dist/resources/extensions/gsd/session-lock.js +15 -2
  101. package/dist/resources/extensions/gsd/slice-parallel-conflict.js +2 -2
  102. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +84 -5
  103. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  104. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  105. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  106. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  107. package/dist/resources/extensions/gsd/state.js +28 -7
  108. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  109. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  110. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  111. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  112. package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -9
  113. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
  114. package/dist/resources/extensions/gsd/tools/exec-tool.js +87 -5
  115. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  116. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  117. package/dist/resources/extensions/gsd/tools/validate-milestone.js +32 -1
  118. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
  119. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  120. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  121. package/dist/resources/extensions/gsd/validation.js +23 -1
  122. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  123. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  124. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  125. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  126. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  127. package/dist/resources/extensions/gsd/worktree-lifecycle.js +86 -19
  128. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  129. package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
  130. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  131. package/dist/resources/extensions/gsd/worktree-telemetry.js +32 -0
  132. package/dist/resources/extensions/shared/html-shell.js +388 -0
  133. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  134. package/dist/resources/extensions/shared/next-action-ui.js +13 -5
  135. package/dist/resources/extensions/subagent/index.js +448 -78
  136. package/dist/resources/extensions/subagent/launch.js +77 -0
  137. package/dist/resources/extensions/subagent/run-store.js +148 -0
  138. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  139. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  140. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  141. package/dist/resources/extensions/visual-brief/index.js +5 -0
  142. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  143. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  144. package/dist/resources/skills/forensics/SKILL.md +1 -1
  145. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  146. package/dist/web/standalone/.next/BUILD_ID +1 -1
  147. package/dist/web/standalone/.next/app-path-routes-manifest.json +7 -7
  148. package/dist/web/standalone/.next/build-manifest.json +3 -3
  149. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  150. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  151. package/dist/web/standalone/.next/required-server-files.json +1 -1
  152. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  154. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  155. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  156. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  158. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  162. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  165. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  166. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  167. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  169. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  172. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/index.html +1 -1
  175. package/dist/web/standalone/.next/server/app/index.rsc +4 -7
  176. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
  178. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  180. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  181. package/dist/web/standalone/.next/server/app/page.js +2 -2
  182. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
  185. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  186. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  190. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  191. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  192. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  193. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  194. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  195. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  196. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  197. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  198. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  199. package/dist/web/standalone/server.js +1 -1
  200. package/package.json +4 -4
  201. package/packages/contracts/dist/rpc.test.js +7 -0
  202. package/packages/contracts/dist/rpc.test.js.map +1 -1
  203. package/packages/contracts/dist/workflow.d.ts +21 -0
  204. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  205. package/packages/contracts/dist/workflow.js +24 -0
  206. package/packages/contracts/dist/workflow.js.map +1 -1
  207. package/packages/contracts/src/rpc.test.ts +8 -0
  208. package/packages/contracts/src/workflow.ts +24 -0
  209. package/packages/daemon/package.json +2 -2
  210. package/packages/mcp-server/README.md +13 -4
  211. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  212. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  213. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  214. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  215. package/packages/mcp-server/package.json +2 -2
  216. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  217. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  218. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  219. package/packages/native/package.json +1 -1
  220. package/packages/native/tsconfig.json +2 -1
  221. package/packages/native/tsconfig.tsbuildinfo +1 -1
  222. package/packages/pi-agent-core/package.json +1 -1
  223. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  224. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  225. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  226. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  227. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  228. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  229. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  230. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  231. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  232. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  233. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  234. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  235. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  236. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  237. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  238. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  239. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  240. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  241. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  242. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  243. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  244. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  245. package/packages/pi-ai/package.json +1 -1
  246. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  247. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  248. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  249. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  250. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  251. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  252. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  253. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  254. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  255. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  256. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  257. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  258. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  260. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  262. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  264. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  266. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  268. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  270. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  271. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  273. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  275. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +82 -97
  278. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  280. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  282. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  284. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  286. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  288. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  289. package/packages/pi-coding-agent/package.json +1 -1
  290. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  291. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  292. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  293. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  294. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  295. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  296. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  297. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  298. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  299. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +91 -102
  300. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  301. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  302. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  303. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  304. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  305. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  306. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  307. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  308. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  309. package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
  310. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  311. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  312. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  313. package/packages/pi-tui/dist/terminal.js +12 -0
  314. package/packages/pi-tui/dist/terminal.js.map +1 -1
  315. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  316. package/packages/pi-tui/dist/tui.js +106 -27
  317. package/packages/pi-tui/dist/tui.js.map +1 -1
  318. package/packages/pi-tui/package.json +1 -1
  319. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  320. package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
  321. package/packages/pi-tui/src/terminal.ts +11 -0
  322. package/packages/pi-tui/src/tui.ts +108 -27
  323. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  324. package/packages/rpc-client/package.json +1 -1
  325. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  326. package/pkg/package.json +1 -1
  327. package/src/resources/GSD-WORKFLOW.md +10 -1
  328. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  329. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  330. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  331. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  332. package/src/resources/extensions/cmux/index.ts +6 -0
  333. package/src/resources/extensions/gsd/auto/contracts.ts +19 -6
  334. package/src/resources/extensions/gsd/auto/detect-stuck.ts +1 -0
  335. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  336. package/src/resources/extensions/gsd/auto/loop.ts +123 -40
  337. package/src/resources/extensions/gsd/auto/orchestrator.ts +15 -4
  338. package/src/resources/extensions/gsd/auto/phases.ts +160 -60
  339. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  340. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  341. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  342. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  343. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  344. package/src/resources/extensions/gsd/auto-budget.ts +11 -0
  345. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  346. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  347. package/src/resources/extensions/gsd/auto-dispatch.ts +164 -29
  348. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  349. package/src/resources/extensions/gsd/auto-post-unit.ts +369 -148
  350. package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
  351. package/src/resources/extensions/gsd/auto-recovery.ts +86 -13
  352. package/src/resources/extensions/gsd/auto-start.ts +109 -14
  353. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  354. package/src/resources/extensions/gsd/auto-verification.ts +174 -42
  355. package/src/resources/extensions/gsd/auto-worktree.ts +202 -30
  356. package/src/resources/extensions/gsd/auto.ts +172 -81
  357. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
  358. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -10
  359. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +13 -4
  360. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  361. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  362. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  363. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  364. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
  365. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  366. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  367. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  368. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  369. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +11 -3
  370. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  371. package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
  372. package/src/resources/extensions/gsd/db/auto-workers.ts +37 -0
  373. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  374. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  375. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  376. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  377. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  378. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  379. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  380. package/src/resources/extensions/gsd/doctor-git-checks.ts +45 -1
  381. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  382. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  383. package/src/resources/extensions/gsd/doctor.ts +2 -27
  384. package/src/resources/extensions/gsd/export-html.ts +27 -427
  385. package/src/resources/extensions/gsd/forensics.ts +9 -3
  386. package/src/resources/extensions/gsd/git-service.ts +182 -16
  387. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  388. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  389. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  390. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  391. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  392. package/src/resources/extensions/gsd/journal.ts +8 -1
  393. package/src/resources/extensions/gsd/markdown-renderer.ts +14 -11
  394. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  395. package/src/resources/extensions/gsd/migrate/parsers.ts +139 -2
  396. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  397. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  398. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  399. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  400. package/src/resources/extensions/gsd/paths.ts +5 -0
  401. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  402. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  403. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  404. package/src/resources/extensions/gsd/pre-execution-checks.ts +67 -19
  405. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  406. package/src/resources/extensions/gsd/preferences-types.ts +35 -0
  407. package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
  408. package/src/resources/extensions/gsd/preferences.ts +9 -0
  409. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  410. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  411. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  412. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  413. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  414. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  415. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  416. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  417. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  418. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  419. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  420. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  421. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  422. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  423. package/src/resources/extensions/gsd/repo-identity.ts +45 -25
  424. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  425. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  426. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  427. package/src/resources/extensions/gsd/session-lock.ts +15 -2
  428. package/src/resources/extensions/gsd/slice-parallel-conflict.ts +2 -2
  429. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +75 -3
  430. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  431. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  432. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  433. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  434. package/src/resources/extensions/gsd/state.ts +33 -7
  435. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  436. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  437. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  438. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  439. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  440. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  441. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  442. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  443. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +775 -34
  444. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +245 -28
  445. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  446. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  447. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  448. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +136 -13
  449. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
  450. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  451. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  452. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  453. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +29 -0
  454. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  455. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  456. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  457. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  458. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  459. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  460. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  461. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  462. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +55 -2
  463. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -9
  464. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  465. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  466. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  467. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  468. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  469. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  470. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +111 -1
  471. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  472. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +140 -1
  473. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  474. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  475. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  476. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +99 -1
  477. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +15 -1
  478. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  479. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  480. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  481. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  482. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  483. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  484. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  485. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  486. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  487. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  488. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  489. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  490. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  491. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  492. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +226 -2
  493. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +5 -21
  494. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
  495. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  496. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +40 -0
  497. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  498. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  499. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  500. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  501. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  502. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +21 -40
  503. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +59 -1
  504. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  505. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  506. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  507. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  508. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  509. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  510. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  511. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  512. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  513. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  514. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  515. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  516. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  517. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +8 -1
  518. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  519. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +147 -0
  520. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  521. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  522. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  523. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +79 -0
  524. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +42 -1
  525. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  526. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  527. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  528. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  529. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  530. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +28 -1
  531. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  532. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  533. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +35 -0
  534. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
  535. package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +2 -2
  536. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +112 -1
  537. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  538. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +94 -2
  539. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  540. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  541. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  542. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  543. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  544. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  545. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  546. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  547. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  548. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  549. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +68 -0
  550. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  551. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +188 -1
  552. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  553. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  554. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  555. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  556. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +153 -1
  557. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  558. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  559. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +73 -2
  560. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  561. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
  562. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  563. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +16 -0
  564. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  565. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  566. package/src/resources/extensions/gsd/tools/complete-milestone.ts +18 -10
  567. package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
  568. package/src/resources/extensions/gsd/tools/exec-tool.ts +98 -5
  569. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  570. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  571. package/src/resources/extensions/gsd/tools/validate-milestone.ts +31 -0
  572. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
  573. package/src/resources/extensions/gsd/types.ts +1 -1
  574. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  575. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  576. package/src/resources/extensions/gsd/validation.ts +23 -1
  577. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  578. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  579. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  580. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  581. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  582. package/src/resources/extensions/gsd/worktree-lifecycle.ts +98 -20
  583. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  584. package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
  585. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  586. package/src/resources/extensions/gsd/worktree-telemetry.ts +39 -0
  587. package/src/resources/extensions/shared/html-shell.ts +412 -0
  588. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  589. package/src/resources/extensions/shared/next-action-ui.ts +11 -5
  590. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  591. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -0
  592. package/src/resources/extensions/subagent/index.ts +567 -103
  593. package/src/resources/extensions/subagent/launch.ts +131 -0
  594. package/src/resources/extensions/subagent/run-store.ts +218 -0
  595. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  596. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  597. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  598. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  599. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  600. package/src/resources/extensions/visual-brief/index.ts +8 -0
  601. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  602. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  603. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  604. package/src/resources/skills/forensics/SKILL.md +1 -1
  605. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  606. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  607. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  608. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  609. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  610. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  611. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  612. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  613. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  614. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  615. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  616. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  617. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  618. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → Z8H5evS-hDo0qdP22XJPA}/_buildManifest.js +0 -0
  619. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → Z8H5evS-hDo0qdP22XJPA}/_ssgManifest.js +0 -0
@@ -44,10 +44,11 @@ import { readSessionLockData, isSessionLockProcessAlive } from "./session-lock.j
44
44
  import { nativeAddAll, nativeCommit, nativeHasCommittedHead, nativeIsRepo, nativeInit } from "./native-git-bridge.js";
45
45
  import { isInheritedRepo } from "./repo-identity.js";
46
46
  import { ensureGitignore, ensurePreferences, untrackRuntimeFiles } from "./gitignore.js";
47
- import { loadEffectiveGSDPreferences } from "./preferences.js";
47
+ import { getIsolationMode, loadEffectiveGSDPreferences } from "./preferences.js";
48
48
  import { resolveUokFlags } from "./uok/flags.js";
49
49
  import { ensurePlanV2Graph, isMissingFinalizedContextResult } from "./uok/plan-v2.js";
50
50
  import { detectProjectState, hasGsdBootstrapArtifacts } from "./detection.js";
51
+ import { isFutureMilestoneStatus } from "./status-guards.js";
51
52
  import { showProjectInit, offerMigration } from "./init-wizard.js";
52
53
  import { validateDirectory } from "./validate-directory.js";
53
54
  import { showConfirm } from "../shared/tui.js";
@@ -69,8 +70,24 @@ import {
69
70
  formatPriorContextBrief,
70
71
  } from "./preparation.js";
71
72
  import { verifyExpectedArtifact } from "./auto-recovery.js";
72
- import { createWorkspace, scopeMilestone, type MilestoneScope } from "./workspace.js";
73
+ import type { MilestoneScope } from "./workspace.js";
73
74
  import { getPendingGate, extractDepthVerificationMilestoneId } from "./bootstrap/write-gate.js";
75
+ import {
76
+ _getPendingAutoStart,
77
+ clearPendingAutoStart,
78
+ deletePendingAutoStart,
79
+ getDiscussionMilestoneId,
80
+ hasPendingAutoStart,
81
+ setPendingAutoStart,
82
+ } from "./pending-auto-start.js";
83
+ import { clearGuidedUnitContext, setGuidedUnitContext } from "./guided-unit-context.js";
84
+
85
+ export {
86
+ _getPendingAutoStart,
87
+ clearPendingAutoStart,
88
+ getDiscussionMilestoneId,
89
+ setPendingAutoStart,
90
+ } from "./pending-auto-start.js";
74
91
 
75
92
  export function shouldSkipGitBootstrapAfterInit(result: { gitEnabled?: boolean }): boolean {
76
93
  return result.gitEnabled === false;
@@ -92,6 +109,12 @@ import { deleteRuntimeKv } from "./db/runtime-kv.js";
92
109
  import { PAUSED_SESSION_KV_KEY } from "./interrupted-session.js";
93
110
  import { buildWorkflowDispatchContent } from "./workflow-protocol.js";
94
111
  import { isFullGsdToolSurfaceRequested, restoreGsdWorkflowTools, scopeGsdWorkflowToolsForDispatch } from "./bootstrap/register-hooks.js";
112
+ import {
113
+ resolveActiveTaskChoiceRoute,
114
+ type ActiveTaskChoice,
115
+ } from "./smart-entry-routing.js";
116
+
117
+ export { resolveGuidedExecuteLaunchMode } from "./smart-entry-routing.js";
95
118
 
96
119
  type AutoStartOptions = Parameters<typeof startAutoDetached>[4];
97
120
  type AutoStartLauncher = typeof startAutoDetached;
@@ -228,26 +251,6 @@ function buildDocsCommitInstruction(_message: string): string {
228
251
 
229
252
  // ─── Auto-start after discuss ─────────────────────────────────────────────────
230
253
 
231
- /** Pending auto-start context, keyed by basePath for session isolation (#2985). */
232
- interface PendingAutoStartEntry {
233
- ctx: ExtensionCommandContext;
234
- pi: ExtensionAPI;
235
- basePath: string;
236
- milestoneId: string; // the milestone being discussed
237
- step?: boolean; // preserve step mode through discuss → auto transition
238
- createdAt: number; // timestamp for staleness detection (#3274)
239
- // #4573: counter for how many times the LLM emitted the ready phrase
240
- // without writing the required artifacts. Cleared on entry delete/recreate.
241
- readyRejectCount?: number;
242
- // C1: scope is pinned at reservation time so path resolution is immune to
243
- // cwd-drift between discuss and checkAutoStartAfterDiscuss.
244
- // TODO(C3): basePath becomes redundant once all consumers migrate to scope.
245
- scope: MilestoneScope;
246
- // H1: retry counter for Gate 1b plan-blocked recovery. Capped at
247
- // MAX_PLAN_BLOCKED_RECOVERIES to prevent infinite recovery loops (#5012).
248
- planBlockedRecoveryCount: number;
249
- }
250
-
251
254
  interface PendingDeepProjectSetupEntry {
252
255
  ctx: ExtensionCommandContext;
253
256
  pi: ExtensionAPI;
@@ -273,7 +276,6 @@ const MAX_PLAN_BLOCKED_RECOVERIES = 3;
273
276
  // suffix) with optional trailing punctuation.
274
277
  const READY_PHRASE_RE = /\bMilestone\s+M\d{3}[A-Z0-9-]*\s+ready\.?/i;
275
278
 
276
- const pendingAutoStartMap = new Map<string, PendingAutoStartEntry>();
277
279
  const pendingDeepProjectSetupMap = new Map<string, PendingDeepProjectSetupEntry>();
278
280
  const USER_DRIVEN_DEEP_SETUP_UNITS = new Set([
279
281
  "discuss-project",
@@ -300,17 +302,6 @@ This stage is running inside the foreground \`/gsd new-project --deep\` intervie
300
302
  - Do NOT call \`ask_user_questions\`, \`AskUserQuestion\`, or ToolSearch to discover user-input tools.
301
303
  - Ask one focused round, then stop and wait for the user's normal chat response.`;
302
304
 
303
- /**
304
- * Backward-compat bridge: returns a mutable reference to the entry matching
305
- * basePath, or the sole entry when only one session exists.
306
- * Exported for testing — internal use only in production code.
307
- */
308
- export function _getPendingAutoStart(basePath?: string): PendingAutoStartEntry | null {
309
- if (basePath) return pendingAutoStartMap.get(basePath) ?? null;
310
- if (pendingAutoStartMap.size === 1) return pendingAutoStartMap.values().next().value!;
311
- return null;
312
- }
313
-
314
305
  function hasNestedFileOrSymlink(dir: string): boolean {
315
306
  for (const entry of readdirSync(dir, { withFileTypes: true })) {
316
307
  if (entry.isFile() || entry.isSymbolicLink()) return true;
@@ -344,29 +335,6 @@ function clearEmptyLegacyDeepSetupPseudoMilestones(basePath: string, entries: st
344
335
  return remaining;
345
336
  }
346
337
 
347
- /**
348
- * Store pending auto-start state for a project.
349
- * Exported for testing (#2985).
350
- */
351
- export function setPendingAutoStart(basePath: string, entry: { basePath: string; milestoneId: string; ctx?: ExtensionCommandContext; pi?: ExtensionAPI; step?: boolean; createdAt?: number }): void {
352
- const ws = createWorkspace(entry.basePath);
353
- const scope = scopeMilestone(ws, entry.milestoneId);
354
- pendingAutoStartMap.set(basePath, { createdAt: Date.now(), planBlockedRecoveryCount: 0, ...entry, scope } as PendingAutoStartEntry);
355
- }
356
-
357
- /**
358
- * Clear pending auto-start state.
359
- * If basePath is given, clears only that project. Otherwise clears all.
360
- * Exported for testing (#2985).
361
- */
362
- export function clearPendingAutoStart(basePath?: string): void {
363
- if (basePath) {
364
- pendingAutoStartMap.delete(basePath);
365
- } else {
366
- pendingAutoStartMap.clear();
367
- }
368
- }
369
-
370
338
  export function clearPendingDeepProjectSetup(basePath?: string): void {
371
339
  if (basePath) {
372
340
  pendingDeepProjectSetupMap.delete(basePath);
@@ -375,23 +343,6 @@ export function clearPendingDeepProjectSetup(basePath?: string): void {
375
343
  }
376
344
  }
377
345
 
378
- /**
379
- * Returns the milestoneId being discussed for the given project.
380
- * When basePath is omitted and only one session is active, returns that
381
- * session's milestoneId for backward compatibility. Returns null when
382
- * multiple sessions exist and basePath is not specified (#2985 Bug 4).
383
- */
384
- export function getDiscussionMilestoneId(basePath?: string): string | null {
385
- if (basePath) {
386
- return pendingAutoStartMap.get(basePath)?.milestoneId ?? null;
387
- }
388
- // Backward compat: return the sole entry's milestoneId, or null if ambiguous
389
- if (pendingAutoStartMap.size === 1) {
390
- return pendingAutoStartMap.values().next().value!.milestoneId;
391
- }
392
- return null;
393
- }
394
-
395
346
  function _getPendingDeepProjectSetup(basePath?: string): PendingDeepProjectSetupEntry | null {
396
347
  if (basePath) return pendingDeepProjectSetupMap.get(basePath) ?? null;
397
348
  if (pendingDeepProjectSetupMap.size === 1) return pendingDeepProjectSetupMap.values().next().value!;
@@ -544,13 +495,14 @@ async function dispatchNextDeepProjectSetupStage(entry: PendingDeepProjectSetupE
544
495
  "gsd-run",
545
496
  entry.ctx,
546
497
  result.unitType,
498
+ { basePath: entry.basePath },
547
499
  );
548
500
  return true;
549
501
  }
550
502
 
551
503
  /** Called from agent_end to check if auto-mode should start after discuss */
552
- export function checkAutoStartAfterDiscuss(): boolean {
553
- const entry = _getPendingAutoStart();
504
+ export function checkAutoStartAfterDiscuss(lookupBasePath?: string): boolean {
505
+ const entry = _getPendingAutoStart(lookupBasePath);
554
506
  if (!entry) return false;
555
507
 
556
508
  const { ctx, pi, basePath, milestoneId, step } = entry;
@@ -735,7 +687,7 @@ export function checkAutoStartAfterDiscuss(): boolean {
735
687
  }
736
688
  }
737
689
 
738
- pendingAutoStartMap.delete(basePath);
690
+ deletePendingAutoStart(basePath);
739
691
  ctx.ui.notify(`Milestone ${milestoneId} ready.`, "success");
740
692
  scheduleAutoStartAfterIdle(ctx, pi, basePath, false, { step });
741
693
  return true;
@@ -806,8 +758,8 @@ function hasToolUse(msg: any): boolean {
806
758
  * Returns true when a nudge (or give-up) was emitted, signaling the caller to
807
759
  * skip `resolveAgentEnd`.
808
760
  */
809
- export function maybeHandleReadyPhraseWithoutFiles(event: { messages: any[] }): boolean {
810
- const entry = _getPendingAutoStart();
761
+ export function maybeHandleReadyPhraseWithoutFiles(event: { messages: any[] }, lookupBasePath?: string): boolean {
762
+ const entry = _getPendingAutoStart(lookupBasePath);
811
763
  if (!entry) return false;
812
764
  const { ctx, pi, basePath, milestoneId } = entry;
813
765
 
@@ -854,7 +806,7 @@ export function maybeHandleReadyPhraseWithoutFiles(event: { messages: any[] }):
854
806
  if (entry.readyRejectCount > MAX_READY_REJECTS) {
855
807
  // Give up: clear state and tell the user to re-run /gsd. Avoids an
856
808
  // infinite nudge loop when the LLM never produces the writes.
857
- pendingAutoStartMap.delete(basePath);
809
+ deletePendingAutoStart(basePath);
858
810
  ctx.ui.notify(
859
811
  `Milestone ${milestoneId}: LLM signaled "ready" ${entry.readyRejectCount} times without writing files. ` +
860
812
  `Stopping auto-nudge. Run /gsd to try again.`,
@@ -935,10 +887,11 @@ export function resetEmptyTurnCounter(basePath?: string): void {
935
887
  export function maybeHandleEmptyIntentTurn(
936
888
  event: { messages: any[] },
937
889
  isAuto: boolean,
890
+ lookupBasePath?: string,
938
891
  ): boolean {
939
892
  // Gate: only fire when there is system-driven work in flight. Interactive
940
893
  // /gsd discuss (user-driven) produces legitimate text-only turns.
941
- if (!isAuto && pendingAutoStartMap.size === 0) return false;
894
+ if (!isAuto && !hasPendingAutoStart(lookupBasePath)) return false;
942
895
 
943
896
  const lastMsg = event.messages[event.messages.length - 1];
944
897
  if (!lastMsg) return false;
@@ -965,7 +918,7 @@ export function maybeHandleEmptyIntentTurn(
965
918
 
966
919
  // Resolve the target basePath + pi for injection. Prefer the pending
967
920
  // autostart entry (discuss flow); otherwise we cannot inject.
968
- const entry = _getPendingAutoStart();
921
+ const entry = _getPendingAutoStart(lookupBasePath);
969
922
  if (!entry) return false;
970
923
  const { ctx, pi, basePath } = entry;
971
924
 
@@ -1024,6 +977,19 @@ type UIContext = ExtensionContext;
1024
977
 
1025
978
  // ─── Helpers ──────────────────────────────────────────────────────────────────
1026
979
 
980
+ interface DispatchWorkflowOptions {
981
+ basePath?: string;
982
+ deps?: {
983
+ loadPreferences?: typeof loadEffectiveGSDPreferences;
984
+ selectModel?: typeof selectAndApplyModel;
985
+ getTransportSupportError?: typeof getWorkflowTransportSupportError;
986
+ };
987
+ }
988
+
989
+ export function resolveGuidedDispatchProjectRoot(basePath?: string): string {
990
+ return basePath ?? process.cwd();
991
+ }
992
+
1027
993
  /**
1028
994
  * Read GSD-WORKFLOW.md and dispatch it to the LLM with a contextual note.
1029
995
  * This is the only way the wizard triggers work — everything else is the LLM's job.
@@ -1039,13 +1005,20 @@ async function dispatchWorkflow(
1039
1005
  customType = "gsd-run",
1040
1006
  ctx?: ExtensionContext,
1041
1007
  unitType?: string,
1008
+ options?: DispatchWorkflowOptions,
1042
1009
  ): Promise<void> {
1010
+ const resolvedOptions = options ?? {};
1011
+ const projectRoot = resolveGuidedDispatchProjectRoot(resolvedOptions.basePath);
1012
+ const loadPreferences = resolvedOptions.deps?.loadPreferences ?? loadEffectiveGSDPreferences;
1013
+ const selectModel = resolvedOptions.deps?.selectModel ?? selectAndApplyModel;
1014
+ const getTransportSupportError = resolvedOptions.deps?.getTransportSupportError ?? getWorkflowTransportSupportError;
1015
+
1043
1016
  // Route through the dynamic routing pipeline (complexity classification,
1044
1017
  // tier downgrade, fallback chains) — same path as auto-mode dispatches (#2958).
1045
1018
  if (ctx && unitType) {
1046
- const prefs = loadEffectiveGSDPreferences()?.preferences;
1047
- const result = await selectAndApplyModel(
1048
- ctx, pi, unitType, /* unitId */ "", /* basePath */ process.cwd(),
1019
+ const prefs = loadPreferences(projectRoot)?.preferences;
1020
+ const result = await selectModel(
1021
+ ctx, pi, unitType, /* unitId */ "", projectRoot,
1049
1022
  prefs, /* verbose */ false, /* autoModeStartModel */ null,
1050
1023
  /* retryContext */ undefined, /* isAutoMode */ false,
1051
1024
  );
@@ -1057,11 +1030,11 @@ async function dispatchWorkflow(
1057
1030
  });
1058
1031
  }
1059
1032
 
1060
- const compatibilityError = getWorkflowTransportSupportError(
1033
+ const compatibilityError = getTransportSupportError(
1061
1034
  result.appliedModel?.provider ?? ctx.model?.provider,
1062
1035
  getRequiredWorkflowToolsForGuidedUnit(unitType),
1063
1036
  {
1064
- projectRoot: process.cwd(),
1037
+ projectRoot,
1065
1038
  surface: "guided flow",
1066
1039
  unitType,
1067
1040
  authMode: result.appliedModel?.provider
@@ -1070,6 +1043,7 @@ async function dispatchWorkflow(
1070
1043
  ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
1071
1044
  : undefined,
1072
1045
  baseUrl: result.appliedModel?.baseUrl ?? ctx.model?.baseUrl,
1046
+ activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
1073
1047
  },
1074
1048
  );
1075
1049
  if (compatibilityError) {
@@ -1119,14 +1093,20 @@ async function dispatchWorkflow(
1119
1093
  const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(gsdHome(), "agent", "GSD-WORKFLOW.md");
1120
1094
  const workflow = readFileSync(workflowPath, "utf-8");
1121
1095
 
1122
- pi.sendMessage(
1123
- {
1124
- customType,
1125
- content: buildWorkflowDispatchContent({ workflow, workflowPath, task: note }),
1126
- display: false,
1127
- },
1128
- { triggerTurn: true },
1129
- );
1096
+ if (unitType) setGuidedUnitContext(projectRoot, unitType);
1097
+ try {
1098
+ pi.sendMessage(
1099
+ {
1100
+ customType,
1101
+ content: buildWorkflowDispatchContent({ workflow, workflowPath, task: note }),
1102
+ display: false,
1103
+ },
1104
+ { triggerTurn: true },
1105
+ );
1106
+ } catch (err) {
1107
+ clearGuidedUnitContext(projectRoot);
1108
+ throw err;
1109
+ }
1130
1110
  } finally {
1131
1111
  // Restore full tool set after the message is queued. The LLM turn has
1132
1112
  // already captured the scoped set — restoring prevents the narrowed
@@ -1357,7 +1337,7 @@ export async function showHeadlessMilestoneCreation(
1357
1337
  // model/tool routing to skip discuss-flow tool scoping and
1358
1338
  // `checkAutoStartAfterDiscuss` guardrails that rely on the
1359
1339
  // "discuss-"-prefixed unitType.
1360
- await dispatchWorkflow(pi, prompt, "gsd-run", ctx, "discuss-milestone");
1340
+ await dispatchWorkflow(pi, prompt, "gsd-run", ctx, "discuss-milestone", { basePath });
1361
1341
  }
1362
1342
 
1363
1343
 
@@ -1493,7 +1473,7 @@ export async function showDiscuss(
1493
1473
  // No active milestone (or corrupted milestone with undefined id) —
1494
1474
  // check for pending milestones to discuss instead
1495
1475
  if (!state.activeMilestone?.id) {
1496
- const pendingMilestones = state.registry.filter(m => m.status === "pending");
1476
+ const pendingMilestones = state.registry.filter(m => isFutureMilestoneStatus(m.status));
1497
1477
  if (pendingMilestones.length === 0) {
1498
1478
  ctx.ui.notify("No active milestone. Run /gsd to create one first.", "warning");
1499
1479
  return;
@@ -1539,6 +1519,7 @@ export async function showDiscuss(
1539
1519
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
1540
1520
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
1541
1521
  const basePrompt = loadPrompt("guided-discuss-milestone", {
1522
+ workingDirectory: basePath,
1542
1523
  milestoneId: mid, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
1543
1524
  commitInstruction: buildDocsCommitInstruction(`docs(${mid}): milestone context from discuss`),
1544
1525
  fastPathInstruction: "",
@@ -1547,16 +1528,17 @@ export async function showDiscuss(
1547
1528
  ? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
1548
1529
  : basePrompt;
1549
1530
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: mid, step: false });
1550
- await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone");
1531
+ await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone", { basePath });
1551
1532
  } else if (choice === "discuss_fresh") {
1552
1533
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
1553
1534
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
1554
1535
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: mid, step: false });
1555
1536
  await dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
1537
+ workingDirectory: basePath,
1556
1538
  milestoneId: mid, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
1557
1539
  commitInstruction: buildDocsCommitInstruction(`docs(${mid}): milestone context from discuss`),
1558
1540
  fastPathInstruction: "",
1559
- }), "gsd-discuss", ctx, "discuss-milestone");
1541
+ }), "gsd-discuss", ctx, "discuss-milestone", { basePath });
1560
1542
  } else if (choice === "skip_milestone") {
1561
1543
  const { ensureDbOpen } = await import("./bootstrap/dynamic-tools.js");
1562
1544
  await ensureDbOpen(basePath);
@@ -1564,7 +1546,7 @@ export async function showDiscuss(
1564
1546
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
1565
1547
  const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
1566
1548
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: nextId, step: false });
1567
- await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
1549
+ await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone", { basePath });
1568
1550
  }
1569
1551
  return;
1570
1552
  }
@@ -1603,7 +1585,7 @@ export async function showDiscuss(
1603
1585
 
1604
1586
  if (pendingSlices.length === 0) {
1605
1587
  // All slices complete — but queued milestones may still need discussion (#3150)
1606
- const pendingMilestones = state.registry.filter(m => m.status === "pending");
1588
+ const pendingMilestones = state.registry.filter(m => isFutureMilestoneStatus(m.status));
1607
1589
  if (pendingMilestones.length > 0) {
1608
1590
  await showDiscussQueuedMilestone(ctx, pi, basePath, pendingMilestones);
1609
1591
  return;
@@ -1627,7 +1609,7 @@ export async function showDiscuss(
1627
1609
  // If all pending slices are discussed, check for queued milestones before exiting (#3150)
1628
1610
  const allDiscussed = pendingSlices.every(s => discussedMap.get(s.id));
1629
1611
  if (allDiscussed) {
1630
- const pendingMilestones = state.registry.filter(m => m.status === "pending");
1612
+ const pendingMilestones = state.registry.filter(m => isFutureMilestoneStatus(m.status));
1631
1613
  if (pendingMilestones.length > 0) {
1632
1614
  await showDiscussQueuedMilestone(ctx, pi, basePath, pendingMilestones);
1633
1615
  return;
@@ -1663,7 +1645,7 @@ export async function showDiscuss(
1663
1645
  });
1664
1646
 
1665
1647
  // Offer access to queued milestones when any exist
1666
- const pendingMilestones = state.registry.filter(m => m.status === "pending");
1648
+ const pendingMilestones = state.registry.filter(m => isFutureMilestoneStatus(m.status));
1667
1649
  if (pendingMilestones.length > 0) {
1668
1650
  actions.push({
1669
1651
  id: "discuss_queued_milestone",
@@ -1712,7 +1694,7 @@ export async function showDiscuss(
1712
1694
 
1713
1695
  const sqAvail = getStructuredQuestionsAvailability(pi, ctx);
1714
1696
  const prompt = await buildDiscussSlicePrompt(mid, chosen.id, chosen.title, basePath, { rediscuss: isRediscuss, structuredQuestionsAvailable: sqAvail });
1715
- await dispatchWorkflow(pi, prompt, "gsd-discuss", ctx, "discuss-slice");
1697
+ await dispatchWorkflow(pi, prompt, "gsd-discuss", ctx, "discuss-slice", { basePath });
1716
1698
 
1717
1699
  // Wait for the discuss session to finish, then loop back to the picker
1718
1700
  await ctx.waitForIdle();
@@ -1738,10 +1720,11 @@ async function showDiscussQueuedMilestone(
1738
1720
  const hasContext = !!resolveMilestoneFile(basePath, m.id, "CONTEXT");
1739
1721
  const hasDraft = !hasContext && !!resolveMilestoneFile(basePath, m.id, "CONTEXT-DRAFT");
1740
1722
  const contextStatus = hasContext ? "context ✓" : hasDraft ? "draft context" : "no context yet";
1723
+ const statusLabel = m.status === "planned" ? "planned" : "queued";
1741
1724
  return {
1742
1725
  id: m.id,
1743
1726
  label: `${m.id}: ${m.title}`,
1744
- description: `[queued] · ${contextStatus}`,
1727
+ description: `[${statusLabel}] · ${contextStatus}`,
1745
1728
  recommended: i === 0,
1746
1729
  };
1747
1730
  });
@@ -1822,6 +1805,7 @@ async function dispatchDiscussForMilestone(
1822
1805
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
1823
1806
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
1824
1807
  const basePrompt = loadPrompt("guided-discuss-milestone", {
1808
+ workingDirectory: basePath,
1825
1809
  milestoneId: mid,
1826
1810
  milestoneTitle,
1827
1811
  inlinedTemplates: discussMilestoneTemplates,
@@ -1832,7 +1816,7 @@ async function dispatchDiscussForMilestone(
1832
1816
  const prompt = draftContent
1833
1817
  ? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
1834
1818
  : basePrompt;
1835
- await dispatchWorkflow(pi, prompt, "gsd-discuss", ctx, "discuss-milestone");
1819
+ await dispatchWorkflow(pi, prompt, "gsd-discuss", ctx, "discuss-milestone", { basePath });
1836
1820
  }
1837
1821
 
1838
1822
  // ─── Smart Entry Point ────────────────────────────────────────────────────────
@@ -1975,7 +1959,7 @@ async function handleMilestoneActions(
1975
1959
  await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId,
1976
1960
  `New milestone ${nextId}.`,
1977
1961
  basePath
1978
- ), "gsd-run", ctx, "discuss-milestone");
1962
+ ), "gsd-run", ctx, "discuss-milestone", { basePath });
1979
1963
  return true;
1980
1964
  }
1981
1965
 
@@ -2121,18 +2105,19 @@ export async function showSmartEntry(
2121
2105
 
2122
2106
  if (interrupted.classification !== "recoverable") {
2123
2107
  try {
2124
- const { autoImportMarkdownHierarchyIfDbMismatch } = await import("./migration-auto-check.js");
2125
- const result = await autoImportMarkdownHierarchyIfDbMismatch(basePath);
2126
- if (result.action === "imported") {
2108
+ const { checkMarkdownHierarchyAgainstDb } = await import("./migration-auto-check.js");
2109
+ const result = await checkMarkdownHierarchyAgainstDb(basePath);
2110
+ if (result.action === "recovery-required") {
2127
2111
  ctx.ui.notify(
2128
- `Recovered migrated planning state into gsd.db (${result.reason}): ${result.afterDb.milestones} milestone(s), ${result.afterDb.slices} slice(s), ${result.afterDb.tasks} task(s).`,
2129
- "info",
2112
+ result.message ??
2113
+ `Markdown planning artifacts do not match the authoritative DB. Run \`${result.recoveryCommand ?? "gsd recover"}\` to import markdown explicitly.`,
2114
+ "warning",
2130
2115
  );
2131
2116
  }
2132
2117
  } catch (err) {
2133
2118
  const message = err instanceof Error ? err.message : String(err);
2134
- ctx.ui.notify(`GSD could not auto-import existing planning state into gsd.db: ${message}`, "warning");
2135
- logWarning("guided", `planning state auto-import failed: ${message}`, { file: "guided-flow.ts" });
2119
+ ctx.ui.notify(`GSD could not compare markdown planning artifacts with gsd.db: ${message}`, "warning");
2120
+ logWarning("guided", `planning state DB/markdown comparison failed: ${message}`, { file: "guided-flow.ts" });
2136
2121
  }
2137
2122
  }
2138
2123
 
@@ -2173,17 +2158,24 @@ export async function showSmartEntry(
2173
2158
  // Both /gsd and /gsd auto reach this branch when no milestone exists yet.
2174
2159
  // Without this guard, every subsequent /gsd call overwrites the pending auto-start
2175
2160
  // and fires another dispatchWorkflow, resetting the conversation mid-interview.
2176
- if (pendingAutoStartMap.has(basePath)) {
2161
+ if (hasPendingAutoStart(basePath)) {
2177
2162
  // #3274: If /clear interrupted the discussion, the pending entry is stale.
2178
2163
  // Detect staleness: no manifest, no milestone CONTEXT artifact, AND entry is older than
2179
2164
  // 30s (avoids race between .set() and LLM writing first artifact).
2180
- const entry = pendingAutoStartMap.get(basePath)!;
2165
+ const entry = _getPendingAutoStart(basePath)!;
2181
2166
  const ageMs = Date.now() - (entry.createdAt || 0);
2182
2167
  const manifestExists = existsSync(join(gsdRoot(basePath), "DISCUSSION-MANIFEST.json"));
2183
2168
  const milestoneHasContext = !!resolveMilestoneFile(basePath, entry.milestoneId, "CONTEXT");
2184
- if (!manifestExists && !milestoneHasContext && ageMs > 30_000) {
2169
+ const milestoneHasRoadmap = !!resolveMilestoneFile(basePath, entry.milestoneId, "ROADMAP");
2170
+ const milestoneRow = isDbAvailable() ? getMilestone(entry.milestoneId) : null;
2171
+ const discussPlanComplete = milestoneHasRoadmap && !!milestoneRow && milestoneRow.status !== "queued";
2172
+ if (discussPlanComplete) {
2173
+ // The discuss flow already completed, but pending auto-start cleanup handshake did not run.
2174
+ // Clear stale in-memory guard and continue through normal active-milestone routing.
2175
+ deletePendingAutoStart(basePath);
2176
+ } else if (!manifestExists && !milestoneHasContext && ageMs > 30_000) {
2185
2177
  // Stale entry from an interrupted discussion — clear and continue
2186
- pendingAutoStartMap.delete(basePath);
2178
+ deletePendingAutoStart(basePath);
2187
2179
  } else {
2188
2180
  ctx.ui.notify("Discussion already in progress — answer the question above to continue.", "info");
2189
2181
  return;
@@ -2223,7 +2215,7 @@ export async function showSmartEntry(
2223
2215
  await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId,
2224
2216
  `New project, milestone ${nextId}. Do NOT read or explore .gsd/ — it's empty scaffolding.`,
2225
2217
  basePath
2226
- ), "gsd-run", ctx, "discuss-milestone");
2218
+ ), "gsd-run", ctx, "discuss-milestone", { basePath });
2227
2219
  } else {
2228
2220
  const choice = await showNextAction(ctx, {
2229
2221
  title: "GSD — Get Shit Done",
@@ -2252,7 +2244,7 @@ export async function showSmartEntry(
2252
2244
  await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId,
2253
2245
  `New milestone ${nextId}.`,
2254
2246
  basePath
2255
- ), "gsd-run", ctx, "discuss-milestone");
2247
+ ), "gsd-run", ctx, "discuss-milestone", { basePath });
2256
2248
  }
2257
2249
  }
2258
2250
  return;
@@ -2274,6 +2266,7 @@ export async function showSmartEntry(
2274
2266
  "gsd-discuss",
2275
2267
  ctx,
2276
2268
  "discuss-milestone",
2269
+ { basePath },
2277
2270
  );
2278
2271
  return;
2279
2272
  }
@@ -2315,7 +2308,7 @@ export async function showSmartEntry(
2315
2308
  await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId,
2316
2309
  `New milestone ${nextId}.`,
2317
2310
  basePath
2318
- ), "gsd-run", ctx, "discuss-milestone");
2311
+ ), "gsd-run", ctx, "discuss-milestone", { basePath });
2319
2312
  } else if (choice === "status") {
2320
2313
  const { fireStatusViaCommand } = await import("./commands.js");
2321
2314
  await fireStatusViaCommand(ctx);
@@ -2356,6 +2349,7 @@ export async function showSmartEntry(
2356
2349
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
2357
2350
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
2358
2351
  const basePrompt = loadPrompt("guided-discuss-milestone", {
2352
+ workingDirectory: basePath,
2359
2353
  milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
2360
2354
  commitInstruction: buildDocsCommitInstruction(`docs(${milestoneId}): milestone context from discuss`),
2361
2355
  fastPathInstruction: "",
@@ -2364,16 +2358,17 @@ export async function showSmartEntry(
2364
2358
  ? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
2365
2359
  : basePrompt;
2366
2360
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
2367
- await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone");
2361
+ await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone", { basePath });
2368
2362
  } else if (choice === "discuss_fresh") {
2369
2363
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
2370
2364
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
2371
2365
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
2372
2366
  await dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
2367
+ workingDirectory: basePath,
2373
2368
  milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
2374
2369
  commitInstruction: buildDocsCommitInstruction(`docs(${milestoneId}): milestone context from discuss`),
2375
2370
  fastPathInstruction: "",
2376
- }), "gsd-discuss", ctx, "discuss-milestone");
2371
+ }), "gsd-discuss", ctx, "discuss-milestone", { basePath });
2377
2372
  } else if (choice === "skip_milestone") {
2378
2373
  const milestoneIds = findMilestoneIds(basePath);
2379
2374
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
@@ -2382,7 +2377,7 @@ export async function showSmartEntry(
2382
2377
  await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId,
2383
2378
  `New milestone ${nextId}.`,
2384
2379
  basePath
2385
- ), "gsd-run", ctx, "discuss-milestone");
2380
+ ), "gsd-run", ctx, "discuss-milestone", { basePath });
2386
2381
  }
2387
2382
  return;
2388
2383
  }
@@ -2457,15 +2452,17 @@ export async function showSmartEntry(
2457
2452
  "gsd-run",
2458
2453
  ctx,
2459
2454
  "plan-milestone",
2455
+ { basePath },
2460
2456
  );
2461
2457
  } else if (choice === "discuss") {
2462
2458
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
2463
2459
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
2464
2460
  await dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
2461
+ workingDirectory: basePath,
2465
2462
  milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
2466
2463
  commitInstruction: buildDocsCommitInstruction(`docs(${milestoneId}): milestone context from discuss`),
2467
2464
  fastPathInstruction: "",
2468
- }), "gsd-run", ctx, "discuss-milestone");
2465
+ }), "gsd-run", ctx, "discuss-milestone", { basePath });
2469
2466
  } else if (choice === "skip_milestone") {
2470
2467
  const milestoneIds = findMilestoneIds(basePath);
2471
2468
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
@@ -2474,7 +2471,7 @@ export async function showSmartEntry(
2474
2471
  await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId,
2475
2472
  `New milestone ${nextId}.`,
2476
2473
  basePath
2477
- ), "gsd-run", ctx, "discuss-milestone");
2474
+ ), "gsd-run", ctx, "discuss-milestone", { basePath });
2478
2475
  } else if (choice === "discard_milestone") {
2479
2476
  const confirmed = await showConfirm(ctx, {
2480
2477
  title: "Discard milestone?",
@@ -2589,10 +2586,11 @@ export async function showSmartEntry(
2589
2586
  "gsd-run",
2590
2587
  ctx,
2591
2588
  "plan-slice",
2589
+ { basePath },
2592
2590
  );
2593
2591
  } else if (choice === "discuss") {
2594
2592
  const sqAvail = getStructuredQuestionsAvailability(pi, ctx);
2595
- await dispatchWorkflow(pi, await buildDiscussSlicePrompt(milestoneId, sliceId, sliceTitle, basePath, { rediscuss: hasContext, structuredQuestionsAvailable: sqAvail }), "gsd-run", ctx, "discuss-slice");
2593
+ await dispatchWorkflow(pi, await buildDiscussSlicePrompt(milestoneId, sliceId, sliceTitle, basePath, { rediscuss: hasContext, structuredQuestionsAvailable: sqAvail }), "gsd-run", ctx, "discuss-slice", { basePath });
2596
2594
  } else if (choice === "research") {
2597
2595
  const researchTemplates = inlineTemplate("research", "Research");
2598
2596
  await dispatchWorkflow(pi, loadPrompt("guided-research-slice", {
@@ -2607,7 +2605,7 @@ export async function showSmartEntry(
2607
2605
  sliceTitle,
2608
2606
  extraContext: [researchTemplates],
2609
2607
  }),
2610
- }), "gsd-run", ctx, "research-slice");
2608
+ }), "gsd-run", ctx, "research-slice", { basePath });
2611
2609
  } else if (choice === "status") {
2612
2610
  const { fireStatusViaCommand } = await import("./commands.js");
2613
2611
  await fireStatusViaCommand(ctx);
@@ -2652,6 +2650,7 @@ export async function showSmartEntry(
2652
2650
  "gsd-run",
2653
2651
  ctx,
2654
2652
  "complete-slice",
2653
+ { basePath },
2655
2654
  );
2656
2655
  } else if (choice === "status") {
2657
2656
  const { fireStatusViaCommand } = await import("./commands.js");
@@ -2708,12 +2707,20 @@ export async function showSmartEntry(
2708
2707
  notYetMessage: "Run /gsd when ready.",
2709
2708
  });
2710
2709
 
2711
- if (choice === "auto") {
2712
- startAutoDetached(ctx, pi, basePath, false);
2710
+ if (choice === "not_yet") return;
2711
+
2712
+ const route = resolveActiveTaskChoiceRoute({
2713
+ choice: choice as ActiveTaskChoice,
2714
+ isolationMode: getIsolationMode(basePath),
2715
+ milestoneId,
2716
+ });
2717
+
2718
+ if (route.kind === "auto-bootstrap") {
2719
+ startAutoDetached(ctx, pi, basePath, route.verboseMode, route.options);
2713
2720
  return;
2714
2721
  }
2715
2722
 
2716
- if (choice === "execute") {
2723
+ if (route.kind === "guided-dispatch") {
2717
2724
  ctx.ui.setStatus("gsd-step", "Executing Task · follow progress above");
2718
2725
  if (hasInterrupted) {
2719
2726
  await dispatchWorkflow(pi, loadPrompt("guided-resume-task", {
@@ -2726,7 +2733,7 @@ export async function showSmartEntry(
2726
2733
  taskId,
2727
2734
  taskTitle,
2728
2735
  }),
2729
- }), "gsd-run", ctx, "execute-task");
2736
+ }), "gsd-run", ctx, "execute-task", { basePath });
2730
2737
  } else {
2731
2738
  await dispatchWorkflow(
2732
2739
  pi,
@@ -2734,12 +2741,13 @@ export async function showSmartEntry(
2734
2741
  "gsd-run",
2735
2742
  ctx,
2736
2743
  "execute-task",
2744
+ { basePath },
2737
2745
  );
2738
2746
  }
2739
- } else if (choice === "status") {
2747
+ } else if (route.kind === "status") {
2740
2748
  const { fireStatusViaCommand } = await import("./commands.js");
2741
2749
  await fireStatusViaCommand(ctx);
2742
- } else if (choice === "milestone_actions") {
2750
+ } else if (route.kind === "milestone-actions") {
2743
2751
  const acted = await handleMilestoneActions(ctx, pi, basePath, milestoneId, milestoneTitle, options);
2744
2752
  if (acted) return showSmartEntry(ctx, pi, basePath, options);
2745
2753
  }