@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,15 @@
1
+ import type { ModelRegistry as ModelRegistryInstance } from '@gsd/pi-coding-agent';
2
+ /**
3
+ * Apply the --model CLI flag override to the active session.
4
+ * Searches available models by exact id or provider/id pattern and warns
5
+ * on stderr when the requested model is not found in the registry.
6
+ *
7
+ * The setModel call is intentionally fire-and-forget: provider readiness
8
+ * checks run later in startup so --model does not block session creation.
9
+ */
10
+ export declare function applyModelOverride(session: {
11
+ setModel(model: {
12
+ provider: string;
13
+ id: string;
14
+ }): unknown | Promise<unknown>;
15
+ }, modelRegistry: ModelRegistryInstance, modelFlag: string | undefined): void;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Apply the --model CLI flag override to the active session.
3
+ * Searches available models by exact id or provider/id pattern and warns
4
+ * on stderr when the requested model is not found in the registry.
5
+ *
6
+ * The setModel call is intentionally fire-and-forget: provider readiness
7
+ * checks run later in startup so --model does not block session creation.
8
+ */
9
+ export function applyModelOverride(session, modelRegistry, modelFlag) {
10
+ if (!modelFlag)
11
+ return;
12
+ const available = modelRegistry.getAvailable();
13
+ const match = available.find((m) => m.id === modelFlag) ||
14
+ available.find((m) => `${m.provider}/${m.id}` === modelFlag);
15
+ if (match) {
16
+ void session.setModel(match);
17
+ }
18
+ else {
19
+ process.stderr.write(`[gsd] Warning: Model "${modelFlag}" not found. Using configured default.\n`);
20
+ }
21
+ }
package/dist/cli.js CHANGED
@@ -13,7 +13,8 @@ import { shouldRedirectAutoToHeadless } from './cli-auto-routing.js';
13
13
  import { printHelp, printSubcommandHelp } from './help-text.js';
14
14
  import { applySecurityOverrides } from './security-overrides.js';
15
15
  import { validateConfiguredModel } from './startup-model-validation.js';
16
- import { migrateAnthropicDefaultToClaudeCode } from './provider-migrations.js';
16
+ import { migrateAnthropicDefaultToClaudeCode, migrateGeminiCliDefaultToAntigravity } from './provider-migrations.js';
17
+ import { applyModelOverride } from './cli-model-override.js';
17
18
  import { buildHeadlessAutoArgs, parseCliArgs, runWebCliBranch, migrateLegacyFlatSessions, } from './cli-web-branch.js';
18
19
  import { stopWebMode } from './web-mode.js';
19
20
  import { getProjectSessionsDir } from './project-sessions.js';
@@ -122,24 +123,6 @@ async function reapplyValidatedModelOnFallback(session, modelRegistry, settingsM
122
123
  // Provider not ready — leave session on its current model
123
124
  }
124
125
  }
125
- /**
126
- * Apply the --model CLI flag override to the active session.
127
- * Searches available models by exact id or provider/id pattern and warns
128
- * on stderr when the requested model is not found in the registry.
129
- */
130
- function applyModelOverride(session, modelRegistry, modelFlag) {
131
- if (!modelFlag)
132
- return;
133
- const available = modelRegistry.getAvailable();
134
- const match = available.find((m) => m.id === modelFlag) ||
135
- available.find((m) => `${m.provider}/${m.id}` === modelFlag);
136
- if (match) {
137
- void session.setModel(match);
138
- }
139
- else {
140
- process.stderr.write(`[gsd] Warning: Model "${modelFlag}" not found. Using configured default.\n`);
141
- }
142
- }
143
126
  const cliFlags = parseCliArgs(process.argv);
144
127
  const isPrintMode = cliFlags.print || cliFlags.mode !== undefined;
145
128
  // `gsd [subcommand] --help` / `-h` — print help before any subcommand runs.
@@ -629,6 +612,12 @@ if (isPrintMode) {
629
612
  settingsManager,
630
613
  modelRegistry,
631
614
  });
