gsd-pi 2.82.0-dev.ed17d078d → 3.0.0

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 (567) hide show
  1. package/README.md +6 -5
  2. package/dist/resources/.managed-resources-content-hash +1 -1
  3. package/dist/resources/GSD-WORKFLOW.md +10 -1
  4. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  5. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +1 -1
  6. package/dist/resources/extensions/cmux/index.js +5 -0
  7. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  8. package/dist/resources/extensions/gsd/auto/loop.js +19 -6
  9. package/dist/resources/extensions/gsd/auto/orchestrator.js +11 -0
  10. package/dist/resources/extensions/gsd/auto/phases.js +81 -31
  11. package/dist/resources/extensions/gsd/auto/session.js +4 -0
  12. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  13. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  14. package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
  15. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  16. package/dist/resources/extensions/gsd/auto-dispatch.js +20 -19
  17. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  18. package/dist/resources/extensions/gsd/auto-post-unit.js +246 -133
  19. package/dist/resources/extensions/gsd/auto-prompts.js +2 -2
  20. package/dist/resources/extensions/gsd/auto-recovery.js +71 -14
  21. package/dist/resources/extensions/gsd/auto-start.js +87 -14
  22. package/dist/resources/extensions/gsd/auto-verification.js +45 -26
  23. package/dist/resources/extensions/gsd/auto-worktree.js +176 -10
  24. package/dist/resources/extensions/gsd/auto.js +57 -33
  25. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
  26. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
  27. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +4 -2
  28. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  29. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +17 -3
  30. package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
  31. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  32. package/dist/resources/extensions/gsd/commands/handlers/core.js +38 -0
  33. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  34. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  35. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +7 -2
  36. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  37. package/dist/resources/extensions/gsd/crash-recovery.js +43 -5
  38. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  39. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  40. package/dist/resources/extensions/gsd/dispatch-guard.js +2 -2
  41. package/dist/resources/extensions/gsd/doctor-git-checks.js +46 -1
  42. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  43. package/dist/resources/extensions/gsd/doctor.js +2 -28
  44. package/dist/resources/extensions/gsd/export-html.js +27 -425
  45. package/dist/resources/extensions/gsd/forensics.js +3 -3
  46. package/dist/resources/extensions/gsd/git-service.js +45 -3
  47. package/dist/resources/extensions/gsd/gsd-db.js +21 -6
  48. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  49. package/dist/resources/extensions/gsd/guided-flow.js +101 -116
  50. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  51. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -8
  52. package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
  53. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  54. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  55. package/dist/resources/extensions/gsd/native-git-bridge.js +48 -12
  56. package/dist/resources/extensions/gsd/paths.js +4 -0
  57. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  58. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -2
  59. package/dist/resources/extensions/gsd/pre-execution-checks.js +28 -1
  60. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  61. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  62. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  63. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  64. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  65. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  66. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  67. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  68. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  69. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  70. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  71. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  72. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  73. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  74. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  75. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  76. package/dist/resources/extensions/gsd/state.js +3 -3
  77. package/dist/resources/extensions/gsd/status-guards.js +11 -0
  78. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  79. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  80. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
  81. package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
  82. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  83. package/dist/resources/extensions/gsd/tools/plan-slice.js +87 -14
  84. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
  85. package/dist/resources/extensions/gsd/unit-context-manifest.js +32 -10
  86. package/dist/resources/extensions/gsd/validation.js +23 -1
  87. package/dist/resources/extensions/gsd/verification-gate.js +68 -7
  88. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  89. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  90. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  91. package/dist/resources/extensions/gsd/worktree-lifecycle.js +54 -10
  92. package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
  93. package/dist/resources/extensions/shared/html-shell.js +388 -0
  94. package/dist/resources/extensions/subagent/index.js +448 -78
  95. package/dist/resources/extensions/subagent/launch.js +77 -0
  96. package/dist/resources/extensions/subagent/run-store.js +148 -0
  97. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  98. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  99. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  100. package/dist/resources/extensions/visual-brief/index.js +5 -0
  101. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  102. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  103. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  104. package/dist/web/standalone/.next/BUILD_ID +1 -1
  105. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  106. package/dist/web/standalone/.next/build-manifest.json +4 -4
  107. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  108. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  109. package/dist/web/standalone/.next/required-server-files.json +3 -3
  110. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  111. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  121. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  131. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  138. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  150. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  170. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  180. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  186. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  202. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  206. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/index.html +1 -1
  216. package/dist/web/standalone/.next/server/app/index.rsc +5 -8
  217. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  218. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
  219. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  220. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  221. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  222. package/dist/web/standalone/.next/server/app/page.js +2 -2
  223. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  226. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  227. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  228. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  229. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/middleware.js +2 -2
  232. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  234. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  235. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  236. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  237. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  238. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  239. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  240. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  241. package/dist/web/standalone/.next/static/chunks/app/layout-b23b3f6858dc6dc8.js +1 -0
  242. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +1 -0
  243. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  244. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  245. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  246. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  247. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  248. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  249. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  250. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  251. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  252. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  253. package/dist/web/standalone/server.js +1 -1
  254. package/package.json +4 -4
  255. package/packages/contracts/dist/rpc.test.js +7 -0
  256. package/packages/contracts/dist/rpc.test.js.map +1 -1
  257. package/packages/contracts/dist/workflow.d.ts +21 -0
  258. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  259. package/packages/contracts/dist/workflow.js +24 -0
  260. package/packages/contracts/dist/workflow.js.map +1 -1
  261. package/packages/contracts/src/rpc.test.ts +8 -0
  262. package/packages/contracts/src/workflow.ts +24 -0
  263. package/packages/daemon/package.json +2 -2
  264. package/packages/mcp-server/README.md +13 -4
  265. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  266. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  267. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  268. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  269. package/packages/mcp-server/package.json +2 -2
  270. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  271. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  272. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  273. package/packages/native/package.json +1 -1
  274. package/packages/native/tsconfig.json +2 -1
  275. package/packages/native/tsconfig.tsbuildinfo +1 -1
  276. package/packages/pi-agent-core/package.json +1 -1
  277. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  278. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  279. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  280. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  281. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  282. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  283. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  284. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  285. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  286. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  287. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  288. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  289. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  290. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  291. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  292. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  293. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  294. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  295. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  296. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  297. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  298. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  299. package/packages/pi-ai/package.json +1 -1
  300. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  301. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  302. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  303. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  304. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  305. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  306. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  307. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  308. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  310. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  312. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  313. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  314. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  316. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  321. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
  322. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  323. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  324. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  326. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  328. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  329. package/packages/pi-coding-agent/package.json +1 -1
  330. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  331. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  332. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  333. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  334. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  335. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
  336. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  337. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  338. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  339. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  340. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  341. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  342. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  343. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  344. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  345. package/packages/pi-tui/dist/terminal.js +12 -0
  346. package/packages/pi-tui/dist/terminal.js.map +1 -1
  347. package/packages/pi-tui/package.json +1 -1
  348. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  349. package/packages/pi-tui/src/terminal.ts +11 -0
  350. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  351. package/packages/rpc-client/package.json +1 -1
  352. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  353. package/pkg/package.json +1 -1
  354. package/src/resources/GSD-WORKFLOW.md +10 -1
  355. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  356. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +1 -1
  357. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  358. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +9 -0
  359. package/src/resources/extensions/cmux/index.ts +6 -0
  360. package/src/resources/extensions/gsd/auto/contracts.ts +14 -6
  361. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  362. package/src/resources/extensions/gsd/auto/loop.ts +22 -6
  363. package/src/resources/extensions/gsd/auto/orchestrator.ts +11 -0
  364. package/src/resources/extensions/gsd/auto/phases.ts +90 -38
  365. package/src/resources/extensions/gsd/auto/session.ts +4 -0
  366. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  367. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  368. package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
  369. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  370. package/src/resources/extensions/gsd/auto-dispatch.ts +21 -19
  371. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  372. package/src/resources/extensions/gsd/auto-post-unit.ts +279 -144
  373. package/src/resources/extensions/gsd/auto-prompts.ts +2 -2
  374. package/src/resources/extensions/gsd/auto-recovery.ts +74 -11
  375. package/src/resources/extensions/gsd/auto-start.ts +94 -12
  376. package/src/resources/extensions/gsd/auto-verification.ts +58 -36
  377. package/src/resources/extensions/gsd/auto-worktree.ts +193 -10
  378. package/src/resources/extensions/gsd/auto.ts +59 -31
  379. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
  380. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
  381. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +4 -2
  382. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  383. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +20 -4
  384. package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
  385. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  386. package/src/resources/extensions/gsd/commands/handlers/core.ts +41 -0
  387. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  388. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  389. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +8 -3
  390. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  391. package/src/resources/extensions/gsd/crash-recovery.ts +44 -4
  392. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  393. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  394. package/src/resources/extensions/gsd/dispatch-guard.ts +2 -2
  395. package/src/resources/extensions/gsd/doctor-git-checks.ts +45 -1
  396. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  397. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  398. package/src/resources/extensions/gsd/doctor.ts +2 -27
  399. package/src/resources/extensions/gsd/export-html.ts +27 -427
  400. package/src/resources/extensions/gsd/forensics.ts +3 -3
  401. package/src/resources/extensions/gsd/git-service.ts +51 -4
  402. package/src/resources/extensions/gsd/gsd-db.ts +21 -6
  403. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  404. package/src/resources/extensions/gsd/guided-flow.ts +134 -133
  405. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  406. package/src/resources/extensions/gsd/markdown-renderer.ts +10 -8
  407. package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
  408. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  409. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  410. package/src/resources/extensions/gsd/native-git-bridge.ts +54 -12
  411. package/src/resources/extensions/gsd/paths.ts +5 -0
  412. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  413. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -2
  414. package/src/resources/extensions/gsd/pre-execution-checks.ts +32 -1
  415. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  416. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  417. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  418. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  419. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  420. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  421. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  422. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  423. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  424. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  425. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  426. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  427. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  428. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  429. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  430. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  431. package/src/resources/extensions/gsd/state.ts +3 -3
  432. package/src/resources/extensions/gsd/status-guards.ts +13 -0
  433. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  434. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  435. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  436. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  437. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +56 -0
  438. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +80 -1
  439. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  440. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  441. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  442. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +91 -6
  443. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  444. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  445. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  446. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  447. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  448. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
  449. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +11 -2
  450. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  451. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  452. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
  453. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
  454. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  455. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +86 -2
  456. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  457. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  458. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +59 -2
  459. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +66 -0
  460. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +27 -0
  461. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  462. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +38 -0
  463. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  464. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +11 -0
  465. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  466. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  467. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  468. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  469. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  470. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  471. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  472. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  473. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  474. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  475. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  476. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +112 -1
  477. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  478. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +46 -0
  479. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  480. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
  481. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  482. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +63 -2
  483. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  484. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  485. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  486. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  487. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  488. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  489. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +251 -2
  490. package/src/resources/extensions/gsd/tests/plan-task.test.ts +17 -0
  491. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  492. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +86 -0
  493. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
  494. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  495. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +53 -0
  496. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +59 -0
  497. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  498. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  499. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  500. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  501. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  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 +10 -0
  504. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  505. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
  506. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  507. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  508. package/src/resources/extensions/gsd/tests/status-guards.test.ts +13 -1
  509. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  510. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  511. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +103 -7
  512. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  513. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +110 -1
  514. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  515. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  516. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  517. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  518. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
  519. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  520. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  521. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +25 -0
  522. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +54 -0
  523. package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
  524. package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
  525. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  526. package/src/resources/extensions/gsd/tools/plan-slice.ts +97 -12
  527. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
  528. package/src/resources/extensions/gsd/types.ts +1 -1
  529. package/src/resources/extensions/gsd/unit-context-manifest.ts +47 -11
  530. package/src/resources/extensions/gsd/validation.ts +23 -1
  531. package/src/resources/extensions/gsd/verification-gate.ts +78 -6
  532. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  533. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  534. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  535. package/src/resources/extensions/gsd/worktree-lifecycle.ts +61 -10
  536. package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
  537. package/src/resources/extensions/shared/html-shell.ts +412 -0
  538. package/src/resources/extensions/subagent/index.ts +567 -103
  539. package/src/resources/extensions/subagent/launch.ts +131 -0
  540. package/src/resources/extensions/subagent/run-store.ts +218 -0
  541. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  542. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  543. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  544. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  545. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  546. package/src/resources/extensions/visual-brief/index.ts +8 -0
  547. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  548. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  549. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  550. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  551. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  552. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  553. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  554. package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +0 -1
  555. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +0 -1
  556. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  557. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  558. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  559. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  560. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  561. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  562. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  563. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  564. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  565. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  566. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → qoMxZh-xuwuvpFW0x0k01}/_buildManifest.js +0 -0
  567. /package/dist/web/standalone/.next/static/{YEvjuT-fsFfYQhDSWtueS → qoMxZh-xuwuvpFW0x0k01}/_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,17 @@ 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
