@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
@@ -0,0 +1,335 @@
1
+ // gsd-pi — Orchestrator advance() log coverage.
2
+ //
3
+ // The orchestrator's private methods (findPriorSliceCompletionBlocker,
4
+ // emitUokGate, mergePendingCompleteMilestone) each emit `engine` warnings on
5
+ // their failure paths (orchestrator.ts:660 / :538 / :637). They are only
6
+ // reachable by driving advance() through a real AutoOrchestrator constructed
7
+ // via createAutoOrchestrator. This file builds a minimal fixture (git repo +
8
+ // seeded DB + session lock + registry dispatch rule, modelled on
9
+ // auto-orchestrator.test.ts's makeFixture) and drives advance() into each
10
+ // branch, asserting the log output.
11
+
12
+ import { test } from "node:test";
13
+ import assert from "node:assert/strict";
14
+ import { execFileSync } from "node:child_process";
15
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync } from "node:fs";
16
+ import { tmpdir } from "node:os";
17
+ import { dirname, join } from "node:path";
18
+
19
+ import {
20
+ createAutoOrchestrator,
21
+ _setProjectionRebuildFnForTests,
22
+ type OrchestratorContext,
23
+ } from "../auto/orchestrator.ts";
24
+ import type { AutoSessionContext } from "../auto/contracts.ts";
25
+ import { RuleRegistry, setRegistry, resetRegistry } from "../rule-registry.ts";
26
+ import type { UnifiedRule } from "../rule-types.ts";
27
+ import {
28
+ closeDatabase,
29
+ insertAssessment,
30
+ insertMilestone,
31
+ insertSlice,
32
+ insertTask,
33
+ openDatabase,
34
+ _getAdapter,
35
+ } from "../gsd-db.ts";
36
+ import { resolveExpectedArtifactPath } from "../auto-artifact-paths.ts";
37
+ import { AutoSession } from "../auto/session.ts";
38
+ import { acquireSessionLock, releaseSessionLock } from "../session-lock.ts";
39
+ import { invalidateAllCaches } from "../cache.ts";
40
+ import { invalidateStateCache } from "../state.ts";
41
+ import {
42
+ drainLogs,
43
+ setStderrLoggingEnabled,
44
+ _resetLogs,
45
+ type LogEntry,
46
+ } from "../workflow-logger.ts";
47
+
48
+ const SESSION_CONTEXT: AutoSessionContext = { basePath: "/tmp/project", trigger: "manual" };
49
+
50
+ function gitInit(base: string): void {
51
+ execFileSync("git", ["init", "--initial-branch=main"], { cwd: base, stdio: "ignore" });
52
+ execFileSync("git", ["config", "user.email", "test@test.com"], { cwd: base, stdio: "ignore" });
53
+ execFileSync("git", ["config", "user.name", "Test"], { cwd: base, stdio: "ignore" });
54
+ writeFileSync(join(base, ".gitkeep"), "");
55
+ execFileSync("git", ["add", "."], { cwd: base, stdio: "ignore" });
56
+ execFileSync("git", ["commit", "-m", "initial"], { cwd: base, stdio: "ignore" });
57
+ }
58
+
59
+ interface FixtureOptions {
60
+ /** Override the session's originalBasePath (used by findPriorSliceCompletionBlocker's guard). */
61
+ originalBasePath?: string;
62
+ /** The dispatch decision the registry rule returns. */
63
+ dispatch?: UnifiedRule["where"];
64
+ /** Drop the gate_runs table after seeding so emitUokGate's insertGateRun throws (:538 path). */
65
+ dropGateRuns?: boolean;
66
+ }
67
+
68
+ interface Fixture {
69
+ base: string;
70
+ session: AutoSession;
71
+ orchestrator: ReturnType<typeof createAutoOrchestrator>;
72
+ cleanup(): void;
73
+ }
74
+
75
+ function makeFixture(opts: FixtureOptions = {}): Fixture {
76
+ const base = mkdtempSync(join(tmpdir(), "gsd-orch-logs-"));
77
+ gitInit(base);
78
+
79
+ const milestoneDir = join(base, ".gsd", "milestones", "M001");
80
+ const sliceDir = join(milestoneDir, "slices", "S01");
81
+ mkdirSync(join(sliceDir, "tasks"), { recursive: true });
82
+
83
+ invalidateAllCaches();
84
+ invalidateStateCache();
85
+ openDatabase(join(base, ".gsd", "gsd.db"));
86
+ insertMilestone({ id: "M001", title: "Milestone", status: "active" });
87
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Slice", status: "active", risk: "low", depends: [], demo: "", sequence: 1 });
88
+ insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", title: "Task", status: "active" });
89
+ if (opts.dropGateRuns) {
90
+ // Break the gate_runs sink so UokGateRunner.run → insertGateRun throws,
91
+ // exercising emitUokGate's catch (orchestrator.ts:538).
92
+ _getAdapter()!.exec("DROP TABLE gate_runs");
93
+ }
94
+
95
+ writeFileSync(
96
+ join(milestoneDir, "M001-ROADMAP.md"),
97
+ ["# M001: Milestone", "", "**Vision:** Fixture", "", "## Slices", "", "- [ ] **S01: Slice** `risk:low` `depends:[]`", ""].join("\n"),
98
+ );
99
+ writeFileSync(
100
+ join(sliceDir, "S01-PLAN.md"),
101
+ ["# S01: Slice", "", "**Goal:** g", "**Demo:** d", "", "## Tasks", "", "- [ ] **T01: Task** `est:1h`", ""].join("\n"),
102
+ );
103
+
104
+ acquireSessionLock(base);
105
+
106
+ const session = new AutoSession();
107
+ session.basePath = base;
108
+ // originalBasePath feeds resolveWorktreeProjectRoot inside
109
+ // findPriorSliceCompletionBlocker → getMainBranch(guardBasePath). Pointing it
110
+ // at a non-git directory makes branch discovery throw → :660 warning.
111
+ session.originalBasePath = opts.originalBasePath ?? base;
112
+ session.currentMilestoneId = "M001";
113
+ session.resourceVersionOnStart = null;
114
+
115
+ const ctx: OrchestratorContext = {
116
+ ctx: { model: {}, modelRegistry: { getAll: () => [], getAvailable: () => [] }, ui: { notify() {} } } as never,
117
+ pi: { getActiveTools: () => [] } as never,
118
+ dispatchBasePath: base,
119
+ runtimeBasePath: base,
120
+ session,
121
+ };
122
+
123
+ const rule: UnifiedRule = {
124
+ name: "fixture-dispatch",
125
+ when: "dispatch",
126
+ evaluation: "first-match",
127
+ where: opts.dispatch ?? (async () => ({
128
+ action: "dispatch",
129
+ unitType: "execute-task",
130
+ unitId: "M001/S01/T01",
131
+ prompt: "fixture-prompt",
132
+ })),
133
+ then: (r) => r,
134
+ };
135
+ setRegistry(new RuleRegistry([rule]));
136
+
137
+ const orchestrator = createAutoOrchestrator(ctx);
138
+
139
+ return {
140
+ base,
141
+ session,
142
+ orchestrator,
143
+ cleanup() {
144
+ resetRegistry();
145
+ try { releaseSessionLock(base); } catch { /* */ }
146
+ try { closeDatabase(); } catch { /* */ }
147
+ try { rmSync(base, { recursive: true, force: true }); } catch { /* */ }
148
+ },
149
+ };
150
+ }
151
+
152
+ /** Capture log entries emitted during fn, with stderr suppressed. */
153
+ async function captureLogs<T>(fn: () => Promise<T>): Promise<{ result: T; logs: LogEntry[] }> {
154
+ const previous = setStderrLoggingEnabled(false);
155
+ _resetLogs();
156
+ try {
157
+ const result = await fn();
158
+ return { result, logs: drainLogs() };
159
+ } finally {
160
+ _resetLogs();
161
+ setStderrLoggingEnabled(previous);
162
+ }
163
+ }
164
+
165
+ // orchestrator.ts:660 — findPriorSliceCompletionBlocker catches a getMainBranch
166
+ // failure and logs `branch discovery failed, falling back to main`. Triggered
167
+ // by pointing session.originalBasePath at a non-git directory.
168
+ test("advance() logs an engine warning when branch discovery fails (orchestrator.ts:660)", async (t) => {
169
+ // A second temp dir that is deliberately NOT a git repo.
170
+ const nonGit = mkdtempSync(join(tmpdir(), "gsd-orch-logs-nongit-"));
171
+ const f = makeFixture({ originalBasePath: nonGit });
172
+ t.after(() => {
173
+ f.cleanup();
174
+ rmSync(nonGit, { recursive: true, force: true });
175
+ });
176
+
177
+ const { logs } = await captureLogs(() => f.orchestrator.advance());
178
+
179
+ const branchWarn = logs.find(
180
+ (e) => e.component === "engine" && e.severity === "warn" && /branch discovery failed/u.test(e.message),
181
+ );
182
+ assert.ok(
183
+ branchWarn,
184
+ "an engine warning must be logged when getMainBranch fails (got: " +
185
+ logs.filter((e) => e.component === "engine").map((e) => e.message).join(" | ") + ")",
186
+ );
187
+ assert.match(branchWarn!.message, /branch discovery failed, falling back to main/u);
188
+ });
189
+
190
+ // orchestrator.ts:538 — emitUokGate catches a UokGateRunner.run failure and logs
191
+ // `uok gate emit failed`. Gates are enabled by default (uok.gates.enabled ?? true),
192
+ // and runner.run persists via insertGateRun; dropping the gate_runs table makes
193
+ // that persistence throw, surfacing through the catch.
194
+ test("advance() logs an engine warning when the uok gate emit fails (orchestrator.ts:538)", async (t) => {
195
+ const f = makeFixture({ dropGateRuns: true });
196
+ t.after(() => f.cleanup());
197
+
198
+ const { logs } = await captureLogs(() => f.orchestrator.advance());
199
+
200
+ const uokFail = logs.find(
201
+ (e) => e.component === "engine" && e.severity === "warn" && /uok gate emit failed/u.test(e.message),
202
+ );
203
+ assert.ok(
204
+ uokFail,
205
+ "an engine warning must be logged when UokGateRunner.run fails (got: " +
206
+ logs.filter((e) => e.component === "engine").map((e) => e.message).join(" | ") + ")",
207
+ );
208
+ assert.match(uokFail!.message, /uok gate emit failed/u);
209
+ assert.equal(uokFail!.context?.file, "orchestrator.ts");
210
+ assert.ok(uokFail!.context?.gateId, "the failing gate id must be captured in context");
211
+ });
212
+
213
+ // orchestrator.ts:637 — mergePendingCompleteMilestone catches a
214
+ // rebuildMarkdownProjectionsFromDb failure after the system-owned milestone
215
+ // merge and logs `markdown projection rebuild after settlement merge failed`.
216
+ // Reached only when advance() hits a merge-pending settlement (auto-worktree,
217
+ // complete milestone, proven closeout, no remaining units). We build that state
218
+ // (real git worktree + closed milestone + SUMMARY artifact, modelled on
219
+ // milestone-settlement.test.ts), inject a throwing rebuild via the test seam,
220
+ // and assert the engine warning.
221
+ test("advance() logs an engine warning when the post-settlement projection rebuild fails (orchestrator.ts:637)", async (t) => {
222
+ const projectRoot = mkdtempSync(join(tmpdir(), "gsd-orch-logs-settle-"));
223
+ // Real git repo at the project root.
224
+ execFileSync("git", ["init", "-b", "main"], { cwd: projectRoot, stdio: "ignore" });
225
+ execFileSync("git", ["config", "user.email", "test@test.com"], { cwd: projectRoot, stdio: "ignore" });
226
+ execFileSync("git", ["config", "user.name", "Test"], { cwd: projectRoot, stdio: "ignore" });
227
+ writeFileSync(join(projectRoot, "README.md"), "# fixture\n");
228
+ execFileSync("git", ["add", "."], { cwd: projectRoot, stdio: "ignore" });
229
+ execFileSync("git", ["commit", "-m", "chore: init"], { cwd: projectRoot, stdio: "ignore" });
230
+
231
+ // Auto-worktree for M001 — required so evaluateAllCompleteSettlement returns
232
+ // merge-pending (isActiveUnmergedWorktree must be true).
233
+ const worktree = join(projectRoot, ".gsd", "worktrees", "M001");
234
+ mkdirSync(dirname(worktree), { recursive: true });
235
+ execFileSync("git", ["worktree", "add", "-b", "milestone/M001", worktree, "HEAD"], { cwd: projectRoot, stdio: "ignore" });
236
+
237
+ // Seed a closed milestone + proven closeout SUMMARY so proveMilestoneCloseout
238
+ // passes and the settlement resolves to merge-pending.
239
+ mkdirSync(join(projectRoot, ".gsd"), { recursive: true });
240
+ invalidateAllCaches();
241
+ invalidateStateCache();
242
+ openDatabase(join(projectRoot, ".gsd", "gsd.db"));
243
+ insertMilestone({ id: "M001", title: "Milestone One", status: "complete" });
244
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Slice One", status: "complete" });
245
+ insertTask({
246
+ id: "T01",
247
+ sliceId: "S01",
248
+ milestoneId: "M001",
249
+ title: "Task One",
250
+ status: "complete",
251
+ verificationResult: "passed",
252
+ });
253
+ insertAssessment({
254
+ path: ".gsd/milestones/M001/M001-VALIDATION.md",
255
+ milestoneId: "M001",
256
+ status: "pass",
257
+ scope: "milestone-validation",
258
+ fullContent: "verdict: pass\n",
259
+ });
260
+ // Create the milestone projection dir in the worktree BEFORE resolving the
261
+ // summary artifact path (resolveExpectedArtifactPath needs the dir to exist).
262
+ const milestoneProjDir = join(worktree, ".gsd", "milestones", "M001");
263
+ mkdirSync(milestoneProjDir, { recursive: true });
264
+ const summaryPath = resolveExpectedArtifactPath("complete-milestone", "M001", worktree);
265
+ assert.ok(summaryPath, "complete-milestone summary path must resolve");
266
+ mkdirSync(dirname(summaryPath), { recursive: true });
267
+ writeFileSync(summaryPath, "# Milestone One\n\nComplete.\n");
268
+
269
+ acquireSessionLock(projectRoot);
270
+
271
+ const session = new AutoSession();
272
+ session.basePath = worktree;
273
+ session.originalBasePath = projectRoot;
274
+ session.currentMilestoneId = "M001";
275
+ session.resourceVersionOnStart = null;
276
+
277
+ const ctx: OrchestratorContext = {
278
+ ctx: { model: {}, modelRegistry: { getAll: () => [], getAvailable: () => [] }, ui: { notify() {} } } as never,
279
+ pi: { getActiveTools: () => [] } as never,
280
+ dispatchBasePath: worktree,
281
+ runtimeBasePath: worktree,
282
+ session,
283
+ };
284
+
285
+ // Registry rule returns skip (no remaining units) so advance() reaches the
286
+ // no-remaining-units settlement branch and calls mergePendingCompleteMilestone.
287
+ const rule: UnifiedRule = {
288
+ name: "settle-no-units",
289
+ when: "dispatch",
290
+ evaluation: "first-match",
291
+ where: async () => ({ action: "skip", matchedRule: "settle-no-units" }),
292
+ then: (r) => r,
293
+ };
294
+ setRegistry(new RuleRegistry([rule]));
295
+
296
+ const orchestrator = createAutoOrchestrator(ctx);
297
+
298
+ // Inject a throwing projection rebuild so :637 fires after exitMilestone
299
+ // completes the system-owned merge. restoreDefault() in finally keeps the
300
+ // seam production-neutral for every other test in the process.
301
+ const restoreDefault = _setProjectionRebuildFnForTests(async () => {
302
+ throw new Error("forced projection rebuild failure");
303
+ });
304
+
305
+ t.after(() => {
306
+ restoreDefault();
307
+ resetRegistry();
308
+ try { releaseSessionLock(projectRoot); } catch { /* */ }
309
+ try { closeDatabase(); } catch { /* */ }
310
+ try { execFileSync("git", ["worktree", "remove", "--force", worktree], { cwd: projectRoot, stdio: "ignore" }); } catch { /* */ }
311
+ try { rmSync(projectRoot, { recursive: true, force: true }); } catch { /* */ }
312
+ });
313
+
314
+ const previous = setStderrLoggingEnabled(false);
315
+ _resetLogs();
316
+ let logs: LogEntry[] = [];
317
+ try {
318
+ await orchestrator.advance();
319
+ logs = drainLogs();
320
+ } finally {
321
+ _resetLogs();
322
+ setStderrLoggingEnabled(previous);
323
+ }
324
+
325
+ const rebuildWarn = logs.find(
326
+ (e) => e.component === "engine" && e.severity === "warn" &&
327
+ /markdown projection rebuild after settlement merge failed/u.test(e.message),
328
+ );
329
+ assert.ok(
330
+ rebuildWarn,
331
+ "an engine warning must be logged when the post-settlement projection rebuild fails (got: " +
332
+ logs.filter((e) => e.component === "engine").map((e) => e.message).join(" | ") + ")",
333
+ );
334
+ assert.match(rebuildWarn!.message, /forced projection rebuild failure/u);
335
+ });
@@ -29,8 +29,8 @@ import {
29
29
 
30
30
  const SKILL_NAME = "testskill";
31
31
  const COMPLETE_SLICE_SKILL_NAME = "complete-slice-policies";
32
- const SKILL_ACTIVATION_SUBSTRING = `Call Skill({ skill: '${SKILL_NAME}' })`;
33
- const COMPLETE_SLICE_SKILL_ACTIVATION_SUBSTRING = `Call Skill({ skill: '${COMPLETE_SLICE_SKILL_NAME}' })`;
32
+ const SKILL_ACTIVATION_SUBSTRING = `Read the installed '${SKILL_NAME}' skill file from <available_skills>`;
33
+ const COMPLETE_SLICE_SKILL_ACTIVATION_SUBSTRING = `Read the installed '${COMPLETE_SLICE_SKILL_NAME}' skill file from <available_skills>`;
34
34
 
35
35
  const tmpDirs: string[] = [];
36
36
  let savedCwd: string | undefined;
@@ -28,6 +28,11 @@ const BANNED_DECISION_PATHS = new Set([
28
28
  "gsd/auto-post-unit.ts",
29
29
  "gsd/milestone-closeout.ts",
30
30
  "gsd/auto/phases.ts",
31
+ "gsd/auto/pre-dispatch.ts",
32
+ "gsd/auto/dispatch.ts",
33
+ "gsd/auto/unit-phase.ts",
34
+ "gsd/auto/finalize.ts",
35
+ "gsd/auto/closeout.ts",
31
36
  "gsd/auto/orchestrator.ts",
32
37
  "gsd/auto/loop.ts",
33
38
  "gsd/tools/complete-slice.ts",
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import { createTestContext } from "./test-helpers.ts";
13
- import { runPreDispatch } from "../auto/phases.ts";
13
+ import { runPreDispatch } from "../auto/pre-dispatch.ts";
14
14
 
15
15
  const { assertTrue, report } = createTestContext();
16
16
 
@@ -30,7 +30,7 @@
30
30
  */
31
31
 
32
32
  import { createTestContext } from "./test-helpers.ts";
33
- import { runPreDispatch } from "../auto/phases.ts";
33
+ import { runPreDispatch } from "../auto/pre-dispatch.ts";
34
34
  import {
35
35
  openDatabase,
36
36
  closeDatabase,
@@ -18,12 +18,12 @@ function readSrc(file: string): string {
18
18
  return readFileSync(join(gsdDir, file), "utf-8");
19
19
  }
20
20
 
21
- test("#4620: auto/phases plan gate failed message includes doctor heal hint", () => {
22
- const src = readSrc("auto/phases.ts");
21
+ test("#4620: auto/pre-dispatch plan gate failed message includes doctor heal hint", () => {
22
+ const src = readSrc("auto/pre-dispatch.ts");
23
23
  assert.match(
24
24
  src,
25
25
  /Plan gate failed-closed:[\s\S]*\/gsd doctor heal/,
26
- "auto/phases.ts should include /gsd doctor heal in plan gate failed notification",
26
+ "auto/pre-dispatch.ts should include /gsd doctor heal in plan gate failed notification",
27
27
  );
28
28
  });
29
29
 
@@ -11,7 +11,7 @@
11
11
 
12
12
  import test from "node:test";
13
13
  import assert from "node:assert/strict";
14
- import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
14
+ import { mkdtempSync, readFileSync, rmSync, writeFileSync, mkdirSync } from "node:fs";
15
15
  import { join } from "node:path";
16
16
  import { tmpdir } from "node:os";
17
17
 
@@ -92,11 +92,42 @@ test("resolveModelWithFallbacksForUnit returns undefined when no preferences fil
92
92
  });
93
93
 
94
94
  test("resolveModelWithFallbacksForUnit returns undefined when preferences omit models", () => {
95
- withGsdHome("---\nmode: solo\n---\n", () => {
95
+ withGsdHome("---\nmode: solo\ntoken_profile: burn-max\n---\n", () => {
96
96
  assert.equal(resolveModelWithFallbacksForUnit("execute-task"), undefined);
97
97
  });
98
98
  });
99
99
 
100
+ test("resolveModelWithFallbacksForUnit honors project basePath when cwd differs", () => {
101
+ const oldHome = process.env.GSD_HOME;
102
+ const oldCwd = process.cwd();
103
+ const home = mkdtempSync(join(tmpdir(), "gsd-prefs-home-"));
104
+ const project = mkdtempSync(join(tmpdir(), "gsd-prefs-project-"));
105
+ const other = mkdtempSync(join(tmpdir(), "gsd-prefs-other-"));
106
+ try {
107
+ process.env.GSD_HOME = home;
108
+ writeFileSync(join(home, "PREFERENCES.md"), "---\nmode: solo\ntoken_profile: burn-max\n---\n");
109
+ const gsdDir = join(project, ".gsd");
110
+ mkdirSync(gsdDir, { recursive: true });
111
+ writeFileSync(
112
+ join(gsdDir, "PREFERENCES.md"),
113
+ "---\nmodels:\n execution: anthropic/claude-opus-4-6\n---\n",
114
+ );
115
+ process.chdir(other);
116
+ assert.equal(resolveModelWithFallbacksForUnit("execute-task"), undefined);
117
+ assert.equal(
118
+ resolveModelWithFallbacksForUnit("execute-task", project)?.primary,
119
+ "anthropic/claude-opus-4-6",
120
+ );
121
+ } finally {
122
+ process.chdir(oldCwd);
123
+ if (oldHome === undefined) delete process.env.GSD_HOME;
124
+ else process.env.GSD_HOME = oldHome;
125
+ rmSync(home, { recursive: true, force: true });
126
+ rmSync(project, { recursive: true, force: true });
127
+ rmSync(other, { recursive: true, force: true });
128
+ }
129
+ });
130
+
100
131
  test("resolveDefaultSessionModel returns undefined when no preferences file exists", () => {
101
132
  withGsdHome(null, () => {
102
133
  assert.equal(resolveDefaultSessionModel("anthropic"), undefined);
@@ -104,13 +135,13 @@ test("resolveDefaultSessionModel returns undefined when no preferences file exis
104
135
  });
105
136
 
106
137
  test("resolveDefaultSessionModel returns undefined when preferences omit models", () => {
107
- withGsdHome("---\nmode: solo\n---\n", () => {
138
+ withGsdHome("---\nmode: solo\ntoken_profile: burn-max\n---\n", () => {
108
139
  assert.equal(resolveDefaultSessionModel("anthropic"), undefined);
109
140
  });
110
141
  });
111
142
 
112
143
  test("readModelFromPreferences returns 'default' when preferences omit models", () => {
113
- withGsdHome("---\nmode: solo\n---\n", () => {
144
+ withGsdHome("---\nmode: solo\ntoken_profile: burn-max\n---\n", () => {
114
145
  assert.equal(readModelFromPreferences(), "default");
115
146
  });
116
147
  });
@@ -0,0 +1,79 @@
1
+ // Project/App: gsd-pi
2
+ // File Purpose: Shared helpers for GsdStatusWidget progress-strip extension tests.
3
+
4
+ import assert from "node:assert/strict";
5
+ import stripAnsi from "strip-ansi";
6
+ import { visibleWidth } from "@gsd/pi-tui";
7
+ import type { GsdProgressState } from "@gsd/pi-coding-agent/core/extensions/index.js";
8
+ import { initTheme } from "@gsd/pi-coding-agent/theme/theme.js";
9
+ import { GsdStatusWidget } from "../../../../../packages/gsd-agent-modes/src/modes/interactive/components/gsd-status-widget.ts";
10
+
11
+ export type ProgressStripUiMock = {
12
+ widgetCalls: Array<[string, unknown]>;
13
+ getProgressState: () => GsdProgressState | undefined;
14
+ disposeProgress: () => void;
15
+ ui: {
16
+ setWidget(key: string, factory: unknown): void;
17
+ setHeader(): void;
18
+ setStatus(key: string, value?: string): void;
19
+ setGsdProgress(state: GsdProgressState | undefined, dispose?: () => void): void;
20
+ };
21
+ };
22
+
23
+ export function createProgressStripUiMock(): ProgressStripUiMock {
24
+ const widgetCalls: Array<[string, unknown]> = [];
25
+ let progressState: GsdProgressState | undefined;
26
+ let progressDispose: (() => void) | undefined;
27
+
28
+ return {
29
+ widgetCalls,
30
+ getProgressState: () => progressState,
31
+ disposeProgress: () => progressDispose?.(),
32
+ ui: {
33
+ setWidget(key: string, factory: unknown) {
34
+ widgetCalls.push([key, factory]);
35
+ },
36
+ setHeader() {},
37
+ setStatus() {},
38
+ setGsdProgress(state: GsdProgressState | undefined, dispose?: () => void) {
39
+ progressState = state;
40
+ if (dispose) progressDispose = dispose;
41
+ widgetCalls.push(["setGsdProgress", state]);
42
+ },
43
+ },
44
+ };
45
+ }
46
+
47
+ export function renderProgressStripLines(
48
+ progress: GsdProgressState,
49
+ width: number,
50
+ options?: { activeToolCount?: number; manuallyExpanded?: boolean; cwd?: string },
51
+ ): string[] {
52
+ initTheme("dark", false);
53
+ const widget = new GsdStatusWidget(() => ({
54
+ override: "auto",
55
+ activeToolCount: options?.activeToolCount ?? 1,
56
+ cwd: options?.cwd ?? progress.path ?? "/tmp",
57
+ manuallyExpanded: options?.manuallyExpanded ?? progress.widgetMode !== "min",
58
+ gsdProgress: progress,
59
+ }));
60
+ return widget.render(width);
61
+ }
62
+
63
+ export function renderProgressStrip(
64
+ progress: GsdProgressState,
65
+ width: number,
66
+ options?: { activeToolCount?: number; manuallyExpanded?: boolean; cwd?: string },
67
+ ): string {
68
+ return renderProgressStripLines(progress, width, options).map((line) => stripAnsi(line)).join("\n");
69
+ }
70
+
71
+ export function assertLinesFit(lines: string[], width: number): void {
72
+ for (const line of lines) {
73
+ const plain = stripAnsi(line);
74
+ assert.ok(
75
+ visibleWidth(plain) <= width,
76
+ `line exceeds width ${width}: "${plain}" (${visibleWidth(plain)})`,
77
+ );
78
+ }
79
+ }
@@ -620,6 +620,8 @@ describe("prompt-budget: reactive-execute builder", () => {
620
620
 
621
621
  assert.match(prompt, /\[\.\.\.truncated/);
622
622
  assert.ok(prompt.length < hugeSummary.length * 2, "reactive prompt should not include full dependency summaries");
623
+ assert.match(prompt, /Your working directory is/);
624
+ assert.doesNotMatch(prompt, /Work only in the repository root/i);
623
625
  } finally {
624
626
  cleanup(base);
625
627
  }
@@ -55,14 +55,20 @@ const PHASE_PROMPT_TOOL_CALLS: Record<string, readonly string[]> = {
55
55
  "plan-slice": ["gsd_reassess_roadmap", "gsd_plan_slice", "gsd_decision_save"],
56
56
  "refine-slice": ["gsd_plan_slice", "gsd_decision_save"],
57
57
  "replan-slice": ["gsd_replan_slice"],
58
- "execute-task": ["gsd_task_complete"],
58
+ "execute-task": [
59
+ "gsd_task_complete",
60
+ "gsd_exec",
61
+ "gsd_exec_search",
62
+ "gsd_resume",
63
+ "gsd_capture_thought",
64
+ ],
59
65
  "reactive-execute": ["gsd_summary_save"],
60
66
  "complete-slice": [
61
67
  "gsd_exec",
62
68
  "gsd_task_reopen",
63
69
  "gsd_replan_slice",
64
70
  "gsd_requirement_update",
65
- "capture_thought",
71
+ "gsd_capture_thought",
66
72
  "gsd_slice_complete",
67
73
  "gsd_summary_save",
68
74
  ],
@@ -113,6 +119,7 @@ test("reactive-execute prompt keeps task summaries with subagents and avoids bat
113
119
  const prompt = readPrompt("reactive-execute");
114
120
  assert.match(prompt, /subagent-written summary as authoritative/i);
115
121
  assert.match(prompt, /Do NOT create a batch commit/i);
122
+ assert.match(prompt, /cwd:\s*"\{\{workingDirectory\}\}"/);
116
123
  assert.doesNotMatch(prompt, /\*\*Write task summaries\*\*/i);
117
124
  assert.doesNotMatch(prompt, /\*\*Commit\*\* all changes/i);
118
125
  });
@@ -240,6 +247,8 @@ test("workflow-start prompt defaults to autonomy instead of per-phase confirmati
240
247
  const prompt = readPrompt("workflow-start");
241
248
  assert.match(prompt, /Keep moving by default/i);
242
249
  assert.match(prompt, /Decision gates, not ceremony/i);
250
+ assert.match(prompt, /Persist workflow state/i);
251
+ assert.match(prompt, /completedAt/i);
243
252
  assert.doesNotMatch(prompt, /confirm with the user before proceeding/i);
244
253
  assert.doesNotMatch(prompt, /Gate between phases/i);
245
254
  });
@@ -56,6 +56,21 @@ test("unitTypeToPrefsPhaseKey maps research units", () => {
56
56
  assert.equal(unitTypeToPrefsPhaseKey("plan-slice"), "planning");
57
57
  });
58
58
 
59
+ test("resolveProviderErrorGuidance suggests Antigravity migration for deprecated Gemini CLI", () => {
60
+ const guidance = resolveProviderErrorGuidance({
61
+ errorMsg:
62
+ "IneligibleTierError: This client is no longer supported for Gemini Code Assist for individuals. To continue using Gemini, please migrate to the Antigravity suite of products: https://antigravity.google.",
63
+ provider: "google-gemini-cli",
64
+ modelId: "gemini-2.5-pro",
65
+ unitType: "execute-task",
66
+ });
67
+
68
+ assert.match(guidance.summary, /Antigravity CLI/);
69
+ assert.ok(guidance.steps.some((step) => step.includes("antigravity.google/cli/install.sh")));
70
+ assert.ok(guidance.steps.some((step) => step.includes("/login")));
71
+ assert.ok(guidance.steps.some((step) => step.includes("/gsd next")));
72
+ });
73
+
59
74
  test("resolveProviderErrorGuidance suggests gemini-3-flash for antigravity pro-high", () => {
60
75
  const guidance = resolveProviderErrorGuidance({
61
76
  errorMsg: "Cloud Code Assist API error (400): Request contains an invalid argument.",
@@ -17,10 +17,8 @@ import {
17
17
  shouldDeferTransientErrorToCoreRetry,
18
18
  suppressTerminalDeletedWorktreeMessageEnd,
19
19
  } from "../bootstrap/agent-end-recovery.ts";
20
- import {
21
- _buildCancelledUnitStopReason,
22
- _classifyZeroToolProviderMessageForTest,
23
- } from "../auto/phases.ts";
20
+ import { _buildCancelledUnitStopReason } from "../auto/phase-helpers.ts";
21
+ import { _classifyZeroToolProviderMessageForTest } from "../auto/unit-phase.ts";
24
22
  import { autoSession } from "../auto-runtime-state.ts";
25
23
  import { getNextFallbackModel } from "../preferences.ts";
26
24
  // Zero-import module — imported by path rather than through the package