@opengsd/gsd-pi 1.2.0-dev.0b870afa → 1.2.0-dev.23d85b63

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 (579) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli.js +14 -19
  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/loader.js +6 -4
  8. package/dist/onboarding.js +9 -4
  9. package/dist/provider-migrations.d.ts +23 -0
  10. package/dist/provider-migrations.js +41 -0
  11. package/dist/register-agent-bundles.d.ts +11 -2
  12. package/dist/register-agent-bundles.js +18 -4
  13. package/dist/resource-loader.d.ts +10 -5
  14. package/dist/resource-loader.js +121 -6
  15. package/dist/resources/.managed-resources-content-hash +1 -1
  16. package/dist/resources/extensions/ask-user-questions.js +3 -2
  17. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
  18. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  19. package/dist/resources/extensions/google-cli/stream-adapter.js +16 -1
  20. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  21. package/dist/resources/extensions/gsd/auto/dispatch-history.js +21 -6
  22. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  23. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  24. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  25. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  26. package/dist/resources/extensions/gsd/auto/orchestrator.js +119 -18
  27. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  28. package/dist/resources/extensions/gsd/auto/phases.js +17 -2372
  29. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +542 -0
  30. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  31. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  32. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  33. package/dist/resources/extensions/gsd/auto-closeout-messaging.js +90 -0
  34. package/dist/resources/extensions/gsd/auto-dashboard.js +255 -431
  35. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +15 -3
  36. package/dist/resources/extensions/gsd/auto-dispatch.js +19 -1
  37. package/dist/resources/extensions/gsd/auto-model-selection.js +9 -6
  38. package/dist/resources/extensions/gsd/auto-post-unit.js +12 -8
  39. package/dist/resources/extensions/gsd/auto-prompts.js +5 -1
  40. package/dist/resources/extensions/gsd/auto-recovery.js +52 -6
  41. package/dist/resources/extensions/gsd/auto-start.js +28 -7
  42. package/dist/resources/extensions/gsd/auto-worktree.js +48 -3
  43. package/dist/resources/extensions/gsd/auto.js +83 -19
  44. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +4 -2
  45. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
  46. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +3 -1
  47. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +32 -3
  48. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +56 -16
  49. package/dist/resources/extensions/gsd/closeout-wizard.js +8 -3
  50. package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -8
  51. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  52. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  53. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +8 -0
  54. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  55. package/dist/resources/extensions/gsd/config-overlay.js +11 -8
  56. package/dist/resources/extensions/gsd/db/engine.js +24 -6
  57. package/dist/resources/extensions/gsd/db/queries.js +30 -0
  58. package/dist/resources/extensions/gsd/db/writers/reconcile.js +19 -1
  59. package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
  60. package/dist/resources/extensions/gsd/db-transaction.js +27 -23
  61. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  62. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  63. package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
  64. package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
  65. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +11 -9
  66. package/dist/resources/extensions/gsd/gsd-db.js +15 -20
  67. package/dist/resources/extensions/gsd/guided-flow.js +88 -2
  68. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  69. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  70. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  71. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  72. package/dist/resources/extensions/gsd/notifications.js +12 -7
  73. package/dist/resources/extensions/gsd/preferences-models.js +17 -9
  74. package/dist/resources/extensions/gsd/preferences.js +91 -5
  75. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  76. package/dist/resources/extensions/gsd/prompts/complete-slice.md +6 -2
  77. package/dist/resources/extensions/gsd/prompts/execute-task.md +7 -2
  78. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -1
  81. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  83. package/dist/resources/extensions/gsd/provider-error-guidance.js +24 -0
  84. package/dist/resources/extensions/gsd/session-lock.js +4 -3
  85. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  86. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +13 -6
  87. package/dist/resources/extensions/gsd/state.js +6 -2
  88. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  89. package/dist/resources/extensions/gsd/tools/complete-task.js +62 -0
  90. package/dist/resources/extensions/gsd/tools/exec-tool.js +2 -109
  91. package/dist/resources/extensions/gsd/tui/render-kit.js +38 -13
  92. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  93. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  94. package/dist/resources/extensions/gsd/workflow-logger.js +4 -0
  95. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  96. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  97. package/dist/resources/extensions/gsd/worktree-manager.js +101 -2
  98. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  99. package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
  100. package/dist/resources/extensions/gsd/worktree.js +8 -1
  101. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  102. package/dist/resources/extensions/search-the-web/index.js +41 -9
  103. package/dist/resources/extensions/search-the-web/native-search.js +18 -4
  104. package/dist/resources/extensions/shared/gsd-browser-cli.js +40 -2
  105. package/dist/resources/extensions/subagent/index.js +20 -15
  106. package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
  107. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  108. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  109. package/dist/runtime-checks.d.ts +10 -0
  110. package/dist/runtime-checks.js +27 -0
  111. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  112. package/dist/web/standalone/.next/BUILD_ID +1 -1
  113. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  114. package/dist/web/standalone/.next/build-manifest.json +2 -2
  115. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  116. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  134. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  135. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  136. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  137. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  138. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  140. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  144. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/index.html +1 -1
  167. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  174. package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
  175. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  176. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  178. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  179. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  180. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  181. package/package.json +4 -4
  182. package/packages/cloud-mcp-gateway/package.json +2 -2
  183. package/packages/contracts/package.json +1 -1
  184. package/packages/daemon/package.json +4 -4
  185. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  186. package/packages/gsd-agent-core/dist/sdk.js +12 -6
  187. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  188. package/packages/gsd-agent-core/package.json +5 -5
  189. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +5 -5
  190. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  191. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
  192. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
  193. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
  194. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
  196. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  197. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
  198. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  199. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
  200. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
  201. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
  202. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
  203. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
  204. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  205. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
  206. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  207. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
  208. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  209. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
  210. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
  211. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
  212. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
  213. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
  214. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
  215. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
  216. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
  217. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
  218. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
  219. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
  220. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
  221. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
  222. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
  223. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
  224. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  225. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
  226. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
  227. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  228. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  229. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  230. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  231. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -3
  232. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  233. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
  234. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  235. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +11 -0
  236. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  237. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +85 -19
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +71 -3
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +257 -37
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
  244. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
  246. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -10
  250. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
  252. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
  254. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +5 -0
  256. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  260. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  261. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +3 -5
  262. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  263. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -2
  264. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  265. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
  266. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  267. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +25 -0
  268. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  269. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.d.ts.map +1 -1
  270. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
  271. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
  272. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
  273. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
  275. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -0
  277. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  278. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  279. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +10 -2
  280. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  281. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +48 -6
  282. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  283. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  284. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  285. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  286. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
  287. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
  288. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js.map +1 -1
  289. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  290. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -0
  291. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  292. package/packages/gsd-agent-modes/package.json +7 -7
  293. package/packages/mcp-server/README.md +12 -3
  294. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  295. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  296. package/packages/mcp-server/dist/cli-runner.js +137 -0
  297. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  298. package/packages/mcp-server/dist/cli.js +2 -58
  299. package/packages/mcp-server/dist/cli.js.map +1 -1
  300. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  301. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  302. package/packages/mcp-server/dist/pid-registry.js +459 -0
  303. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  304. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  305. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  306. package/packages/mcp-server/dist/probe-mode.js +10 -0
  307. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  308. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  309. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  310. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  311. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  312. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  313. package/packages/mcp-server/dist/workflow-tools.js +62 -43
  314. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  315. package/packages/mcp-server/package.json +5 -5
  316. package/packages/native/package.json +1 -1
  317. package/packages/pi-agent-core/dist/agent-loop.js +52 -2
  318. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  319. package/packages/pi-agent-core/package.json +1 -1
  320. package/packages/pi-ai/package.json +1 -1
  321. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +28 -2
  322. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  325. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
  328. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
  330. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  332. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  334. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  336. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  337. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  340. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  341. package/packages/pi-coding-agent/package.json +8 -8
  342. package/packages/pi-tui/README.md +15 -0
  343. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  344. package/packages/pi-tui/dist/autocomplete.js +6 -1
  345. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  346. package/packages/pi-tui/dist/components/input.js +1 -1
  347. package/packages/pi-tui/dist/components/input.js.map +1 -1
  348. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  349. package/packages/pi-tui/dist/components/loader.js +1 -0
  350. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  351. package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
  352. package/packages/pi-tui/dist/components/select-list.js +8 -2
  353. package/packages/pi-tui/dist/components/select-list.js.map +1 -1
  354. package/packages/pi-tui/dist/index.d.ts +2 -2
  355. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  356. package/packages/pi-tui/dist/index.js +2 -2
  357. package/packages/pi-tui/dist/index.js.map +1 -1
  358. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  359. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  360. package/packages/pi-tui/dist/terminal-image.js +54 -2
  361. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  362. package/packages/pi-tui/dist/terminal.d.ts +12 -0
  363. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  364. package/packages/pi-tui/dist/terminal.js +70 -25
  365. package/packages/pi-tui/dist/terminal.js.map +1 -1
  366. package/packages/pi-tui/dist/tui.d.ts +15 -0
  367. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  368. package/packages/pi-tui/dist/tui.js +106 -21
  369. package/packages/pi-tui/dist/tui.js.map +1 -1
  370. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  371. package/packages/pi-tui/dist/utils.js +110 -36
  372. package/packages/pi-tui/dist/utils.js.map +1 -1
  373. package/packages/pi-tui/package.json +2 -2
  374. package/packages/rpc-client/package.json +2 -2
  375. package/pkg/dist/theme/theme.d.ts.map +1 -1
  376. package/pkg/dist/theme/theme.js +45 -17
  377. package/pkg/dist/theme/theme.js.map +1 -1
  378. package/pkg/package.json +1 -1
  379. package/src/resources/extensions/ask-user-questions.ts +7 -2
  380. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +80 -0
  381. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  382. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  383. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  384. package/src/resources/extensions/google-cli/stream-adapter.ts +22 -1
  385. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  386. package/src/resources/extensions/gsd/auto/dispatch-history.ts +22 -6
  387. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  388. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  389. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  390. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  391. package/src/resources/extensions/gsd/auto/orchestrator.ts +140 -18
  392. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  393. package/src/resources/extensions/gsd/auto/phases.ts +58 -3061
  394. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +716 -0
  395. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  396. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  397. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  398. package/src/resources/extensions/gsd/auto-closeout-messaging.ts +90 -0
  399. package/src/resources/extensions/gsd/auto-dashboard.ts +310 -454
  400. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
  401. package/src/resources/extensions/gsd/auto-dispatch.ts +24 -2
  402. package/src/resources/extensions/gsd/auto-model-selection.ts +20 -5
  403. package/src/resources/extensions/gsd/auto-post-unit.ts +16 -9
  404. package/src/resources/extensions/gsd/auto-prompts.ts +5 -1
  405. package/src/resources/extensions/gsd/auto-recovery.ts +62 -8
  406. package/src/resources/extensions/gsd/auto-start.ts +44 -7
  407. package/src/resources/extensions/gsd/auto-worktree.ts +51 -3
  408. package/src/resources/extensions/gsd/auto.ts +118 -18
  409. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +6 -2
  410. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
  411. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -1
  412. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +36 -3
  413. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +69 -16
  414. package/src/resources/extensions/gsd/closeout-wizard.ts +11 -2
  415. package/src/resources/extensions/gsd/commands/handlers/core.ts +27 -8
  416. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -2
  417. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  418. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +7 -0
  419. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  420. package/src/resources/extensions/gsd/config-overlay.ts +22 -9
  421. package/src/resources/extensions/gsd/db/engine.ts +26 -6
  422. package/src/resources/extensions/gsd/db/queries.ts +29 -0
  423. package/src/resources/extensions/gsd/db/writers/reconcile.ts +24 -1
  424. package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
  425. package/src/resources/extensions/gsd/db-transaction.ts +37 -20
  426. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  427. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  428. package/src/resources/extensions/gsd/doctor-git-checks.ts +4 -1
  429. package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
  430. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +10 -10
  431. package/src/resources/extensions/gsd/gsd-db.ts +15 -19
  432. package/src/resources/extensions/gsd/guided-flow.ts +128 -2
  433. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  434. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  435. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  436. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  437. package/src/resources/extensions/gsd/notifications.ts +13 -6
  438. package/src/resources/extensions/gsd/preferences-models.ts +26 -8
  439. package/src/resources/extensions/gsd/preferences.ts +111 -5
  440. package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  441. package/src/resources/extensions/gsd/prompts/complete-slice.md +6 -2
  442. package/src/resources/extensions/gsd/prompts/execute-task.md +7 -2
  443. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  444. package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  445. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -1
  446. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  448. package/src/resources/extensions/gsd/provider-error-guidance.ts +32 -0
  449. package/src/resources/extensions/gsd/session-lock.ts +8 -7
  450. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  451. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +23 -10
  452. package/src/resources/extensions/gsd/state.ts +7 -1
  453. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  454. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  455. package/src/resources/extensions/gsd/tests/auto-closeout-messaging.test.ts +71 -0
  456. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +68 -116
  457. package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
  458. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  459. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +7 -2
  460. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +16 -1
  461. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +89 -22
  462. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  463. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +97 -4
  464. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  465. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  466. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  467. package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
  468. package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
  469. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +6 -2
  470. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  471. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
  472. package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -0
  473. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
  474. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
  475. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  476. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +2 -1
  477. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
  478. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  479. package/src/resources/extensions/gsd/tests/dispatch-db-degradation-logs.test.ts +98 -0
  480. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
  481. package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
  482. package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
  483. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  484. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
  485. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  486. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  487. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -1
  488. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +40 -7
  489. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +19 -0
  490. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +16 -0
  491. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +75 -0
  492. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  493. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  494. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +18 -0
  495. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -0
  496. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  497. package/src/resources/extensions/gsd/tests/loop.test.ts +60 -0
  498. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  499. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  500. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  501. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  503. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  504. package/src/resources/extensions/gsd/tests/model-router.test.ts +139 -0
  505. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  506. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +13 -1
  507. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
  508. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +335 -0
  509. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  510. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +5 -0
  511. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  512. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +1 -1
  513. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  514. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +35 -4
  515. package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
  516. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
  517. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -2
  518. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +15 -0
  519. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  520. package/src/resources/extensions/gsd/tests/reconcile-logs.test.ts +244 -0
  521. package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
  522. package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
  523. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
  524. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  525. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
  526. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +7 -1
  527. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +68 -0
  528. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
  529. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
  530. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  531. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  532. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +17 -1
  533. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  534. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  535. package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
  536. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
  537. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  538. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +40 -86
  539. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
  540. package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
  541. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  542. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  543. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  544. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  545. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  546. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  547. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +36 -0
  548. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  549. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  550. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  551. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  552. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
  553. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  554. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  555. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  556. package/src/resources/extensions/gsd/tools/exec-tool.ts +2 -118
  557. package/src/resources/extensions/gsd/tui/render-kit.ts +56 -13
  558. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  559. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  560. package/src/resources/extensions/gsd/workflow-logger.ts +5 -0
  561. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  562. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  563. package/src/resources/extensions/gsd/worktree-manager.ts +97 -2
  564. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  565. package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
  566. package/src/resources/extensions/gsd/worktree.ts +7 -1
  567. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  568. package/src/resources/extensions/search-the-web/index.ts +45 -9
  569. package/src/resources/extensions/search-the-web/native-search.ts +16 -4
  570. package/src/resources/extensions/shared/gsd-browser-cli.ts +41 -2
  571. package/src/resources/extensions/subagent/index.ts +20 -15
  572. package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
  573. package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
  574. package/src/resources/skills/create-skill/SKILL.md +3 -0
  575. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  576. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  577. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  578. /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_buildManifest.js +0 -0
  579. /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_ssgManifest.js +0 -0