1788
  if (!manifestExists && !milestoneHasContext && ageMs > 30_000) {
1814
1789
  // Stale entry from an interrupted discussion — clear and continue
1815
- pendingAutoStartMap.delete(basePath);
1790
+ deletePendingAutoStart(basePath);
1816
1791
  }
1817
1792
  else {
1818
1793
  ctx.ui.notify("Discussion already in progress — answer the question above to continue.", "info");
@@ -1846,7 +1821,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1846
1821
  // First ever — skip wizard, just ask directly
1847
1822
  ctx.ui.setStatus("gsd-step", "New Milestone · answer the questions above to plan");
1848
1823
  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");
1824
+ 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
1825
  }
1851
1826
  else {
1852
1827
  const choice = await showNextAction(ctx, {
@@ -1873,7 +1848,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1873
1848
  else if (choice === "new_milestone") {
1874
1849
  ctx.ui.setStatus("gsd-step", "New Milestone · answer the questions above to plan");
1875
1850
  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");
1851
+ await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone", { basePath });
1877
1852
  }
1878
1853
  }
1879
1854
  return;
@@ -1882,7 +1857,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1882
1857
  const milestoneTitle = state.activeMilestone.title;
1883
1858
  if (planV2GateDecision === "recover-missing-context") {
1884
1859
  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");
1860
+ await dispatchWorkflow(pi, await buildDiscussMilestonePrompt(milestoneId, milestoneTitle, basePath, getStructuredQuestionsAvailability(pi, ctx)), "gsd-discuss", ctx, "discuss-milestone", { basePath });
1886
1861
  return;
1887
1862
  }
1888
1863
  // ── All milestones complete → New milestone ──────────────────────────
@@ -1918,7 +1893,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1918
1893
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
1919
1894
  const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
1920
1895
  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");
1896
+ await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone", { basePath });
1922
1897
  }
1923
1898
  else if (choice === "status") {
1924
1899
  const { fireStatusViaCommand } = await import("./commands.js");
@@ -1957,6 +1932,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1957
1932
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
1958
1933
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
1959
1934
  const basePrompt = loadPrompt("guided-discuss-milestone", {
1935
+ workingDirectory: basePath,
1960
1936
  milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
1961
1937
  commitInstruction: buildDocsCommitInstruction(`docs(${milestoneId}): milestone context from discuss`),
1962
1938
  fastPathInstruction: "",
@@ -1965,24 +1941,25 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
1965
1941
  ? `${basePrompt}\n\n## Prior Discussion (Draft Seed)\n\n${draftContent}`
1966
1942
  : basePrompt;
1967
1943
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
1968
- await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone");
1944
+ await dispatchWorkflow(pi, seed, "gsd-discuss", ctx, "discuss-milestone", { basePath });
1969
1945
  }
1970
1946
  else if (choice === "discuss_fresh") {
1971
1947
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
1972
1948
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
1973
1949
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
1974
1950
  await dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
1951
+ workingDirectory: basePath,
1975
1952
  milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
1976
1953
  commitInstruction: buildDocsCommitInstruction(`docs(${milestoneId}): milestone context from discuss`),
1977
1954
  fastPathInstruction: "",
1978
- }), "gsd-discuss", ctx, "discuss-milestone");
1955
+ }), "gsd-discuss", ctx, "discuss-milestone", { basePath });
1979
1956
  }
