@opengsd/gsd-pi 1.2.0-dev.fbdca60b → 1.3.0-dev.65546769

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 (835) hide show
  1. package/README.md +13 -7
  2. package/dist/cli.js +28 -1
  3. package/dist/headless-context.js +0 -1
  4. package/dist/headless-events.d.ts +16 -1
  5. package/dist/headless-events.js +19 -2
  6. package/dist/headless.js +8 -1
  7. package/dist/help-text.js +29 -0
  8. package/dist/hermes-integration-install.d.ts +17 -0
  9. package/dist/hermes-integration-install.js +199 -0
  10. package/dist/jiti-workspace-aliases.d.ts +11 -2
  11. package/dist/jiti-workspace-aliases.js +19 -3
  12. package/dist/onboarding.js +9 -4
  13. package/dist/provider-migrations.d.ts +23 -0
  14. package/dist/provider-migrations.js +41 -0
  15. package/dist/read-cli.d.ts +23 -0
  16. package/dist/read-cli.js +90 -0
  17. package/dist/resource-loader.d.ts +3 -3
  18. package/dist/resource-loader.js +4 -13
  19. package/dist/resources/.managed-resources-content-hash +1 -1
  20. package/dist/resources/GSD-WORKFLOW.md +22 -22
  21. package/dist/resources/extensions/claude-code-cli/index.js +7 -1
  22. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +73 -20
  23. package/dist/resources/extensions/google-cli/stream-adapter.js +16 -1
  24. package/dist/resources/extensions/gsd/auto/dispatch-history.js +6 -1
  25. package/dist/resources/extensions/gsd/auto/loop.js +67 -2
  26. package/dist/resources/extensions/gsd/auto/orchestrator.js +50 -10
  27. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +8 -0
  28. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +15 -1
  29. package/dist/resources/extensions/gsd/auto-artifact-paths.js +81 -19
  30. package/dist/resources/extensions/gsd/auto-closeout-messaging.js +90 -0
  31. package/dist/resources/extensions/gsd/auto-dashboard.js +255 -431
  32. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +15 -3
  33. package/dist/resources/extensions/gsd/auto-dispatch.js +47 -8
  34. package/dist/resources/extensions/gsd/auto-model-selection.js +14 -8
  35. package/dist/resources/extensions/gsd/auto-post-unit.js +39 -29
  36. package/dist/resources/extensions/gsd/auto-prompts.js +44 -30
  37. package/dist/resources/extensions/gsd/auto-recovery.js +118 -40
  38. package/dist/resources/extensions/gsd/auto-runtime-state.js +13 -0
  39. package/dist/resources/extensions/gsd/auto-start.js +58 -31
  40. package/dist/resources/extensions/gsd/auto-verification.js +5 -2
  41. package/dist/resources/extensions/gsd/auto-worktree.js +149 -91
  42. package/dist/resources/extensions/gsd/auto.js +97 -31
  43. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +42 -54
  44. package/dist/resources/extensions/gsd/bootstrap/fallback-continuation.js +25 -0
  45. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +24 -2
  46. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +108 -9
  47. package/dist/resources/extensions/gsd/bootstrap/system-context.js +164 -44
  48. package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +22 -3
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +113 -27
  50. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +92 -4
  51. package/dist/resources/extensions/gsd/closeout-wizard.js +8 -3
  52. package/dist/resources/extensions/gsd/codebase-generator.js +5 -8
  53. package/dist/resources/extensions/gsd/commands/catalog.js +6 -0
  54. package/dist/resources/extensions/gsd/commands/dispatcher.js +3 -0
  55. package/dist/resources/extensions/gsd/commands/gsd-core-aliases-handler.js +39 -0
  56. package/dist/resources/extensions/gsd/commands/gsd-core-aliases.js +44 -0
  57. package/dist/resources/extensions/gsd/commands/handlers/core.js +52 -8
  58. package/dist/resources/extensions/gsd/commands/handlers/ops.js +227 -3
  59. package/dist/resources/extensions/gsd/commands-cmux.js +3 -1
  60. package/dist/resources/extensions/gsd/commands-gsd-core.js +868 -0
  61. package/dist/resources/extensions/gsd/commands-handlers.js +67 -1
  62. package/dist/resources/extensions/gsd/commands-maintenance.js +79 -2
  63. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +14 -1
  64. package/dist/resources/extensions/gsd/commands-verdict.js +17 -11
  65. package/dist/resources/extensions/gsd/compat/compat-marker.js +172 -0
  66. package/dist/resources/extensions/gsd/compat/index.js +3 -0
  67. package/dist/resources/extensions/gsd/compat/planning-compat.js +142 -0
  68. package/dist/resources/extensions/gsd/config-overlay.js +11 -8
  69. package/dist/resources/extensions/gsd/consent-question.js +12 -0
  70. package/dist/resources/extensions/gsd/consent-verdict.js +10 -0
  71. package/dist/resources/extensions/gsd/dashboard-overlay.js +39 -3
  72. package/dist/resources/extensions/gsd/db/engine.js +27 -0
  73. package/dist/resources/extensions/gsd/db/queries.js +54 -0
  74. package/dist/resources/extensions/gsd/db/unit-dispatches.js +22 -1
  75. package/dist/resources/extensions/gsd/db/writers/reconcile.js +19 -1
  76. package/dist/resources/extensions/gsd/db-workspace.js +13 -1
  77. package/dist/resources/extensions/gsd/discussion-handoff.js +9 -5
  78. package/dist/resources/extensions/gsd/doctor-git-checks.js +30 -4
  79. package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
  80. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -24
  81. package/dist/resources/extensions/gsd/doctor.js +28 -7
  82. package/dist/resources/extensions/gsd/error-classifier.js +13 -1
  83. package/dist/resources/extensions/gsd/escalation.js +11 -4
  84. package/dist/resources/extensions/gsd/export-html.js +10 -3
  85. package/dist/resources/extensions/gsd/export.js +73 -0
  86. package/dist/resources/extensions/gsd/file-lock.js +1 -1
  87. package/dist/resources/extensions/gsd/flat-phase-migration.js +176 -0
  88. package/dist/resources/extensions/gsd/forensics.js +2 -1
  89. package/dist/resources/extensions/gsd/git-service.js +7 -4
  90. package/dist/resources/extensions/gsd/gitignore.js +6 -2
  91. package/dist/resources/extensions/gsd/guidance.js +7 -7
  92. package/dist/resources/extensions/gsd/guided-flow.js +11 -6
  93. package/dist/resources/extensions/gsd/layout-policy.js +75 -0
  94. package/dist/resources/extensions/gsd/markdown-renderer.js +391 -116
  95. package/dist/resources/extensions/gsd/mcp-filter.js +44 -10
  96. package/dist/resources/extensions/gsd/md-importer.js +153 -51
  97. package/dist/resources/extensions/gsd/metrics.js +19 -11
  98. package/dist/resources/extensions/gsd/migrate/layout-detect.js +32 -0
  99. package/dist/resources/extensions/gsd/migrate/planning-writer.js +203 -0
  100. package/dist/resources/extensions/gsd/migrate-external.js +51 -6
  101. package/dist/resources/extensions/gsd/migration-auto-check.js +5 -14
  102. package/dist/resources/extensions/gsd/milestone-actions.js +5 -3
  103. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -2
  104. package/dist/resources/extensions/gsd/milestone-ids.js +50 -19
  105. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +8 -0
  106. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +7 -4
  107. package/dist/resources/extensions/gsd/model-router.js +79 -20
  108. package/dist/resources/extensions/gsd/notification-store.js +22 -29
  109. package/dist/resources/extensions/gsd/notifications.js +36 -7
  110. package/dist/resources/extensions/gsd/observability-validator.js +12 -4
  111. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +133 -35
  112. package/dist/resources/extensions/gsd/parsers-legacy.js +40 -14
  113. package/dist/resources/extensions/gsd/paths.js +356 -44
  114. package/dist/resources/extensions/gsd/planning-depth.js +2 -1
  115. package/dist/resources/extensions/gsd/post-execution-checks.js +26 -3
  116. package/dist/resources/extensions/gsd/preferences-models.js +34 -14
  117. package/dist/resources/extensions/gsd/preferences.js +148 -13
  118. package/dist/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
  119. package/dist/resources/extensions/gsd/prompts/audit-fix.md +39 -0
  120. package/dist/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
  121. package/dist/resources/extensions/gsd/prompts/audit-uat.md +24 -0
  122. package/dist/resources/extensions/gsd/prompts/autonomous.md +31 -0
  123. package/dist/resources/extensions/gsd/prompts/code-review.md +37 -0
  124. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  125. package/dist/resources/extensions/gsd/prompts/complete-slice.md +24 -15
  126. package/dist/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
  127. package/dist/resources/extensions/gsd/prompts/docs-update.md +13 -0
  128. package/dist/resources/extensions/gsd/prompts/execute-phase.md +33 -0
  129. package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -1
  130. package/dist/resources/extensions/gsd/prompts/explore.md +58 -0
  131. package/dist/resources/extensions/gsd/prompts/graphify.md +27 -0
  132. package/dist/resources/extensions/gsd/prompts/health.md +37 -0
  133. package/dist/resources/extensions/gsd/prompts/import.md +30 -0
  134. package/dist/resources/extensions/gsd/prompts/inbox.md +27 -0
  135. package/dist/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
  136. package/dist/resources/extensions/gsd/prompts/manager.md +21 -0
  137. package/dist/resources/extensions/gsd/prompts/map-codebase.md +42 -0
  138. package/dist/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
  139. package/dist/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
  140. package/dist/resources/extensions/gsd/prompts/pause-work.md +24 -0
  141. package/dist/resources/extensions/gsd/prompts/phase.md +22 -0
  142. package/dist/resources/extensions/gsd/prompts/plan-phase.md +34 -0
  143. package/dist/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
  144. package/dist/resources/extensions/gsd/prompts/profile-user.md +28 -0
  145. package/dist/resources/extensions/gsd/prompts/progress.md +30 -0
  146. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  147. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  148. package/dist/resources/extensions/gsd/prompts/resume-work.md +20 -0
  149. package/dist/resources/extensions/gsd/prompts/review-backlog.md +21 -0
  150. package/dist/resources/extensions/gsd/prompts/review.md +27 -0
  151. package/dist/resources/extensions/gsd/prompts/run-uat.md +5 -1
  152. package/dist/resources/extensions/gsd/prompts/secure-phase.md +24 -0
  153. package/dist/resources/extensions/gsd/prompts/settings.md +24 -0
  154. package/dist/resources/extensions/gsd/prompts/sketch.md +59 -0
  155. package/dist/resources/extensions/gsd/prompts/spec-phase.md +29 -0
  156. package/dist/resources/extensions/gsd/prompts/spike.md +59 -0
  157. package/dist/resources/extensions/gsd/prompts/stats.md +43 -0
  158. package/dist/resources/extensions/gsd/prompts/surface.md +25 -0
  159. package/dist/resources/extensions/gsd/prompts/thread.md +24 -0
  160. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  161. package/dist/resources/extensions/gsd/prompts/ui-phase.md +29 -0
  162. package/dist/resources/extensions/gsd/prompts/ui-review.md +29 -0
  163. package/dist/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
  164. package/dist/resources/extensions/gsd/prompts/validate-phase.md +26 -0
  165. package/dist/resources/extensions/gsd/prompts/verify-work.md +24 -0
  166. package/dist/resources/extensions/gsd/prompts/workspace.md +22 -0
  167. package/dist/resources/extensions/gsd/prompts/workstreams.md +24 -0
  168. package/dist/resources/extensions/gsd/provider-error-guidance.js +24 -0
  169. package/dist/resources/extensions/gsd/queue-order.js +3 -2
  170. package/dist/resources/extensions/gsd/recovery-classification.js +8 -0
  171. package/dist/resources/extensions/gsd/roadmap-slices.js +1 -1
  172. package/dist/resources/extensions/gsd/safety/content-validator.js +2 -1
  173. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +43 -1
  174. package/dist/resources/extensions/gsd/service-tier.js +2 -1
  175. package/dist/resources/extensions/gsd/session-lock.js +11 -9
  176. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
  177. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
  178. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +51 -10
  179. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +24 -3
  180. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +82 -0
  181. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +142 -0
  182. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +19 -6
  183. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +2 -2
  184. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +95 -19
  185. package/dist/resources/extensions/gsd/state-reconciliation/index.js +36 -3
  186. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +12 -0
  187. package/dist/resources/extensions/gsd/state.js +48 -17
  188. package/dist/resources/extensions/gsd/sync-lock.js +11 -18
  189. package/dist/resources/extensions/gsd/tool-surface-readiness.js +205 -16
  190. package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
  191. package/dist/resources/extensions/gsd/tools/complete-slice.js +12 -2
  192. package/dist/resources/extensions/gsd/tools/complete-task.js +15 -1
  193. package/dist/resources/extensions/gsd/tools/exec-tool.js +2 -109
  194. package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -3
  195. package/dist/resources/extensions/gsd/tools/plan-task.js +16 -1
  196. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +9 -3
  197. package/dist/resources/extensions/gsd/tools/validate-milestone.js +8 -3
  198. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +44 -5
  199. package/dist/resources/extensions/gsd/triage-resolution.js +14 -7
  200. package/dist/resources/extensions/gsd/tui/render-kit.js +38 -13
  201. package/dist/resources/extensions/gsd/undo.js +8 -9
  202. package/dist/resources/extensions/gsd/unit-registry.js +27 -3
  203. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +58 -2
  204. package/dist/resources/extensions/gsd/validation-block-guard.js +45 -0
  205. package/dist/resources/extensions/gsd/visualizer-data.js +35 -0
  206. package/dist/resources/extensions/gsd/visualizer-views.js +21 -2
  207. package/dist/resources/extensions/gsd/workflow-logger.js +4 -0
  208. package/dist/resources/extensions/gsd/workflow-mcp.js +9 -1
  209. package/dist/resources/extensions/gsd/workflow-projections.js +25 -4
  210. package/dist/resources/extensions/gsd/worktree-command.js +6 -6
  211. package/dist/resources/extensions/gsd/worktree-health.js +6 -3
  212. package/dist/resources/extensions/gsd/worktree-manager.js +109 -16
  213. package/dist/resources/extensions/gsd/worktree-safety.js +20 -11
  214. package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
  215. package/dist/resources/extensions/mcp-client/manager.js +3 -3
  216. package/dist/resources/extensions/search-the-web/index.js +41 -9
  217. package/dist/resources/extensions/search-the-web/native-search.js +18 -4
  218. package/dist/resources/extensions/shared/gsd-browser-cli.js +40 -2
  219. package/dist/resources/extensions/subagent/index.js +20 -15
  220. package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
  221. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  222. package/dist/update-check.js +15 -4
  223. package/dist/web/standalone/.next/BUILD_ID +1 -1
  224. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  225. package/dist/web/standalone/.next/build-manifest.json +3 -3
  226. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  227. package/dist/web/standalone/.next/react-loadable-manifest.json +3 -3
  228. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  229. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  230. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  231. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  232. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  233. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  234. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  235. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  236. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  237. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  238. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  239. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  240. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  241. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  242. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  243. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  244. package/dist/web/standalone/.next/server/app/index.html +1 -1
  245. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  246. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  247. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  248. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  249. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  250. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  251. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  252. package/dist/web/standalone/.next/server/chunks/1128.js +1 -1
  253. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  254. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  255. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  257. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  258. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  259. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  260. package/dist/web/standalone/.next/static/chunks/{4283.e4873b058df143a1.js → 4283.8e446784528ed9dc.js} +2 -2
  261. package/dist/web/standalone/.next/static/chunks/8785.481aa5869991b760.js +1 -0
  262. package/dist/web/standalone/.next/static/chunks/{webpack-f0285ce91d4ec9ef.js → webpack-f46ea08200a0227e.js} +1 -1
  263. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  264. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  265. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  266. package/dist/web-mode.d.ts +3 -1
  267. package/dist/web-mode.js +7 -5
  268. package/integrations/hermes/README.md +48 -0
  269. package/integrations/hermes/docs/setup.md +272 -0
  270. package/integrations/hermes/docs/upstream-hermes-pr.md +40 -0
  271. package/integrations/hermes/open_gsd_hermes/__init__.py +105 -0
  272. package/integrations/hermes/open_gsd_hermes/binding.py +107 -0
  273. package/integrations/hermes/open_gsd_hermes/commands.py +186 -0
  274. package/integrations/hermes/open_gsd_hermes/config.py +59 -0
  275. package/integrations/hermes/open_gsd_hermes/credentials.py +51 -0
  276. package/integrations/hermes/open_gsd_hermes/cron.py +85 -0
  277. package/integrations/hermes/open_gsd_hermes/formatting.py +13 -0
  278. package/integrations/hermes/open_gsd_hermes/gsd_client.py +269 -0
  279. package/integrations/hermes/open_gsd_hermes/inject.py +31 -0
  280. package/integrations/hermes/open_gsd_hermes/memory.py +66 -0
  281. package/integrations/hermes/open_gsd_hermes/notifications.py +71 -0
  282. package/integrations/hermes/open_gsd_hermes/snapshot.py +42 -0
  283. package/integrations/hermes/open_gsd_hermes/supervisor.py +180 -0
  284. package/integrations/hermes/open_gsd_hermes/types.py +100 -0
  285. package/integrations/hermes/plugin.yaml +38 -0
  286. package/integrations/hermes/pyproject.toml +32 -0
  287. package/integrations/hermes/scripts/preflight.sh +92 -0
  288. package/integrations/hermes/tests/fixtures/minimal-project/.gsd/STATE.md +17 -0
  289. package/integrations/hermes/tests/golden/memory_prefetch.txt +5 -0
  290. package/integrations/hermes/tests/golden/snapshot.txt +8 -0
  291. package/integrations/hermes/tests/test_binding.py +103 -0
  292. package/integrations/hermes/tests/test_config.py +36 -0
  293. package/integrations/hermes/tests/test_cron.py +34 -0
  294. package/integrations/hermes/tests/test_gsd_client_cache.py +120 -0
  295. package/integrations/hermes/tests/test_memory.py +59 -0
  296. package/integrations/hermes/tests/test_read_cli_contract.py +50 -0
  297. package/integrations/hermes/tests/test_register.py +56 -0
  298. package/integrations/hermes/tests/test_snapshot.py +53 -0
  299. package/integrations/hermes/tests/test_supervisor_fsm.py +581 -0
  300. package/package.json +8 -7
  301. package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts +8 -0
  302. package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts.map +1 -1
  303. package/packages/cloud-mcp-gateway/dist/runtime-registry.js +19 -2
  304. package/packages/cloud-mcp-gateway/dist/runtime-registry.js.map +1 -1
  305. package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js +71 -2
  306. package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js.map +1 -1
  307. package/packages/cloud-mcp-gateway/package.json +2 -2
  308. package/packages/contracts/package.json +1 -1
  309. package/packages/daemon/package.json +4 -4
  310. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  311. package/packages/gsd-agent-core/dist/sdk.js +6 -2
  312. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  313. package/packages/gsd-agent-core/package.json +5 -5
  314. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +5 -5
  315. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  316. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
  317. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
  318. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
  319. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
  320. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
  321. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  322. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
  323. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  324. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
  325. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
  326. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
  327. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
  328. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
  329. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  330. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
  331. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  332. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
  333. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  334. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
  335. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
  336. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
  337. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
  338. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
  339. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
  340. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
  341. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
  342. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
  343. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
  344. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
  345. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
  346. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
  347. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
  348. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
  349. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  350. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
  351. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
  352. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -3
  353. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  354. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
  355. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  356. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +3 -0
  357. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  358. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +37 -15
  359. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  360. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +69 -3
  361. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  362. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +223 -32
  363. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  364. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
  365. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  366. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
  367. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
  368. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -0
  369. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  370. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -10
  371. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  372. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
  373. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
  374. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
  375. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  376. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +5 -0
  377. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  378. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  379. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
  380. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  381. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  382. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +3 -5
  383. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  384. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -2
  385. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  386. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
  387. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  388. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +25 -0
  389. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  390. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.d.ts.map +1 -1
  391. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
  392. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
  393. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
  394. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
  395. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
  396. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
  397. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -0
  398. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  399. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  400. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +9 -2
  401. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  402. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +31 -6
  403. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  404. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
  405. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
  406. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js.map +1 -1
  407. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  408. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -0
  409. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  410. package/packages/gsd-agent-modes/package.json +7 -7
  411. package/packages/mcp-server/README.md +10 -0
  412. package/packages/mcp-server/dist/cli-errors.d.ts +11 -0
  413. package/packages/mcp-server/dist/cli-errors.d.ts.map +1 -1
  414. package/packages/mcp-server/dist/cli-errors.js +12 -0
  415. package/packages/mcp-server/dist/cli-errors.js.map +1 -1
  416. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
  417. package/packages/mcp-server/dist/cli-runner.js +33 -0
  418. package/packages/mcp-server/dist/cli-runner.js.map +1 -1
  419. package/packages/mcp-server/dist/cli.d.ts +1 -0
  420. package/packages/mcp-server/dist/cli.d.ts.map +1 -1
  421. package/packages/mcp-server/dist/cli.js +1 -0
  422. package/packages/mcp-server/dist/cli.js.map +1 -1
  423. package/packages/mcp-server/dist/server.d.ts +29 -0
  424. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  425. package/packages/mcp-server/dist/server.js +82 -3
  426. package/packages/mcp-server/dist/server.js.map +1 -1
  427. package/packages/mcp-server/package.json +21 -5
  428. package/packages/native/package.json +1 -1
  429. package/packages/pi-agent-core/dist/agent-loop.js +9 -0
  430. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  431. package/packages/pi-agent-core/package.json +1 -1
  432. package/packages/pi-ai/package.json +1 -1
  433. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +28 -2
  434. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  435. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  436. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  437. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  438. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  439. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
  440. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  441. package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
  442. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  443. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  444. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  445. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  446. package/packages/pi-coding-agent/package.json +8 -8
  447. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  448. package/packages/pi-tui/dist/autocomplete.js +6 -1
  449. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  450. package/packages/pi-tui/dist/components/input.js +1 -1
  451. package/packages/pi-tui/dist/components/input.js.map +1 -1
  452. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  453. package/packages/pi-tui/dist/components/loader.js +1 -0
  454. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  455. package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
  456. package/packages/pi-tui/dist/components/select-list.js +8 -2
  457. package/packages/pi-tui/dist/components/select-list.js.map +1 -1
  458. package/packages/pi-tui/package.json +2 -2
  459. package/packages/rpc-client/package.json +2 -2
  460. package/pkg/package.json +1 -1
  461. package/src/resources/GSD-WORKFLOW.md +22 -22
  462. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +80 -0
  463. package/src/resources/extensions/claude-code-cli/index.ts +8 -1
  464. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +83 -20
  465. package/src/resources/extensions/claude-code-cli/tests/index.test.ts +47 -0
  466. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +182 -10
  467. package/src/resources/extensions/google-cli/stream-adapter.ts +22 -1
  468. package/src/resources/extensions/gsd/auto/dispatch-history.ts +19 -1
  469. package/src/resources/extensions/gsd/auto/loop.ts +69 -2
  470. package/src/resources/extensions/gsd/auto/orchestrator.ts +63 -10
  471. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +13 -1
  472. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +25 -3
  473. package/src/resources/extensions/gsd/auto-artifact-paths.ts +83 -20
  474. package/src/resources/extensions/gsd/auto-closeout-messaging.ts +90 -0
  475. package/src/resources/extensions/gsd/auto-dashboard.ts +310 -454
  476. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
  477. package/src/resources/extensions/gsd/auto-dispatch.ts +57 -12
  478. package/src/resources/extensions/gsd/auto-model-selection.ts +27 -5
  479. package/src/resources/extensions/gsd/auto-post-unit.ts +52 -31
  480. package/src/resources/extensions/gsd/auto-prompts.ts +45 -30
  481. package/src/resources/extensions/gsd/auto-recovery.ts +126 -37
  482. package/src/resources/extensions/gsd/auto-runtime-state.ts +13 -0
  483. package/src/resources/extensions/gsd/auto-start.ts +82 -36
  484. package/src/resources/extensions/gsd/auto-verification.ts +5 -7
  485. package/src/resources/extensions/gsd/auto-worktree.ts +83 -15
  486. package/src/resources/extensions/gsd/auto.ts +133 -32
  487. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +45 -61
  488. package/src/resources/extensions/gsd/bootstrap/fallback-continuation.ts +31 -0
  489. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +23 -2
  490. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +123 -9
  491. package/src/resources/extensions/gsd/bootstrap/system-context.ts +185 -46
  492. package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +21 -3
  493. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +138 -29
  494. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +107 -3
  495. package/src/resources/extensions/gsd/closeout-wizard.ts +11 -2
  496. package/src/resources/extensions/gsd/codebase-generator.ts +6 -9
  497. package/src/resources/extensions/gsd/commands/catalog.ts +6 -0
  498. package/src/resources/extensions/gsd/commands/dispatcher.ts +3 -0
  499. package/src/resources/extensions/gsd/commands/gsd-core-aliases-handler.ts +48 -0
  500. package/src/resources/extensions/gsd/commands/gsd-core-aliases.ts +63 -0
  501. package/src/resources/extensions/gsd/commands/handlers/core.ts +58 -8
  502. package/src/resources/extensions/gsd/commands/handlers/ops.ts +230 -3
  503. package/src/resources/extensions/gsd/commands-cmux.ts +3 -0
  504. package/src/resources/extensions/gsd/commands-gsd-core.ts +1142 -0
  505. package/src/resources/extensions/gsd/commands-handlers.ts +76 -1
  506. package/src/resources/extensions/gsd/commands-maintenance.ts +98 -2
  507. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +13 -0
  508. package/src/resources/extensions/gsd/commands-verdict.ts +16 -15
  509. package/src/resources/extensions/gsd/compat/compat-marker.ts +210 -0
  510. package/src/resources/extensions/gsd/compat/index.ts +12 -0
  511. package/src/resources/extensions/gsd/compat/planning-compat.ts +168 -0
  512. package/src/resources/extensions/gsd/config-overlay.ts +24 -9
  513. package/src/resources/extensions/gsd/consent-question.ts +11 -1
  514. package/src/resources/extensions/gsd/consent-verdict.ts +30 -1
  515. package/src/resources/extensions/gsd/dashboard-overlay.ts +41 -4
  516. package/src/resources/extensions/gsd/db/engine.ts +26 -0
  517. package/src/resources/extensions/gsd/db/queries.ts +78 -0
  518. package/src/resources/extensions/gsd/db/unit-dispatches.ts +24 -0
  519. package/src/resources/extensions/gsd/db/writers/reconcile.ts +24 -1
  520. package/src/resources/extensions/gsd/db-workspace.ts +15 -0
  521. package/src/resources/extensions/gsd/discussion-handoff.ts +9 -5
  522. package/src/resources/extensions/gsd/doctor-git-checks.ts +28 -3
  523. package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
  524. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +12 -25
  525. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  526. package/src/resources/extensions/gsd/doctor.ts +30 -7
  527. package/src/resources/extensions/gsd/error-classifier.ts +14 -1
  528. package/src/resources/extensions/gsd/escalation.ts +9 -4
  529. package/src/resources/extensions/gsd/export-html.ts +11 -4
  530. package/src/resources/extensions/gsd/export.ts +88 -1
  531. package/src/resources/extensions/gsd/file-lock.ts +1 -1
  532. package/src/resources/extensions/gsd/flat-phase-migration.ts +205 -0
  533. package/src/resources/extensions/gsd/forensics.ts +2 -1
  534. package/src/resources/extensions/gsd/git-constants.ts +1 -1
  535. package/src/resources/extensions/gsd/git-service.ts +7 -2
  536. package/src/resources/extensions/gsd/gitignore.ts +7 -3
  537. package/src/resources/extensions/gsd/guidance.ts +7 -7
  538. package/src/resources/extensions/gsd/guided-flow.ts +11 -6
  539. package/src/resources/extensions/gsd/layout-policy.ts +85 -0
  540. package/src/resources/extensions/gsd/markdown-renderer.ts +404 -104
  541. package/src/resources/extensions/gsd/mcp-filter.ts +59 -10
  542. package/src/resources/extensions/gsd/md-importer.ts +215 -65
  543. package/src/resources/extensions/gsd/metrics.ts +23 -10
  544. package/src/resources/extensions/gsd/migrate/layout-detect.ts +38 -0
  545. package/src/resources/extensions/gsd/migrate/planning-writer.ts +259 -0
  546. package/src/resources/extensions/gsd/migrate-external.ts +49 -6
  547. package/src/resources/extensions/gsd/migration-auto-check.ts +4 -13
  548. package/src/resources/extensions/gsd/milestone-actions.ts +5 -2
  549. package/src/resources/extensions/gsd/milestone-closeout.ts +13 -2
  550. package/src/resources/extensions/gsd/milestone-ids.ts +49 -19
  551. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +8 -0
  552. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +7 -9
  553. package/src/resources/extensions/gsd/model-router.ts +98 -18
  554. package/src/resources/extensions/gsd/notification-store.ts +17 -28
  555. package/src/resources/extensions/gsd/notifications.ts +37 -6
  556. package/src/resources/extensions/gsd/observability-validator.ts +12 -4
  557. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +151 -31
  558. package/src/resources/extensions/gsd/parsers-legacy.ts +42 -15
  559. package/src/resources/extensions/gsd/paths.ts +348 -39
  560. package/src/resources/extensions/gsd/planning-depth.ts +2 -1
  561. package/src/resources/extensions/gsd/post-execution-checks.ts +43 -3
  562. package/src/resources/extensions/gsd/preferences-models.ts +47 -13
  563. package/src/resources/extensions/gsd/preferences.ts +188 -14
  564. package/src/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
  565. package/src/resources/extensions/gsd/prompts/audit-fix.md +39 -0
  566. package/src/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
  567. package/src/resources/extensions/gsd/prompts/audit-uat.md +24 -0
  568. package/src/resources/extensions/gsd/prompts/autonomous.md +31 -0
  569. package/src/resources/extensions/gsd/prompts/code-review.md +37 -0
  570. package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  571. package/src/resources/extensions/gsd/prompts/complete-slice.md +24 -15
  572. package/src/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
  573. package/src/resources/extensions/gsd/prompts/docs-update.md +13 -0
  574. package/src/resources/extensions/gsd/prompts/execute-phase.md +33 -0
  575. package/src/resources/extensions/gsd/prompts/execute-task.md +5 -1
  576. package/src/resources/extensions/gsd/prompts/explore.md +58 -0
  577. package/src/resources/extensions/gsd/prompts/graphify.md +27 -0
  578. package/src/resources/extensions/gsd/prompts/health.md +37 -0
  579. package/src/resources/extensions/gsd/prompts/import.md +30 -0
  580. package/src/resources/extensions/gsd/prompts/inbox.md +27 -0
  581. package/src/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
  582. package/src/resources/extensions/gsd/prompts/manager.md +21 -0
  583. package/src/resources/extensions/gsd/prompts/map-codebase.md +42 -0
  584. package/src/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
  585. package/src/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
  586. package/src/resources/extensions/gsd/prompts/pause-work.md +24 -0
  587. package/src/resources/extensions/gsd/prompts/phase.md +22 -0
  588. package/src/resources/extensions/gsd/prompts/plan-phase.md +34 -0
  589. package/src/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
  590. package/src/resources/extensions/gsd/prompts/profile-user.md +28 -0
  591. package/src/resources/extensions/gsd/prompts/progress.md +30 -0
  592. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  593. package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  594. package/src/resources/extensions/gsd/prompts/resume-work.md +20 -0
  595. package/src/resources/extensions/gsd/prompts/review-backlog.md +21 -0
  596. package/src/resources/extensions/gsd/prompts/review.md +27 -0
  597. package/src/resources/extensions/gsd/prompts/run-uat.md +5 -1
  598. package/src/resources/extensions/gsd/prompts/secure-phase.md +24 -0
  599. package/src/resources/extensions/gsd/prompts/settings.md +24 -0
  600. package/src/resources/extensions/gsd/prompts/sketch.md +59 -0
  601. package/src/resources/extensions/gsd/prompts/spec-phase.md +29 -0
  602. package/src/resources/extensions/gsd/prompts/spike.md +59 -0
  603. package/src/resources/extensions/gsd/prompts/stats.md +43 -0
  604. package/src/resources/extensions/gsd/prompts/surface.md +25 -0
  605. package/src/resources/extensions/gsd/prompts/thread.md +24 -0
  606. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  607. package/src/resources/extensions/gsd/prompts/ui-phase.md +29 -0
  608. package/src/resources/extensions/gsd/prompts/ui-review.md +29 -0
  609. package/src/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
  610. package/src/resources/extensions/gsd/prompts/validate-phase.md +26 -0
  611. package/src/resources/extensions/gsd/prompts/verify-work.md +24 -0
  612. package/src/resources/extensions/gsd/prompts/workspace.md +22 -0
  613. package/src/resources/extensions/gsd/prompts/workstreams.md +24 -0
  614. package/src/resources/extensions/gsd/provider-error-guidance.ts +32 -0
  615. package/src/resources/extensions/gsd/queue-order.ts +3 -2
  616. package/src/resources/extensions/gsd/recovery-classification.ts +7 -0
  617. package/src/resources/extensions/gsd/roadmap-slices.ts +1 -1
  618. package/src/resources/extensions/gsd/safety/content-validator.ts +2 -1
  619. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +45 -1
  620. package/src/resources/extensions/gsd/service-tier.ts +2 -0
  621. package/src/resources/extensions/gsd/session-lock.ts +15 -13
  622. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
  623. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
  624. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +58 -14
  625. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +22 -2
  626. package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +105 -0
  627. package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +180 -0
  628. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +19 -6
  629. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +2 -2
  630. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +98 -26
  631. package/src/resources/extensions/gsd/state-reconciliation/index.ts +36 -3
  632. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +12 -0
  633. package/src/resources/extensions/gsd/state-reconciliation/types.ts +19 -0
  634. package/src/resources/extensions/gsd/state.ts +57 -15
  635. package/src/resources/extensions/gsd/sync-lock.ts +11 -20
  636. package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-01-PLAN.md +13 -0
  637. package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-ROADMAP.md +8 -0
  638. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/M001-ROADMAP.md +13 -0
  639. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/slices/S01/S01-PLAN.md +5 -0
  640. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/PROJECT.md +1 -0
  641. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/ROADMAP.md +5 -0
  642. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/STATE.md +10 -0
  643. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/phases/01-foundation/01-01-PLAN.md +13 -0
  644. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +322 -1
  645. package/src/resources/extensions/gsd/tests/auto-closeout-messaging.test.ts +71 -0
  646. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +68 -116
  647. package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
  648. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +104 -0
  649. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +32 -1
  650. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +7 -2
  651. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +10 -0
  652. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +28 -22
  653. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +11 -2
  654. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +19 -2
  655. package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
  656. package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +17 -0
  657. package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
  658. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +15 -11
  659. package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +89 -0
  660. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +37 -1
  661. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +31 -30
  662. package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +862 -0
  663. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +1 -1
  664. package/src/resources/extensions/gsd/tests/compat-health-line.test.ts +102 -0
  665. package/src/resources/extensions/gsd/tests/compat-marker-invalidation.test.ts +51 -0
  666. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +105 -0
  667. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +6 -2
  668. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +82 -0
  669. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -7
  670. package/src/resources/extensions/gsd/tests/complete-task.test.ts +7 -7
  671. package/src/resources/extensions/gsd/tests/consent-question.test.ts +45 -0
  672. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
  673. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +37 -0
  674. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
  675. package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -0
  676. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +63 -1
  677. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +49 -5
  678. package/src/resources/extensions/gsd/tests/discuss-cold-start-db-open.test.ts +10 -27
  679. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +20 -1
  680. package/src/resources/extensions/gsd/tests/dispatch-db-degradation-logs.test.ts +98 -0
  681. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +102 -0
  682. package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
  683. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +38 -49
  684. package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
  685. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +7 -0
  686. package/src/resources/extensions/gsd/tests/doctor-git-checks-autoresolve.test.ts +149 -0
  687. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
  688. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +17 -10
  689. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +95 -0
  690. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +25 -0
  691. package/src/resources/extensions/gsd/tests/export-memory.test.ts +179 -0
  692. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +53 -0
  693. package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +137 -0
  694. package/src/resources/extensions/gsd/tests/external-planning-edit.test.ts +199 -0
  695. package/src/resources/extensions/gsd/tests/fallback-continuation.test.ts +36 -0
  696. package/src/resources/extensions/gsd/tests/file-lock.test.ts +43 -0
  697. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +114 -0
  698. package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +83 -0
  699. package/src/resources/extensions/gsd/tests/flat-phase-round-trip.test.ts +72 -0
  700. package/src/resources/extensions/gsd/tests/flat-phase-validation-integration.test.ts +120 -0
  701. package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +74 -0
  702. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -1
  703. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +40 -7
  704. package/src/resources/extensions/gsd/tests/gsd-core-parity-routing.test.ts +183 -0
  705. package/src/resources/extensions/gsd/tests/guidance.test.ts +25 -0
  706. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +19 -11
  707. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +75 -0
  708. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +6 -2
  709. package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +55 -0
  710. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +4 -3
  711. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +11 -7
  712. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -0
  713. package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +372 -0
  714. package/src/resources/extensions/gsd/tests/layout-policy.test.ts +59 -0
  715. package/src/resources/extensions/gsd/tests/loop.test.ts +60 -0
  716. package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +1 -1
  717. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +214 -82
  718. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +74 -1
  719. package/src/resources/extensions/gsd/tests/metrics-ledger-cap.test.ts +239 -0
  720. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +7 -2
  721. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +6 -1
  722. package/src/resources/extensions/gsd/tests/model-router.test.ts +343 -7
  723. package/src/resources/extensions/gsd/tests/notification-store.test.ts +23 -0
  724. package/src/resources/extensions/gsd/tests/notifications.test.ts +33 -0
  725. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +13 -1
  726. package/src/resources/extensions/gsd/tests/observability-validator-boundary.test.ts +194 -0
  727. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
  728. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +339 -0
  729. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +52 -1
  730. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +91 -0
  731. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +7 -2
  732. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +7 -2
  733. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
  734. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +58 -23
  735. package/src/resources/extensions/gsd/tests/plan-task.test.ts +4 -4
  736. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +19 -0
  737. package/src/resources/extensions/gsd/tests/planning-layout-detect.test.ts +84 -0
  738. package/src/resources/extensions/gsd/tests/planning-marker.test.ts +107 -0
  739. package/src/resources/extensions/gsd/tests/planning-projection-hook.test.ts +123 -0
  740. package/src/resources/extensions/gsd/tests/planning-round-trip-property.test.ts +164 -0
  741. package/src/resources/extensions/gsd/tests/planning-writer.test.ts +82 -0
  742. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +48 -1
  743. package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -1
  744. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +35 -4
  745. package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
  746. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
  747. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +16 -0
  748. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +15 -0
  749. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +107 -0
  750. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +22 -13
  751. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +9 -8
  752. package/src/resources/extensions/gsd/tests/reconcile-logs.test.ts +244 -0
  753. package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
  754. package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
  755. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
  756. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +79 -4
  757. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +4 -4
  758. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
  759. package/src/resources/extensions/gsd/tests/round-trip-property.test.ts +137 -0
  760. package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +28 -2
  761. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +68 -0
  762. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
  763. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +1 -0
  764. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +7 -1
  765. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +155 -58
  766. package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +6 -2
  767. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +85 -0
  768. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +23 -0
  769. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +29 -1
  770. package/src/resources/extensions/gsd/tests/terminal-tool-surface-classification.test.ts +80 -0
  771. package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
  772. package/src/resources/extensions/gsd/tests/tool-schema-model-fallback.test.ts +64 -0
  773. package/src/resources/extensions/gsd/tests/tool-search-shim.test.ts +71 -0
  774. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +26 -7
  775. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +23 -0
  776. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +40 -86
  777. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
  778. package/src/resources/extensions/gsd/tests/undo.test.ts +39 -37
  779. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +22 -0
  780. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +62 -0
  781. package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
  782. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +72 -1
  783. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +9 -1
  784. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +51 -0
  785. package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +34 -6
  786. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +90 -0
  787. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +87 -0
  788. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +27 -0
  789. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +51 -0
  790. package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +133 -0
  791. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +34 -8
  792. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +3 -4
  793. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +64 -8
  794. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +43 -3
  795. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +62 -0
  796. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +39 -18
  797. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
  798. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +4 -1
  799. package/src/resources/extensions/gsd/tests/write-gate.test.ts +103 -0
  800. package/src/resources/extensions/gsd/tool-surface-readiness.ts +226 -16
  801. package/src/resources/extensions/gsd/tools/complete-milestone.ts +4 -7
  802. package/src/resources/extensions/gsd/tools/complete-slice.ts +12 -9
  803. package/src/resources/extensions/gsd/tools/complete-task.ts +15 -1
  804. package/src/resources/extensions/gsd/tools/exec-tool.ts +2 -118
  805. package/src/resources/extensions/gsd/tools/plan-slice.ts +1 -3
  806. package/src/resources/extensions/gsd/tools/plan-task.ts +17 -1
  807. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +9 -10
  808. package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -13
  809. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +43 -4
  810. package/src/resources/extensions/gsd/triage-resolution.ts +14 -7
  811. package/src/resources/extensions/gsd/tui/render-kit.ts +56 -13
  812. package/src/resources/extensions/gsd/undo.ts +8 -9
  813. package/src/resources/extensions/gsd/unit-registry.ts +27 -3
  814. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +60 -1
  815. package/src/resources/extensions/gsd/validation-block-guard.ts +46 -0
  816. package/src/resources/extensions/gsd/visualizer-data.ts +55 -0
  817. package/src/resources/extensions/gsd/visualizer-views.ts +27 -2
  818. package/src/resources/extensions/gsd/workflow-logger.ts +5 -0
  819. package/src/resources/extensions/gsd/workflow-mcp.ts +12 -1
  820. package/src/resources/extensions/gsd/workflow-projections.ts +24 -4
  821. package/src/resources/extensions/gsd/worktree-command.ts +6 -6
  822. package/src/resources/extensions/gsd/worktree-health.ts +6 -3
  823. package/src/resources/extensions/gsd/worktree-manager.ts +122 -16
  824. package/src/resources/extensions/gsd/worktree-safety.ts +31 -11
  825. package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
  826. package/src/resources/extensions/mcp-client/manager.ts +3 -3
  827. package/src/resources/extensions/search-the-web/index.ts +45 -9
  828. package/src/resources/extensions/search-the-web/native-search.ts +16 -4
  829. package/src/resources/extensions/shared/gsd-browser-cli.ts +41 -2
  830. package/src/resources/extensions/subagent/index.ts +20 -15
  831. package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
  832. package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
  833. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +0 -1
  834. /package/dist/web/standalone/.next/static/{2T9IOdiiM3o3gZ4UbPi8E → BTKtGFF1Y-hvVJEGhBRo9}/_buildManifest.js +0 -0
  835. /package/dist/web/standalone/.next/static/{2T9IOdiiM3o3gZ4UbPi8E → BTKtGFF1Y-hvVJEGhBRo9}/_ssgManifest.js +0 -0