@@ -7,14 +7,11 @@ import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
7
7
  import { readFileSync, writeFileSync, existsSync } from "node:fs";
8
8
  import { execFileSync } from "node:child_process";
9
9
  import { truncateToWidth, visibleWidth } from "@gsd/pi-tui";
10
- import { makeUI } from "../shared/tui.js";
11
- import { GLYPH, INDENT } from "../shared/mod.js";
12
- import { padRightVisible, renderPanel, renderProgressBar, rightAlign, wrapVisibleText } from "./tui/render-kit.js";
10
+ import { padRightVisible, renderPlainOutcome, wrapVisibleText } from "./tui/render-kit.js";
13
11
  import { computeProgressScore } from "./progress-score.js";
14
12
  import { getGlobalGSDPreferencesPath, getProjectGSDPreferencesPath, parsePreferencesMarkdown, } from "./preferences.js";
15
13
  import { parseUnitId } from "./unit-id.js";
16
14
  import { logWarning } from "./workflow-logger.js";
17
- import { formattedShortcutPair } from "./shortcut-defs.js";
18
15
  import { readUnitRuntimeRecord } from "./unit-runtime.js";
19
16
  import { describeMilestoneReadinessPhase } from "./milestone-readiness.js";
20
17
  const ACTIVE_SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