1980
1957
  else if (choice === "skip_milestone") {
1981
1958
  const milestoneIds = findMilestoneIds(basePath);
1982
1959
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
1983
1960
  const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
1984
1961
  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");
1962
+ await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone", { basePath });
1986
1963
  }
1987
1964
  return;
1988
1965
  }
@@ -2046,23 +2023,24 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
2046
2023
  else if (choice === "plan") {
2047
2024
  ctx.ui.setStatus("gsd-step", "Planning Milestone · decomposing into slices");
2048
2025
  setPendingAutoStart(basePath, { ctx, pi, basePath, milestoneId, step: stepMode });
2049
- await dispatchWorkflow(pi, await buildPlanMilestonePrompt(milestoneId, milestoneTitle, basePath), "gsd-run", ctx, "plan-milestone");
2026
+ await dispatchWorkflow(pi, await buildPlanMilestonePrompt(milestoneId, milestoneTitle, basePath), "gsd-run", ctx, "plan-milestone", { basePath });
2050
2027
  }
2051
2028
  else if (choice === "discuss") {
2052
2029
  const discussMilestoneTemplates = inlineTemplate("context", "Context");
2053
2030
  const structuredQuestionsAvailable = getStructuredQuestionsAvailability(pi, ctx);
2054
2031
  await dispatchWorkflow(pi, loadPrompt("guided-discuss-milestone", {
2032
+ workingDirectory: basePath,
2055
2033
  milestoneId, milestoneTitle, inlinedTemplates: discussMilestoneTemplates, structuredQuestionsAvailable,
2056
2034
  commitInstruction: buildDocsCommitInstruction(`docs(${milestoneId}): milestone context from discuss`),
2057
2035
  fastPathInstruction: "",
2058
- }), "gsd-run", ctx, "discuss-milestone");
2036
+ }), "gsd-run", ctx, "discuss-milestone", { basePath });
2059
2037
  }