@@ -170,6 +170,9 @@ export function classifyQuestion(input) {
170
170
  /**
171
171
  * THE single policy point for whether a question's answer counts as answered.
172
172
  *
173
+ * - timed_out rounds → "timeout" for every kind (host elicitation expired
174
+ * before the user answered; fail-closed, but the caller pauses-and-waits
175
+ * instead of re-asking into the same timeout loop, #852).
173
176
  * - cancelled rounds → "cancelled" for every kind.
174
177
  * - gate: delegates to evaluateGateAnswer in the consent-verdict leaf — the
175
178
  * same verdict engine write-gate's applyAskUserQuestionsGateResult consumes;
@@ -181,6 +184,8 @@ export function classifyQuestion(input) {
181
184
  */
182
185
  export function evaluateAnswer(options) {
183
186
  const { question, details } = options;
187
+ if (details.timed_out)
188
+ return "timeout";
184
189
  if (details.cancelled)
185
190
  return "cancelled";
186
191
  const { kind } = classifyQuestion({ id: question.id, options: question.options });
@@ -203,6 +208,7 @@ export function evaluateAnswer(options) {
203
208
  }
204
209
  const OUTCOME_PRECEDENCE = [
205
210
  "cancelled",
211
+ "timeout",
206
212
  "waiting",
207
213
  "declined",
208
214
  "verified",
@@ -217,6 +223,12 @@ const OUTCOME_PRECEDENCE = [
217
223
  * a no-op, so it reports "answered" here.
218
224
  */
219
225
  export function evaluateAskUserQuestionsRound(questions, details) {
226
+ // timed_out is checked before cancelled: a host elicitation timeout is a
227
+ // more specific signal than the deliberate-dismissal cancelled it is also
228
+ // marked with, and callers must pause-and-wait instead of treating it as a
229
+ // re-ask-able cancel (#852).
230
+ if (details.timed_out)
231
+ return "timeout";
220
232
  if (details.cancelled)
221
233
  return "cancelled";
222
234
  let worst = "answered";
@@ -44,13 +44,23 @@ export function hasNotesValue(notes) {
44
44
  /**
45
45
  * THE per-question verdict for gate questions (fail-closed):
46
46
  *
47
+ * - timed_out rounds → "timeout" (host elicitation expired before the user
48
+ * answered; fail-closed — the gate stays pending — but the caller pauses
49
+ * instead of re-asking into the same timeout loop, #852).
47
50
  * - cancelled rounds → "cancelled".
48
51
  * - the confirmation option (structural match) → "verified".
49
52
  * - any other real selection → "declined".
50
53
  * - empty/missing selection → "waiting" — an empty answer is NEVER an answer,
51
54
  * so notes can never satisfy a gate either.
55
+ *
56
+ * `timed_out` is checked first: the handler marks a timed-out round with both
57
+ * `cancelled: true` and `timed_out: true` (see
58
+ * `askUserQuestionsHandler`), so the timeout must win to avoid the cancelled
59
+ * branch's re-ask semantics.
52
60
  */
53
61
  export function evaluateGateAnswer(question, details) {
62
+ if (details.timed_out)
63
+ return "timeout";
54
64
  if (details.cancelled)
55
65
  return "cancelled";
56
66
  const questionId = typeof question.id === "string" ? question.id : "";
@@ -12,8 +12,10 @@ import { loadFile } from "./files.js";
12
12
  import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
13
13
  import { resolveMilestoneFile } from "./paths.js";
14
14
  import { getAutoDashboardData } from "./auto.js";
15
+ import { getAutoRuntimeSnapshot } from "./auto-runtime-state.js";
15
16
  import { getLedger, getProjectTotals, aggregateByPhase, aggregateBySlice, aggregateByModel, aggregateCacheHitRate, formatCost, formatTokenCount, formatCostProjection, getPromptSizeStats, } from "./metrics.js";
16
17
  import { loadEffectiveGSDPreferences } from "./preferences.js";
18
+ import { countPendingCaptures } from "./captures.js";
17
19
  import { getActiveWorktreeName } from "./worktree-session-state.js";
18
20
  import { getWorkerBatches, hasActiveWorkers } from "../subagent/worker-registry.js";
19
21
  import { formatDuration, padRight, joinColumns, centerLine, fitColumns, STATUS_GLYPH, STATUS_COLOR } from "../shared/mod.js";
@@ -102,20 +104,54 @@ export class GSDDashboardOverlay {
102
104
  currentUnit,
103
105
  ].join("|");
104
106
  }
107
+ refreshVolatileDashboardData(snapshot = getAutoRuntimeSnapshot()) {
108
+ let pendingCaptureCount = this.dashData.pendingCaptureCount;
109
+ try {
110
+ if (snapshot.basePath) {
111
+ pendingCaptureCount = countPendingCaptures(snapshot.basePath);
112
+ }
113
+ }
114
+ catch {
115
+ // Non-fatal — keep last known value
116
+ }
117
+ this.dashData = {
118
+ ...this.dashData,
119
+ active: snapshot.active,
120
+ paused: snapshot.paused,
121
+ currentUnit: snapshot.currentUnit
122
+ ? {
123
+ type: snapshot.currentUnit.type,
124
+ id: snapshot.currentUnit.id,
125
+ startedAt: snapshot.currentUnit.startedAt,
126
+ }
127
+ : null,
128
+ basePath: snapshot.basePath,
129
+ elapsed: snapshot.active || snapshot.paused
130
+ ? (this.dashData.startTime > 0 ? Date.now() - this.dashData.startTime : 0)
131
+ : 0,
132
+ toolSurface: snapshot.toolSurface,
133
+ pendingCaptureCount,
134
+ };
135
+ }
105
136
  async refreshDashboard(initial = false) {
106
137
  if (this.disposed)
107
138
  return;
108
- this.dashData = getAutoDashboardData();
109
- const nextIdentity = this.computeDashboardIdentity(this.dashData);
139
+ const runtimeSnapshot = getAutoRuntimeSnapshot();
140
+ const nextIdentity = this.computeDashboardIdentity(runtimeSnapshot);
110
141
  const identityChanged = initial || nextIdentity !== this.loadedDashboardIdentity;
111
142
  if (identityChanged) {
143
+ this.dashData = getAutoDashboardData();
144
+ const loadedIdentity = this.computeDashboardIdentity(this.dashData);
112
145
  const loaded = await this.loadData();
113
146
  if (this.disposed)
114
147
  return;
115
148
  if (loaded) {
116
- this.loadedDashboardIdentity = nextIdentity;
149
+ this.loadedDashboardIdentity = loadedIdentity;
117
150
  }
118
151
  }
152
+ else {
153
+ this.refreshVolatileDashboardData(runtimeSnapshot);
154
+ }
119
155
  if (initial) {
120
156
  this.loading = false;
121
157
  }
@@ -615,6 +615,33 @@ export function closeDatabase() {
615
615
  // failed open doesn't persist into the next open attempt or status check.
616
616
  _dbOpenState.reset();
617
617
  }
618
+ /**
619
+ * Open an isolated database connection that does NOT touch the process-wide
620
+ * `currentDb` singleton. Intended for background observers (e.g. the parallel
621
+ * monitor overlay) that must read a database without displacing an active
622
+ * workflow session connection.
623
+ *
624
+ * The caller MUST call `adapter.close()` when done. Schema migrations are NOT
625
+ * run — the database must already exist and be fully migrated by the primary
626
+ * connection. Returns null if the connection cannot be opened.
627
+ */
628
+ export function openIsolatedDatabase(path) {
629
+ try {
630
+ const rawDb = providerLoader.openRaw(path);
631
+ if (!rawDb)
632
+ return null;
633
+ const adapter = createDbAdapter(rawDb);
634
+ // Minimal pragmas for a short-lived read-only observer connection.
635
+ // WAL mode is already set file-wide by the primary connection; repeating
636
+ // it here is a no-op on an existing WAL file and safe to issue.
637
+ adapter.exec("PRAGMA journal_mode=WAL");
638
+ adapter.exec("PRAGMA busy_timeout = 5000");
639
+ return adapter;
640
+ }
641
+ catch {
642
+ return null;
643
+ }
644
+ }
618
645
  /**
619
646
  * Re-open the active database connection from disk.
620
647
  *
@@ -218,6 +218,46 @@ export function getMilestoneSlices(milestoneId) {
218
218
  const rows = getDbOrNull().prepare("SELECT * FROM slices WHERE milestone_id = :mid ORDER BY sequence, id").all({ ":mid": milestoneId });
219
219
  return rows.map(rowToSlice);
220
220
  }
221
+ export function getParallelMonitorSliceProgress(milestoneId) {
222
+ const db = getDbOrNull();
223
+ if (!db)
224
+ return [];
225
+ const rows = db.prepare(`SELECT
226
+ s.id AS id,
227
+ s.status AS status,
228
+ COUNT(t.id) AS total,
229
+ COALESCE(SUM(CASE WHEN t.status='complete' THEN 1 ELSE 0 END), 0) AS done
230
+ FROM slices s
231
+ LEFT JOIN tasks t ON s.milestone_id=t.milestone_id AND s.id=t.slice_id
232
+ WHERE s.milestone_id=:mid
233
+ GROUP BY s.id
234
+ ORDER BY s.id`).all({ ":mid": milestoneId });
235
+ return rows.map((row) => ({
236
+ id: String(row["id"] ?? ""),
237
+ status: String(row["status"] ?? ""),
238
+ total: Number(row["total"] ?? 0),
239
+ done: Number(row["done"] ?? 0),
240
+ }));
241
+ }
242
+ export function getParallelMonitorRecentCompletions(milestoneId, limit = 5) {
243
+ const db = getDbOrNull();
244
+ if (!db)
245
+ return [];
246
+ const numericLimit = Number.isFinite(limit) ? Math.floor(limit) : 5;
247
+ const safeLimit = Math.max(1, Math.min(50, numericLimit));
248
+ const rows = db.prepare(`SELECT id, slice_id, one_liner
249
+ FROM tasks
250
+ WHERE milestone_id=:mid
251
+ AND status='complete'
252
+ AND completed_at IS NOT NULL
253
+ ORDER BY completed_at DESC
254
+ LIMIT ${safeLimit}`).all({ ":mid": milestoneId });
255
+ return rows.map((row) => ({
256
+ taskId: String(row["id"] ?? ""),
257
+ sliceId: String(row["slice_id"] ?? ""),
258
+ oneLiner: String(row["one_liner"] ?? ""),
259
+ }));
260
+ }
221
261
  /**
222
262
  * Load slices for many milestones in a single query. Returns a Map keyed by
223
263
  * milestone_id, preserving `ORDER BY sequence, id` within each bucket.
@@ -281,6 +321,20 @@ export function getArtifact(path) {
281
321
  return null;
282
322
  return rowToArtifact(row);
283
323
  }
324
+ /** Milestone-level artifacts (CONTEXT, RESEARCH, VALIDATION, etc.) from the artifacts table. */
325
+ export function getMilestoneScopedArtifacts(milestoneId) {
326
+ if (!getDbOrNull())
327
+ return [];
328
+ const rows = getDbOrNull().prepare("SELECT * FROM artifacts WHERE milestone_id = :mid AND slice_id IS NULL AND task_id IS NULL ORDER BY path").all({ ":mid": milestoneId });
329
+ return rows.map(rowToArtifact);
330
+ }
331
+ /** Slice-level artifacts (CONTEXT, RESEARCH, CONTINUE, etc.) from the artifacts table. */
332
+ export function getSliceScopedArtifacts(milestoneId, sliceId) {
333
+ if (!getDbOrNull())
334
+ return [];
335
+ const rows = getDbOrNull().prepare("SELECT * FROM artifacts WHERE milestone_id = :mid AND slice_id = :sid AND task_id IS NULL ORDER BY path").all({ ":mid": milestoneId, ":sid": sliceId });
336
+ return rows.map(rowToArtifact);
337
+ }
284
338
  /** Fast milestone status check — avoids deserializing JSON planning fields. */
285
339
  export function getActiveMilestoneIdFromDb() {
286
340
  if (!getDbOrNull())
@@ -387,10 +387,31 @@ export function getRecentUnitKeysForWorker(workerId, limit = 20) {
387
387
  // Reverse so callers consume oldest-first (sliding-window semantics).
388
388
  return rows.reverse().map((r) => ({ key: r.unit_id }));
389
389
  }
390
- export function getRecentUnitKeysForProjectRoot(projectRootRealpath, limit = 20) {
390
+ export function getRecentUnitKeysForProjectRoot(projectRootRealpath, limit = 20, traceId) {
391
391
  if (!isDbAvailable())
392
392
  return [];
393
393
  const db = _getAdapter();
394
+ // When a trace_id is provided, scope the window to the current session so
395
+ // stale finalize-retry entries from PREVIOUS sessions don't fire detectStuck
396
+ // Rule 1 on the first iteration of a new session — killing auto-mode before
397
+ // any new dispatch runs. Without this, a project that had two consecutive
398
+ // finalize-retry failures in a prior session is permanently stuck: every
399
+ // fresh session loads those stale errors and immediately declares stuck.
400
+ if (traceId) {
401
+ const rows = db.prepare(`SELECT ud.unit_type, ud.unit_id
402
+ FROM unit_dispatches ud
403
+ INNER JOIN workers w ON w.worker_id = ud.worker_id
404
+ WHERE w.project_root_realpath = :project_root_realpath
405
+ AND w.status != 'crashed'
406
+ AND ud.trace_id = :trace_id
407
+ ORDER BY ud.started_at DESC, ud.id DESC
408
+ LIMIT :limit`).all({
409
+ ":project_root_realpath": projectRootRealpath,
410
+ ":trace_id": traceId,
411
+ ":limit": limit,
412
+ });
413
+ return rows.reverse().map((r) => ({ key: `${r.unit_type}/${r.unit_id}` }));
414
+ }
394
415
  const rows = db.prepare(`SELECT ud.unit_type, ud.unit_id
395
416
  FROM unit_dispatches ud
396
417
  INNER JOIN workers w ON w.worker_id = ud.worker_id
@@ -10,6 +10,24 @@ import { createHash } from "node:crypto";
10
10
  import { logError, logWarning } from "../../workflow-logger.js";
11
11
  import { getDbOrNull, openDatabase } from "../engine.js";
12
12
  import { TERMINAL_STATUS_SQL } from "../sql-constants.js";
13
+ /**
14
+ * Optional override for the project-root DB open inside reconcileWorktreeDb.
15
+ * Production leaves this null so the real engine.openDatabase runs; tests
16
+ * inject a function returning false to deterministically exercise the
17
+ * cannot-open-main-DB branch (reconcile.ts:82), which is otherwise unreachable
18
+ * without a contrived provider/OS fault (openDatabase rethrows on real failures
19
+ * rather than returning false across providers).
20
+ * @internal
21
+ */
22
+ let _mainDbOpenerFn = null;
23
+ export function _setMainDbOpenerFnForTests(fn) {
24
+ const previous = _mainDbOpenerFn;
25
+ _mainDbOpenerFn = fn;
26
+ return () => { _mainDbOpenerFn = previous; };
27
+ }
28
+ function openMainDb(mainDbPath) {
29
+ return _mainDbOpenerFn ? _mainDbOpenerFn(mainDbPath) : openDatabase(mainDbPath);
30
+ }
13
31
  export function copyWorktreeDb(srcDbPath, destDbPath) {
14
32
  try {
15
33
  if (!existsSync(srcDbPath))
@@ -61,7 +79,7 @@ export function reconcileWorktreeDb(mainDbPath, worktreeDbPath) {
61
79
  return zero;
62
80
  }
63
81
  if (!getDbOrNull()) {
64
- const opened = openDatabase(mainDbPath);
82
+ const opened = openMainDb(mainDbPath);
65
83
  if (!opened) {
66
84
  logError("db", "worktree DB reconciliation failed: cannot open main DB");
67
85
  return zero;
@@ -2,7 +2,7 @@
2
2
  // File Purpose: Workspace-facing Interface for opening and maintaining the workflow database.
3
3
  import { existsSync } from "node:fs";
4
4
  import { dirname } from "node:path";
5
- import { backupDatabaseSnapshot, checkpointDatabase, closeAllDatabases, closeDatabase, closeDatabaseByWorkspace, getDbPath, getDbStatus, getDbProvider, isDbAvailable, openDatabase, openDatabaseByScope, openDatabaseByWorkspace, refreshOpenDatabaseFromDisk, vacuumDatabase, wasDbOpenAttempted, } from "./gsd-db.js";
5
+ import { backupDatabaseSnapshot, checkpointDatabase, closeAllDatabases, closeDatabase, closeDatabaseByWorkspace, getDbPath, getDbStatus, getDbProvider, isDbAvailable, openDatabase, openDatabaseByScope, openDatabaseByWorkspace, openIsolatedDatabase, refreshOpenDatabaseFromDisk, vacuumDatabase, wasDbOpenAttempted, } from "./gsd-db.js";
6
6
  import { resolveGsdPathContract } from "./paths.js";
7
7
  import { setLogBasePath } from "./workflow-logger.js";
8
8
  export function resolveWorkflowDatabaseLocation(basePath) {
@@ -59,6 +59,18 @@ export function openExistingWorkflowDatabase(basePath) {
59
59
  export function openWorkflowDatabasePath(path) {
60
60
  return openDatabase(path);
61
61
  }
62
+ /**
63
+ * Open an isolated database connection for read-only observation without
64
+ * displacing the active workflow session's global DB handle. The caller is
65
+ * responsible for calling `adapter.close()` when done.
66
+ *
67
+ * Use this for background observers (e.g. the parallel monitor overlay) that
68
+ * need to query a database on a 5s tick without interfering with the primary
69
+ * connection. Returns null if the connection cannot be opened.
70
+ */
71
+ export function openWorkflowDatabaseIsolated(path) {
72
+ return openIsolatedDatabase(path);
73
+ }
62
74
  export function openWorkflowDatabaseByWorkspace(workspace) {
63
75
  return openDatabaseByWorkspace(workspace);
64
76
  }
@@ -6,7 +6,7 @@ import { startAutoDetached } from "./auto.js";
6
6
  import { extractDepthVerificationMilestoneId, getPendingGate } from "./bootstrap/write-gate.js";
7
7
  import { getMilestone, insertMilestone, isDbAvailable } from "./gsd-db.js";
8
8
  import { assessMilestoneHandoffReadiness, formatAcceptedDiscussHandoffMessage, } from "./milestone-readiness.js";
9
- import { gsdRoot, resolveGsdRootFile, resolveMilestoneFile } from "./paths.js";
9
+ import { clearPathCache, gsdRoot, resolveGsdRootFile, resolveMilestoneFile } from "./paths.js";
10
10
  import { _getPendingAutoStart, deletePendingAutoStart } from "./pending-auto-start.js";
11
11
  import { logWarning } from "./workflow-logger.js";
12
12
  import { readManifest } from "./workflow-manifest.js";
@@ -186,14 +186,18 @@ function cleanupAcceptedHandoffArtifacts(entry) {
186
186
  }
187
187
  /** Called from agent_end to check if auto-mode should start after discuss. */
188
188
  export function checkAutoStartAfterDiscuss(lookupBasePath) {
189
+ // Clear the path cache so layout-aware resolution sees fresh directory
190
+ // listings — the cache may have been primed before discuss wrote its
191
+ // artifacts (e.g. CONTEXT.md), causing resolveMilestoneFile to miss them.
192
+ clearPathCache();
189
193
  const entry = _getPendingAutoStart(lookupBasePath);
190
194
  if (!entry)
191
195
  return false;
192
196
  const { ctx, pi, basePath, milestoneId, step } = entry;
193
- const contextFilePath = entry.scope.contextFile();
194
- const roadmapFilePath = entry.scope.roadmapFile();
195
- const contextFile = existsSync(contextFilePath) ? contextFilePath : null;
196
- const roadmapFile = existsSync(roadmapFilePath) ? roadmapFilePath : null;
197
+ // Use layout-aware resolution so flat-phase projects (phases/NN-slug/)
198
+ // are found as well as legacy projects (milestones/MID/).
199
+ const contextFile = resolveMilestoneFile(basePath, milestoneId, "CONTEXT");
200
+ const roadmapFile = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
197
201
  if (!contextFile && !roadmapFile)
198
202
  return false;
199
203
  if (hasBlockingDepthGate(entry))
@@ -6,13 +6,14 @@ import { loadFile } from "./files.js";
6
6
  import { resolveMilestoneFile } from "./paths.js";
7
7
  import { isCompletedMilestoneTerminal } from "./milestone-closeout.js";
8
8
  import { deriveState } from "./state.js";
9
+ import { isClosedStatus } from "./status-guards.js";
9
10
  import { allWorktreesDirs, createWorktree, listWorktrees, resolveGitDir } from "./worktree-manager.js";
10
11
  import { abortAndReset } from "./git-self-heal.js";
11
12
  import { RUNTIME_EXCLUSION_PATHS, resolveMilestoneIntegrationBranch, writeIntegrationBranch } from "./git-service.js";
12
13
  import { nativeIsRepo, nativeWorktreeList, nativeWorktreeRemove, nativeBranchList, nativeBranchDelete, nativeLsFiles, nativeRmCached, nativeHasChanges, nativeLastCommitEpoch, nativeGetCurrentBranch, nativeAddTracked, nativeCommit } from "./native-git-bridge.js";
13
14
  import { getAllWorktreeHealth } from "./worktree-health.js";
14
15
  import { loadEffectiveGSDPreferences } from "./preferences.js";
15
- import { listUnmergedGitPaths } from "./git-conflict-state.js";
16
+ import { listUnmergedGitPaths, probeGitConflictState, reconcileGitConflictsOnSignal } from "./git-conflict-state.js";
16
17
  import { resolveWorktreeProjectRoot } from "./worktree-root.js";
17
18
  /**
18
19
  * Returns true if the directory contains only doctor artifacts
@@ -140,13 +141,13 @@ function getSnapshotDiffCheckFailure(basePath) {
140
141
  }
141
142
  return failures.length > 0 ? failures.join("\n") : null;
142
143
  }
143
- export async function checkGitHealth(basePath, issues, fixesApplied, shouldFix, isolationMode = "none") {
144
+ export async function checkGitHealth(basePath, issues, fixesApplied, shouldFix, isolationMode = "none", dryRun = false) {
144
145
  // Degrade gracefully if not a git repo
145
146
  if (!nativeIsRepo(basePath)) {
146
147
  return; // Not a git repo — skip all git health checks
147
148
  }
148
149
  const gitDir = resolveGitDir(basePath);
149
- const unmergedPaths = listUnmergedGitPaths(basePath);
150
+ let unmergedPaths = listUnmergedGitPaths(basePath);
150
151
  if (unmergedPaths === null) {
151
152
  issues.push({
152
153
  severity: "error",
@@ -158,6 +159,28 @@ export async function checkGitHealth(basePath, issues, fixesApplied, shouldFix,
158
159
  });
159
160
  return;
160
161
  }
162
+ // ── Auto-resolve safe conflicts before reporting ──────────────────────
163
+ // A failed worktree merge (e.g. during complete-slice) can leave conflict
164
+ // markers for paths that are always safe to accept from the milestone side
165
+ // (.gsd/ state and build artifacts). Run the same reconciliation the
166
+ // preflight/auto-worktree paths use before the doctor hard-blocks auto-mode,
167
+ // so only genuinely-manual conflicts remain. This also clears stale
168
+ // merge-state markers (e.g. MERGE_HEAD) in the same pass when auto-resolve
169
+ // empties the unmerged set (#849).
170
+ if (unmergedPaths.length > 0 && !dryRun) {
171
+ try {
172
+ const reconcileFixes = reconcileGitConflictsOnSignal(basePath, probeGitConflictState(basePath));
173
+ if (reconcileFixes.length > 0) {
174
+ fixesApplied.push(...reconcileFixes);
175
+ const refreshed = listUnmergedGitPaths(basePath);
176
+ if (refreshed !== null)
177
+ unmergedPaths = refreshed;
178
+ }
179
+ }
180
+ catch {
181
+ // Non-fatal — fall through to report the unmerged paths as-is
182
+ }
183
+ }
161
184
  // ── Orphaned auto-worktrees & Stale milestone branches ────────────────
162
185
  // These checks only apply in worktree/branch modes — skip in none mode
163
186
  // where no milestone worktrees or branches are created.
@@ -174,7 +197,7 @@ export async function checkGitHealth(basePath, issues, fixesApplied, shouldFix,
174
197
  const milestoneId = wt.branch.replace(/^milestone\//, "");
175
198
  const milestoneEntry = state.registry.find(m => m.id === milestoneId);
176
199
  const isComplete = milestoneEntry
177
- ? await isCompletedMilestoneTerminal(basePath, milestoneId)
200
+ ? isClosedStatus(milestoneEntry.status)
178
201
  : false;
179
202
  if (!isComplete && !hasProjectContentOnDisk(wt.path) && hasProjectContentOnDisk(basePath)) {
180
203
  issues.push({
@@ -269,6 +292,9 @@ export async function checkGitHealth(basePath, issues, fixesApplied, shouldFix,
269
292
  const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
270
293
  if (!roadmapContent)
271
294
  continue;
295
+ const milestoneEntry = state.registry.find(m => m.id === milestoneId);
296
+ if (!milestoneEntry || !isClosedStatus(milestoneEntry.status))
297
+ continue;
272
298
  branchMilestoneComplete = await isCompletedMilestoneTerminal(basePath, milestoneId);
273
299
  if (branchMilestoneComplete) {
274
300
  issues.push({
@@ -35,7 +35,7 @@ const CLI_AUTH_PROVIDERS = new Set([
35
35
  const PROVIDER_ROUTES = {
36
36
  anthropic: ["github-copilot", "claude-code"],
37
37
  openai: ["github-copilot", "openai-codex"],
38
- google: ["google-gemini-cli"],
38
+ google: ["google-antigravity", "google-gemini-cli"],
39
39
  };
40
40
  // ── Model → Provider ID mapping ───────────────────────────────────────────────
41
41
  /**
@@ -10,25 +10,12 @@ import { getActiveAutoWorkers } from "./db/auto-workers.js";
10
10
  import { normalizeRealPath } from "./paths.js";
11
11
  import { ensureGitignore, isGsdGitignored } from "./gitignore.js";
12
12
  import { readAllSessionStatuses, isSessionStale, removeSessionStatus } from "./session-status-io.js";
13
- import { recoverFailedMigration } from "./migrate-external.js";
13
+ import { isCurrentGsdStateIntactForMigratingCleanup, recoverFailedMigration } from "./migrate-external.js";
14
14
  import { splitCompletedKey } from "./forensics.js";
15
15
  import { findMilestoneIds } from "./milestone-ids.js";
16
16
  import { getAllMilestones, isDbAvailable } from "./gsd-db.js";
17
17
  import { loadEffectiveGSDPreferences } from "./preferences.js";
18
18
  const MAX_UAT_ATTEMPTS = 3;
19
- function isCurrentGsdStateIntactForMigratingCleanup(basePath) {
20
- try {
21
- const stateFile = resolveGsdRootFile(basePath, "STATE");
22
- const milestonesPath = milestonesDir(basePath);
23
- const dbPath = join(gsdRoot(basePath), "gsd.db");
24
- const hasDbFile = existsSync(dbPath);
25
- const hasNonEmptyDb = hasDbFile && statSync(dbPath).size > 0;
26
- return existsSync(stateFile) && existsSync(milestonesPath) && hasNonEmptyDb;
27
- }
28
- catch {
29
- return false;
30
- }
31
- }
32
19
  function hasAssessmentVerdict(basePath, mid, sid) {
33
20
  const assessmentPath = join(gsdRoot(basePath), "milestones", mid, "slices", sid, `${sid}-ASSESSMENT.md`);
34
21
  if (!existsSync(assessmentPath))
@@ -53,19 +40,21 @@ export async function checkRuntimeHealth(basePath, issues, fixesApplied, shouldF
53
40
  if (lock) {
54
41
  const alive = isLockProcessAlive(lock);
55
42
  if (!alive) {
56
- issues.push({
57
- severity: "error",
58
- code: "stale_crash_lock",
59
- scope: "project",
60
- unitId: "project",
61
- message: `Stale auto-mode worker (PID ${lock.pid}, started ${lock.startedAt}, was executing ${lock.unitType} ${lock.unitId}) — process is no longer running`,
62
- file: "<workers table>",
63
- fixable: true,
64
- });
65
43
  if (shouldFix("stale_crash_lock")) {
66
44
  clearStaleWorkerLock(basePath);
67
45
  fixesApplied.push("cleared stale auto-mode worker state");
68
46
  }
47
+ else {
48
+ issues.push({
49
+ severity: "error",
50
+ code: "stale_crash_lock",
51
+ scope: "project",
52
+ unitId: "project",
53
+ message: `Stale auto-mode worker (PID ${lock.pid}, started ${lock.startedAt}, was executing ${lock.unitType} ${lock.unitId}) — process is no longer running`,
54
+ file: "<workers table>",
55
+ fixable: true,
56
+ });
57
+ }
69
58
  }
70
59
  }
71
60
  }
@@ -440,7 +429,7 @@ export async function checkRuntimeHealth(basePath, issues, fixesApplied, shouldF
440
429
  });
441
430
  if (shouldFix("failed_migration")) {
442
431
  if (recoverFailedMigration(basePath)) {
443
- fixesApplied.push("recovered failed migration (.gsd.migrating → .gsd)");
432
+ fixesApplied.push("recovered failed external state migration");
444
433
  }
445
434
  else if (isCurrentGsdStateIntactForMigratingCleanup(basePath)) {
446
435
  try {
@@ -4,7 +4,8 @@ import { loadFile, parseSummary, saveFile, parseTaskPlanMustHaves, countMustHave
4
4
  import { parseRoadmap as parseLegacyRoadmap, parsePlan as parseLegacyPlan } from "./parsers-legacy.js";
5
5
  import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
6
6
  import { openExistingWorkflowDatabase } from "./db-workspace.js";
7
- import { resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTasksDir, milestonesDir, gsdRoot, relMilestoneFile, relSliceFile, relTaskFile, relSlicePath, relGsdRootFile, resolveGsdRootFile, relMilestonePath } from "./paths.js";
7
+ import { resolveMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveSlicePath, resolveTaskFile, resolveTasksDir, milestonesDir, legacyMilestonesDir, gsdRoot, relMilestoneFile, relSliceFile, relTaskFile, relSlicePath, relGsdRootFile, resolveGsdRootFile, relMilestonePath } from "./paths.js";
8
+ import { findMilestoneIds } from "./milestone-ids.js";
8
9
  import { deriveState, isMilestoneComplete } from "./state.js";
9
10
  import { invalidateAllCaches } from "./cache.js";
10
11
  import { loadEffectiveGSDPreferences } from "./preferences.js";
@@ -171,7 +172,8 @@ export async function selectDoctorScope(basePath, requestedScope) {
171
172
  return state.activeMilestone.id;
172
173
  }
173
174
  const milestonesPath = milestonesDir(basePath);
174
- if (!existsSync(milestonesPath))
175
+ const legacyMilestonesPath = legacyMilestonesDir(basePath);
176
+ if (!existsSync(milestonesPath) && !existsSync(legacyMilestonesPath))
175
177
  return undefined;
176
178
  for (const milestone of state.registry) {
177
179
  const roadmapPath = resolveMilestoneFile(basePath, milestone.id, "ROADMAP");
@@ -333,7 +335,7 @@ export async function runGSDDoctor(basePath, options) {
333
335
  const isolationMode = options?.isolationMode ??
334
336
  (prefs?.preferences?.git?.isolation === "worktree" ? "worktree" :
335
337
  prefs?.preferences?.git?.isolation === "branch" ? "branch" : "none");
336
- await checkGitHealth(basePath, issues, fixesApplied, shouldFix, isolationMode);
338
+ await checkGitHealth(basePath, issues, fixesApplied, shouldFix, isolationMode, dryRun);
337
339
  const gitMs = Date.now() - t0git;
338
340
  // Runtime health checks — timed
339
341
  const t0runtime = Date.now();
@@ -352,7 +354,8 @@ export async function runGSDDoctor(basePath, options) {
352
354
  // Engine health checks — DB constraints and projection drift
353
355
  await checkEngineHealth(basePath, issues, fixesApplied);
354
356
  const milestonesPath = milestonesDir(basePath);
355
- if (!existsSync(milestonesPath)) {
357
+ const legacyMilestonesPath2 = legacyMilestonesDir(basePath);
358
+ if (!existsSync(milestonesPath) && !existsSync(legacyMilestonesPath2)) {
356
359
  const report = { ok: issues.every(i => i.severity !== "error"), basePath, issues, fixesApplied, timing: { git: gitMs, runtime: runtimeMs, environment: envMs, gsdState: 0 } };
357
360
  await appendDoctorHistory(basePath, report);
358
361
  return report;
@@ -396,7 +399,13 @@ export async function runGSDDoctor(basePath, options) {
396
399
  // Non-fatal — provider check failure should not block other checks
397
400
  }
398
401
  }
399
- for (const milestone of state.registry) {
402
+ // When DB is unavailable, state.registry is empty. Fall back to a direct
403
+ // filesystem scan so the doctor can still report issues (e.g. missing ROADMAP)
404
+ // for milestone dirs that exist on disk.
405
+ const milestoneEntries = state.registry.length > 0
406
+ ? state.registry
407
+ : findMilestoneIds(basePath).map(id => ({ id, title: id }));
408
+ for (const milestone of milestoneEntries) {
400
409
  const milestoneId = milestone.id;
401
410
  const milestonePath = resolveMilestonePath(basePath, milestoneId);
402
411
  if (!milestonePath)
@@ -433,8 +442,17 @@ export async function runGSDDoctor(basePath, options) {
433
442
  }
434
443
  const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
435
444
  const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
436
- if (!roadmapContent)
445
+ if (!roadmapContent) {
446
+ issues.push({
447
+ severity: "error",
448
+ code: "missing_roadmap",
449
+ scope: "milestone",
450
+ unitId: milestoneId,
451
+ message: `Milestone ${milestoneId} is missing its ROADMAP.md file.`,
452
+ fixable: false,
453
+ });
437
454
  continue;
455
+ }
438
456
  let slices;
439
457
  if (isDbAvailable()) {
440
458
  const dbSlices = getMilestoneSlices(milestoneId);
@@ -574,6 +592,9 @@ export async function runGSDDoctor(basePath, options) {
574
592
  // Skipped slices may legitimately never create tasks/.
575
593
  if (slice.pending || slice.skipped)
576
594
  continue;
595
+ // Flat-phase: tasks are embedded in plan files; no tasks/ subdir expected.
596
+ if (!existsSync(legacyMilestonesDir(basePath)))
597
+ continue;
577
598
  issues.push({
578
599
  severity: slice.done ? "warning" : "error",
579
600
  code: "missing_tasks_dir",
@@ -739,7 +760,7 @@ export async function runGSDDoctor(basePath, options) {
739
760
  code: "all_slices_done_missing_milestone_validation",
740
761
  scope: "milestone",
741
762
  unitId: milestoneId,
742
- message: `All slices are done but ${milestoneId}-VALIDATION.md is missing \u2014 milestone is in validating-milestone phase`,
763
+ message: `All slices are done but the milestone VALIDATION.md is missing \u2014 milestone is in validating-milestone phase`,
743
764
  file: relMilestoneFile(basePath, milestoneId, "VALIDATION"),
744
765
  fixable: false,
745
766
  });
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * @see https://github.com/open-gsd/gsd-pi/issues/2577
11
11
  */
12
- import { TOOL_SURFACE_NOT_READY } from "./tool-surface-readiness.js";
12
+ import { TOOL_SURFACE_NOT_READY, isTerminalToolSurfaceError } from "./tool-surface-readiness.js";
13
13
  export function createRetryState() {
14
14
  return { networkRetryCount: 0, consecutiveTransientCount: 0, currentRetryModelId: undefined };
15
15
  }
@@ -82,7 +82,19 @@ export function classifyError(errorMsg, retryAfterMs) {
82
82
  if (TOOL_SCHEMA_RE.test(errorMsg)) {
83
83
  return { kind: "tool-schema", retryAfterMs: 0 };
84
84
  }
85
+ // Terminal tool-surface failure: the workflow MCP server is in a
86
+ // non-self-healing status (failed / needs-auth / disabled). This is NOT
87
+ // transient — retrying the same model cannot repair a dead server, so it
88
+ // must escalate / pause rather than retrying every ~3s into the per-unit
89
+ // cost cap. Checked ahead of the transient readiness branch below, which
90
+ // shares the TOOL_SURFACE_NOT_READY prefix and would otherwise collapse the
91
+ // terminal case into a transient `network` retry. See #783.
92
+ if (isTerminalToolSurfaceError(errorMsg)) {
93
+ return { kind: "permanent" };
94
+ }
85
95
  // Tool-surface readiness abort — transient; retry the same model shortly.
96
+ // This covers the not-yet-connected variants (absent, pending, connected but
97
+ // not registered); terminal statuses were handled by the branch above.
86
98
  if (TOOL_SURFACE_NOT_READY_RE.test(errorMsg)) {
87
99
  return { kind: "network", retryAfterMs: retryAfterMs ?? 3_000 };
88
100
  }