615
+ migrateGeminiCliDefaultToAntigravity({
616
+ authStorage,
617
+ isAntigravityReady: () => modelRegistry.isProviderRequestReady('google-antigravity'),
618
+ settingsManager,
619
+ modelRegistry,
620
+ });
632
621
  const { session, extensionsResult, modelFallbackMessage } = await createAgentSession({
633
622
  authStorage,
634
623
  modelRegistry,
@@ -733,6 +722,12 @@ migrateAnthropicDefaultToClaudeCode({
733
722
  settingsManager,
734
723
  modelRegistry,
735
724
  });
725
+ migrateGeminiCliDefaultToAntigravity({
726
+ authStorage,
727
+ isAntigravityReady: () => modelRegistry.isProviderRequestReady('google-antigravity'),
728
+ settingsManager,
729
+ modelRegistry,
730
+ });
736
731
  markStartup('providerMigrations');
737
732
  const { session, extensionsResult, modelFallbackMessage: interactiveFallbackMsg } = await createAgentSession({
738
733
  authStorage,
@@ -53,7 +53,22 @@ export declare function isTerminalNotification(event: Record<string, unknown>):
53
53
  export declare function isBlockedNotification(event: Record<string, unknown>): boolean;
54
54
  export declare function isMilestoneReadyNotification(event: Record<string, unknown>): boolean;
55
55
  export declare function isInteractiveHeadlessTool(toolName: string | undefined): boolean;
56
- export declare function shouldArmHeadlessIdleTimeout(toolCallCount: number, interactiveToolCount: number): boolean;
56
+ /**
57
+ * Decide whether to arm the headless idle-completion timer.
58
+ *
59
+ * Arms once at least one tool call has started (and no interactive tool —
60
+ * ask_user_questions / secure_env_collect — is still awaiting a human answer),
61
+ * so a multi-step command that pauses between tool calls still resolves.
62
+ *
63
+ * Also arms for *quick commands* that are handled entirely in the extension
64
+ * layer (e.g. `/gsd status`, `/gsd history`, `/gsd help`). These never enter
65
+ * the LLM agent loop, so they emit no `agent_end` / `execution_complete` and
66
+ * make zero tool calls. Without this branch the idle timer never arms, the
67
+ * completion promise never resolves, and the process exits with a spurious
68
+ * "cancelled" (11) code once the event loop drains. See live-regression
69
+ * scenario `headless status exits 0 on a seeded project`.
70
+ */
71
+ export declare function shouldArmHeadlessIdleTimeout(toolCallCount: number, interactiveToolCount: number, isQuickCommand?: boolean): boolean;
57
72
  export interface HeadlessTrackedEventLike {
58
73
  type: string;
59
74
  detail?: string;
@@ -125,8 +125,25 @@ export function isMilestoneReadyNotification(event) {
125
125
  export function isInteractiveHeadlessTool(toolName) {
126
126
  return INTERACTIVE_HEADLESS_TOOLS.has(canonicalHeadlessToolName(toolName));
127
127
  }
128
- export function shouldArmHeadlessIdleTimeout(toolCallCount, interactiveToolCount) {
129
- return toolCallCount > 0 && interactiveToolCount === 0;
128
+ /**
129
+ * Decide whether to arm the headless idle-completion timer.
130
+ *
131
+ * Arms once at least one tool call has started (and no interactive tool —
132
+ * ask_user_questions / secure_env_collect — is still awaiting a human answer),
133
+ * so a multi-step command that pauses between tool calls still resolves.
134
+ *
135
+ * Also arms for *quick commands* that are handled entirely in the extension
136
+ * layer (e.g. `/gsd status`, `/gsd history`, `/gsd help`). These never enter
137
+ * the LLM agent loop, so they emit no `agent_end` / `execution_complete` and
138
+ * make zero tool calls. Without this branch the idle timer never arms, the
139
+ * completion promise never resolves, and the process exits with a spurious
140
+ * "cancelled" (11) code once the event loop drains. See live-regression
141
+ * scenario `headless status exits 0 on a seeded project`.
142
+ */
143
+ export function shouldArmHeadlessIdleTimeout(toolCallCount, interactiveToolCount, isQuickCommand = false) {
144
+ if (interactiveToolCount > 0)
145
+ return false;
146
+ return toolCallCount > 0 || isQuickCommand;
130
147
  }
131
148
  function hasCancelledDetail(detail) {
132
149
  return /\bcancelled\b/i.test(String(detail ?? ''));
package/dist/headless.js CHANGED
@@ -434,6 +434,13 @@ async function runHeadlessOnce(options, restartCount) {
434
434
  });
435
435
  // Idle timeout — fallback completion detection
436
436
  let idleTimer = null;
437
+ // Quick commands (status, history, help, …) are short extension-layer
438
+ // operations that never enter the LLM agent loop, so they emit no
439
+ // execution_complete and make no tool calls. The idle timer is what
440
+ // resolves them; without arming it for zero-tool quick commands the run
441
+ // hangs and exits with a spurious "cancelled" (11). See
442
+ // shouldArmHeadlessIdleTimeout.
443
+ const isQuickCmd = isQuickCommand(options.command, options.commandArgs);
437
444
  let effectiveIdleTimeout = isNewMilestone
438
445
  ? NEW_MILESTONE_IDLE_TIMEOUT_MS
439
446
  : isAutoMode
@@ -443,7 +450,7 @@ async function runHeadlessOnce(options, restartCount) {
443
450
  if (idleTimer)
444
451
  clearTimeout(idleTimer);
445
452
  if (effectiveIdleTimeout > 0 &&
446
- shouldArmHeadlessIdleTimeout(toolCallCount, interactiveToolCallIds.size)) {
453
+ shouldArmHeadlessIdleTimeout(toolCallCount, interactiveToolCallIds.size, isQuickCmd)) {
447
454
  idleTimer = setTimeout(() => {
448
455
  completed = true;
449
456
  resolveCompletion();
package/dist/loader.js CHANGED
@@ -31,7 +31,7 @@ if (firstArg === '--help' || firstArg === '-h') {
31
31
  // package.json (already parsed above) and verifies git is available.
32
32
  // ---------------------------------------------------------------------------
33
33
  {
34
- const { MIN_NODE_MAJOR, checkNodeVersion, requireGit } = await import('./runtime-checks.js');
34
+ const { MIN_NODE_MAJOR, checkNodeVersion, gitAvailableOnPath } = await import('./runtime-checks.js');
35
35
  const red = '\x1b[31m';
36
36
  const bold = '\x1b[1m';
37
37
  const dim = '\x1b[2m';
@@ -48,8 +48,10 @@ if (firstArg === '--help' || firstArg === '-h') {
48
48
  process.exit(1);
49
49
  }
50
50
  // -- git --
51
- const { execFileSync } = await import('child_process');
52
- const gitOk = requireGit((cmd, args) => execFileSync(cmd, args, { stdio: 'ignore' }));
51
+ // Presence-check git via a $PATH scan rather than spawning `git --version`:
52
+ // the subprocess cost ~15ms on every cold start (~5% of startup CPU) just to
53
+ // confirm git is installed.
54
+ const gitOk = gitAvailableOnPath();
53
55
  if (!gitOk) {
54
56
  process.stderr.write(`\n${red}${bold}Error:${reset} GSD requires git but it was not found on PATH.\n\n` +
55
57
  `${dim}Install git:${reset}\n` +
@@ -230,6 +232,6 @@ if (missingPackages.length > 0) {
230
232
  }
231
233
  // Register GSD agent packages for extension imports before CLI loads.
232
234
  const { registerAgentBundles } = await import('./register-agent-bundles.js');
233
- registerAgentBundles();
235
+ await registerAgentBundles();
234
236
  // Dynamic import defers ESM evaluation — config.js will see PI_PACKAGE_DIR above
235
237
  await import('./cli.js');
@@ -359,11 +359,15 @@ export async function runLlmStep(p, pc, authStorage) {
359
359
  if (isClaudeCliReady()) {
360
360
  authOptions.push({ value: 'claude-cli', label: 'Use Claude Code CLI', hint: 'uses your existing Claude subscription' });
361
361
  }
362
- if (isGeminiCliReady()) {
363
- authOptions.push({ value: 'gemini-cli', label: 'Use Google Gemini CLI', hint: 'uses your existing Gemini CLI session' });
364
- }
365
362
  if (isAntigravityCliReady()) {
366
- authOptions.push({ value: 'antigravity-cli', label: 'Use Antigravity CLI', hint: 'uses your existing Antigravity session' });
363
+ authOptions.push({ value: 'antigravity-cli', label: 'Use Antigravity CLI', hint: 'recommended replaces Gemini CLI for individuals' });
364
+ }
365
+ else if (isGeminiCliReady()) {
366
+ authOptions.push({
367
+ value: 'gemini-cli',
368
+ label: 'Use Google Gemini CLI (deprecated)',
369
+ hint: 'individual tier no longer supported — install Antigravity from https://antigravity.google',
370
+ });
367
371
  }
368
372
  authOptions.push({ value: 'browser', label: 'Sign in with your browser', hint: 'GitHub Copilot or ChatGPT/Codex' }, { value: 'api-key', label: 'Paste an API key', hint: 'from your provider dashboard' }, { value: 'skip', label: 'Skip for now', hint: 'use /login inside GSD later' });
369
373
  const method = await p.select({
@@ -385,6 +389,7 @@ export async function runLlmStep(p, pc, authStorage) {
385
389
  return true;
386
390
  }
387
391
  if (method === 'gemini-cli') {
392
+ p.log.warn('Google Gemini CLI is deprecated for individual users — install Antigravity: https://antigravity.google');
388
393
  p.log.success('Google Gemini CLI detected — routing through local CLI');
389
394
  p.log.info('Your Gemini CLI session will be used for inference. No API key needed.');
390
395
  authStorage.set('google-gemini-cli', { type: 'api_key', key: 'cli' });
@@ -25,4 +25,27 @@ type AnthropicDefaultMigrationDeps = {
25
25
  export declare function hasDirectAnthropicApiKey(authStorage: Pick<AuthStorage, "getCredentialsForProvider">, env?: NodeJS.ProcessEnv): boolean;
26
26
  export declare function shouldMigrateAnthropicToClaudeCode({ authStorage, isClaudeCodeReady, defaultProvider, env, }: AnthropicMigrationDeps): boolean;
27
27
  export declare function migrateAnthropicDefaultToClaudeCode({ authStorage, isClaudeCodeReady, settingsManager, modelRegistry, env, }: AnthropicDefaultMigrationDeps): boolean;
28
+ type GeminiCliMigrationDeps = {
29
+ authStorage: Pick<AuthStorage, "getCredentialsForProvider">;
30
+ isAntigravityReady: boolean | (() => boolean);
31
+ defaultProvider: string | undefined;
32
+ env?: NodeJS.ProcessEnv;
33
+ };
34
+ type GeminiCliDefaultMigrationDeps = {
35
+ authStorage: Pick<AuthStorage, "getCredentialsForProvider" | "set">;
36
+ isAntigravityReady: boolean | (() => boolean);
37
+ settingsManager: {
38
+ getDefaultProvider(): string | undefined;
39
+ getDefaultModel(): string | undefined;
40
+ setDefaultModelAndProvider(provider: string, modelId: string): void;
41
+ };
42
+ modelRegistry: {
43
+ getAvailable(): MigrationModel[];
44
+ };
45
+ env?: NodeJS.ProcessEnv;
46
+ };
47
+ export declare function hasGeminiCliExternalAuth(authStorage: Pick<AuthStorage, "getCredentialsForProvider">): boolean;
48
+ export declare function hasDirectGoogleApiKey(authStorage: Pick<AuthStorage, "getCredentialsForProvider">, env?: NodeJS.ProcessEnv): boolean;
49
+ export declare function shouldMigrateGeminiCliToAntigravity({ authStorage, isAntigravityReady, defaultProvider, env, }: GeminiCliMigrationDeps): boolean;
50
+ export declare function migrateGeminiCliDefaultToAntigravity({ authStorage, isAntigravityReady, settingsManager, modelRegistry, env, }: GeminiCliDefaultMigrationDeps): boolean;
28
51
  export {};
@@ -27,3 +27,44 @@ export function migrateAnthropicDefaultToClaudeCode({ authStorage, isClaudeCodeR
27
27
  settingsManager.setDefaultModelAndProvider(target.provider, target.id);
28
28
  return true;
29
29
  }
30
+ export function hasGeminiCliExternalAuth(authStorage) {
31
+ return authStorage.getCredentialsForProvider("google-gemini-cli").some((credential) => credential?.type === "api_key" && credential?.key === "cli");
32
+ }
33
+ export function hasDirectGoogleApiKey(authStorage, env = process.env) {
34
+ if ((env.GEMINI_API_KEY ?? env.GOOGLE_API_KEY ?? "").trim()) {
35
+ return true;
36
+ }
37
+ return authStorage.getCredentialsForProvider("google").some((credential) => credential?.type === "api_key" && typeof credential?.key === "string" && credential.key.trim().length > 0);
38
+ }
39
+ export function shouldMigrateGeminiCliToAntigravity({ authStorage, isAntigravityReady, defaultProvider, env = process.env, }) {
40
+ if (defaultProvider !== "google-gemini-cli") {
41
+ return false;
42
+ }
43
+ if (!hasGeminiCliExternalAuth(authStorage)) {
44
+ return false;
45
+ }
46
+ if (hasDirectGoogleApiKey(authStorage, env)) {
47
+ return false;
48
+ }
49
+ return typeof isAntigravityReady === "function" ? isAntigravityReady() : isAntigravityReady;
50
+ }
51
+ export function migrateGeminiCliDefaultToAntigravity({ authStorage, isAntigravityReady, settingsManager, modelRegistry, env = process.env, }) {
52
+ const defaultProvider = settingsManager.getDefaultProvider();
53
+ if (!shouldMigrateGeminiCliToAntigravity({ authStorage, isAntigravityReady, defaultProvider, env })) {
54
+ return false;
55
+ }
56
+ const defaultModel = settingsManager.getDefaultModel();
57
+ const antigravityModels = modelRegistry.getAvailable().filter((model) => model.provider === "google-antigravity");
58
+ const target = (defaultModel
59
+ ? antigravityModels.find((model) => model.id === defaultModel)
60
+ : undefined) ||
61
+ antigravityModels.find((model) => model.id === "default") ||
62
+ antigravityModels[0];
63
+ if (!target) {
64
+ return false;
65
+ }
66
+ authStorage.set("google-antigravity", { type: "api_key", key: "cli" });
67
+ settingsManager.setDefaultModelAndProvider(target.provider, target.id);
68
+ process.stderr.write("[gsd] Migrated default provider google-gemini-cli → google-antigravity (Gemini CLI no longer supported for individuals)\n");
69
+ return true;
70
+ }
@@ -1,2 +1,11 @@
1
- /** Register GSD agent packages for extension virtual module resolution. */
2
- export declare function registerAgentBundles(): void;
1
+ /**
2
+ * Register GSD agent packages for extension virtual module resolution.
3
+ *
4
+ * The eager `@gsd/agent-core` and `@gsd/agent-modes` barrels are only consumed
5
+ * by the Bun-binary extension loader (which has no filesystem and resolves
6
+ * bundled packages through `virtualModules`). On the Node/dev path the loader
7
+ * resolves those same specifiers by file path via `getAliases()`, so importing
8
+ * the full barrels at startup there is ~400ms of wasted module loading.
9
+ * Load them only when actually needed (Bun), keeping Node startup lean.
10
+ */
11
+ export declare function registerAgentBundles(): Promise<void>;
@@ -1,12 +1,26 @@
1
- import * as agentCore from '@gsd/agent-core';
2
- import * as agentModes from '@gsd/agent-modes';
1
+ import { isBunBinary } from '@gsd/pi-coding-agent/config.js';
3
2
  import { registerExtensionBundledModules } from '@gsd/pi-coding-agent/core/extensions/loader.js';
4
3
  let registered = false;
5
- /** Register GSD agent packages for extension virtual module resolution. */
6
- export function registerAgentBundles() {
4
+ /**
5
+ * Register GSD agent packages for extension virtual module resolution.
6
+ *
7
+ * The eager `@gsd/agent-core` and `@gsd/agent-modes` barrels are only consumed
8
+ * by the Bun-binary extension loader (which has no filesystem and resolves
9
+ * bundled packages through `virtualModules`). On the Node/dev path the loader
10
+ * resolves those same specifiers by file path via `getAliases()`, so importing
11
+ * the full barrels at startup there is ~400ms of wasted module loading.
12
+ * Load them only when actually needed (Bun), keeping Node startup lean.
13
+ */
14
+ export async function registerAgentBundles() {
7
15
  if (registered)
8
16
  return;
9
17
  registered = true;
18
+ if (!isBunBinary)
19
+ return;
20
+ const [agentCore, agentModes] = await Promise.all([
21
+ import('@gsd/agent-core'),
22
+ import('@gsd/agent-modes'),
23
+ ]);
10
24
  registerExtensionBundledModules({
11
25
  '@gsd/agent-core': agentCore,
12
26
  '@gsd/agent-modes': agentModes,
@@ -22,6 +22,9 @@ export declare function readManagedResourceVersion(agentDir: string): string | n
22
22
  * directory (e.g. pre-install verification).
23
23
  */
24
24
  export declare function computeResourceFingerprint(rootDir?: string): string;
25
+ export declare function setGsdBrowserPackageSkillPathForTests(skillPath: string | null | undefined): void;
26
+ export declare function collectGsdBrowserPackageSkillReferences(content: string): string[];
27
+ export declare function hasStaleGsdBrowserPackageSkill(skillsDir: string): boolean;
25
28
  export declare function getNewerManagedResourceVersion(agentDir: string, currentVersion: string): string | null;
26
29
  /**
27
30
  * Syncs a single bundled resource directory into the agent directory.
@@ -49,18 +52,20 @@ export declare function reconcileMergedNodeModules(agentNodeModules: string, hoi
49
52
  /** Build a cache fingerprint from packageRoot + sorted entry names of both directories */
50
53
  export declare function mergedFingerprint(hoisted: string, internal: string): string;
51
54
  /**
52
- * Syncs all bundled resources to agentDir (~/.gsd/agent/) on every launch.
55
+ * Initializes managed resources under agentDir (~/.gsd/agent/).
53
56
  *
54
57
  * - extensions/ → ~/.gsd/agent/extensions/ (overwrite when version changes)
55
58
  * - shared/ → ~/.gsd/agent/shared/ (overwrite when version changes)
56
59
  * - agents/ → ~/.gsd/agent/agents/ (overwrite when version changes)
57
60
  * - skills/ → ~/.gsd/agent/skills/ (overwrite when version changes)
61
+ * - gsd-browser skill → ~/.gsd/agent/skills/gsd-browser/ from @opengsd/gsd-browser
58
62
  * - GSD-WORKFLOW.md → ~/.gsd/agent/GSD-WORKFLOW.md (fallback for env var miss)
59
63
  *
60
- * Skips the copy when the managed-resources.json version matches the current
61
- * GSD version, avoiding ~128ms of synchronous cpSync on every startup.
62
- * After `npm update -g @glittercowboy/gsd`, versions will differ and the
63
- * copy runs once to land the new resources.
64
+ * Skips the full copy only when the managed-resources.json version, content
65
+ * fingerprint, and package-owned gsd-browser skill all match the current
66
+ * install, avoiding ~128ms of synchronous cpSync on steady-state startup.
67
+ * After `npm update -g @opengsd/gsd-pi`, versions will differ and the copy
68
+ * runs once to land the new resources.
64
69
  *
65
70
  * Inspectable: `ls ~/.gsd/agent/extensions/`
66
71
  */
@@ -1,6 +1,7 @@
1
1
  import { createHash } from 'node:crypto';
2
2
  import { homedir } from 'node:os';
3
3
  import { chmodSync, copyFileSync, cpSync, existsSync, lstatSync, mkdirSync, readFileSync, readlinkSync, readdirSync, rmSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs';
4
+ import { createRequire } from 'node:module';
4
5
  import { basename, dirname, join, relative, resolve } from 'node:path';
5
6
  import { fileURLToPath } from 'node:url';
6
7
  import { compareSemver } from './update-check.js';
@@ -24,6 +25,10 @@ const resourcesDir = resolveBundledResourcesDirFromPackageRoot(packageRoot);
24
25
  const bundledExtensionsDir = join(resourcesDir, 'extensions');
25
26
  const resourceVersionManifestName = 'managed-resources.json';
26
27
  const resourceFingerprintFileName = '.managed-resources-content-hash';
28
+ const gsdBrowserSkillName = 'gsd-browser';
29
+ const requireFromResourceLoader = createRequire(import.meta.url);
30
+ const gsdBrowserSkillReferenceDirs = ['docs', 'scripts', 'gsd-browser-skill'];
31
+ let gsdBrowserPackageSkillPathForTests;
27
32
  export { discoverExtensionEntryPaths } from './extension-discovery.js';
28
33
  export function getExtensionKey(entryPath, extensionsDir) {
29
34
  const relPath = relative(extensionsDir, entryPath);
@@ -153,6 +158,111 @@ function getCurrentResourceFingerprint() {
153
158
  }
154
159
  return computeResourceFingerprint();
155
160
  }
161
+ function resolveGsdBrowserPackageSkillPath() {
162
+ if (gsdBrowserPackageSkillPathForTests !== undefined) {
163
+ return gsdBrowserPackageSkillPathForTests;
164
+ }
165
+ try {
166
+ return requireFromResourceLoader.resolve('@opengsd/gsd-browser/SKILL.md');
167
+ }
168
+ catch {
169
+ return null;
170
+ }
171
+ }
172
+ export function setGsdBrowserPackageSkillPathForTests(skillPath) {
173
+ gsdBrowserPackageSkillPathForTests = skillPath;
174
+ }
175
+ export function collectGsdBrowserPackageSkillReferences(content) {
176
+ const refs = new Set();
177
+ const referencePattern = /`((?:\.\/)?(?:docs|scripts|gsd-browser-skill)\/[^`\s]+)`/g;
178
+ for (const match of content.matchAll(referencePattern)) {
179
+ const ref = normalizeGsdBrowserPackageSkillReference(match[1]);
180
+ if (ref)
181
+ refs.add(ref);
182
+ }
183
+ return [...refs].sort();
184
+ }
185
+ function normalizeGsdBrowserPackageSkillReference(ref) {
186
+ if (!ref)
187
+ return null;
188
+ const normalized = ref
189
+ .replace(/^\.\//, '')
190
+ .replace(/[),.;:]+$/, '');
191
+ if (normalized.includes('..') || normalized.startsWith('/'))
192
+ return null;
193
+ if (!gsdBrowserSkillReferenceDirs.some(dir => normalized === dir || normalized.startsWith(`${dir}/`))) {
194
+ return null;
195
+ }
196
+ return normalized;
197
+ }
198
+ function readGsdBrowserPackageSkillBundle(sourceSkillPath) {
199
+ const skillContent = readFileSync(sourceSkillPath);
200
+ const files = new Map([['SKILL.md', skillContent]]);
201
+ const supportRefs = collectGsdBrowserPackageSkillReferences(skillContent.toString('utf-8'));
202
+ const sourceDir = dirname(sourceSkillPath);
203
+ for (const relPath of supportRefs) {
204
+ const sourcePath = join(sourceDir, relPath);
205
+ if (existsSync(sourcePath)) {
206
+ files.set(relPath, readFileSync(sourcePath));
207
+ }
208
+ }
209
+ return files;
210
+ }
211
+ export function hasStaleGsdBrowserPackageSkill(skillsDir) {
212
+ const targetDir = join(skillsDir, gsdBrowserSkillName);
213
+ const sourceSkillPath = resolveGsdBrowserPackageSkillPath();
214
+ // Package unresolvable. syncGsdBrowserPackageSkill is a no-op in this case
215
+ // (it preserves any existing managed skill), so reporting "stale" here
216
+ // would drive a full resource resync on every launch that the sync cannot
217
+ // actually satisfy. Keep the existing managed skill in place until the
218
+ // package becomes resolvable again or the manifest fingerprint changes.
219
+ if (!sourceSkillPath)
220
+ return false;
221
+ try {
222
+ const sourceDir = dirname(sourceSkillPath);
223
+ const skillContent = readFileSync(sourceSkillPath, 'utf-8');
224
+ for (const [relPath, content] of readGsdBrowserPackageSkillBundle(sourceSkillPath)) {
225
+ const targetPath = join(targetDir, relPath);
226
+ if (!existsSync(targetPath) || !readFileSync(targetPath).equals(content)) {
227
+ return true;
228
+ }
229
+ }
230
+ // Only flag SKILL.md references when sync can actually correct them.
231
+ // The bundle loop above already covers "source has it, target missing".
232
+ // A reference the package itself does not ship (source missing) is only
233
+ // worth a resync if the target still has a stale copy that sync should
234
+ // clean up; missing on both sides is the steady state when upstream
235
+ // omits files referenced from SKILL.md and is not actionable here.
236
+ for (const relPath of collectGsdBrowserPackageSkillReferences(skillContent)) {
237
+ const sourcePath = join(sourceDir, relPath);
238
+ const targetPath = join(targetDir, relPath);
239
+ if (!existsSync(sourcePath) && existsSync(targetPath)) {
240
+ return true;
241
+ }
242
+ }
243
+ return false;
244
+ }
245
+ catch {
246
+ return true;
247
+ }
248
+ }
249
+ function syncGsdBrowserPackageSkill(skillsDir) {
250
+ const targetDir = join(skillsDir, gsdBrowserSkillName);
251
+ const sourceSkillPath = resolveGsdBrowserPackageSkillPath();
252
+ if (!sourceSkillPath)
253
+ return;
254
+ makeTreeWritable(targetDir);
255
+ rmSync(targetDir, { recursive: true, force: true });
256
+ for (const [relPath, content] of readGsdBrowserPackageSkillBundle(sourceSkillPath)) {
257
+ const targetPath = join(targetDir, relPath);
258
+ mkdirSync(dirname(targetPath), { recursive: true });
259
+ writeFileSync(targetPath, content);
260
+ if (relPath.startsWith('scripts/') && relPath.endsWith('.sh')) {
261
+ chmodSync(targetPath, 0o755);
262
+ }
263
+ }
264
+ makeTreeWritable(targetDir);
265
+ }
156
266
  function collectFileEntries(dir, root, out) {
157
267
  if (!existsSync(dir))
158
268
  return;
@@ -557,18 +667,20 @@ function pruneRemovedBundledExtensions(manifest, agentDir) {
557
667
  removeFileIfStale('env-utils.js');
558
668
  }
559
669
  /**
560
- * Syncs all bundled resources to agentDir (~/.gsd/agent/) on every launch.
670
+ * Initializes managed resources under agentDir (~/.gsd/agent/).
561
671
  *
562
672
  * - extensions/ → ~/.gsd/agent/extensions/ (overwrite when version changes)
563
673
  * - shared/ → ~/.gsd/agent/shared/ (overwrite when version changes)
564
674
  * - agents/ → ~/.gsd/agent/agents/ (overwrite when version changes)
565
675
  * - skills/ → ~/.gsd/agent/skills/ (overwrite when version changes)
676
+ * - gsd-browser skill → ~/.gsd/agent/skills/gsd-browser/ from @opengsd/gsd-browser
566
677
  * - GSD-WORKFLOW.md → ~/.gsd/agent/GSD-WORKFLOW.md (fallback for env var miss)
567
678
  *
568
- * Skips the copy when the managed-resources.json version matches the current
569
- * GSD version, avoiding ~128ms of synchronous cpSync on every startup.
570
- * After `npm update -g @glittercowboy/gsd`, versions will differ and the
571
- * copy runs once to land the new resources.
679
+ * Skips the full copy only when the managed-resources.json version, content
680
+ * fingerprint, and package-owned gsd-browser skill all match the current
681
+ * install, avoiding ~128ms of synchronous cpSync on steady-state startup.
682
+ * After `npm update -g @opengsd/gsd-pi`, versions will differ and the copy
683
+ * runs once to land the new resources.
572
684
  *
573
685
  * Inspectable: `ls ~/.gsd/agent/extensions/`
574
686
  */
@@ -603,11 +715,13 @@ export function initResources(agentDir, skillsDir = join(agentDir, 'skills')) {
603
715
  const hasStaleExtensionFiles = hasStaleCompiledExtensionSiblings(extensionsDir, bundledExtensionsDir);
604
716
  const hasMissingSharedFiles = hasMissingBundledResourceFiles(join(agentDir, 'shared'), join(resourcesDir, 'shared'));
605
717
  const hasMissingSkillFiles = hasMissingBundledResourceFiles(skillsDir, join(resourcesDir, 'skills'));
718
+ const hasStaleGsdBrowserSkill = hasStaleGsdBrowserPackageSkill(skillsDir);
606
719
  if (manifest.contentHash &&
607
720
  manifest.contentHash === currentHash &&
608
721
  !hasStaleExtensionFiles &&
609
722
  !hasMissingSharedFiles &&
610
- !hasMissingSkillFiles) {
723
+ !hasMissingSkillFiles &&
724
+ !hasStaleGsdBrowserSkill) {
611
725
  return;
612
726
  }
613
727
  }
@@ -616,6 +730,7 @@ export function initResources(agentDir, skillsDir = join(agentDir, 'skills')) {
616
730
  syncResourceDir(join(resourcesDir, 'shared'), join(agentDir, 'shared'));
617
731
  syncResourceDir(join(resourcesDir, 'agents'), join(agentDir, 'agents'));
618
732
  syncResourceDir(join(resourcesDir, 'skills'), skillsDir);
733
+ syncGsdBrowserPackageSkill(skillsDir);
619
734
  // Sync GSD-WORKFLOW.md to agentDir as a fallback for when GSD_WORKFLOW_PATH
620
735
  // env var is not set (e.g. fork/dev builds, alternative entry points).
621
736
  const workflowSrc = join(resourcesDir, 'GSD-WORKFLOW.md');
@@ -1 +1 @@
1
- 9afebd3db70730bd
1
+ 173573359f5af483
@@ -187,10 +187,11 @@ function formatForLLM(result) {
187
187
  }
188
188
  return JSON.stringify({ answers });
189
189
  }
190
- async function playQuestionBell() {
190
+ /** @internal Exported for testing only. */
191
+ export async function playQuestionBell(preferences, stream) {
191
192
  try {
192
193
  const { playNotificationBell } = await import("./gsd/notifications.js");
193
- playNotificationBell("question");
194
+ playNotificationBell("question", preferences, stream);
194
195
  }
195
196
  catch {
196
197
  // Best-effort: question rendering must never depend on alert delivery.