@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
@@ -11,6 +11,7 @@
11
11
  import type {
12
12
  ExtensionContext,
13
13
  ExtensionCommandContext,
14
+ GsdProgressState,
14
15
  ReadonlyFooterDataProvider,
15
16
  Theme,
16
17
  ThemeColor,
@@ -30,7 +31,7 @@ import { execFileSync } from "node:child_process";
30
31
  import { truncateToWidth, visibleWidth } from "@gsd/pi-tui";
31
32
  import { makeUI } from "../shared/tui.js";
32
33
  import { GLYPH, INDENT } from "../shared/mod.js";
33
- import { padRightVisible, renderPanel, renderProgressBar, rightAlign, wrapVisibleText } from "./tui/render-kit.js";
34
+ import { padRightVisible, renderPlainOutcome, renderProgressBar, rightAlign, wrapVisibleText } from "./tui/render-kit.js";
34
35
  import { computeProgressScore } from "./progress-score.js";
35
36
  import {
36
37
  getGlobalGSDPreferencesPath,
@@ -754,341 +755,88 @@ export function updateProgressWidget(
754
755
  updateSliceProgressCache(accessors.getBasePath(), mid.id, slice?.id);
755
756
  }
756
757
 
757
- ctx.ui.setWidget("gsd-progress", (tui, theme) => {
758
- let spinnerIndex = 0;
759
- let cachedLines: string[] | undefined;
760
- let cachedWidth: number | undefined;
761
- let cachedRuntimeRecord: AutoUnitRuntimeRecord | null = null;
762
-
763
- const refreshRuntimeRecord = (): void => {
764
- try {
765
- cachedRuntimeRecord = readUnitRuntimeRecord(accessors.getBasePath(), unitType, unitId);
766
- } catch {
767
- cachedRuntimeRecord = null;
768
- }
769
- };
770
-
771
- refreshRuntimeRecord();
772
-
773
- const spinnerTimer = setInterval(() => {
774
- spinnerIndex = (spinnerIndex + 1) % ACTIVE_SPINNER_FRAMES.length;
775
- cachedLines = undefined;
776
- tui.requestRender();
777
- }, 200);
778
- spinnerTimer.unref?.();
779
-
780
- // Refresh progress cache from disk every 15s so the widget reflects
781
- // task/slice completion mid-unit. Without this, the progress bar only
782
- // updates at dispatch time, appearing frozen during long-running units.
783
- // 15s (vs 5s) reduces synchronous file I/O on the hot path.
784
- const progressRefreshTimer = setInterval(() => {
785
- try {
786
- if (mid) {
787
- updateSliceProgressCache(accessors.getBasePath(), mid.id, slice?.id);
788
- }
789
- refreshRuntimeRecord();
790
- cachedLines = undefined;
791
- } catch (err) { /* non-fatal */
792
- logWarning("dashboard", `DB status update failed: ${err instanceof Error ? err.message : String(err)}`);
793
- }
794
- }, 15_000);
795
- progressRefreshTimer.unref?.();
796
-
797
- return {
798
- render(width: number): string[] {
799
- if (cachedLines && cachedWidth === width) return cachedLines;
800
-
801
- // While newSession() is in-flight, session state is mid-mutation.
802
- // Accessing cmdCtx.sessionManager or cmdCtx.getContextUsage() can
803
- // block the render loop and freeze the TUI. Return the last cached
804
- // frame (or an empty frame on first render) until the switch settles.
805
- if (accessors.isSessionSwitching()) {
806
- return cachedLines ?? [];
807
- }
808
-
809
- const ui = makeUI(theme, width);
810
- const lines: string[] = [];
811
- const pad = INDENT.base;
812
-
813
- // ── Line 1: Top bar ───────────────────────────────────────────────
814
- lines.push(...ui.bar());
815
-
816
- const spinner = theme.fg("accent", ACTIVE_SPINNER_FRAMES[spinnerIndex]);
817
- const elapsed = formatAutoElapsed(accessors.getAutoStartTime());
818
- const modeTag = accessors.isStepMode() ? "NEXT" : "AUTO";
819
-
820
- // Health indicator in header
821
- const score = computeProgressScore();
822
- const runtimeSignal = formatRuntimeHealthSignal(cachedRuntimeRecord);
823
- const healthLevel = runtimeSignal?.level ?? score.level;
824
- const healthSummary = runtimeSignal?.summary ?? score.summary;
825
- const healthColor = healthLevel === "green" ? "success"
826
- : healthLevel === "yellow" ? "warning"
827
- : "error";
828
- const healthIcon = healthLevel === "green" ? GLYPH.statusActive
829
- : healthLevel === "yellow" ? "!"
830
- : "x";
831
- const activeState = runtimeSignal?.state === "waiting" ? "waiting" : "running";
832
- const stateColor = runtimeSignal?.state === "waiting" ? "warning" : "success";
833
- const healthParts: string[] = [];
834
- if (runtimeSignal?.summary) {
835
- healthParts.push(theme.fg(healthColor, healthSummary));
836
- } else if (healthLevel !== "green") {
837
- healthParts.push(`${theme.fg(healthColor, healthIcon)} ${theme.fg(healthColor, healthSummary)}`);
838
- }
839
-
840
- const headerLeft = [
841
- `${pad}${spinner} ${theme.fg("accent", theme.bold("GSD"))}`,
842
- theme.fg("success", modeTag),
843
- theme.fg(stateColor, activeState),
844
- ...healthParts,
845
- ].join(` ${theme.fg("dim", "·")} `);
846
-
847
- // ETA in header right, after elapsed
848
- const eta = estimateTimeRemaining();
849
- const etaShort = eta ? eta.replace(" remaining", " left") : null;
850
- const headerRight = elapsed
851
- ? (etaShort
852
- ? `${theme.fg("dim", elapsed)} ${theme.fg("dim", "·")} ${theme.fg("dim", etaShort)}`
853
- : theme.fg("dim", elapsed))
854
- : "";
855
- lines.push(rightAlign(headerLeft, headerRight, width));
856
-
857
- // Show health signal details when degraded (yellow/red)
858
- if (runtimeSignal?.detail && widgetMode !== "min") {
859
- lines.push(`${pad} ${theme.fg("dim", runtimeSignal.detail)}`);
860
- } else if (score.level !== "green" && score.signals.length > 0 && widgetMode !== "min") {
861
- // Show up to 3 most relevant signals in compact form
862
- const topSignals = score.signals
863
- .filter(s => s.kind === "negative")
864
- .slice(0, 3);
865
- if (topSignals.length > 0) {
866
- const signalStr = topSignals
867
- .map(s => theme.fg("dim", s.label))
868
- .join(theme.fg("dim", " · "));
869
- lines.push(`${pad} ${signalStr}`);
870
- }
871
- }
872
-
873
- // ── Mode: off — return empty ──────────────────────────────────
874
- if (widgetMode === "off") {
875
- cachedLines = [];
876
- cachedWidth = width;
877
- return [];
878
- }
879
-
880
- // ── Mode: min — header line only ──────────────────────────────
881
- if (widgetMode === "min") {
882
- lines.push(...ui.bar());
883
- cachedLines = lines;
884
- cachedWidth = width;
885
- return lines;
886
- }
887
-
888
- // ── Mode: small — dense horizontal grid ───────────────────────
889
- if (widgetMode === "small") {
890
- lines.length = 0;
891
- lines.push(...ui.bar());
892
-
893
- const roadmapSlices = mid ? getRoadmapSlicesSync() : null;
894
- const unitLabel = unitId || [mid?.id, slice?.id, task?.id].filter(Boolean).join("/");
895
- const statusParts = [
896
- spinner,
897
- theme.fg("success", modeTag),
898
- theme.fg(stateColor, activeState),
899
- ];
900
- if (runtimeSignal?.summary) {
901
- statusParts.push(theme.fg(healthColor, healthSummary));
902
- } else if (healthLevel !== "green") {
903
- statusParts.push(`${theme.fg(healthColor, healthIcon)} ${theme.fg(healthColor, healthSummary)}`);
904
- }
905
-
906
- const timeValue = [elapsed, etaShort].filter(Boolean).join(" · ") || "--";
907
- const rowOne = widgetGridColumns(theme, width, [
908
- `${widgetGridLabel(theme, "status", "border")} ${statusParts.join(" ")}`,
909
- `${widgetGridLabel(theme, "unit")} ${theme.fg("text", unitLabel || "--")}`,
910
- `${widgetGridLabel(theme, "spend", "border")} ${theme.fg("dim", formatSmallWidgetSpend())}`,
911
- `${widgetGridLabel(theme, "time")} ${theme.fg("dim", timeValue)}`,
912
- ]);
913
-
914
- const target = task
915
- ? `${task.id}: ${task.title}`
916
- : slice
917
- ? `${slice.id}: ${slice.title}`
918
- : unitId;
919
-
920
- let taskValue = task?.id ?? "--";
921
- let sliceValue = slice?.id ?? "--";
922
- if (shouldRenderRoadmapProgress(roadmapSlices)) {
923
- const { done, total, activeSliceTasks } = roadmapSlices;
924
- const barWidth = Math.max(4, Math.min(14, Math.floor(width * 0.12)));
925
- const bar = renderProgressBar(theme, done, total, barWidth);
926
- sliceValue = `${bar} ${theme.fg("text", `${done}/${total}`)}`;
927
- if (activeSliceTasks && activeSliceTasks.total > 0) {
928
- const taskNum = isHook
929
- ? Math.max(activeSliceTasks.done, 1)
930
- : Math.min(activeSliceTasks.done + 1, activeSliceTasks.total);
931
- taskValue = `${theme.fg("accent", `${taskNum}`)}${theme.fg("dim", `/${activeSliceTasks.total}`)}`;
932
- }
933
- }
758
+ installGsdProgressStrip(ctx, accessors, unitType, unitId, mid, slice, task, isHook, verb);
759
+ }
934
760
 
935
- const rowTwo = widgetGridColumns(theme, width, [
936
- `${widgetGridLabel(theme, "phase", "border")} ${theme.fg("dim", unitType)}`,
937
- `${widgetGridLabel(theme, "work")} ${theme.fg("text", target || "--")}`,
938
- `${widgetGridLabel(theme, "task", "border")} ${taskValue}`,
939
- `${widgetGridLabel(theme, "slice")} ${sliceValue}`,
940
- ]);
941
-
942
- lines.push(rowOne);
943
- lines.push(rowTwo);
944
- lines.push(...ui.bar());
945
- cachedLines = lines;
946
- cachedWidth = width;
947
- return lines;
948
- }
761
+ function buildCompletionRollupLines(
762
+ theme: Theme,
763
+ snapshot: CompletionDashboardSnapshot,
764
+ width: number,
765
+ ): { lines: string[]; footerCommands?: string } {
766
+ const innerWidth = Math.max(8, width - 2);
767
+ const lines: string[] = [];
768
+
769
+ const add = (line: string): void => {
770
+ if (!line) return;
771
+ for (const wrapped of wrapVisibleText(line, innerWidth).slice(0, 12 - lines.length)) {
772
+ lines.push(wrapped);
773
+ }
774
+ };
949
775
 
950
- // ── Mode: full — complete two-column layout ───────────────────
951
- lines.push("");
776
+ if (snapshot.milestoneTitle) {
777
+ add(theme.fg("text", snapshot.milestoneTitle));
778
+ }
952
779
 
953
- // Context section: milestone + slice. Footer owns model/cost/context.
954
- const hasContext = !!(mid || (slice && unitType !== "research-milestone" && unitType !== "plan-milestone"));
955
- if (mid) {
956
- lines.push(truncateToWidth(`${pad}${theme.fg("dim", mid.title)}`, width, "…"));
957
- }
958
- if (slice && unitType !== "research-milestone" && unitType !== "plan-milestone") {
959
- lines.push(truncateToWidth(
960
- `${pad}${theme.fg("text", theme.bold(`${slice.id}: ${slice.title}`))}`,
961
- width, "…",
962
- ));
963
- }
964
- if (hasContext) lines.push("");
965
-
966
- const target = task ? `${task.id}: ${task.title}` : unitId;
967
- const actionLeft = `${pad}${theme.fg("accent", "▸")} ${theme.fg("accent", verb)} ${theme.fg("text", target)}`;
968
- const tierTag = tierBadge ? theme.fg("dim", `[${tierBadge}] `) : "";
969
- const phaseBadge = `${tierTag}${theme.fg("dim", phaseLabel)}`;
970
- lines.push(rightAlign(actionLeft, phaseBadge, width));
971
-
972
- lines.push("");
973
-
974
- // Two-column body
975
- const minTwoColWidth = 76;
976
- const roadmapSlices = mid ? getRoadmapSlicesSync() : null;
977
- const taskDetailsCol = roadmapSlices?.taskDetails ?? null;
978
- const useTwoCol = width >= minTwoColWidth && taskDetailsCol !== null && taskDetailsCol.length > 0;
979
- const leftColWidth = useTwoCol
980
- ? Math.floor(width * (width >= 100 ? 0.45 : 0.50))
981
- : width;
982
-
983
- const leftLines: string[] = [];
984
-
985
- if (shouldRenderRoadmapProgress(roadmapSlices)) {
986
- const { done, total, activeSliceTasks } = roadmapSlices;
987
- const barWidth = Math.max(6, Math.min(18, Math.floor(leftColWidth * 0.4)));
988
- const bar = renderProgressBar(theme, done, total, barWidth);
989
-
990
- let meta = `${theme.fg("text", `${done}`)}${theme.fg("dim", `/${total} slices`)}`;
991
- if (activeSliceTasks && activeSliceTasks.total > 0) {
992
- const taskNum = isHook
993
- ? Math.max(activeSliceTasks.done, 1)
994
- : Math.min(activeSliceTasks.done + 1, activeSliceTasks.total);
995
- meta += `${theme.fg("dim", " · task ")}${theme.fg("accent", `${taskNum}`)}${theme.fg("dim", `/${activeSliceTasks.total}`)}`;
996
- }
997
- leftLines.push(`${pad}${bar} ${meta}`);
998
- }
780
+ const oneLiner = normalizeRollupText(snapshot.oneLiner);
781
+ if (oneLiner) {
782
+ add(`${theme.fg("accent", "Outcome")} ${theme.fg("text", oneLiner)}`);
783
+ }
999
784
 
1000
- // Build right column: task checklist
1001
- const rightLines: string[] = [];
1002
- const maxVisibleTasks = 8;
785
+ const changed = [
786
+ ...(snapshot.successCriteriaResults ? [snapshot.successCriteriaResults] : []),
787
+ ...(snapshot.requirementOutcomes ? [snapshot.requirementOutcomes] : []),
788
+ ...(snapshot.keyDecisions ?? []),
789
+ ].map(normalizeRollupText).filter((v): v is string => !!v).slice(0, 4);
790
+ if (changed.length > 0) {
791
+ add(theme.fg("accent", "What changed"));
792
+ for (const item of changed) add(` - ${theme.fg("text", item)}`);
793
+ }
1003
794
 
1004
- // Max visible chars for task title text (before ANSI theming)
1005
- const maxTaskTitleLen = 45;
1006
- function truncTitle(s: string): string {
1007
- return s.length > maxTaskTitleLen ? s.slice(0, maxTaskTitleLen - 1) + "…" : s;
1008
- }
795
+ const verification = [
796
+ snapshot.definitionOfDoneResults,
797
+ snapshot.deviations ? `Deviations: ${snapshot.deviations}` : null,
798
+ snapshot.followUps ? `Follow-ups: ${snapshot.followUps}` : null,
799
+ ].map(normalizeRollupText).filter((v): v is string => !!v);
800
+ if (verification.length > 0 || (snapshot.keyFiles?.length ?? 0) > 0) {
801
+ add(theme.fg("accent", "Verification"));
802
+ for (const item of verification.slice(0, 3)) add(` - ${theme.fg("text", item)}`);
803
+ const files = (snapshot.keyFiles ?? []).map(normalizeRollupText).filter((v): v is string => !!v).slice(0, 4);
804
+ if (files.length > 0) {
805
+ add(` ${theme.fg("accent", "Files:")} ${theme.fg("text", files.join("; "))}`);
806
+ }
807
+ }
1009
808
 
1010
- function formatTaskLine(t: { id: string; title: string; done: boolean }, isCurrent: boolean): string {
1011
- const glyph = t.done
1012
- ? theme.fg("success", "*")
1013
- : isCurrent
1014
- ? theme.fg("accent", ">")
1015
- : theme.fg("dim", ".");
1016
- const id = isCurrent
1017
- ? theme.fg("accent", t.id)
1018
- : t.done
1019
- ? theme.fg("muted", t.id)
1020
- : theme.fg("dim", t.id);
1021
- const short = truncTitle(t.title);
1022
- const title = isCurrent
1023
- ? theme.fg("text", short)
1024
- : t.done
1025
- ? theme.fg("muted", short)
1026
- : theme.fg("text", short);
1027
- return `${glyph} ${id}: ${title}`;
1028
- }
809
+ const lessons = (snapshot.lessonsLearned ?? []).map(normalizeRollupText).filter((v): v is string => !!v).slice(0, 2);
810
+ if (lessons.length > 0) {
811
+ add(`${theme.fg("accent", "Lessons:")} ${theme.fg("text", lessons.join("; "))}`);
812
+ }
1029
813
 
1030
- if (useTwoCol && taskDetailsCol) {
1031
- for (const t of taskDetailsCol.slice(0, maxVisibleTasks)) {
1032
- rightLines.push(formatTaskLine(t, !!(task && t.id === task.id)));
1033
- }
1034
- if (taskDetailsCol.length > maxVisibleTasks) {
1035
- rightLines.push(theme.fg("dim", ` +${taskDetailsCol.length - maxVisibleTasks} more`));
1036
- }
1037
- } else if (!useTwoCol && taskDetailsCol && taskDetailsCol.length > 0) {
1038
- for (const t of taskDetailsCol.slice(0, maxVisibleTasks)) {
1039
- leftLines.push(`${pad}${formatTaskLine(t, !!(task && t.id === task.id))}`);
1040
- }
1041
- }
814
+ const nextAction = snapshot.allMilestonesComplete
815
+ ? snapshot.unmappedActiveRequirements && snapshot.unmappedActiveRequirements > 0
816
+ ? `Review ${snapshot.unmappedActiveRequirements} unmapped active requirement${snapshot.unmappedActiveRequirements === 1 ? "" : "s"}, then start a new milestone when ready.`
817
+ : "Review the roll-up, then start a new milestone when ready."
818
+ : "Review the roll-up, inspect status, or continue to the next milestone.";
819
+ add(`${theme.fg("success", "Next")} ${theme.fg("text", nextAction)}`);
820
+
821
+ if ((snapshot.requirementsBacklogPreview?.length ?? 0) > 0) {
822
+ add(theme.fg("accent", "Requirements backlog"));
823
+ for (const line of snapshot.requirementsBacklogPreview ?? []) {
824
+ add(` ${theme.fg("text", line)}`);
825
+ }
826
+ }
1042
827
 
1043
- // Compose columns
1044
- if (useTwoCol) {
1045
- const maxRows = Math.max(leftLines.length, rightLines.length);
1046
- if (maxRows > 0) {
1047
- lines.push("");
1048
- for (let i = 0; i < maxRows; i++) {
1049
- const left = padRightVisible(truncateToWidth(leftLines[i] ?? "", leftColWidth, "…"), leftColWidth);
1050
- const right = rightLines[i] ?? "";
1051
- lines.push(`${left}${right}`);
1052
- }
1053
- }
1054
- } else {
1055
- if (leftLines.length > 0) {
1056
- lines.push("");
1057
- for (const l of leftLines) lines.push(truncateToWidth(l, width, "…"));
1058
- }
1059
- }
828
+ const commands = snapshot.allMilestonesComplete
829
+ ? snapshot.unmappedActiveRequirements && snapshot.unmappedActiveRequirements > 0
830
+ ? ["/gsd to review requirements backlog", "/gsd status for overview", "/gsd visualize to inspect", "/gsd start for new work"]
831
+ : ["/gsd status for overview", "/gsd visualize to inspect", "/gsd notifications for history", "/gsd start for new work"]
832
+ : ["/gsd status for overview", "/gsd visualize to inspect", "/gsd notifications for history", "/gsd auto for next milestone"];
833
+ const footerCommands = theme.fg("dim", commands.join(" · "));
1060
834
 
1061
- // ── Auto controls. Footer owns cwd/branch/model/cost/context. ───
1062
- lines.push("");
1063
- // Step-mode guidance — shown above keyboard hints when auto is paused
1064
- if (accessors.isStepMode()) {
1065
- lines.push(`${pad}${theme.fg("accent", "→")} ${theme.fg("dim", "/gsd next to advance one step · /gsd status for overview")}`);
1066
- }
835
+ if (snapshot.reason) {
836
+ add(theme.fg("dim", snapshot.reason));
837
+ }
1067
838
 
1068
- // Hints line
1069
- const hintParts: string[] = [];
1070
- hintParts.push("esc pause");
1071
- hintParts.push(`${formattedShortcutPair("dashboard")} dashboard`);
1072
- hintParts.push(`${formattedShortcutPair("parallel")} parallel`);
1073
- const hintStr = theme.fg("dim", hintParts.join(" | "));
1074
- lines.push(rightAlign("", hintStr, width));
1075
-
1076
- lines.push(...ui.bar());
1077
-
1078
- cachedLines = lines;
1079
- cachedWidth = width;
1080
- return lines;
1081
- },
1082
- invalidate() {
1083
- cachedLines = undefined;
1084
- cachedWidth = undefined;
1085
- },
1086
- dispose() {
1087
- clearInterval(spinnerTimer);
1088
- if (progressRefreshTimer) clearInterval(progressRefreshTimer);
1089
- },
1090
- };
1091
- });
839
+ return { lines, footerCommands };
1092
840
  }
1093
841
 
1094
842
  export function setCompletionProgressWidget(
@@ -1096,8 +844,11 @@ export function setCompletionProgressWidget(
1096
844
  snapshot: CompletionDashboardSnapshot,
1097
845
  ): void {
1098
846
  if (!ctx.hasUI) return;
1099
- const widgetKey = "gsd-progress";
1100
847
  clearAutoOutcomeWidget(ctx);
848
+ // Clear the structured GSD progress strip so it does not linger behind
849
+ // the completion widget (the two use separate display channels).
850
+ ctx.ui?.setGsdProgress?.(undefined);
851
+ ctx.ui.setWidget("gsd-progress", undefined);
1101
852
 
1102
853
  if (typeof ctx.ui?.setHeader === "function") {
1103
854
  ctx.ui.setHeader(() => ({
@@ -1109,117 +860,20 @@ export function setCompletionProgressWidget(
1109
860
  ctx.ui.setStatus("gsd-step", undefined);
1110
861
  }
1111
862
 
1112
- ctx.ui.setWidget(widgetKey, (_tui, theme) => ({
863
+ ctx.ui.setWidget("gsd-outcome", (_tui, theme) => ({
1113
864
  render(width: number): string[] {
1114
- const ui = makeUI(theme, width);
1115
- const pad = INDENT.base;
1116
- const lines: string[] = [];
1117
- const contentWidth = Math.max(20, width - visibleWidth(pad));
1118
- const add = (line = ""): void => {
1119
- lines.push(line ? truncateToWidth(`${pad}${line}`, width, "…") : "");
1120
- };
1121
- const addSection = (label: string, value: string | null | undefined, indent = ""): void => {
1122
- const clean = normalizeRollupText(value);
1123
- if (!clean) return;
1124
- add(`${indent}${theme.fg("accent", label)} ${theme.fg("text", truncateToWidth(clean, contentWidth - indent.length - label.length - 1, "…"))}`);
1125
- };
1126
- const addList = (label: string, values: string[] | undefined, limit: number, indent = ""): void => {
1127
- const clean = (values ?? []).map(normalizeRollupText).filter((v): v is string => !!v);
1128
- if (clean.length === 0) return;
1129
- const shown = clean.slice(0, limit);
1130
- const more = clean.length > shown.length ? ` (+${clean.length - shown.length} more)` : "";
1131
- add(`${indent}${theme.fg("accent", label)} ${theme.fg("text", truncateToWidth(shown.join("; ") + more, contentWidth - indent.length - label.length - 1, "…"))}`);
1132
- };
1133
-
1134
- lines.push(...ui.bar());
1135
-
1136
865
  const elapsed = formatAutoElapsed(snapshot.startedAt);
1137
866
  const heading = snapshot.allMilestonesComplete
1138
867
  ? "All milestones complete"
1139
868
  : snapshot.milestoneId
1140
869
  ? `Milestone ${snapshot.milestoneId} roll-up`
1141
870
  : "Milestone roll-up";
1142
- lines.push(rightAlign(`${pad}${theme.fg("accent", theme.bold(heading))}`, elapsed ? theme.fg("dim", elapsed) : "", width));
1143
-
1144
- if (snapshot.milestoneTitle) {
1145
- add(theme.fg("text", snapshot.milestoneTitle));
1146
- }
1147
-
1148
- lines.push("");
1149
- add(theme.fg("accent", "Outcome"));
1150
- addSection("", snapshot.oneLiner, " ");
1151
-
1152
- const changed = [
1153
- ...(snapshot.successCriteriaResults ? [snapshot.successCriteriaResults] : []),
1154
- ...(snapshot.requirementOutcomes ? [snapshot.requirementOutcomes] : []),
1155
- ...(snapshot.keyDecisions ?? []),
1156
- ].map(normalizeRollupText).filter((v): v is string => !!v).slice(0, 4);
1157
- if (changed.length > 0) {
1158
- lines.push("");
1159
- add(theme.fg("accent", "What changed"));
1160
- for (const item of changed) add(` - ${theme.fg("text", item)}`);
1161
- }
1162
-
1163
- const verification = [
1164
- snapshot.definitionOfDoneResults,
1165
- snapshot.deviations ? `Deviations: ${snapshot.deviations}` : null,
1166
- snapshot.followUps ? `Follow-ups: ${snapshot.followUps}` : null,
1167
- ].map(normalizeRollupText).filter((v): v is string => !!v);
1168
- if (verification.length > 0 || (snapshot.keyFiles?.length ?? 0) > 0) {
1169
- lines.push("");
1170
- add(theme.fg("accent", "Verification"));
1171
- for (const item of verification.slice(0, 3)) add(` - ${theme.fg("text", item)}`);
1172
- addList("Files:", snapshot.keyFiles, 4, " ");
1173
- }
1174
-
1175
- if ((snapshot.lessonsLearned?.length ?? 0) > 0) {
1176
- lines.push("");
1177
- addList("Lessons:", snapshot.lessonsLearned, 2);
1178
- }
1179
-
1180
- const hasSliceTotals = typeof snapshot.completedSlices === "number" && typeof snapshot.totalSlices === "number" && snapshot.totalSlices > 0;
1181
-
1182
- lines.push("");
1183
- const stats: string[] = [];
1184
- if (hasSliceTotals) stats.push(theme.fg("success", `${snapshot.completedSlices}/${snapshot.totalSlices} slices`));
1185
- if (snapshot.unitCount > 0) stats.push(theme.fg("dim", `${snapshot.unitCount} units`));
1186
- if (snapshot.totalTokens > 0) stats.push(theme.fg("dim", `${formatWidgetTokens(snapshot.totalTokens)} tokens`));
1187
- if (snapshot.totalCost > 0) stats.push(theme.fg("warning", `$${snapshot.totalCost.toFixed(2)}`));
1188
- if (typeof snapshot.cacheHitRate === "number") {
1189
- const hitColor = snapshot.cacheHitRate >= 70 ? "success" : snapshot.cacheHitRate >= 40 ? "warning" : "error";
1190
- stats.push(theme.fg(hitColor, `${Math.round(snapshot.cacheHitRate)}% cache hit`));
1191
- }
1192
- if (stats.length > 0) {
1193
- add(`${theme.fg("accent", "Run totals")} ${stats.join(theme.fg("dim", " · "))}`);
1194
- }
1195
-
1196
- lines.push("");
1197
- const nextAction = snapshot.allMilestonesComplete
1198
- ? snapshot.unmappedActiveRequirements && snapshot.unmappedActiveRequirements > 0
1199
- ? `Review ${snapshot.unmappedActiveRequirements} unmapped active requirement${snapshot.unmappedActiveRequirements === 1 ? "" : "s"}, then start a new milestone when ready.`
1200
- : "Review the roll-up, then start a new milestone when ready."
1201
- : "Review the roll-up, inspect status, or continue to the next milestone.";
1202
- const commands = snapshot.allMilestonesComplete
1203
- ? snapshot.unmappedActiveRequirements && snapshot.unmappedActiveRequirements > 0
1204
- ? ["/gsd to review requirements backlog", "/gsd status for overview", "/gsd visualize to inspect", "/gsd start for new work"]
1205
- : ["/gsd status for overview", "/gsd visualize to inspect", "/gsd notifications for history", "/gsd start for new work"]
1206
- : ["/gsd status for overview", "/gsd visualize to inspect", "/gsd notifications for history", "/gsd auto for next milestone"];
1207
- add(`${theme.fg("success", "Next")} ${theme.fg("text", nextAction)}`);
1208
- if ((snapshot.requirementsBacklogPreview?.length ?? 0) > 0) {
1209
- lines.push("");
1210
- add(theme.fg("accent", "Requirements backlog"));
1211
- for (const line of snapshot.requirementsBacklogPreview ?? []) {
1212
- add(` ${theme.fg("text", line)}`);
1213
- }
1214
- }
1215
- add(theme.fg("dim", commands.join(" · ")));
1216
-
1217
- const location = snapshot.basePath ? theme.fg("dim", snapshot.basePath) : "";
1218
- const reason = theme.fg("dim", snapshot.reason);
1219
- lines.push(rightAlign(`${pad}${truncateToWidth(location, Math.max(0, width - 32), "…")}`, reason, width));
1220
- lines.push(...ui.bar());
1221
-
1222
- return lines;
871
+ const statusLine = `${theme.fg("success", "✓")} ${theme.fg("text", heading)}`;
872
+ const { lines, footerCommands } = buildCompletionRollupLines(theme, snapshot, width);
873
+ return renderPlainOutcome(theme, width, statusLine, lines, {
874
+ headerRight: elapsed ? theme.fg("dim", elapsed) : undefined,
875
+ footerRight: footerCommands,
876
+ });
1223
877
  },
1224
878
  invalidate(): void {},
1225
879
  dispose(): void {},
@@ -1231,6 +885,8 @@ export function setAutoOutcomeWidget(
1231
885
  snapshot: AutoOutcomeSurfaceSnapshot,
1232
886
  ): void {
1233
887
  if (!ctx.hasUI) return;
888
+ ctx.ui?.setGsdProgress?.(undefined);
889
+ ctx.ui.setWidget("gsd-progress", undefined);
1234
890
 
1235
891
  ctx.ui.setWidget("gsd-outcome", (_tui, theme) => ({
1236
892
  render(width: number): string[] {
@@ -1244,40 +900,57 @@ export function setAutoOutcomeWidget(
1244
900
  : snapshot.status === "blocked" ? "!"
1245
901
  : snapshot.status === "paused" ? "||"
1246
902
  : "●";
1247
- // renderPanel indents body lines by 2; mirror that for wrap width.
1248
- const innerWidth = Math.max(8, width - 2);
1249
- const maxLines = 7;
1250
- const lines: string[] = [];
1251
903
  const elapsed = snapshot.startedAt ? formatAutoElapsed(snapshot.startedAt) : "";
1252
- const heading = `${theme.fg(color, icon)} ${theme.fg("accent", theme.bold("GSD"))} ${theme.fg("text", snapshot.title)}`;
1253
- // Elapsed rides inline after the title on the header rule.
1254
- const title = elapsed ? `${heading} ${theme.fg("dim", elapsed)}` : heading;
904
+ const statusLine = `${theme.fg(color, icon)} ${theme.fg("text", snapshot.title)}`;
1255
905
  const commands = snapshot.commands?.filter(Boolean) ?? [];
1256
- const commandLine = commands.length > 0 ? theme.fg("dim", commands.join(" · ")) : null;
1257
-
1258
- const addWrapped = (text: string, prefix = ""): void => {
1259
- const reserve = commandLine ? 1 : 0;
1260
- const remaining = Math.max(0, maxLines - reserve - lines.length);
1261
- if (remaining === 0) return;
1262
- const available = Math.max(8, innerWidth - visibleWidth(prefix));
1263
- for (const [idx, line] of wrapVisibleText(text, available).slice(0, remaining).entries()) {
1264
- lines.push(`${idx === 0 ? prefix : " ".repeat(visibleWidth(prefix))}${line}`);
1265
- }
906
+ const commandLine = commands.length > 0 ? theme.fg("dim", commands.join(" · ")) : undefined;
907
+
908
+ const innerWidth = Math.max(8, width);
909
+ const maxLines = 7;
910
+ const splitRows: Array<{ left: string; right?: string }> = [];
911
+ let commandsPlaced = false;
912
+
913
+ const pushLeft = (left: string): void => {
914
+ if (splitRows.length >= maxLines - (commandLine ? 1 : 0)) return;
915
+ splitRows.push({ left });
1266
916
  };
1267
917
 
1268
918
  if (snapshot.detail) {
1269
- addWrapped(snapshot.detail, `${theme.fg("dim", "Reason")} `);
919
+ for (const line of wrapVisibleText(snapshot.detail, innerWidth).slice(0, maxLines)) {
920
+ pushLeft(theme.fg("text", line));
921
+ }
1270
922
  }
923
+
1271
924
  if (snapshot.unitLabel) {
1272
- addWrapped(snapshot.unitLabel, `${theme.fg("dim", "Last")} `);
925
+ const lastLeft = theme.fg("dim", "Last · ") + theme.fg("text", snapshot.unitLabel);
926
+ if (
927
+ commandLine &&
928
+ visibleWidth(lastLeft) + visibleWidth(commandLine) + 2 <= innerWidth &&
929
+ splitRows.length < maxLines
930
+ ) {
931
+ splitRows.push({ left: lastLeft, right: commandLine });
932
+ commandsPlaced = true;
933
+ } else {
934
+ pushLeft(lastLeft);
935
+ }
1273
936
  }
1274
- addWrapped(snapshot.nextAction, `${theme.fg("success", "Next")} `);
1275
937
 
1276
- if (commandLine && lines.length < maxLines) {
1277
- lines.push(commandLine);
938
+ const nextPrefix = theme.fg("success", "Next · ");
939
+ const nextPrefixWidth = visibleWidth(nextPrefix);
940
+ for (const [idx, line] of wrapVisibleText(
941
+ snapshot.nextAction,
942
+ Math.max(8, innerWidth - nextPrefixWidth),
943
+ ).entries()) {
944
+ if (splitRows.length >= maxLines - (commandLine && !commandsPlaced ? 1 : 0)) break;
945
+ const lead = idx === 0 ? nextPrefix : " ".repeat(nextPrefixWidth);
946
+ pushLeft(theme.fg("text", lead + line));
1278
947
  }
1279
948
 
1280
- return renderPanel(theme, title, lines, width, { ruleColor: color });
949
+ return renderPlainOutcome(theme, width, statusLine, [], {
950
+ headerRight: elapsed ? theme.fg("dim", elapsed) : undefined,
951
+ splitRows,
952
+ footerRight: commandLine && !commandsPlaced ? commandLine : undefined,
953
+ });
1281
954
  },
1282
955
  invalidate(): void {},
1283
956
  dispose(): void {},
@@ -1344,3 +1017,186 @@ function extractMessageText(value: unknown): string | null {
1344
1017
 
1345
1018
  return null;
1346
1019
  }
1020
+
1021
+ type MilestoneRef = NonNullable<GSDState["activeMilestone"]>;
1022
+ type SliceRef = NonNullable<GSDState["activeSlice"]>;
1023
+ type TaskRef = NonNullable<GSDState["activeTask"]>;
1024
+
1025
+ function buildGsdProgressPayload(
1026
+ accessors: WidgetStateAccessors,
1027
+ unitType: string,
1028
+ unitId: string,
1029
+ mid: MilestoneRef | null | undefined,
1030
+ slice: SliceRef | null | undefined,
1031
+ task: TaskRef | null | undefined,
1032
+ isHook: boolean,
1033
+ verb: string,
1034
+ runtimeRecord: AutoUnitRuntimeRecord | null,
1035
+ ): GsdProgressState | undefined {
1036
+ const mode = getWidgetMode();
1037
+ if (mode === "off") return undefined;
1038
+
1039
+ const elapsed = formatAutoElapsed(accessors.getAutoStartTime());
1040
+ const eta = estimateTimeRemaining();
1041
+ const etaShort = eta ? eta.replace(" remaining", " left") : undefined;
1042
+ const modeTag = accessors.isStepMode() ? "NEXT" : "AUTO";
1043
+
1044
+ const target = task
1045
+ ? `${task.id}: ${task.title}`
1046
+ : slice
1047
+ ? `${slice.id}: ${slice.title}`
1048
+ : unitId;
1049
+ const phase = `${verb} ${target}`.trim();
1050
+
1051
+ const roadmapSlices = mid ? getRoadmapSlicesSync() : null;
1052
+ let taskProgress: { done: number; total: number } | undefined;
1053
+ let sliceProgress: { done: number; total: number } | undefined;
1054
+ if (shouldRenderRoadmapProgress(roadmapSlices)) {
1055
+ if (roadmapSlices.total > 0) {
1056
+ sliceProgress = { done: roadmapSlices.done, total: roadmapSlices.total };
1057
+ }
1058
+ const { activeSliceTasks } = roadmapSlices;
1059
+ if (activeSliceTasks && activeSliceTasks.total > 0) {
1060
+ const taskNum = isHook
1061
+ ? Math.max(activeSliceTasks.done, 1)
1062
+ : Math.min(activeSliceTasks.done + 1, activeSliceTasks.total);
1063
+ taskProgress = { done: taskNum, total: activeSliceTasks.total };
1064
+ }
1065
+ }
1066
+
1067
+ const runtimeSignal = formatRuntimeHealthSignal(runtimeRecord);
1068
+ const score = computeProgressScore();
1069
+ let healthSummary: string | undefined;
1070
+ if (mode !== "min") {
1071
+ if (runtimeSignal?.detail) {
1072
+ healthSummary = runtimeSignal.detail;
1073
+ } else if (score.level !== "green") {
1074
+ healthSummary = score.signals
1075
+ .filter((signal) => signal.kind === "negative")
1076
+ .slice(0, 2)
1077
+ .map((signal) => signal.label)
1078
+ .join(" · ");
1079
+ }
1080
+ }
1081
+
1082
+ const unitLabel = unitId || [mid?.id, slice?.id, task?.id].filter(Boolean).join("/");
1083
+
1084
+ return {
1085
+ phase,
1086
+ modeTag,
1087
+ taskProgress,
1088
+ sliceProgress,
1089
+ sliceLabel: slice?.id,
1090
+ taskLabel: task?.id,
1091
+ unitLabel,
1092
+ elapsed,
1093
+ eta: etaShort,
1094
+ healthSummary,
1095
+ path: accessors.getBasePath(),
1096
+ widgetMode: mode,
1097
+ };
1098
+ }
1099
+
1100
+ function installGsdProgressStrip(
1101
+ ctx: ExtensionContext,
1102
+ accessors: WidgetStateAccessors,
1103
+ unitType: string,
1104
+ unitId: string,
1105
+ mid: MilestoneRef | null | undefined,
1106
+ slice: SliceRef | null | undefined,
1107
+ task: TaskRef | null | undefined,
1108
+ isHook: boolean,
1109
+ verb: string,
1110
+ ): void {
1111
+ if (!ctx.hasUI || typeof ctx.ui?.setGsdProgress !== "function") return;
1112
+
1113
+ ctx.ui.setWidget("gsd-progress", undefined);
1114
+
1115
+ let cachedRuntimeRecord: AutoUnitRuntimeRecord | null = null;
1116
+ const refreshRuntimeRecord = (): void => {
1117
+ try {
1118
+ cachedRuntimeRecord = readUnitRuntimeRecord(accessors.getBasePath(), unitType, unitId);
1119
+ } catch {
1120
+ cachedRuntimeRecord = null;
1121
+ }
1122
+ };
1123
+ refreshRuntimeRecord();
1124
+
1125
+ let progressRefreshTimer: ReturnType<typeof setInterval> | undefined;
1126
+ let elapsedRefreshTimer: ReturnType<typeof setInterval> | undefined;
1127
+
1128
+ const dispose = (): void => {
1129
+ if (progressRefreshTimer !== undefined) {
1130
+ clearInterval(progressRefreshTimer);
1131
+ progressRefreshTimer = undefined;
1132
+ }
1133
+ if (elapsedRefreshTimer !== undefined) {
1134
+ clearInterval(elapsedRefreshTimer);
1135
+ elapsedRefreshTimer = undefined;
1136
+ }
1137
+ // Do not call setGsdProgress here: callers (resetExtensionUI, unit transition,
1138
+ // setCompletionProgressWidget) clear gsdProgressState directly, and calling it
1139
+ // here would re-enter setGsdProgress which calls dispose again — infinite recursion.
1140
+ };
1141
+
1142
+ const publish = (registerDispose = false): boolean => {
1143
+ if (accessors.isSessionSwitching()) {
1144
+ // On initial install (registerDispose) clear any stale strip from the
1145
+ // previous unit. On timer refreshes, skip silently — calling
1146
+ // setGsdProgress(undefined) would run dispose() and permanently clear
1147
+ // the refresh timers, leaving the strip blank after the switch.
1148
+ if (registerDispose) {
1149
+ ctx.ui!.setGsdProgress!(undefined);
1150
+ }
1151
+ return false;
1152
+ }
1153
+ ctx.ui!.setGsdProgress!(
1154
+ buildGsdProgressPayload(
1155
+ accessors,
1156
+ unitType,
1157
+ unitId,
1158
+ mid,
1159
+ slice,
1160
+ task,
1161
+ isHook,
1162
+ verb,
1163
+ cachedRuntimeRecord,
1164
+ ),
1165
+ registerDispose ? dispose : undefined,
1166
+ );
1167
+ return true;
1168
+ };
1169
+
1170
+ const startElapsedRefreshTimer = (): void => {
1171
+ if (elapsedRefreshTimer !== undefined) return;
1172
+ elapsedRefreshTimer = setInterval(() => {
1173
+ try {
1174
+ publish();
1175
+ } catch (err) {
1176
+ logWarning("dashboard", `progress strip elapsed refresh failed: ${getErrorMessage(err)}`);
1177
+ }
1178
+ }, 1_000);
1179
+ elapsedRefreshTimer.unref?.();
1180
+ };
1181
+
1182
+ const startProgressRefreshTimer = (): void => {
1183
+ if (progressRefreshTimer !== undefined) return;
1184
+ progressRefreshTimer = setInterval(() => {
1185
+ try {
1186
+ if (mid) {
1187
+ updateSliceProgressCache(accessors.getBasePath(), mid.id, slice?.id);
1188
+ }
1189
+ refreshRuntimeRecord();
1190
+ publish();
1191
+ } catch (err) {
1192
+ logWarning("dashboard", `progress strip refresh failed: ${getErrorMessage(err)}`);
1193
+ }
1194
+ }, 15_000);
1195
+ progressRefreshTimer.unref?.();
1196
+ };
1197
+
1198
+ if (publish(true)) {
1199
+ startElapsedRefreshTimer();
1200
+ startProgressRefreshTimer();
1201
+ }
1202
+ }