gsd-pi 2.82.0-dev.ed17d078d → 3.0.0-dev.2e8b124f7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (580) hide show
  1. package/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/infra-errors.js +9 -3
  11. package/dist/resources/extensions/gsd/auto/loop.js +110 -37
  12. package/dist/resources/extensions/gsd/auto/orchestrator.js +13 -2
  13. package/dist/resources/extensions/gsd/auto/phases.js +104 -38
  14. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  15. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  16. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  17. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  18. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  19. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  20. package/dist/resources/extensions/gsd/auto-dispatch.js +71 -20
  21. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  22. package/dist/resources/extensions/gsd/auto-post-unit.js +278 -137
  23. package/dist/resources/extensions/gsd/auto-prompts.js +36 -10
  24. package/dist/resources/extensions/gsd/auto-recovery.js +79 -14
  25. package/dist/resources/extensions/gsd/auto-start.js +90 -14
  26. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  27. package/dist/resources/extensions/gsd/auto-verification.js +102 -34
  28. package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
  29. package/dist/resources/extensions/gsd/auto.js +107 -54
  30. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  32. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +5 -4
  33. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  34. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  35. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  36. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  37. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
  38. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  39. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  40. package/dist/resources/extensions/gsd/commands-handlers.js +2 -0
  41. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  42. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -2
  43. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  44. package/dist/resources/extensions/gsd/crash-recovery.js +52 -7
  45. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  46. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  47. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  48. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  49. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  50. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  51. package/dist/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  52. package/dist/resources/extensions/gsd/doctor-git-checks.js +46 -1
  53. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  54. package/dist/resources/extensions/gsd/doctor.js +2 -28
  55. package/dist/resources/extensions/gsd/export-html.js +27 -425
  56. package/dist/resources/extensions/gsd/forensics.js +10 -3
  57. package/dist/resources/extensions/gsd/git-service.js +138 -10
  58. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  59. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  60. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  61. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  62. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  63. package/dist/resources/extensions/gsd/markdown-renderer.js +14 -11
  64. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  65. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  66. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  67. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  68. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  69. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  70. package/dist/resources/extensions/gsd/paths.js +4 -0
  71. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  72. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  73. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  74. package/dist/resources/extensions/gsd/pre-execution-checks.js +38 -11
  75. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  76. package/dist/resources/extensions/gsd/preferences-types.js +2 -0
  77. package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
  78. package/dist/resources/extensions/gsd/preferences.js +2 -0
  79. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  80. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  83. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  84. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  85. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  86. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  87. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  88. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  89. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  90. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  91. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  92. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  93. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  94. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  95. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  96. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +59 -2
  97. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  98. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  99. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  100. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  101. package/dist/resources/extensions/gsd/state.js +14 -4
  102. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  103. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  104. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  105. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  106. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  107. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  108. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  109. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  110. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  111. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  112. package/dist/resources/extensions/gsd/validation.js +23 -1
  113. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  114. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  115. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  116. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  117. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  118. package/dist/resources/extensions/gsd/worktree-lifecycle.js +83 -19
  119. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  120. package/dist/resources/extensions/gsd/worktree-safety.js +33 -1
  121. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  122. package/dist/resources/extensions/shared/html-shell.js +388 -0
  123. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  124. package/dist/resources/extensions/subagent/index.js +448 -78
  125. package/dist/resources/extensions/subagent/launch.js +77 -0
  126. package/dist/resources/extensions/subagent/run-store.js +148 -0
  127. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  128. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  129. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  130. package/dist/resources/extensions/visual-brief/index.js +5 -0
  131. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  132. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  133. package/dist/resources/skills/forensics/SKILL.md +1 -1
  134. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  135. package/dist/web/standalone/.next/BUILD_ID +1 -1
  136. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  137. package/dist/web/standalone/.next/build-manifest.json +3 -3
  138. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  139. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  140. package/dist/web/standalone/.next/required-server-files.json +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  143. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  151. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  154. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  155. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  156. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  158. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  161. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/index.html +1 -1
  164. package/dist/web/standalone/.next/server/app/index.rsc +4 -7
  165. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  166. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -7
  167. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  169. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  170. package/dist/web/standalone/.next/server/app/page.js +2 -2
  171. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  174. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  175. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  176. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  179. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  180. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  181. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  182. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  183. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  184. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  185. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  186. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  187. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  188. package/dist/web/standalone/server.js +1 -1
  189. package/package.json +4 -4
  190. package/packages/contracts/dist/rpc.test.js +7 -0
  191. package/packages/contracts/dist/rpc.test.js.map +1 -1
  192. package/packages/contracts/dist/workflow.d.ts +21 -0
  193. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  194. package/packages/contracts/dist/workflow.js +24 -0
  195. package/packages/contracts/dist/workflow.js.map +1 -1
  196. package/packages/contracts/src/rpc.test.ts +8 -0
  197. package/packages/contracts/src/workflow.ts +24 -0
  198. package/packages/daemon/package.json +2 -2
  199. package/packages/mcp-server/README.md +13 -4
  200. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  201. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  202. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  203. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  204. package/packages/mcp-server/package.json +2 -2
  205. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  206. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  207. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  208. package/packages/native/package.json +1 -1
  209. package/packages/native/tsconfig.json +2 -1
  210. package/packages/native/tsconfig.tsbuildinfo +1 -1
  211. package/packages/pi-agent-core/package.json +1 -1
  212. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  213. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  214. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  215. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  216. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  217. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  218. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  219. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  220. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  221. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  222. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  223. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  224. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  225. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  226. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  227. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  228. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  229. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  230. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  231. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  232. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  233. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  234. package/packages/pi-ai/package.json +1 -1
  235. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  236. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  237. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  238. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  239. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  240. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  241. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  242. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  243. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  244. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  245. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  246. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  247. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  249. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  251. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  252. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  253. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  254. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  255. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  257. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  259. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  260. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  261. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  262. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  264. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  267. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  269. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  271. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  273. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  275. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  277. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  278. package/packages/pi-coding-agent/package.json +1 -1
  279. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  280. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  281. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  282. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  283. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  284. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  285. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  286. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  287. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  288. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  289. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  290. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  291. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  292. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  293. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  294. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  295. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  296. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  297. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  298. package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
  299. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  300. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  301. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  302. package/packages/pi-tui/dist/terminal.js +12 -0
  303. package/packages/pi-tui/dist/terminal.js.map +1 -1
  304. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  305. package/packages/pi-tui/dist/tui.js +106 -27
  306. package/packages/pi-tui/dist/tui.js.map +1 -1
  307. package/packages/pi-tui/package.json +1 -1
  308. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  309. package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
  310. package/packages/pi-tui/src/terminal.ts +11 -0
  311. package/packages/pi-tui/src/tui.ts +108 -27
  312. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  313. package/packages/rpc-client/package.json +1 -1
  314. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  315. package/pkg/package.json +1 -1
  316. package/src/resources/GSD-WORKFLOW.md +10 -1
  317. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  318. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  319. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  320. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  321. package/src/resources/extensions/cmux/index.ts +6 -0
  322. package/src/resources/extensions/gsd/auto/contracts.ts +17 -6
  323. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  324. package/src/resources/extensions/gsd/auto/loop.ts +111 -38
  325. package/src/resources/extensions/gsd/auto/orchestrator.ts +13 -2
  326. package/src/resources/extensions/gsd/auto/phases.ts +127 -49
  327. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  328. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  329. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  330. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  331. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  332. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  333. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  334. package/src/resources/extensions/gsd/auto-dispatch.ts +74 -20
  335. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  336. package/src/resources/extensions/gsd/auto-post-unit.ts +312 -148
  337. package/src/resources/extensions/gsd/auto-prompts.ts +36 -13
  338. package/src/resources/extensions/gsd/auto-recovery.ts +83 -11
  339. package/src/resources/extensions/gsd/auto-start.ts +99 -12
  340. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  341. package/src/resources/extensions/gsd/auto-verification.ts +124 -42
  342. package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
  343. package/src/resources/extensions/gsd/auto.ts +100 -42
  344. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
  345. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  346. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +5 -4
  347. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  348. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  349. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  350. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  351. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
  352. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  353. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  354. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  355. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  356. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +11 -3
  357. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  358. package/src/resources/extensions/gsd/crash-recovery.ts +52 -6
  359. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  360. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  361. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  362. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  363. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  364. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  365. package/src/resources/extensions/gsd/docs/preferences-reference.md +8 -0
  366. package/src/resources/extensions/gsd/doctor-git-checks.ts +45 -1
  367. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  368. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  369. package/src/resources/extensions/gsd/doctor.ts +2 -27
  370. package/src/resources/extensions/gsd/export-html.ts +27 -427
  371. package/src/resources/extensions/gsd/forensics.ts +9 -3
  372. package/src/resources/extensions/gsd/git-service.ts +166 -11
  373. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  374. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  375. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  376. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  377. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  378. package/src/resources/extensions/gsd/journal.ts +8 -1
  379. package/src/resources/extensions/gsd/markdown-renderer.ts +14 -11
  380. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  381. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  382. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  383. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  384. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  385. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  386. package/src/resources/extensions/gsd/paths.ts +5 -0
  387. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  388. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  389. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  390. package/src/resources/extensions/gsd/pre-execution-checks.ts +49 -11
  391. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  392. package/src/resources/extensions/gsd/preferences-types.ts +33 -0
  393. package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
  394. package/src/resources/extensions/gsd/preferences.ts +5 -0
  395. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  396. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  397. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  398. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  399. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  400. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  401. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  402. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  403. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  404. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  405. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  406. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  407. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  408. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  409. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  410. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  411. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  412. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +52 -1
  413. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  414. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  415. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  416. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  417. package/src/resources/extensions/gsd/state.ts +15 -4
  418. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  419. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  420. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  421. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  422. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  423. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  424. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +300 -1
  425. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +197 -11
  426. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  427. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  428. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  429. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +129 -6
  430. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  431. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  432. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  433. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  434. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  435. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  436. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  437. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  438. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  439. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  440. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  441. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  442. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  443. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  444. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  445. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  446. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  447. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  448. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  449. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +111 -1
  450. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  451. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  452. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  453. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  454. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  455. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  456. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  457. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  458. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  459. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  460. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  461. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  462. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  463. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  464. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  465. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  466. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  467. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  468. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +199 -2
  469. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  470. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  471. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  472. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  473. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  474. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  475. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  476. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  477. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  478. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  479. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  480. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  481. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  482. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  483. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  484. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  485. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  486. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  487. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  488. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  489. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  490. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  491. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +59 -0
  492. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  493. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  494. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  495. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +78 -0
  496. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  497. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  498. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  499. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  500. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  501. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  502. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  503. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +21 -1
  504. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -1
  505. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  506. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +86 -2
  507. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  508. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  509. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  510. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  511. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  512. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  513. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  514. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  515. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  516. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  517. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  518. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -1
  519. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  520. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  521. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  522. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  523. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  524. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  525. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  526. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +57 -2
  527. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  528. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +46 -0
  529. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  530. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  531. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  532. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  533. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  534. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  535. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  536. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  537. package/src/resources/extensions/gsd/types.ts +1 -1
  538. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  539. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  540. package/src/resources/extensions/gsd/validation.ts +23 -1
  541. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  542. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  543. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  544. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  545. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  546. package/src/resources/extensions/gsd/worktree-lifecycle.ts +93 -20
  547. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  548. package/src/resources/extensions/gsd/worktree-safety.ts +45 -6
  549. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  550. package/src/resources/extensions/shared/html-shell.ts +412 -0
  551. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  552. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  553. package/src/resources/extensions/subagent/index.ts +567 -103
  554. package/src/resources/extensions/subagent/launch.ts +131 -0
  555. package/src/resources/extensions/subagent/run-store.ts +218 -0
  556. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  557. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  558. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  559. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  560. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  561. package/src/resources/extensions/visual-brief/index.ts +8 -0
  562. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  563. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  564. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  565. package/src/resources/skills/forensics/SKILL.md +1 -1
  566. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  567. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  568. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  569. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  570. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  571. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  572. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  573. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  574. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  575. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  576. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  577. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  578. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  579. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → zCegwxH2e6vLp1vEZLLuZ}/_buildManifest.js +0 -0
  580. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → zCegwxH2e6vLp1vEZLLuZ}/_ssgManifest.js +0 -0