2060
2038
  else if (choice === "skip_milestone") {
2061
2039
  const milestoneIds = findMilestoneIds(basePath);
2062
2040
  const uniqueMilestoneIds = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
2063
2041
  const nextId = nextMilestoneIdReserved(milestoneIds, uniqueMilestoneIds, basePath);
2064
2042
  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");
2043
+ await dispatchWorkflow(pi, await prepareAndBuildDiscussPrompt(ctx, pi, nextId, `New milestone ${nextId}.`, basePath), "gsd-run", ctx, "discuss-milestone", { basePath });
2066
2044
  }
2067
2045
  else if (choice === "discard_milestone") {
2068
2046
  const confirmed = await showConfirm(ctx, {
@@ -2170,11 +2148,11 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
2170
2148
  });
2171
2149
  if (choice === "plan") {
2172
2150
  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");
2151
+ await dispatchWorkflow(pi, await buildPlanSlicePrompt(milestoneId, milestoneTitle, sliceId, sliceTitle, basePath), "gsd-run", ctx, "plan-slice", { basePath });
2174
2152
  }
2175
2153
  else if (choice === "discuss") {
2176
2154
  const sqAvail = getStructuredQuestionsAvailability(pi, ctx);
2177
- await dispatchWorkflow(pi, await buildDiscussSlicePrompt(milestoneId, sliceId, sliceTitle, basePath, { rediscuss: hasContext, structuredQuestionsAvailable: sqAvail }), "gsd-run", ctx, "discuss-slice");
2155
+ await dispatchWorkflow(pi, await buildDiscussSlicePrompt(milestoneId, sliceId, sliceTitle, basePath, { rediscuss: hasContext, structuredQuestionsAvailable: sqAvail }), "gsd-run", ctx, "discuss-slice", { basePath });
2178
2156
  }
2179
2157
  else if (choice === "research") {
2180
2158
  const researchTemplates = inlineTemplate("research", "Research");
@@ -2190,7 +2168,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
2190
2168
  sliceTitle,
2191
2169
  extraContext: [researchTemplates],
2192
2170
  }),