@@ -567,316 +564,84 @@ export function updateProgressWidget(ctx, unitType, unitId, state, accessors, ti
567
564
  if (mid) {
568
565
  updateSliceProgressCache(accessors.getBasePath(), mid.id, slice?.id);
569
566
  }
570
- ctx.ui.setWidget("gsd-progress", (tui, theme) => {
571
- let spinnerIndex = 0;
572
- let cachedLines;
573
- let cachedWidth;
574
- let cachedRuntimeRecord = null;
575
- const refreshRuntimeRecord = () => {
576
- try {
577
- cachedRuntimeRecord = readUnitRuntimeRecord(accessors.getBasePath(), unitType, unitId);
578
- }
579
- catch {
580
- cachedRuntimeRecord = null;
581
- }
582
- };
583
- refreshRuntimeRecord();
584
- const spinnerTimer = setInterval(() => {
585
- spinnerIndex = (spinnerIndex + 1) % ACTIVE_SPINNER_FRAMES.length;
586
- cachedLines = undefined;
587
- tui.requestRender();
588
- }, 200);
589
- spinnerTimer.unref?.();
590
- // Refresh progress cache from disk every 15s so the widget reflects
591
- // task/slice completion mid-unit. Without this, the progress bar only
592
- // updates at dispatch time, appearing frozen during long-running units.
593
- // 15s (vs 5s) reduces synchronous file I/O on the hot path.
594
- const progressRefreshTimer = setInterval(() => {
595
- try {
596
- if (mid) {
597
- updateSliceProgressCache(accessors.getBasePath(), mid.id, slice?.id);
598
- }
599
- refreshRuntimeRecord();
600
- cachedLines = undefined;
601
- }
602
- catch (err) { /* non-fatal */
603
- logWarning("dashboard", `DB status update failed: ${err instanceof Error ? err.message : String(err)}`);
604
- }
605
- }, 15_000);
606
- progressRefreshTimer.unref?.();
607
- return {
608
- render(width) {
609
- if (cachedLines && cachedWidth === width)
610
- return cachedLines;
611
- // While newSession() is in-flight, session state is mid-mutation.
612
- // Accessing cmdCtx.sessionManager or cmdCtx.getContextUsage() can
613
- // block the render loop and freeze the TUI. Return the last cached
614
- // frame (or an empty frame on first render) until the switch settles.
615
- if (accessors.isSessionSwitching()) {
616
- return cachedLines ?? [];
617
- }
618
- const ui = makeUI(theme, width);
619
- const lines = [];
620
- const pad = INDENT.base;
621
- // ── Line 1: Top bar ───────────────────────────────────────────────
622
- lines.push(...ui.bar());
623
- const spinner = theme.fg("accent", ACTIVE_SPINNER_FRAMES[spinnerIndex]);
624
- const elapsed = formatAutoElapsed(accessors.getAutoStartTime());
625
- const modeTag = accessors.isStepMode() ? "NEXT" : "AUTO";
626
- // Health indicator in header
627
- const score = computeProgressScore();
628
- const runtimeSignal = formatRuntimeHealthSignal(cachedRuntimeRecord);
629
- const healthLevel = runtimeSignal?.level ?? score.level;
630
- const healthSummary = runtimeSignal?.summary ?? score.summary;
631
- const healthColor = healthLevel === "green" ? "success"
632
- : healthLevel === "yellow" ? "warning"
633
- : "error";
634
- const healthIcon = healthLevel === "green" ? GLYPH.statusActive
635
- : healthLevel === "yellow" ? "!"
636
- : "x";
637
- const activeState = runtimeSignal?.state === "waiting" ? "waiting" : "running";
638
- const stateColor = runtimeSignal?.state === "waiting" ? "warning" : "success";
639
- const healthParts = [];
640
- if (runtimeSignal?.summary) {
641
- healthParts.push(theme.fg(healthColor, healthSummary));
642
- }
643
- else if (healthLevel !== "green") {
644
- healthParts.push(`${theme.fg(healthColor, healthIcon)} ${theme.fg(healthColor, healthSummary)}`);
645
- }
646
- const headerLeft = [
647
- `${pad}${spinner} ${theme.fg("accent", theme.bold("GSD"))}`,
648
- theme.fg("success", modeTag),
649
- theme.fg(stateColor, activeState),
650
- ...healthParts,
651
- ].join(` ${theme.fg("dim", "·")} `);
652
- // ETA in header right, after elapsed
653
- const eta = estimateTimeRemaining();
654
- const etaShort = eta ? eta.replace(" remaining", " left") : null;
655
- const headerRight = elapsed
656
- ? (etaShort
657
- ? `${theme.fg("dim", elapsed)} ${theme.fg("dim", "·")} ${theme.fg("dim", etaShort)}`
658
- : theme.fg("dim", elapsed))
659
- : "";
660
- lines.push(rightAlign(headerLeft, headerRight, width));
661
- // Show health signal details when degraded (yellow/red)
662
- if (runtimeSignal?.detail && widgetMode !== "min") {
663
- lines.push(`${pad} ${theme.fg("dim", runtimeSignal.detail)}`);
664
- }
665
- else if (score.level !== "green" && score.signals.length > 0 && widgetMode !== "min") {
666
- // Show up to 3 most relevant signals in compact form
667
- const topSignals = score.signals
668
- .filter(s => s.kind === "negative")
669
- .slice(0, 3);
670
- if (topSignals.length > 0) {
671
- const signalStr = topSignals
672
- .map(s => theme.fg("dim", s.label))
673
- .join(theme.fg("dim", " · "));
674
- lines.push(`${pad} ${signalStr}`);
675
- }
676
- }
677
- // ── Mode: off — return empty ──────────────────────────────────
678
- if (widgetMode === "off") {
679
- cachedLines = [];
680
- cachedWidth = width;
681
- return [];
682
- }
683
- // ── Mode: min — header line only ──────────────────────────────
684
- if (widgetMode === "min") {
685
- lines.push(...ui.bar());
686
- cachedLines = lines;
687
- cachedWidth = width;
688
- return lines;
689
- }
690
- // ── Mode: small — dense horizontal grid ───────────────────────
691
- if (widgetMode === "small") {
692
- lines.length = 0;
693
- lines.push(...ui.bar());
694
- const roadmapSlices = mid ? getRoadmapSlicesSync() : null;
695
- const unitLabel = unitId || [mid?.id, slice?.id, task?.id].filter(Boolean).join("/");
696
- const statusParts = [
697
- spinner,
698
- theme.fg("success", modeTag),
699
- theme.fg(stateColor, activeState),
700
- ];
701
- if (runtimeSignal?.summary) {
702
- statusParts.push(theme.fg(healthColor, healthSummary));
703
- }
704
- else if (healthLevel !== "green") {
705
- statusParts.push(`${theme.fg(healthColor, healthIcon)} ${theme.fg(healthColor, healthSummary)}`);
706
- }
707
- const timeValue = [elapsed, etaShort].filter(Boolean).join(" · ") || "--";
708
- const rowOne = widgetGridColumns(theme, width, [
709
- `${widgetGridLabel(theme, "status", "border")} ${statusParts.join(" ")}`,
710
- `${widgetGridLabel(theme, "unit")} ${theme.fg("text", unitLabel || "--")}`,
711
- `${widgetGridLabel(theme, "spend", "border")} ${theme.fg("dim", formatSmallWidgetSpend())}`,
712
- `${widgetGridLabel(theme, "time")} ${theme.fg("dim", timeValue)}`,
713
- ]);
714
- const target = task
715
- ? `${task.id}: ${task.title}`
716
- : slice
717
- ? `${slice.id}: ${slice.title}`
718
- : unitId;
719
- let taskValue = task?.id ?? "--";
720
- let sliceValue = slice?.id ?? "--";
721
- if (shouldRenderRoadmapProgress(roadmapSlices)) {
722
- const { done, total, activeSliceTasks } = roadmapSlices;
723
- const barWidth = Math.max(4, Math.min(14, Math.floor(width * 0.12)));
724
- const bar = renderProgressBar(theme, done, total, barWidth);
725
- sliceValue = `${bar} ${theme.fg("text", `${done}/${total}`)}`;
726
- if (activeSliceTasks && activeSliceTasks.total > 0) {
727
- const taskNum = isHook
728
- ? Math.max(activeSliceTasks.done, 1)
729
- : Math.min(activeSliceTasks.done + 1, activeSliceTasks.total);
730
- taskValue = `${theme.fg("accent", `${taskNum}`)}${theme.fg("dim", `/${activeSliceTasks.total}`)}`;
731
- }
732
- }
733
- const rowTwo = widgetGridColumns(theme, width, [
734
- `${widgetGridLabel(theme, "phase", "border")} ${theme.fg("dim", unitType)}`,
735
- `${widgetGridLabel(theme, "work")} ${theme.fg("text", target || "--")}`,
736
- `${widgetGridLabel(theme, "task", "border")} ${taskValue}`,
737
- `${widgetGridLabel(theme, "slice")} ${sliceValue}`,
738
- ]);
739
- lines.push(rowOne);
740
- lines.push(rowTwo);
741
- lines.push(...ui.bar());
742
- cachedLines = lines;
743
- cachedWidth = width;
744
- return lines;
745
- }
746
- // ── Mode: full — complete two-column layout ───────────────────
747
- lines.push("");
748
- // Context section: milestone + slice. Footer owns model/cost/context.
749
- const hasContext = !!(mid || (slice && unitType !== "research-milestone" && unitType !== "plan-milestone"));
750
- if (mid) {
751
- lines.push(truncateToWidth(`${pad}${theme.fg("dim", mid.title)}`, width, "…"));
752
- }
753
- if (slice && unitType !== "research-milestone" && unitType !== "plan-milestone") {
754
- lines.push(truncateToWidth(`${pad}${theme.fg("text", theme.bold(`${slice.id}: ${slice.title}`))}`, width, "…"));
755
- }
756
- if (hasContext)
757
- lines.push("");
758
- const target = task ? `${task.id}: ${task.title}` : unitId;
759
- const actionLeft = `${pad}${theme.fg("accent", "▸")} ${theme.fg("accent", verb)} ${theme.fg("text", target)}`;
760
- const tierTag = tierBadge ? theme.fg("dim", `[${tierBadge}] `) : "";
761
- const phaseBadge = `${tierTag}${theme.fg("dim", phaseLabel)}`;
762
- lines.push(rightAlign(actionLeft, phaseBadge, width));
763
- lines.push("");
764
- // Two-column body
765
- const minTwoColWidth = 76;
766
- const roadmapSlices = mid ? getRoadmapSlicesSync() : null;
767
- const taskDetailsCol = roadmapSlices?.taskDetails ?? null;
768
- const useTwoCol = width >= minTwoColWidth && taskDetailsCol !== null && taskDetailsCol.length > 0;
769
- const leftColWidth = useTwoCol
770
- ? Math.floor(width * (width >= 100 ? 0.45 : 0.50))
771
- : width;
772
- const leftLines = [];
773
- if (shouldRenderRoadmapProgress(roadmapSlices)) {
774
- const { done, total, activeSliceTasks } = roadmapSlices;
775
- const barWidth = Math.max(6, Math.min(18, Math.floor(leftColWidth * 0.4)));
776
- const bar = renderProgressBar(theme, done, total, barWidth);
777
- let meta = `${theme.fg("text", `${done}`)}${theme.fg("dim", `/${total} slices`)}`;
778
- if (activeSliceTasks && activeSliceTasks.total > 0) {
779
- const taskNum = isHook
780
- ? Math.max(activeSliceTasks.done, 1)
781
- : Math.min(activeSliceTasks.done + 1, activeSliceTasks.total);
782
- meta += `${theme.fg("dim", " · task ")}${theme.fg("accent", `${taskNum}`)}${theme.fg("dim", `/${activeSliceTasks.total}`)}`;
783
- }
784
- leftLines.push(`${pad}${bar} ${meta}`);
785
- }
786
- // Build right column: task checklist
787
- const rightLines = [];
788
- const maxVisibleTasks = 8;
789
- // Max visible chars for task title text (before ANSI theming)
790
- const maxTaskTitleLen = 45;
791
- function truncTitle(s) {
792
- return s.length > maxTaskTitleLen ? s.slice(0, maxTaskTitleLen - 1) + "…" : s;
793
- }
794
- function formatTaskLine(t, isCurrent) {
795
- const glyph = t.done
796
- ? theme.fg("success", "*")
797
- : isCurrent
798
- ? theme.fg("accent", ">")
799
- : theme.fg("dim", ".");
800
- const id = isCurrent
801
- ? theme.fg("accent", t.id)
802
- : t.done
803
- ? theme.fg("muted", t.id)
804
- : theme.fg("dim", t.id);
805
- const short = truncTitle(t.title);
806
- const title = isCurrent
807
- ? theme.fg("text", short)
808
- : t.done
809
- ? theme.fg("muted", short)
810
- : theme.fg("text", short);
811
- return `${glyph} ${id}: ${title}`;
812
- }
813
- if (useTwoCol && taskDetailsCol) {
814
- for (const t of taskDetailsCol.slice(0, maxVisibleTasks)) {
815
- rightLines.push(formatTaskLine(t, !!(task && t.id === task.id)));
816
- }
817
- if (taskDetailsCol.length > maxVisibleTasks) {
818
- rightLines.push(theme.fg("dim", ` +${taskDetailsCol.length - maxVisibleTasks} more`));
819
- }
820
- }
821
- else if (!useTwoCol && taskDetailsCol && taskDetailsCol.length > 0) {
822
- for (const t of taskDetailsCol.slice(0, maxVisibleTasks)) {
823
- leftLines.push(`${pad}${formatTaskLine(t, !!(task && t.id === task.id))}`);
824
- }
825
- }
826
- // Compose columns
827
- if (useTwoCol) {
828
- const maxRows = Math.max(leftLines.length, rightLines.length);
829
- if (maxRows > 0) {
830
- lines.push("");
831
- for (let i = 0; i < maxRows; i++) {
832
- const left = padRightVisible(truncateToWidth(leftLines[i] ?? "", leftColWidth, "…"), leftColWidth);
833
- const right = rightLines[i] ?? "";
834
- lines.push(`${left}${right}`);
835
- }
836
- }
837
- }
838
- else {
839
- if (leftLines.length > 0) {
840
- lines.push("");
841
- for (const l of leftLines)
842
- lines.push(truncateToWidth(l, width, "…"));
843
- }
844
- }
845
- // ── Auto controls. Footer owns cwd/branch/model/cost/context. ───
846
- lines.push("");
847
- // Step-mode guidance — shown above keyboard hints when auto is paused
848
- if (accessors.isStepMode()) {
849
- lines.push(`${pad}${theme.fg("accent", "→")} ${theme.fg("dim", "/gsd next to advance one step · /gsd status for overview")}`);
850
- }
851
- // Hints line
852
- const hintParts = [];
853
- hintParts.push("esc pause");
854
- hintParts.push(`${formattedShortcutPair("dashboard")} dashboard`);
855
- hintParts.push(`${formattedShortcutPair("parallel")} parallel`);
856
- const hintStr = theme.fg("dim", hintParts.join(" | "));
857
- lines.push(rightAlign("", hintStr, width));
858
- lines.push(...ui.bar());
859
- cachedLines = lines;
860
- cachedWidth = width;
861
- return lines;
862
- },
863
- invalidate() {
864
- cachedLines = undefined;
865
- cachedWidth = undefined;
866
- },
867
- dispose() {
868
- clearInterval(spinnerTimer);
869
- if (progressRefreshTimer)
870
- clearInterval(progressRefreshTimer);
871
- },
872
- };
873
- });
567
+ installGsdProgressStrip(ctx, accessors, unitType, unitId, mid, slice, task, isHook, verb);
568
+ }
569
+ function buildCompletionRollupLines(theme, snapshot, width) {
570
+ const innerWidth = Math.max(8, width - 2);
571
+ const lines = [];
572
+ const add = (line) => {
573
+ if (!line)
574
+ return;
575
+ for (const wrapped of wrapVisibleText(line, innerWidth).slice(0, 12 - lines.length)) {
576
+ lines.push(wrapped);
577
+ }
578
+ };
579
+ if (snapshot.milestoneTitle) {
580
+ add(theme.fg("text", snapshot.milestoneTitle));
581
+ }
582
+ const oneLiner = normalizeRollupText(snapshot.oneLiner);
583
+ if (oneLiner) {
584
+ add(`${theme.fg("accent", "Outcome")} ${theme.fg("text", oneLiner)}`);
585
+ }
586
+ const changed = [
587
+ ...(snapshot.successCriteriaResults ? [snapshot.successCriteriaResults] : []),
588
+ ...(snapshot.requirementOutcomes ? [snapshot.requirementOutcomes] : []),
589
+ ...(snapshot.keyDecisions ?? []),
590
+ ].map(normalizeRollupText).filter((v) => !!v).slice(0, 4);
591
+ if (changed.length > 0) {
592
+ add(theme.fg("accent", "What changed"));
593
+ for (const item of changed)
594
+ add(` - ${theme.fg("text", item)}`);
595
+ }
596
+ const verification = [
597
+ snapshot.definitionOfDoneResults,
598
+ snapshot.deviations ? `Deviations: ${snapshot.deviations}` : null,
599
+ snapshot.followUps ? `Follow-ups: ${snapshot.followUps}` : null,
600
+ ].map(normalizeRollupText).filter((v) => !!v);
601
+ if (verification.length > 0 || (snapshot.keyFiles?.length ?? 0) > 0) {
602
+ add(theme.fg("accent", "Verification"));
603
+ for (const item of verification.slice(0, 3))
604
+ add(` - ${theme.fg("text", item)}`);
605
+ const files = (snapshot.keyFiles ?? []).map(normalizeRollupText).filter((v) => !!v).slice(0, 4);
606
+ if (files.length > 0) {
607
+ add(` ${theme.fg("accent", "Files:")} ${theme.fg("text", files.join("; "))}`);
608
+ }
609
+ }
610
+ const lessons = (snapshot.lessonsLearned ?? []).map(normalizeRollupText).filter((v) => !!v).slice(0, 2);
611
+ if (lessons.length > 0) {
612
+ add(`${theme.fg("accent", "Lessons:")} ${theme.fg("text", lessons.join("; "))}`);
613
+ }
614
+ const nextAction = snapshot.allMilestonesComplete
615
+ ? snapshot.unmappedActiveRequirements && snapshot.unmappedActiveRequirements > 0
616
+ ? `Review ${snapshot.unmappedActiveRequirements} unmapped active requirement${snapshot.unmappedActiveRequirements === 1 ? "" : "s"}, then start a new milestone when ready.`
617
+ : "Review the roll-up, then start a new milestone when ready."
618
+ : "Review the roll-up, inspect status, or continue to the next milestone.";
619
+ add(`${theme.fg("success", "Next")} ${theme.fg("text", nextAction)}`);
620
+ if ((snapshot.requirementsBacklogPreview?.length ?? 0) > 0) {
621
+ add(theme.fg("accent", "Requirements backlog"));
622
+ for (const line of snapshot.requirementsBacklogPreview ?? []) {
623
+ add(` ${theme.fg("text", line)}`);
624
+ }
625
+ }
626
+ const commands = snapshot.allMilestonesComplete
627
+ ? snapshot.unmappedActiveRequirements && snapshot.unmappedActiveRequirements > 0
628
+ ? ["/gsd to review requirements backlog", "/gsd status for overview", "/gsd visualize to inspect", "/gsd start for new work"]
629
+ : ["/gsd status for overview", "/gsd visualize to inspect", "/gsd notifications for history", "/gsd start for new work"]
630
+ : ["/gsd status for overview", "/gsd visualize to inspect", "/gsd notifications for history", "/gsd auto for next milestone"];
631
+ const footerCommands = theme.fg("dim", commands.join(" · "));
632
+ if (snapshot.reason) {
633
+ add(theme.fg("dim", snapshot.reason));
634
+ }
635
+ return { lines, footerCommands };
874
636
  }