@@ -18,6 +18,7 @@ import { nativeAddPaths, nativeCommit } from "./native-git-bridge.js";
18
18
  import { loadEffectiveGSDPreferences } from "./preferences.js";
19
19
  import { saveQueueOrder } from "./queue-order.js";
20
20
  import { findMilestoneIds, nextMilestoneId } from "./milestone-ids.js";
21
+ import { isFutureMilestoneStatus } from "./status-guards.js";
21
22
  // ─── Queue Entry Point ──────────────────────────────────────────────────────
22
23
  /**
23
24
  * Queue future milestones via conversational intake.
@@ -48,7 +49,7 @@ export async function showQueue(ctx, pi, basePath) {
48
49
  return;
49
50
  }
50
51
  // ── Count pending milestones ────────────────────────────────────────
51
- const pendingMilestones = state.registry.filter(m => m.status === "pending" || m.status === "active");
52
+ const pendingMilestones = state.registry.filter(m => isFutureMilestoneStatus(m.status) || m.status === "active");
52
53
  const completeCount = state.registry.filter(m => m.status === "complete").length;
53
54
  const parkedCount = state.registry.filter(m => m.status === "parked").length;
54
55
  // ── If multiple pending milestones, show queue management hub ──────
@@ -140,7 +141,7 @@ export async function showQueueAdd(ctx, pi, basePath, state) {
140
141
  const activePart = state.activeMilestone
141
142
  ? `Currently executing: ${state.activeMilestone.id} — ${state.activeMilestone.title} (phase: ${state.phase}).`
142
143
  : "No milestone currently active.";
143
- const pendingCount = state.registry.filter(m => m.status === "pending").length;
144
+ const pendingCount = state.registry.filter(m => isFutureMilestoneStatus(m.status)).length;
144
145
  const completeCount = state.registry.filter(m => m.status === "complete").length;
145
146
  const preamble = [
146
147
  `Queuing new work onto an existing GSD project.`,
@@ -223,7 +224,7 @@ export async function buildExistingMilestonesContext(basePath, milestoneIds, sta
223
224
  }
224
225
  // For active/pending/parked milestones, include the roadmap if it exists
225
226
  // (shows what's planned but not yet built)
226
- if (status === "active" || status === "pending" || status === "parked") {
227
+ if (status === "active" || isFutureMilestoneStatus(status) || status === "parked") {
227
228
  const roadmapFile = resolveMilestoneFile(basePath, mid, "ROADMAP");
228
229
  if (roadmapFile) {
229
230
  const content = await loadFile(roadmapFile);
@@ -26,10 +26,11 @@ import { readSessionLockData, isSessionLockProcessAlive } from "./session-lock.j
26
26
  import { nativeAddAll, nativeCommit, nativeHasCommittedHead, nativeIsRepo, nativeInit } from "./native-git-bridge.js";
27
27
  import { isInheritedRepo } from "./repo-identity.js";
28
28
  import { ensureGitignore, ensurePreferences, untrackRuntimeFiles } from "./gitignore.js";
29
- import { loadEffectiveGSDPreferences } from "./preferences.js";
29
+ import { getIsolationMode, loadEffectiveGSDPreferences } from "./preferences.js";
30
30
  import { resolveUokFlags } from "./uok/flags.js";
31
31
  import { ensurePlanV2Graph, isMissingFinalizedContextResult } from "./uok/plan-v2.js";
32
32
  import { detectProjectState, hasGsdBootstrapArtifacts } from "./detection.js";
33
+ import { isFutureMilestoneStatus } from "./status-guards.js";
33
34
  import { showProjectInit, offerMigration } from "./init-wizard.js";
34
35
  import { validateDirectory } from "./validate-directory.js";
35
36
  import { showConfirm } from "../shared/tui.js";
@@ -43,8 +44,10 @@ import { DISCUSS_TOOLS_ALLOWLIST } from "./constants.js";
43
44
  import { getWorkflowTransportSupportError, getRequiredWorkflowToolsForGuidedUnit, supportsStructuredQuestions, } from "./workflow-mcp.js";
44
45
  import { runPreparation, formatCodebaseBrief, formatPriorContextBrief, } from "./preparation.js";
45
46
  import { verifyExpectedArtifact } from "./auto-recovery.js";
46
- import { createWorkspace, scopeMilestone } from "./workspace.js";
47
47
  import { getPendingGate, extractDepthVerificationMilestoneId } from "./bootstrap/write-gate.js";
48
+ import { _getPendingAutoStart, deletePendingAutoStart, hasPendingAutoStart, setPendingAutoStart, } from "./pending-auto-start.js";
49
+ import { clearGuidedUnitContext, setGuidedUnitContext } from "./guided-unit-context.js";
50
+ export { _getPendingAutoStart, clearPendingAutoStart, getDiscussionMilestoneId, setPendingAutoStart, } from "./pending-auto-start.js";
48
51
  export function shouldSkipGitBootstrapAfterInit(result) {
49
52
  return result.gitEnabled === false;
50
53
  }
@@ -56,6 +59,8 @@ import { deleteRuntimeKv } from "./db/runtime-kv.js";
56
59
  import { PAUSED_SESSION_KV_KEY } from "./interrupted-session.js";
57
60
  import { buildWorkflowDispatchContent } from "./workflow-protocol.js";
58
61
  import { isFullGsdToolSurfaceRequested, restoreGsdWorkflowTools, scopeGsdWorkflowToolsForDispatch } from "./bootstrap/register-hooks.js";
62
+ import { resolveActiveTaskChoiceRoute, } from "./smart-entry-routing.js";
63
+ export { resolveGuidedExecuteLaunchMode } from "./smart-entry-routing.js";
59
64
  function scheduleAutoStartAfterIdle(ctx, pi, basePath, verboseMode, options, launch = startAutoDetached) {
60
65
  const waitForIdle = typeof ctx.waitForIdle === "function"
61
66
  ? ctx.waitForIdle.bind(ctx)
@@ -157,7 +162,6 @@ const MAX_PLAN_BLOCKED_RECOVERIES = 3;
157
162
  // to emit. Accepts any M-prefixed milestone ID (three digits + optional
158
163
  // suffix) with optional trailing punctuation.
159
164
  const READY_PHRASE_RE = /\bMilestone\s+M\d{3}[A-Z0-9-]*\s+ready\.?/i;
160
- const pendingAutoStartMap = new Map();
161
165
  const pendingDeepProjectSetupMap = new Map();
162
166
  const USER_DRIVEN_DEEP_SETUP_UNITS = new Set([
163
167
  "discuss-project",
@@ -183,18 +187,6 @@ This stage is running inside the foreground \`/gsd new-project --deep\` intervie
183
187
 
184
188
  - Do NOT call \`ask_user_questions\`, \`AskUserQuestion\`, or ToolSearch to discover user-input tools.
185
189
  - Ask one focused round, then stop and wait for the user's normal chat response.`;
186
- /**
187
- * Backward-compat bridge: returns a mutable reference to the entry matching
188
- * basePath, or the sole entry when only one session exists.
189
- * Exported for testing — internal use only in production code.
190
- */
191
- export function _getPendingAutoStart(basePath) {
192
- if (basePath)
193
- return pendingAutoStartMap.get(basePath) ?? null;
194
- if (pendingAutoStartMap.size === 1)
195
- return pendingAutoStartMap.values().next().value;
196
- return null;
197
- }
198
190
  function hasNestedFileOrSymlink(dir) {
199
191
  for (const entry of readdirSync(dir, { withFileTypes: true })) {
200
192
  if (entry.isFile() || entry.isSymbolicLink())
@@ -228,28 +220,6 @@ function clearEmptyLegacyDeepSetupPseudoMilestones(basePath, entries) {
228
220
  }
229
221
  return remaining;
230
222
  }
231
- /**
232
- * Store pending auto-start state for a project.
233
- * Exported for testing (#2985).
234
- */
235
- export function setPendingAutoStart(basePath, entry) {
236
- const ws = createWorkspace(entry.basePath);
237
- const scope = scopeMilestone(ws, entry.milestoneId);
238
- pendingAutoStartMap.set(basePath, { createdAt: Date.now(), planBlockedRecoveryCount: 0, ...entry, scope });
239
- }
240
- /**
241
- * Clear pending auto-start state.
242
- * If basePath is given, clears only that project. Otherwise clears all.
243
- * Exported for testing (#2985).
244
- */
245
- export function clearPendingAutoStart(basePath) {
246
- if (basePath) {
247
- pendingAutoStartMap.delete(basePath);
248
- }
249
- else {
250
- pendingAutoStartMap.clear();
251
- }
252
- }
253
223
  export function clearPendingDeepProjectSetup(basePath) {
254
224
  if (basePath) {
255
225
  pendingDeepProjectSetupMap.delete(basePath);
@@ -258,22 +228,6 @@ export function clearPendingDeepProjectSetup(basePath) {
258
228
  pendingDeepProjectSetupMap.clear();
259
229
  }
260
230
  }
261
- /**
262
- * Returns the milestoneId being discussed for the given project.
263
- * When basePath is omitted and only one session is active, returns that
264
- * session's milestoneId for backward compatibility. Returns null when
265
- * multiple sessions exist and basePath is not specified (#2985 Bug 4).
266
- */
267
- export function getDiscussionMilestoneId(basePath) {
268
- if (basePath) {
269
- return pendingAutoStartMap.get(basePath)?.milestoneId ?? null;
270
- }
271
- // Backward compat: return the sole entry's milestoneId, or null if ambiguous
272
- if (pendingAutoStartMap.size === 1) {
273
- return pendingAutoStartMap.values().next().value.milestoneId;
274
- }
275
- return null;
276
- }
277
231
  function _getPendingDeepProjectSetup(basePath) {
278
232
  if (basePath)
279
233
  return pendingDeepProjectSetupMap.get(basePath) ?? null;
@@ -399,12 +353,12 @@ async function dispatchNextDeepProjectSetupStage(entry) {
399
353
  entry.currentUnitType = result.unitType;
400
354
  entry.currentUnitId = result.unitId;
401
355
  entry.createdAt = Date.now();
402
- await dispatchWorkflow(entry.pi, `${result.prompt}\n\n${FOREGROUND_DEEP_SETUP_QUESTION_POLICY}`, "gsd-run", entry.ctx, result.unitType);
356
+ await dispatchWorkflow(entry.pi, `${result.prompt}\n\n${FOREGROUND_DEEP_SETUP_QUESTION_POLICY}`, "gsd-run", entry.ctx, result.unitType, { basePath: entry.basePath });
403
357
  return true;
404
358
  }
405
359
  /** Called from agent_end to check if auto-mode should start after discuss */
406
- export function checkAutoStartAfterDiscuss() {
407
- const entry = _getPendingAutoStart();
360
+ export function checkAutoStartAfterDiscuss(lookupBasePath) {
361
+ const entry = _getPendingAutoStart(lookupBasePath);
408
362
  if (!entry)
409
363
  return false;
410
364
  const { ctx, pi, basePath, milestoneId, step } = entry;
@@ -569,7 +523,7 @@ export function checkAutoStartAfterDiscuss() {
569
523
  return false;
570
524
  }
571
525
  }
572
- pendingAutoStartMap.delete(basePath);
526
+ deletePendingAutoStart(basePath);
573
527
  ctx.ui.notify(`Milestone ${milestoneId} ready.`, "success");
574
528
  scheduleAutoStartAfterIdle(ctx, pi, basePath, false, { step });
575
529
  return true;
@@ -641,8 +595,8 @@ function hasToolUse(msg) {
641
595
  * Returns true when a nudge (or give-up) was emitted, signaling the caller to
642
596
  * skip `resolveAgentEnd`.
643
597
  */
644
- export function maybeHandleReadyPhraseWithoutFiles(event) {
645
- const entry = _getPendingAutoStart();
598
+ export function maybeHandleReadyPhraseWithoutFiles(event, lookupBasePath) {
599
+ const entry = _getPendingAutoStart(lookupBasePath);
646
600
  if (!entry)
647
601
  return false;
648
602
  const { ctx, pi, basePath, milestoneId } = entry;
@@ -684,7 +638,7 @@ export function maybeHandleReadyPhraseWithoutFiles(event) {
684
638
  if (entry.readyRejectCount > MAX_READY_REJECTS) {
685
639
  // Give up: clear state and tell the user to re-run /gsd. Avoids an
686
640
  // infinite nudge loop when the LLM never produces the writes.
687
- pendingAutoStartMap.delete(basePath);
641
+ deletePendingAutoStart(basePath);
688
642
  ctx.ui.notify(`Milestone ${milestoneId}: LLM signaled "ready" ${entry.readyRejectCount} times without writing files. ` +
689
643
  `Stopping auto-nudge. Run /gsd to try again.`, "error");
690
644
  return true;
@@ -747,10 +701,10 @@ export function resetEmptyTurnCounter(basePath) {
747
701
  else
748
702
  emptyTurnCounterByBase.clear();
749
703
  }
750
- export function maybeHandleEmptyIntentTurn(event, isAuto) {
704
+ export function maybeHandleEmptyIntentTurn(event, isAuto, lookupBasePath) {
751
705
  // Gate: only fire when there is system-driven work in flight. Interactive
752
706
  // /gsd discuss (user-driven) produces legitimate text-only turns.
753
- if (!isAuto && pendingAutoStartMap.size === 0)
707
+ if (!isAuto && !hasPendingAutoStart(lookupBasePath))
754
708
  return false;
755
709
  const lastMsg = event.messages[event.messages.length - 1];
756
710
  if (!lastMsg)
@@ -778,7 +732,7 @@ export function maybeHandleEmptyIntentTurn(event, isAuto) {
778
732
  return false;
779
733
  // Resolve the target basePath + pi for injection. Prefer the pending
780
734
  // autostart entry (discuss flow); otherwise we cannot inject.
781
- const entry = _getPendingAutoStart();
735
+ const entry = _getPendingAutoStart(lookupBasePath);
782
736
  if (!entry)
783
737
  return false;
784
738
  const { ctx, pi, basePath } = entry;
@@ -817,7 +771,9 @@ function parseMilestoneSequenceFromProject(content) {
817
771
  }
818
772
  return ids;
819
773
  }
820
- // ─── Helpers ──────────────────────────────────────────────────────────────────
774
+ export function resolveGuidedDispatchProjectRoot(basePath) {
775
+ return basePath ?? process.cwd();
776
+ }
821
777
  /**
822
778
  * Read GSD-WORKFLOW.md and dispatch it to the LLM with a contextual note.
823
779
  * This is the only way the wizard triggers work — everything else is the LLM's job.
@@ -827,12 +783,17 @@ function parseMilestoneSequenceFromProject(content) {
827
783
  * dispatching. This ensures guided-flow dispatches respect the same
828
784
  * per-phase model preferences that auto-mode uses.
829
785
  */
830
- async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType) {
786
+ async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType, options) {
787
+ const resolvedOptions = options ?? {};
788
+ const projectRoot = resolveGuidedDispatchProjectRoot(resolvedOptions.basePath);
789
+ const loadPreferences = resolvedOptions.deps?.loadPreferences ?? loadEffectiveGSDPreferences;
790
+ const selectModel = resolvedOptions.deps?.selectModel ?? selectAndApplyModel;
791
+ const getTransportSupportError = resolvedOptions.deps?.getTransportSupportError ?? getWorkflowTransportSupportError;
831
792
  // Route through the dynamic routing pipeline (complexity classification,
832
793
  // tier downgrade, fallback chains) — same path as auto-mode dispatches (#2958).
833
794
  if (ctx && unitType) {
834
- const prefs = loadEffectiveGSDPreferences()?.preferences;
835
- const result = await selectAndApplyModel(ctx, pi, unitType, /* unitId */ "", /* basePath */ process.cwd(), prefs, /* verbose */ false, /* autoModeStartModel */ null,
795
+ const prefs = loadPreferences(projectRoot)?.preferences;
796
+ const result = await selectModel(ctx, pi, unitType, /* unitId */ "", projectRoot, prefs, /* verbose */ false, /* autoModeStartModel */ null,
836
797
  /* retryContext */ undefined, /* isAutoMode */ false);
837
798
  if (result.appliedModel) {
838
799
  debugLog("guided-flow-model-applied", {
@@ -841,8 +802,8 @@ async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType)
841
802
  routing: result.routing,
842
803
  });
843
804
  }
844
- const compatibilityError = getWorkflowTransportSupportError(result.appliedModel?.provider ?? ctx.model?.provider, getRequiredWorkflowToolsForGuidedUnit(unitType), {
845
- projectRoot: process.cwd(),
805
+ const compatibilityError = getTransportSupportError(result.appliedModel?.provider ?? ctx.model?.provider, getRequiredWorkflowToolsForGuidedUnit(unitType), {
806
+ projectRoot,
846
807
  surface: "guided flow",
847
808
  unitType,
848
809
  authMode: result.appliedModel?.provider
@@ -851,6 +812,7 @@ async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType)
851
812
  ? ctx.modelRegistry.getProviderAuthMode(ctx.model.provider)
852
813
  : undefined,
853
814
  baseUrl: result.appliedModel?.baseUrl ?? ctx.model?.baseUrl,
815
+ activeTools: typeof pi.getActiveTools === "function" ? pi.getActiveTools() : [],
854
816
  });
855
817
  if (compatibilityError) {
856
818
  ctx.ui.notify(compatibilityError, "error");
@@ -894,11 +856,19 @@ async function dispatchWorkflow(pi, note, customType = "gsd-run", ctx, unitType)
894
856
  }
895
857
  const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(gsdHome(), "agent", "GSD-WORKFLOW.md");
896
858
  const workflow = readFileSync(workflowPath, "utf-8");
897
- pi.sendMessage({
898
- customType,
899
- content: buildWorkflowDispatchContent({ workflow, workflowPath, task: note }),
900
- display: false,
901
- }, { triggerTurn: true });
859
+ if (unitType)
860
+ setGuidedUnitContext(projectRoot, unitType);
861
+ try {
862
+ pi.sendMessage({
863
+ customType,
864
+ content: buildWorkflowDispatchContent({ workflow, workflowPath, task: note }),
865
+ display: false,
866
+ }, { triggerTurn: true });
867
+ }
868
+ catch (err) {
869
+ clearGuidedUnitContext(projectRoot);
870
+ throw err;
871
+ }
902
872
  }
903
873
  finally {
904
874
  // Restore full tool set after the message is queued. The LLM turn has
@@ -1086,7 +1056,7 @@ export async function showHeadlessMilestoneCreation(ctx, pi, basePath, seedConte
1086
1056
  // model/tool routing to skip discuss-flow tool scoping and
1087
1057
  // `checkAutoStartAfterDiscuss` guardrails that rely on the
1088
1058
  // "discuss-"-prefixed unitType.
1089
- await dispatchWorkflow(pi, prompt, "gsd-run", ctx, "discuss-milestone");
1059
+ await dispatchWorkflow(pi, prompt, "gsd-run", ctx, "discuss-milestone", { basePath });
1090
1060
  }
1091
1061
  // ─── Discuss Flow ─────────────────────────────────────────────────────────────
1092
1062
  /**
@@ -1196,7 +1166,7 @@ export async function showDiscuss(ctx, pi, basePath) {
1196
1166
  // No active milestone (or corrupted milestone with undefined id) —
1197
1167
  // check for pending milestones to discuss instead
1198
1168
  if (!state.activeMilestone?.id) {
1199
- const pendingMilestones = state.registry.filter(m => m.status === "pending");
1169
+ const pendingMilestones = state.registry.filter(m => isFutureMilestoneStatus(m.status));
1200
1170
  if (pendingMilestones.length === 0) {
1201
1171
  ctx.ui.notify("No active milestone. Run /gsd to create one first.", "warning");
1202
1172
  return;
@@ -1238,6 +1208,7 @@ export async function showDiscuss(ctx, pi, basePath) {
1238
1208
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
1239
1209
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
1240
1210
  const basePrompt = loadPrompt("guided-discuss-milestone", {
1211
+ workingDirectory: basePath,
1241
1212
  milestoneId: mid, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
1242
1213
  commitInstruction: buildDocsCommitInstruction(`docs(${mid}): milestone context from discuss`),
1243
1214
  fastPathInstruction: "",
@@ -1246,17 +1217,18 @@ export async function showDiscuss(ctx, pi, basePath) {
1246
1217
  ? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
1247
1218
  : basePrompt;
1248
1219
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: mid, step: false });
1249
- await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone");
1220
+ await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone", { basePath });
1250
1221
  }
1251
1222
  else if (choice === "discuss_fresh") {
1252
1223
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
1253
1224
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
1254
1225
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: mid, step: false });
1255
1226
  await dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
1227
+ workingDirectory: basePath,
1256
1228
  milestoneId: mid, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
1257
1229
  commitInstruction: buildDocsCommitInstruction(`docs(${mid}): milestone context from discuss`),
1258
1230
  fastPathInstruction: "",
1259
- }), "gsd-discuss", ctx, "discuss-milestone");
1231
+ }), "gsd-discuss", ctx, "discuss-milestone", { basePath });
1260
1232
  }
1261
1233
  else if (choice === "skip_milestone") {
1262
1234
  const { ensureDbOpen } = await import("./bootstrap/dynamic-tools.js");
@@ -1265,7 +1237,7 @@ export async function showDiscuss(ctx, pi, basePath) {
1265
1237
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
1266
1238
  const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
1267
1239
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: nextId, step: false });
1268
- await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
1240
+ await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone", { basePath });
1269
1241
  }
1270
1242
  return;
1271
1243
  }
@@ -1299,7 +1271,7 @@ export async function showDiscuss(ctx, pi, basePath) {
1299
1271
  const pendingSlices = normSlices.filter(s => !s.done);
1300
1272
  if (pendingSlices.length === 0) {
1301
1273
  // All slices complete — but queued milestones may still need discussion (#3150)
1302
- const pendingMilestones = state.registry.filter(m => m.status === "pending");
1274
+ const pendingMilestones = state.registry.filter(m => isFutureMilestoneStatus(m.status));
1303
1275
  if (pendingMilestones.length > 0) {
1304
1276
  await showDiscussQueuedMilestone(ctx, pi, basePath, pendingMilestones);
1305
1277
  return;
@@ -1320,7 +1292,7 @@ export async function showDiscuss(ctx, pi, basePath) {
1320
1292
  // If all pending slices are discussed, check for queued milestones before exiting (#3150)
1321
1293
  const allDiscussed = pendingSlices.every(s => discussedMap.get(s.id));
1322
1294
  if (allDiscussed) {
1323
- const pendingMilestones = state.registry.filter(m => m.status === "pending");
1295
+ const pendingMilestones = state.registry.filter(m => isFutureMilestoneStatus(m.status));
1324
1296
  if (pendingMilestones.length > 0) {
1325
1297
  await showDiscussQueuedMilestone(ctx, pi, basePath, pendingMilestones);
1326
1298
  return;
@@ -1351,7 +1323,7 @@ export async function showDiscuss(ctx, pi, basePath) {
1351
1323
  };
1352
1324
  });
1353
1325
  // Offer access to queued milestones when any exist
1354
- const pendingMilestones = state.registry.filter(m => m.status === "pending");
1326
+ const pendingMilestones = state.registry.filter(m => isFutureMilestoneStatus(m.status));
1355
1327
  if (pendingMilestones.length > 0) {
1356
1328
  actions.push({
1357
1329
  id: "discuss_queued_milestone",
@@ -1397,7 +1369,7 @@ export async function showDiscuss(ctx, pi, basePath) {
1397
1369
  }
1398
1370
  const sqAvail = getStructuredQuestionsAvailability(pi, ctx);
1399
1371
  const prompt = await buildDiscussSlicePrompt(mid, chosen.id, chosen.title, basePath, { rediscuss: isRediscuss, structuredQuestionsAvailable: sqAvail });
1400
- await dispatchWorkflow(pi, prompt, "gsd-discuss", ctx, "discuss-slice");
1372
+ await dispatchWorkflow(pi, prompt, "gsd-discuss", ctx, "discuss-slice", { basePath });
1401
1373
  // Wait for the discuss session to finish, then loop back to the picker
1402
1374
  await ctx.waitForIdle();
1403
1375
  invalidateAllCaches();
@@ -1415,10 +1387,11 @@ async function showDiscussQueuedMilestone(ctx, pi, basePath, pendingMilestones)
1415
1387
  const hasContext = !!resolveMilestoneFile(basePath, m.id, "CONTEXT");
1416
1388
  const hasDraft = !hasContext && !!resolveMilestoneFile(basePath, m.id, "CONTEXT-DRAFT");
1417
1389
  const contextStatus = hasContext ? "context ✓" : hasDraft ? "draft context" : "no context yet";
1390
+ const statusLabel = m.status === "planned" ? "planned" : "queued";
1418
1391
  return {
1419
1392
  id: m.id,
1420
1393
  label: `${m.id}: ${m.title}`,
1421
- description: `[queued] · ${contextStatus}`,
1394
+ description: `[${statusLabel}] · ${contextStatus}`,
1422
1395
  recommended: i === 0,
1423
1396
  };
1424
1397
  });
@@ -1488,6 +1461,7 @@ async function dispatchDiscussForMilestone(ctx, pi, basePath, mid, milestoneTitl
1488
1461
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
1489
1462
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
1490
1463
  const basePrompt = loadPrompt("guided-discuss-milestone", {
1464
+ workingDirectory: basePath,
1491
1465
  milestoneId: mid,
1492
1466
  milestoneTitle,
1493
1467
  inlinedTemplates: discussMilestoneTemplates,
@@ -1498,7 +1472,7 @@ async function dispatchDiscussForMilestone(ctx, pi, basePath, mid, milestoneTitl
1498
1472
  const prompt = draftContent
1499
1473
  ? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
1500
1474
  : basePrompt;
1501
- await dispatchWorkflow(pi, prompt, "gsd-discuss", ctx, "discuss-milestone");
1475
+ await dispatchWorkflow(pi, prompt, "gsd-discuss", ctx, "discuss-milestone", { basePath });
1502
1476
  }
1503
1477
  // ─── Smart Entry Point ────────────────────────────────────────────────────────
1504
1478
  /**
@@ -1624,7 +1598,7 @@ async function handleMilestoneActions(ctx, pi, basePath, milestoneId, milestoneT
1624
1598
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
1625
1599
  const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
1626
1600
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode });
1627
- await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
1601
+ await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone", { basePath });
1628
1602
  return true;
1629
1603
  }
1630
1604
  // "back" or null
@@ -1755,16 +1729,17 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1755
1729
  }
1756
1730
  if (interrupted.classification !== "recoverable") {
1757
1731
  try {
1758
- const { autoImportMarkdownHierarchyIfDbMismatch } = await import("./migration-auto-check.js");
1759
- const result = await autoImportMarkdownHierarchyIfDbMismatch(basePath);
1760
- if (result.action === "imported") {
1761
- ctx.ui.notify(`Recovered migrated planning state into gsd.db (${result.reason}): ${result.afterDb.milestones} milestone(s), ${result.afterDb.slices} slice(s), ${result.afterDb.tasks} task(s).`, "info");
1732
+ const { checkMarkdownHierarchyAgainstDb } = await import("./migration-auto-check.js");
1733
+ const result = await checkMarkdownHierarchyAgainstDb(basePath);
1734
+ if (result.action === "recovery-required") {
1735
+ ctx.ui.notify(result.message ??
1736
+ `Markdown planning artifacts do not match the authoritative DB. Run \`${result.recoveryCommand ?? "gsd recover"}\` to import markdown explicitly.`, "warning");
1762
1737
  }
1763
1738
  }
1764
1739
  catch (err) {
1765
1740
  const message = err instanceof Error ? err.message : String(err);
1766
- ctx.ui.notify(`GSD could not auto-import existing planning state into gsd.db: ${message}`, "warning");
1767
- logWarning("guided", `planning state auto-import failed: ${message}`, { file: "guided-flow.ts" });
1741
+ ctx.ui.notify(`GSD could not compare markdown planning artifacts with gsd.db: ${message}`, "warning");
1742
+ logWarning("guided", `planning state DB/markdown comparison failed: ${message}`, { file: "guided-flow.ts" });
1768
1743
  }
1769
1744
  }
1770
1745
  // Always derive from the project root — the assessment may have derived
@@ -1802,17 +1777,25 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1802
1777
  // Both /gsd and /gsd auto reach this branch when no milestone exists yet.
1803
1778
  // Without this guard, every subsequent /gsd call overwrites the pending auto-start
1804
1779
  // and fires another dispatchWorkflow, resetting the conversation mid-interview.
1805
- if (pendingAutoStartMap.has(basePath)) {
1780
+ if (hasPendingAutoStart(basePath)) {
1806
1781
  // #3274: If /clear interrupted the discussion, the pending entry is stale.
1807
1782
  // Detect staleness: no manifest, no milestone CONTEXT artifact, AND entry is older than
1808
1783
  // 30s (avoids race between .set() and LLM writing first artifact).
1809
- const entry = pendingAutoStartMap.get(basePath);
1784
+ const entry = _getPendingAutoStart(basePath);
1810
1785
  const ageMs = Date.now() - (entry.createdAt || 0);
1811
1786
  const manifestExists = existsSync(join(gsdRoot(basePath), "DISCUSSION-MANIFEST.json"));
1812
1787
  const milestoneHasContext = !!resolveMilestoneFile(basePath, entry.milestoneId, "CONTEXT");
1813
- if (!manifestExists && !milestoneHasContext && ageMs > 30_000) {
1788
+ const milestoneHasRoadmap = !!resolveMilestoneFile(basePath, entry.milestoneId, "ROADMAP");
1789
+ const milestoneRow = isDbAvailable() ? getMilestone(entry.milestoneId) : null;
1790
+ const discussPlanComplete = milestoneHasRoadmap && !!milestoneRow && milestoneRow.status !== "queued";
1791
+ if (discussPlanComplete) {
1792
+ // The discuss flow already completed, but pending auto-start cleanup handshake did not run.
1793
+ // Clear stale in-memory guard and continue through normal active-milestone routing.
1794
+ deletePendingAutoStart(basePath);
1795
+ }
1796
+ else if (!manifestExists && !milestoneHasContext && ageMs > 30_000) {
1814
1797
  // Stale entry from an interrupted discussion — clear and continue
1815
- pendingAutoStartMap.delete(basePath);
1798
+ deletePendingAutoStart(basePath);
1816
1799
  }
1817
1800
  else {
1818
1801
  ctx.ui.notify("Discussion already in progress — answer the question above to continue.", "info");
@@ -1846,7 +1829,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1846
1829
  // First ever — skip wizard, just ask directly
1847
1830
  ctx.ui.setStatus("gsd-step", "New Milestone · answer the questions above to plan");
1848
1831
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode });
1849
- await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New project, milestone ${nextId}. Do NOT read or explore .gsd/ — it's empty scaffolding.`, basePath), "gsd-run", ctx, "discuss-milestone");
1832
+ await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New project, milestone ${nextId}. Do NOT read or explore .gsd/ — it's empty scaffolding.`, basePath), "gsd-run", ctx, "discuss-milestone", { basePath });
1850
1833
  }
1851
1834
  else {
1852
1835
  const choice = await showNextAction(ctx, {
@@ -1873,7 +1856,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1873
1856
  else if (choice === "new_milestone") {
1874
1857
  ctx.ui.setStatus("gsd-step", "New Milestone · answer the questions above to plan");
1875
1858
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode });
1876
- await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
1859
+ await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone", { basePath });
1877
1860
  }
1878
1861
  }
1879
1862
  return;
@@ -1882,7 +1865,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1882
1865
  const milestoneTitle = state.activeMilestone.title;
1883
1866
  if (planV2GateDecision === "recover-missing-context") {
1884
1867
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
1885
- await dispatchWorkflow(pi, await buildDiscussMilestonePrompt(milestoneId, milestoneTitle, basePath, getStructuredQuestionsAvailability(pi, ctx)), "gsd-discuss", ctx, "discuss-milestone");
1868
+ await dispatchWorkflow(pi, await buildDiscussMilestonePrompt(milestoneId, milestoneTitle, basePath, getStructuredQuestionsAvailability(pi, ctx)), "gsd-discuss", ctx, "discuss-milestone", { basePath });
1886
1869
  return;
1887
1870
  }
1888
1871
  // ── All milestones complete → New milestone ──────────────────────────
@@ -1918,7 +1901,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1918
1901
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
1919
1902
  const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
1920
1903
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode });
1921
- await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
1904
+ await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone", { basePath });
1922
1905
  }
1923
1906
  else if (choice === "status") {
1924
1907
  const { fireStatusViaCommand } = await import("./commands.js");
@@ -1957,6 +1940,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1957
1940
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
1958
1941
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
1959
1942
  const basePrompt = loadPrompt("guided-discuss-milestone", {
1943
+ workingDirectory: basePath,
1960
1944
  milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
1961
1945
  commitInstruction: buildDocsCommitInstruction(`docs(${milestoneId}): milestone context from discuss`),
1962
1946
  fastPathInstruction: "",
@@ -1965,24 +1949,25 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1965
1949
  ? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
1966
1950
  : basePrompt;
1967
1951
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
1968
- await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone");
1952
+ await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone", { basePath });
1969
1953
  }
1970
1954
  else if (choice === "discuss_fresh") {
1971
1955
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
1972
1956
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
1973
1957
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
1974
1958
  await dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
1959
+ workingDirectory: basePath,
1975
1960
  milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
1976
1961
  commitInstruction: buildDocsCommitInstruction(`docs(${milestoneId}): milestone context from discuss`),
1977
1962
  fastPathInstruction: "",
1978
- }), "gsd-discuss", ctx, "discuss-milestone");
1963
+ }), "gsd-discuss", ctx, "discuss-milestone", { basePath });
1979
1964
  }
1980
1965
  else if (choice === "skip_milestone") {
1981
1966
  const milestoneIds = findMilestoneIds(basePath);
1982
1967
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
1983
1968
  const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
1984
1969
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode });
1985
- await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
1970
+ await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone", { basePath });
1986
1971
  }
1987
1972
  return;
1988
1973
  }
@@ -2046,23 +2031,24 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
2046
2031
  else if (choice === "plan") {
2047
2032
  ctx.ui.setStatus("gsd-step", "Planning Milestone · decomposing into slices");
2048
2033
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
2049
- await dispatchWorkflow(pi, await buildPlanMilestonePrompt(milestoneId, milestoneTitle, basePath), "gsd-run", ctx, "plan-milestone");
2034
+ await dispatchWorkflow(pi, await buildPlanMilestonePrompt(milestoneId, milestoneTitle, basePath), "gsd-run", ctx, "plan-milestone", { basePath });
2050
2035
  }
2051
2036
  else if (choice === "discuss") {
2052
2037
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
2053
2038
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
2054
2039
  await dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
2040
+ workingDirectory: basePath,
2055
2041
  milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
2056
2042
  commitInstruction: buildDocsCommitInstruction(`docs(${milestoneId}): milestone context from discuss`),
2057
2043
  fastPathInstruction: "",
2058
- }), "gsd-run", ctx, "discuss-milestone");
2044
+ }), "gsd-run", ctx, "discuss-milestone", { basePath });
2059
2045
  }
2060
2046
  else if (choice === "skip_milestone") {
2061
2047
  const milestoneIds = findMilestoneIds(basePath);
2062
2048
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
2063
2049
  const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
2064
2050
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId: nextId, step: stepMode });
2065
- await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone");
2051
+ await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone", { basePath });
2066
2052
  }
2067
2053
  else if (choice === "discard_milestone") {
2068
2054
  const confirmed = await showConfirm(ctx, {
@@ -2170,11 +2156,11 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
2170
2156
  });
2171
2157
  if (choice === "plan") {
2172
2158
  ctx.ui.setStatus("gsd-step", "Slice Planning · answer the questions above");
2173
- await dispatchWorkflow(pi, await buildPlanSlicePrompt(milestoneId, milestoneTitle, sliceId, sliceTitle, basePath), "gsd-run", ctx, "plan-slice");
2159
+ await dispatchWorkflow(pi, await buildPlanSlicePrompt(milestoneId, milestoneTitle, sliceId, sliceTitle, basePath), "gsd-run", ctx, "plan-slice", { basePath });
2174
2160
  }
2175
2161
  else if (choice === "discuss") {
2176
2162
  const sqAvail = getStructuredQuestionsAvailability(pi, ctx);
2177
- await dispatchWorkflow(pi, await buildDiscussSlicePrompt(milestoneId, sliceId, sliceTitle, basePath, { rediscuss: hasContext, structuredQuestionsAvailable: sqAvail }), "gsd-run", ctx, "discuss-slice");
2163
+ await dispatchWorkflow(pi, await buildDiscussSlicePrompt(milestoneId, sliceId, sliceTitle, basePath, { rediscuss: hasContext, structuredQuestionsAvailable: sqAvail }), "gsd-run", ctx, "discuss-slice", { basePath });
2178
2164
  }
2179
2165
  else if (choice === "research") {
2180
2166
  const researchTemplates = inlineTemplate("research", "Research");
@@ -2190,7 +2176,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
2190
2176
  sliceTitle,
2191
2177
  extraContext: [researchTemplates],
2192
2178
  }),
2193
- }), "gsd-run", ctx, "research-slice");
2179
+ }), "gsd-run", ctx, "research-slice", { basePath });
2194
2180
  }
2195
2181
  else if (choice === "status") {
2196
2182
  const { fireStatusViaCommand } = await import("./commands.js");
@@ -2230,7 +2216,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
2230
2216
  });
2231
2217
  if (choice === "complete") {
2232
2218
  ctx.ui.setStatus("gsd-step", "Completing Slice · review changes above");
2233
- await dispatchWorkflow(pi, await buildCompleteSlicePrompt(milestoneId, milestoneTitle, sliceId, sliceTitle, basePath), "gsd-run", ctx, "complete-slice");
2219
+ await dispatchWorkflow(pi, await buildCompleteSlicePrompt(milestoneId, milestoneTitle, sliceId, sliceTitle, basePath), "gsd-run", ctx, "complete-slice", { basePath });
2234
2220
  }
2235
2221
  else if (choice === "status") {
2236
2222
  const { fireStatusViaCommand } = await import("./commands.js");
@@ -2285,11 +2271,18 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
2285
2271
  ],
2286
2272
  notYetMessage: "Run /gsd when ready.",
2287
2273
  });
2288
- if (choice === "auto") {
2289
- startAutoDetached(ctx, pi, basePath, false);
2274
+ if (choice === "not_yet")
2275
+ return;
2276
+ const route = resolveActiveTaskChoiceRoute({
2277
+ choice: choice,
2278
+ isolationMode: getIsolationMode(basePath),
2279
+ milestoneId,
2280
+ });
2281
+ if (route.kind === "auto-bootstrap") {
2282
+ startAutoDetached(ctx, pi, basePath, route.verboseMode, route.options);
2290
2283
  return;
2291
2284
  }
2292
- if (choice === "execute") {
2285
+ if (route.kind === "guided-dispatch") {
2293
2286
  ctx.ui.setStatus("gsd-step", "Executing Task · follow progress above");
2294
2287
  if (hasInterrupted) {
2295
2288
  await dispatchWorkflow(pi, loadPrompt("guided-resume-task", {
@@ -2302,17 +2295,17 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
2302
2295
  taskId,
2303
2296
  taskTitle,
2304
2297
  }),
2305
- }), "gsd-run", ctx, "execute-task");
2298
+ }), "gsd-run", ctx, "execute-task", { basePath });
2306
2299
  }
2307
2300
  else {
2308
- await dispatchWorkflow(pi, await buildExecuteTaskPrompt(milestoneId, sliceId, sliceTitle, taskId, taskTitle, basePath), "gsd-run", ctx, "execute-task");
2301
+ await dispatchWorkflow(pi, await buildExecuteTaskPrompt(milestoneId, sliceId, sliceTitle, taskId, taskTitle, basePath), "gsd-run", ctx, "execute-task", { basePath });
2309
2302
  }
2310
2303
  }
2311
- else if (choice === "status") {
2304
+ else if (route.kind === "status") {
2312
2305
  const { fireStatusViaCommand } = await import("./commands.js");
2313
2306
  await fireStatusViaCommand(ctx);
2314
2307
  }
2315
- else if (choice === "milestone_actions") {
2308
+ else if (route.kind === "milestone-actions") {
2316
2309
  const acted = await handleMilestoneActions(ctx, pi, basePath, milestoneId, milestoneTitle, options);
2317
2310
  if (acted)
2318
2311
  return showSmartEntry(ctx, pi, basePath, options);