2193
- }), "gsd-run", ctx, "research-slice");
2171
+ }), "gsd-run", ctx, "research-slice", { basePath });
2194
2172
  }
2195
2173
  else if (choice === "status") {
2196
2174
  const { fireStatusViaCommand } = await import("./commands.js");
@@ -2230,7 +2208,7 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
2230
2208
  });
2231
2209
  if (choice === "complete") {
2232
2210
  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");
2211
+ await dispatchWorkflow(pi, await buildCompleteSlicePrompt(milestoneId, milestoneTitle, sliceId, sliceTitle, basePath), "gsd-run", ctx, "complete-slice", { basePath });
2234
2212
  }
2235
2213
  else if (choice === "status") {
2236
2214
  const { fireStatusViaCommand } = await import("./commands.js");
@@ -2285,11 +2263,18 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
2285
2263
  ],
2286
2264
  notYetMessage: "Run /gsd when ready.",
2287
2265
  });
2288
- if (choice === "auto") {
2289
- startAutoDetached(ctx, pi, basePath, false);
2266
+ if (choice === "not_yet")
2267
+ return;
2268
+ const route = resolveActiveTaskChoiceRoute({
2269
+ choice: choice,
2270
+ isolationMode: getIsolationMode(basePath),
2271
+ milestoneId,
2272
+ });
2273
+ if (route.kind === "auto-bootstrap") {
2274
+ startAutoDetached(ctx, pi, basePath, route.verboseMode, route.options);
2290
2275
  return;
2291
2276
  }
2292
- if (choice === "execute") {
2277
+ if (route.kind === "guided-dispatch") {
2293
2278
  ctx.ui.setStatus("gsd-step", "Executing Task · follow progress above");
2294
2279
  if (hasInterrupted) {
2295
2280
  await dispatchWorkflow(pi, loadPrompt("guided-resume-task", {
@@ -2302,17 +2287,17 @@ export async function showSmartEntry(ctx, pi, basePath, options) {
2302
2287
  taskId,
2303
2288
  taskTitle,
2304
2289
  }),
2305
- }), "gsd-run", ctx, "execute-task");
2290
+ }), "gsd-run", ctx, "execute-task", { basePath });
2306
2291
  }
2307
2292
  else {
2308
- await dispatchWorkflow(pi, await buildExecuteTaskPrompt(milestoneId, sliceId, sliceTitle, taskId, taskTitle, basePath), "gsd-run", ctx, "execute-task");
2293
+ await dispatchWorkflow(pi, await buildExecuteTaskPrompt(milestoneId, sliceId, sliceTitle, taskId, taskTitle, basePath), "gsd-run", ctx, "execute-task", { basePath });
2309
2294
  }
2310
2295
  }
2311
- else if (choice === "status") {
2296
+ else if (route.kind === "status") {
2312
2297
  const { fireStatusViaCommand } = await import("./commands.js");
2313
2298
  await fireStatusViaCommand(ctx);
2314
2299
  }
2315
- else if (choice === "milestone_actions") {
2300
+ else if (route.kind === "milestone-actions") {
2316
2301
  const acted = await handleMilestoneActions(ctx, pi, basePath, milestoneId, milestoneTitle, options);
2317
2302
  if (acted)
2318
2303
  return showSmartEntry(ctx, pi, basePath, options);