875
637
  export function setCompletionProgressWidget(ctx, snapshot) {
876
638
  if (!ctx.hasUI)
877
639
  return;
878
- const widgetKey = "gsd-progress";
879
640
  clearAutoOutcomeWidget(ctx);
641
+ // Clear the structured GSD progress strip so it does not linger behind
642
+ // the completion widget (the two use separate display channels).
643
+ ctx.ui?.setGsdProgress?.(undefined);
644
+ ctx.ui.setWidget("gsd-progress", undefined);
880
645
  if (typeof ctx.ui?.setHeader === "function") {
881
646
  ctx.ui.setHeader(() => ({
882
647
  render() { return []; },
@@ -886,113 +651,20 @@ export function setCompletionProgressWidget(ctx, snapshot) {
886
651
  if (typeof ctx.ui?.setStatus === "function") {
887
652
  ctx.ui.setStatus("gsd-step", undefined);
888
653
  }
889
- ctx.ui.setWidget(widgetKey, (_tui, theme) => ({
654
+ ctx.ui.setWidget("gsd-outcome", (_tui, theme) => ({
890
655
  render(width) {
891
- const ui = makeUI(theme, width);
892
- const pad = INDENT.base;
893
- const lines = [];
894
- const contentWidth = Math.max(20, width - visibleWidth(pad));
895
- const add = (line = "") => {
896
- lines.push(line ? truncateToWidth(`${pad}${line}`, width, "…") : "");
897
- };
898
- const addSection = (label, value, indent = "") => {
899
- const clean = normalizeRollupText(value);
900
- if (!clean)
901
- return;
902
- add(`${indent}${theme.fg("accent", label)} ${theme.fg("text", truncateToWidth(clean, contentWidth - indent.length - label.length - 1, "…"))}`);
903
- };
904
- const addList = (label, values, limit, indent = "") => {
905
- const clean = (values ?? []).map(normalizeRollupText).filter((v) => !!v);
906
- if (clean.length === 0)
907
- return;
908
- const shown = clean.slice(0, limit);
909
- const more = clean.length > shown.length ? ` (+${clean.length - shown.length} more)` : "";
910
- add(`${indent}${theme.fg("accent", label)} ${theme.fg("text", truncateToWidth(shown.join("; ") + more, contentWidth - indent.length - label.length - 1, "…"))}`);
911
- };
912
- lines.push(...ui.bar());
913
656
  const elapsed = formatAutoElapsed(snapshot.startedAt);
914
657
  const heading = snapshot.allMilestonesComplete
915
658
  ? "All milestones complete"
916
659
  : snapshot.milestoneId
917
660
  ? `Milestone ${snapshot.milestoneId} roll-up`
918
661
  : "Milestone roll-up";
919
- lines.push(rightAlign(`${pad}${theme.fg("accent", theme.bold(heading))}`, elapsed ? theme.fg("dim", elapsed) : "", width));
920
- if (snapshot.milestoneTitle) {
921
- add(theme.fg("text", snapshot.milestoneTitle));
922
- }
923
- lines.push("");
924
- add(theme.fg("accent", "Outcome"));
925
- addSection("", snapshot.oneLiner, " ");
926
- const changed = [
927
- ...(snapshot.successCriteriaResults ? [snapshot.successCriteriaResults] : []),
928
- ...(snapshot.requirementOutcomes ? [snapshot.requirementOutcomes] : []),
929
- ...(snapshot.keyDecisions ?? []),
930
- ].map(normalizeRollupText).filter((v) => !!v).slice(0, 4);
931
- if (changed.length > 0) {
932
- lines.push("");
933
- add(theme.fg("accent", "What changed"));
934
- for (const item of changed)
935
- add(` - ${theme.fg("text", item)}`);
936
- }
937
- const verification = [
938
- snapshot.definitionOfDoneResults,
939
- snapshot.deviations ? `Deviations: ${snapshot.deviations}` : null,
940
- snapshot.followUps ? `Follow-ups: ${snapshot.followUps}` : null,
941
- ].map(normalizeRollupText).filter((v) => !!v);
942
- if (verification.length > 0 || (snapshot.keyFiles?.length ?? 0) > 0) {
943
- lines.push("");
944
- add(theme.fg("accent", "Verification"));
945
- for (const item of verification.slice(0, 3))
946
- add(` - ${theme.fg("text", item)}`);
947
- addList("Files:", snapshot.keyFiles, 4, " ");
948
- }
949
- if ((snapshot.lessonsLearned?.length ?? 0) > 0) {
950
- lines.push("");
951
- addList("Lessons:", snapshot.lessonsLearned, 2);
952
- }
953
- const hasSliceTotals = typeof snapshot.completedSlices === "number" && typeof snapshot.totalSlices === "number" && snapshot.totalSlices > 0;
954
- lines.push("");
955
- const stats = [];
956
- if (hasSliceTotals)
957
- stats.push(theme.fg("success", `${snapshot.completedSlices}/${snapshot.totalSlices} slices`));
958
- if (snapshot.unitCount > 0)
959
- stats.push(theme.fg("dim", `${snapshot.unitCount} units`));
960
- if (snapshot.totalTokens > 0)
961
- stats.push(theme.fg("dim", `${formatWidgetTokens(snapshot.totalTokens)} tokens`));
962
- if (snapshot.totalCost > 0)
963
- stats.push(theme.fg("warning", `$${snapshot.totalCost.toFixed(2)}`));
964
- if (typeof snapshot.cacheHitRate === "number") {
965
- const hitColor = snapshot.cacheHitRate >= 70 ? "success" : snapshot.cacheHitRate >= 40 ? "warning" : "error";
966
- stats.push(theme.fg(hitColor, `${Math.round(snapshot.cacheHitRate)}% cache hit`));
967
- }
968
- if (stats.length > 0) {
969
- add(`${theme.fg("accent", "Run totals")} ${stats.join(theme.fg("dim", " · "))}`);
970
- }
971
- lines.push("");
972
- const nextAction = snapshot.allMilestonesComplete
973
- ? snapshot.unmappedActiveRequirements && snapshot.unmappedActiveRequirements > 0
974
- ? `Review ${snapshot.unmappedActiveRequirements} unmapped active requirement${snapshot.unmappedActiveRequirements === 1 ? "" : "s"}, then start a new milestone when ready.`
975
- : "Review the roll-up, then start a new milestone when ready."
976
- : "Review the roll-up, inspect status, or continue to the next milestone.";
977
- const commands = snapshot.allMilestonesComplete
978
- ? snapshot.unmappedActiveRequirements && snapshot.unmappedActiveRequirements > 0
979
- ? ["/gsd to review requirements backlog", "/gsd status for overview", "/gsd visualize to inspect", "/gsd start for new work"]
980
- : ["/gsd status for overview", "/gsd visualize to inspect", "/gsd notifications for history", "/gsd start for new work"]
981
- : ["/gsd status for overview", "/gsd visualize to inspect", "/gsd notifications for history", "/gsd auto for next milestone"];
982
- add(`${theme.fg("success", "Next")} ${theme.fg("text", nextAction)}`);
983
- if ((snapshot.requirementsBacklogPreview?.length ?? 0) > 0) {
984
- lines.push("");
985
- add(theme.fg("accent", "Requirements backlog"));
986
- for (const line of snapshot.requirementsBacklogPreview ?? []) {
987
- add(` ${theme.fg("text", line)}`);
988
- }
989
- }
990
- add(theme.fg("dim", commands.join(" · ")));
991
- const location = snapshot.basePath ? theme.fg("dim", snapshot.basePath) : "";
992
- const reason = theme.fg("dim", snapshot.reason);
993
- lines.push(rightAlign(`${pad}${truncateToWidth(location, Math.max(0, width - 32), "…")}`, reason, width));
994
- lines.push(...ui.bar());
995
- return lines;
662
+ const statusLine = `${theme.fg("success", "✓")} ${theme.fg("text", heading)}`;
663
+ const { lines, footerCommands } = buildCompletionRollupLines(theme, snapshot, width);
664
+ return renderPlainOutcome(theme, width, statusLine, lines, {
665
+ headerRight: elapsed ? theme.fg("dim", elapsed) : undefined,
666
+ footerRight: footerCommands,
667
+ });
996
668
  },
997
669
  invalidate() { },
998
670
  dispose() { },
@@ -1001,6 +673,8 @@ export function setCompletionProgressWidget(ctx, snapshot) {
1001
673
  export function setAutoOutcomeWidget(ctx, snapshot) {
1002
674
  if (!ctx.hasUI)
1003
675
  return;
676
+ ctx.ui?.setGsdProgress?.(undefined);
677
+ ctx.ui.setWidget("gsd-progress", undefined);
1004
678
  ctx.ui.setWidget("gsd-outcome", (_tui, theme) => ({
1005
679
  render(width) {
1006
680
  const color = snapshot.status === "failed" || snapshot.status === "blocked"
@@ -1013,37 +687,49 @@ export function setAutoOutcomeWidget(ctx, snapshot) {
1013
687
  : snapshot.status === "blocked" ? "!"
1014
688
  : snapshot.status === "paused" ? "||"
1015
689
  : "●";
1016
- // renderPanel indents body lines by 2; mirror that for wrap width.
1017
- const innerWidth = Math.max(8, width - 2);
1018
- const maxLines = 7;
1019
- const lines = [];
1020
690
  const elapsed = snapshot.startedAt ? formatAutoElapsed(snapshot.startedAt) : "";
1021
- const heading = `${theme.fg(color, icon)} ${theme.fg("accent", theme.bold("GSD"))} ${theme.fg("text", snapshot.title)}`;
1022
- // Elapsed rides inline after the title on the header rule.
1023
- const title = elapsed ? `${heading} ${theme.fg("dim", elapsed)}` : heading;
691
+ const statusLine = `${theme.fg(color, icon)} ${theme.fg("text", snapshot.title)}`;
1024
692
  const commands = snapshot.commands?.filter(Boolean) ?? [];
1025
- const commandLine = commands.length > 0 ? theme.fg("dim", commands.join(" · ")) : null;
1026
- const addWrapped = (text, prefix = "") => {
1027
- const reserve = commandLine ? 1 : 0;
1028
- const remaining = Math.max(0, maxLines - reserve - lines.length);
1029
- if (remaining === 0)
693
+ const commandLine = commands.length > 0 ? theme.fg("dim", commands.join(" · ")) : undefined;
694
+ const innerWidth = Math.max(8, width);
695
+ const maxLines = 7;
696
+ const splitRows = [];
697
+ let commandsPlaced = false;
698
+ const pushLeft = (left) => {
699
+ if (splitRows.length >= maxLines - (commandLine ? 1 : 0))
1030
700
  return;
1031
- const available = Math.max(8, innerWidth - visibleWidth(prefix));
1032
- for (const [idx, line] of wrapVisibleText(text, available).slice(0, remaining).entries()) {
1033
- lines.push(`${idx === 0 ? prefix : " ".repeat(visibleWidth(prefix))}${line}`);
1034
- }
701
+ splitRows.push({ left });
1035
702
  };
1036
703
  if (snapshot.detail) {
1037
- addWrapped(snapshot.detail, `${theme.fg("dim", "Reason")} `);
704
+ for (const line of wrapVisibleText(snapshot.detail, innerWidth).slice(0, maxLines)) {
705
+ pushLeft(theme.fg("text", line));
706
+ }
1038
707
  }
1039
708
  if (snapshot.unitLabel) {
1040
- addWrapped(snapshot.unitLabel, `${theme.fg("dim", "Last")} `);
709
+ const lastLeft = theme.fg("dim", "Last · ") + theme.fg("text", snapshot.unitLabel);
710
+ if (commandLine &&
711
+ visibleWidth(lastLeft) + visibleWidth(commandLine) + 2 <= innerWidth &&
712
+ splitRows.length < maxLines) {
713
+ splitRows.push({ left: lastLeft, right: commandLine });
714
+ commandsPlaced = true;
715
+ }
716
+ else {
717
+ pushLeft(lastLeft);
718
+ }
1041
719
  }
1042
- addWrapped(snapshot.nextAction, `${theme.fg("success", "Next")} `);
1043
- if (commandLine && lines.length < maxLines) {
1044
- lines.push(commandLine);
720
+ const nextPrefix = theme.fg("success", "Next · ");
721
+ const nextPrefixWidth = visibleWidth(nextPrefix);
722
+ for (const [idx, line] of wrapVisibleText(snapshot.nextAction, Math.max(8, innerWidth - nextPrefixWidth)).entries()) {
723
+ if (splitRows.length >= maxLines - (commandLine && !commandsPlaced ? 1 : 0))
724
+ break;
725
+ const lead = idx === 0 ? nextPrefix : " ".repeat(nextPrefixWidth);
726
+ pushLeft(theme.fg("text", lead + line));
1045
727
  }
1046
- return renderPanel(theme, title, lines, width, { ruleColor: color });
728
+ return renderPlainOutcome(theme, width, statusLine, [], {
729
+ headerRight: elapsed ? theme.fg("dim", elapsed) : undefined,
730
+ splitRows,
731
+ footerRight: commandLine && !commandsPlaced ? commandLine : undefined,
732
+ });
1047
733
  },
1048
734
  invalidate() { },
1049
735
  dispose() { },
@@ -1111,3 +797,141 @@ function extractMessageText(value) {
1111
797
  }
1112
798
  return null;
1113
799
  }
800
+ function buildGsdProgressPayload(accessors, unitType, unitId, mid, slice, task, isHook, verb, runtimeRecord) {
801
+ const mode = getWidgetMode();
802
+ if (mode === "off")
803
+ return undefined;
804
+ const elapsed = formatAutoElapsed(accessors.getAutoStartTime());
805
+ const eta = estimateTimeRemaining();
806
+ const etaShort = eta ? eta.replace(" remaining", " left") : undefined;
807
+ const modeTag = accessors.isStepMode() ? "NEXT" : "AUTO";
808
+ const target = task
809
+ ? `${task.id}: ${task.title}`
810
+ : slice
811
+ ? `${slice.id}: ${slice.title}`
812
+ : unitId;
813
+ const phase = `${verb} ${target}`.trim();
814
+ const roadmapSlices = mid ? getRoadmapSlicesSync() : null;
815
+ let taskProgress;
816
+ let sliceProgress;
817
+ if (shouldRenderRoadmapProgress(roadmapSlices)) {
818
+ if (roadmapSlices.total > 0) {
819
+ sliceProgress = { done: roadmapSlices.done, total: roadmapSlices.total };
820
+ }
821
+ const { activeSliceTasks } = roadmapSlices;
822
+ if (activeSliceTasks && activeSliceTasks.total > 0) {
823
+ const taskNum = isHook
824
+ ? Math.max(activeSliceTasks.done, 1)
825
+ : Math.min(activeSliceTasks.done + 1, activeSliceTasks.total);
826
+ taskProgress = { done: taskNum, total: activeSliceTasks.total };
827
+ }
828
+ }
829
+ const runtimeSignal = formatRuntimeHealthSignal(runtimeRecord);
830
+ const score = computeProgressScore();
831
+ let healthSummary;
832
+ if (mode !== "min") {
833
+ if (runtimeSignal?.detail) {
834
+ healthSummary = runtimeSignal.detail;
835
+ }
836
+ else if (score.level !== "green") {
837
+ healthSummary = score.signals
838
+ .filter((signal) => signal.kind === "negative")
839
+ .slice(0, 2)
840
+ .map((signal) => signal.label)
841
+ .join(" · ");
842
+ }
843
+ }
844
+ const unitLabel = unitId || [mid?.id, slice?.id, task?.id].filter(Boolean).join("/");
845
+ return {
846
+ phase,
847
+ modeTag,
848
+ taskProgress,
849
+ sliceProgress,
850
+ sliceLabel: slice?.id,
851
+ taskLabel: task?.id,
852
+ unitLabel,
853
+ elapsed,
854
+ eta: etaShort,
855
+ healthSummary,
856
+ path: accessors.getBasePath(),
857
+ widgetMode: mode,
858
+ };
859
+ }
860
+ function installGsdProgressStrip(ctx, accessors, unitType, unitId, mid, slice, task, isHook, verb) {
861
+ if (!ctx.hasUI || typeof ctx.ui?.setGsdProgress !== "function")
862
+ return;
863
+ ctx.ui.setWidget("gsd-progress", undefined);
864
+ let cachedRuntimeRecord = null;
865
+ const refreshRuntimeRecord = () => {
866
+ try {
867
+ cachedRuntimeRecord = readUnitRuntimeRecord(accessors.getBasePath(), unitType, unitId);
868
+ }
869
+ catch {
870
+ cachedRuntimeRecord = null;
871
+ }
872
+ };
873
+ refreshRuntimeRecord();
874
+ let progressRefreshTimer;
875
+ let elapsedRefreshTimer;
876
+ const dispose = () => {
877
+ if (progressRefreshTimer !== undefined) {
878
+ clearInterval(progressRefreshTimer);
879
+ progressRefreshTimer = undefined;
880
+ }
881
+ if (elapsedRefreshTimer !== undefined) {
882
+ clearInterval(elapsedRefreshTimer);
883
+ elapsedRefreshTimer = undefined;
884
+ }
885
+ // Do not call setGsdProgress here: callers (resetExtensionUI, unit transition,
886
+ // setCompletionProgressWidget) clear gsdProgressState directly, and calling it
887
+ // here would re-enter setGsdProgress which calls dispose again — infinite recursion.
888
+ };
889
+ const publish = (registerDispose = false) => {
890
+ if (accessors.isSessionSwitching()) {
891
+ // On initial install (registerDispose) clear any stale strip from the
892
+ // previous unit. On timer refreshes, skip silently — calling
893
+ // setGsdProgress(undefined) would run dispose() and permanently clear
894
+ // the refresh timers, leaving the strip blank after the switch.
895
+ if (registerDispose) {
896
+ ctx.ui.setGsdProgress(undefined);
897
+ }
898
+ return false;
899
+ }
900
+ ctx.ui.setGsdProgress(buildGsdProgressPayload(accessors, unitType, unitId, mid, slice, task, isHook, verb, cachedRuntimeRecord), registerDispose ? dispose : undefined);
901
+ return true;
902
+ };
903
+ const startElapsedRefreshTimer = () => {
904
+ if (elapsedRefreshTimer !== undefined)
905
+ return;
906
+ elapsedRefreshTimer = setInterval(() => {
907
+ try {
908
+ publish();
909
+ }
910
+ catch (err) {
911
+ logWarning("dashboard", `progress strip elapsed refresh failed: ${getErrorMessage(err)}`);
912
+ }
913
+ }, 1_000);
914
+ elapsedRefreshTimer.unref?.();
915
+ };
916
+ const startProgressRefreshTimer = () => {
917
+ if (progressRefreshTimer !== undefined)
918
+ return;
919
+ progressRefreshTimer = setInterval(() => {
920
+ try {
921
+ if (mid) {
922
+ updateSliceProgressCache(accessors.getBasePath(), mid.id, slice?.id);
923
+ }
924
+ refreshRuntimeRecord();
925
+ publish();
926
+ }
927
+ catch (err) {
928
+ logWarning("dashboard", `progress strip refresh failed: ${getErrorMessage(err)}`);
929
+ }
930
+ }, 15_000);
931
+ progressRefreshTimer.unref?.();
932
+ };
933
+ if (publish(true)) {
934
+ startElapsedRefreshTimer();
935
+ startProgressRefreshTimer();
936
+ }
937
+ }