@opengsd/gsd-pi 1.0.2-dev.e70300c → 1.0.2-dev.fb7ddf1

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 (480) hide show
  1. package/README.md +63 -12
  2. package/dist/headless-answers.js +2 -1
  3. package/dist/headless-events.d.ts +1 -0
  4. package/dist/headless-events.js +8 -1
  5. package/dist/onboarding.js +22 -3
  6. package/dist/resource-loader.d.ts +7 -0
  7. package/dist/resource-loader.js +44 -9
  8. package/dist/resources/.managed-resources-content-hash +1 -1
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +34 -11
  10. package/dist/resources/extensions/context7/index.js +12 -2
  11. package/dist/resources/extensions/get-secrets-from-user.js +16 -16
  12. package/dist/resources/extensions/google-cli/index.js +30 -0
  13. package/dist/resources/extensions/google-cli/models.js +55 -0
  14. package/dist/resources/extensions/google-cli/package.json +11 -0
  15. package/dist/resources/extensions/google-cli/readiness.js +12 -0
  16. package/dist/resources/extensions/google-cli/stream-adapter.js +191 -0
  17. package/dist/resources/extensions/gsd/auto/loop.js +81 -1
  18. package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -2
  19. package/dist/resources/extensions/gsd/auto/phases.js +38 -1
  20. package/dist/resources/extensions/gsd/auto/run-unit.js +8 -0
  21. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +17 -7
  23. package/dist/resources/extensions/gsd/auto-post-unit.js +65 -16
  24. package/dist/resources/extensions/gsd/auto-prompts.js +5 -236
  25. package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
  26. package/dist/resources/extensions/gsd/auto-start.js +232 -49
  27. package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -1
  28. package/dist/resources/extensions/gsd/auto-verification.js +14 -2
  29. package/dist/resources/extensions/gsd/auto-worktree.js +34 -1
  30. package/dist/resources/extensions/gsd/auto.js +40 -2
  31. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +4 -3
  32. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -2
  33. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +39 -5
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +107 -27
  35. package/dist/resources/extensions/gsd/bootstrap/system-context.js +3 -27
  36. package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +4 -4
  37. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
  38. package/dist/resources/extensions/gsd/closeout-recovery.js +7 -1
  39. package/dist/resources/extensions/gsd/commands/handlers/auto.js +9 -1
  40. package/dist/resources/extensions/gsd/commands-handlers.js +3 -0
  41. package/dist/resources/extensions/gsd/commands-usage.js +105 -1
  42. package/dist/resources/extensions/gsd/config-overlay.js +20 -14
  43. package/dist/resources/extensions/gsd/context-overlay.js +22 -16
  44. package/dist/resources/extensions/gsd/dashboard-overlay.js +10 -23
  45. package/dist/resources/extensions/gsd/doctor-engine-checks.js +87 -0
  46. package/dist/resources/extensions/gsd/doctor-git-checks.js +70 -5
  47. package/dist/resources/extensions/gsd/doctor-providers.js +54 -24
  48. package/dist/resources/extensions/gsd/doctor.js +7 -2
  49. package/dist/resources/extensions/gsd/git-conflict-state.js +26 -1
  50. package/dist/resources/extensions/gsd/guided-flow.js +5 -6
  51. package/dist/resources/extensions/gsd/key-manager.js +45 -13
  52. package/dist/resources/extensions/gsd/mcp-filter.js +57 -18
  53. package/dist/resources/extensions/gsd/mcp-project-config.js +15 -9
  54. package/dist/resources/extensions/gsd/migration-auto-check.js +5 -1
  55. package/dist/resources/extensions/gsd/milestone-actions.js +3 -0
  56. package/dist/resources/extensions/gsd/milestone-reopen-events.js +28 -0
  57. package/dist/resources/extensions/gsd/notification-overlay.js +8 -9
  58. package/dist/resources/extensions/gsd/parallel-merge.js +6 -4
  59. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +15 -13
  60. package/dist/resources/extensions/gsd/post-execution-checks.js +5 -4
  61. package/dist/resources/extensions/gsd/preferences-skills.js +11 -4
  62. package/dist/resources/extensions/gsd/preferences.js +14 -2
  63. package/dist/resources/extensions/gsd/prompt-loader.js +2 -0
  64. package/dist/resources/extensions/gsd/prompts/discuss.md +4 -2
  65. package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
  66. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  67. package/dist/resources/extensions/gsd/prompts/system.md +3 -20
  68. package/dist/resources/extensions/gsd/queue-reorder-ui.js +28 -18
  69. package/dist/resources/extensions/gsd/repo-identity.js +36 -6
  70. package/dist/resources/extensions/gsd/repository-registry.js +3 -1
  71. package/dist/resources/extensions/gsd/safety/evidence-collector.js +13 -6
  72. package/dist/resources/extensions/gsd/skill-activation.js +233 -0
  73. package/dist/resources/extensions/gsd/skill-catalog.data.js +820 -0
  74. package/dist/resources/extensions/gsd/skill-catalog.install.js +179 -0
  75. package/dist/resources/extensions/gsd/skill-catalog.js +5 -1028
  76. package/dist/resources/extensions/gsd/skill-discovery.js +121 -79
  77. package/dist/resources/extensions/gsd/skill-scope.js +52 -0
  78. package/dist/resources/extensions/gsd/skill-telemetry.js +6 -39
  79. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +1 -1
  80. package/dist/resources/extensions/gsd/skills.js +60 -0
  81. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +351 -0
  82. package/dist/resources/extensions/gsd/state-reconciliation/index.js +41 -0
  83. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +4 -0
  84. package/dist/resources/extensions/gsd/tools/complete-task.js +9 -0
  85. package/dist/resources/extensions/gsd/tools/exec-tool.js +42 -8
  86. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +63 -2
  87. package/dist/resources/extensions/gsd/tui/render-kit.js +51 -0
  88. package/dist/resources/extensions/gsd/unit-context-manifest.js +35 -26
  89. package/dist/resources/extensions/gsd/user-input-boundary.js +1 -1
  90. package/dist/resources/extensions/gsd/vision-ask.js +22 -0
  91. package/dist/resources/extensions/gsd/visualizer-overlay.js +8 -36
  92. package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -3
  93. package/dist/resources/extensions/gsd/worktree-state-projection.js +29 -0
  94. package/dist/resources/extensions/search-the-web/native-search.js +57 -8
  95. package/dist/resources/extensions/shared/confirm-ui.js +9 -6
  96. package/dist/resources/extensions/shared/dialog-frame.js +42 -0
  97. package/dist/resources/extensions/shared/interview-ui.js +42 -30
  98. package/dist/resources/extensions/shared/next-action-ui.js +6 -6
  99. package/dist/resources/extensions/subagent/index.js +8 -15
  100. package/dist/resources/shared/package-manager-detection.js +36 -0
  101. package/dist/resources/skills/agent-browser/SKILL.md +1 -1
  102. package/dist/resources/skills/api-design/SKILL.md +1 -1
  103. package/dist/resources/skills/code-optimizer/SKILL.md +6 -11
  104. package/dist/resources/skills/create-gsd-extension/SKILL.md +1 -1
  105. package/dist/resources/skills/create-mcp-server/SKILL.md +1 -1
  106. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
  107. package/dist/resources/skills/create-skill/workflows/verify-skill.md +2 -10
  108. package/dist/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
  109. package/dist/resources/skills/decompose-into-slices/SKILL.md +3 -3
  110. package/dist/resources/skills/dependency-upgrade/SKILL.md +1 -1
  111. package/dist/resources/skills/forensics/SKILL.md +2 -2
  112. package/dist/resources/skills/grill-me/SKILL.md +1 -1
  113. package/dist/resources/skills/handoff/SKILL.md +1 -1
  114. package/dist/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
  115. package/dist/resources/skills/observability/SKILL.md +1 -1
  116. package/dist/resources/skills/security-review/SKILL.md +1 -1
  117. package/dist/resources/skills/spike-wrap-up/SKILL.md +1 -1
  118. package/dist/resources/skills/tdd/SKILL.md +1 -1
  119. package/dist/resources/skills/write-docs/SKILL.md +1 -1
  120. package/dist/resources/skills/write-milestone-brief/SKILL.md +1 -1
  121. package/dist/update-check.d.ts +6 -2
  122. package/dist/update-check.js +7 -3
  123. package/dist/web/standalone/.next/BUILD_ID +1 -1
  124. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  125. package/dist/web/standalone/.next/build-manifest.json +2 -2
  126. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  127. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/index.html +1 -1
  145. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  152. package/dist/web/standalone/.next/server/chunks/1834.js +2 -2
  153. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  154. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  155. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  156. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  157. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  158. package/package.json +5 -2
  159. package/packages/cloud-mcp-gateway/package.json +2 -2
  160. package/packages/contracts/dist/rpc.test.js +5 -0
  161. package/packages/contracts/dist/rpc.test.js.map +1 -1
  162. package/packages/contracts/dist/workflow.d.ts +15 -0
  163. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  164. package/packages/contracts/dist/workflow.js +16 -0
  165. package/packages/contracts/dist/workflow.js.map +1 -1
  166. package/packages/contracts/dist/workflow.test.js +1 -0
  167. package/packages/contracts/dist/workflow.test.js.map +1 -1
  168. package/packages/contracts/package.json +1 -1
  169. package/packages/daemon/package.json +4 -4
  170. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +1 -0
  171. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  172. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +22 -8
  173. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  174. package/packages/gsd-agent-core/package.json +5 -5
  175. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts +12 -0
  176. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts.map +1 -0
  177. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js +45 -0
  178. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js.map +1 -0
  179. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts +3 -2
  180. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  181. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js +11 -11
  182. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js.map +1 -1
  183. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts +3 -3
  184. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  185. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js +13 -11
  186. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js.map +1 -1
  187. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts +3 -3
  188. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  189. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js +12 -10
  190. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js.map +1 -1
  191. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts +1 -0
  192. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts.map +1 -1
  193. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js +1 -0
  194. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js.map +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  196. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  197. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +2 -2
  198. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
  199. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts +6 -1
  200. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  201. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js +9 -6
  202. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  203. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  204. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -1
  205. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  206. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  207. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +0 -2
  208. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  209. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -0
  210. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
  211. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -0
  212. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
  213. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  214. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +2 -1
  215. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  216. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts +3 -0
  217. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  218. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +144 -2
  219. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  220. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.d.ts.map +1 -1
  221. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js +2 -14
  222. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js.map +1 -1
  223. package/packages/gsd-agent-modes/package.json +7 -7
  224. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  225. package/packages/mcp-server/dist/server.js +7 -1
  226. package/packages/mcp-server/dist/server.js.map +1 -1
  227. package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
  228. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  229. package/packages/mcp-server/dist/workflow-tools.js +47 -8
  230. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  231. package/packages/mcp-server/package.json +3 -3
  232. package/packages/native/package.json +1 -1
  233. package/packages/pi-agent-core/dist/agent-loop.js +16 -14
  234. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  235. package/packages/pi-agent-core/dist/harness/skills.d.ts.map +1 -1
  236. package/packages/pi-agent-core/dist/harness/skills.js +6 -0
  237. package/packages/pi-agent-core/dist/harness/skills.js.map +1 -1
  238. package/packages/pi-agent-core/dist/harness/system-prompt.d.ts +7 -0
  239. package/packages/pi-agent-core/dist/harness/system-prompt.d.ts.map +1 -1
  240. package/packages/pi-agent-core/dist/harness/system-prompt.js +7 -0
  241. package/packages/pi-agent-core/dist/harness/system-prompt.js.map +1 -1
  242. package/packages/pi-agent-core/package.json +1 -1
  243. package/packages/pi-ai/dist/models.generated.d.ts +48 -206
  244. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  245. package/packages/pi-ai/dist/models.generated.js +67 -220
  246. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  247. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  248. package/packages/pi-ai/dist/providers/anthropic.js +50 -0
  249. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  250. package/packages/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
  251. package/packages/pi-ai/dist/providers/openai-responses-shared.js +28 -4
  252. package/packages/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
  253. package/packages/pi-ai/dist/types.d.ts +2 -0
  254. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  255. package/packages/pi-ai/dist/types.js.map +1 -1
  256. package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js +29 -1
  257. package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js.map +1 -1
  258. package/packages/pi-ai/dist/utils/tool-search-shim.d.ts +4 -1
  259. package/packages/pi-ai/dist/utils/tool-search-shim.d.ts.map +1 -1
  260. package/packages/pi-ai/dist/utils/tool-search-shim.js +58 -10
  261. package/packages/pi-ai/dist/utils/tool-search-shim.js.map +1 -1
  262. package/packages/pi-ai/dist/utils/tool-shims.d.ts +1 -1
  263. package/packages/pi-ai/dist/utils/tool-shims.d.ts.map +1 -1
  264. package/packages/pi-ai/dist/utils/tool-shims.js.map +1 -1
  265. package/packages/pi-ai/package.json +1 -1
  266. package/packages/pi-coding-agent/README.md +1 -1
  267. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +2 -2
  268. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/extensions/loader.js +1 -1
  271. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/extensions/runner.js +8 -2
  274. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/skills.d.ts +3 -0
  276. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/skills.js +3 -0
  278. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/tools/edit.js +5 -7
  281. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -2
  283. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/tools/read.js +5 -4
  285. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/tools/write.js +0 -1
  288. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  289. package/packages/pi-coding-agent/package.json +8 -8
  290. package/packages/pi-tui/package.json +1 -1
  291. package/packages/rpc-client/package.json +2 -2
  292. package/pkg/package.json +1 -1
  293. package/scripts/install/detect-existing.js +17 -3
  294. package/scripts/install/npm-global.js +103 -33
  295. package/scripts/install.js +1 -0
  296. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +36 -11
  297. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +86 -19
  298. package/src/resources/extensions/context7/index.ts +15 -2
  299. package/src/resources/extensions/get-secrets-from-user.ts +17 -16
  300. package/src/resources/extensions/google-cli/index.ts +34 -0
  301. package/src/resources/extensions/google-cli/models.ts +57 -0
  302. package/src/resources/extensions/google-cli/package.json +11 -0
  303. package/src/resources/extensions/google-cli/readiness.ts +15 -0
  304. package/src/resources/extensions/google-cli/stream-adapter.ts +245 -0
  305. package/src/resources/extensions/gsd/auto/loop.ts +96 -1
  306. package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -2
  307. package/src/resources/extensions/gsd/auto/phases.ts +47 -1
  308. package/src/resources/extensions/gsd/auto/run-unit.ts +10 -0
  309. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  310. package/src/resources/extensions/gsd/auto-dispatch.ts +31 -11
  311. package/src/resources/extensions/gsd/auto-post-unit.ts +101 -18
  312. package/src/resources/extensions/gsd/auto-prompts.ts +4 -284
  313. package/src/resources/extensions/gsd/auto-recovery.ts +10 -7
  314. package/src/resources/extensions/gsd/auto-start.ts +307 -56
  315. package/src/resources/extensions/gsd/auto-tool-tracking.ts +3 -1
  316. package/src/resources/extensions/gsd/auto-verification.ts +18 -2
  317. package/src/resources/extensions/gsd/auto-worktree.ts +45 -1
  318. package/src/resources/extensions/gsd/auto.ts +50 -2
  319. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +4 -3
  320. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +9 -4
  321. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +42 -5
  322. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +124 -25
  323. package/src/resources/extensions/gsd/bootstrap/system-context.ts +3 -28
  324. package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +4 -4
  325. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
  326. package/src/resources/extensions/gsd/closeout-recovery.ts +6 -1
  327. package/src/resources/extensions/gsd/commands/handlers/auto.ts +9 -1
  328. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  329. package/src/resources/extensions/gsd/commands-usage.ts +110 -5
  330. package/src/resources/extensions/gsd/config-overlay.ts +19 -16
  331. package/src/resources/extensions/gsd/context-overlay.ts +24 -19
  332. package/src/resources/extensions/gsd/dashboard-overlay.ts +14 -27
  333. package/src/resources/extensions/gsd/doctor-engine-checks.ts +99 -0
  334. package/src/resources/extensions/gsd/doctor-git-checks.ts +72 -5
  335. package/src/resources/extensions/gsd/doctor-providers.ts +55 -27
  336. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  337. package/src/resources/extensions/gsd/doctor.ts +7 -2
  338. package/src/resources/extensions/gsd/git-conflict-state.ts +25 -1
  339. package/src/resources/extensions/gsd/guided-flow.ts +5 -6
  340. package/src/resources/extensions/gsd/key-manager.ts +57 -14
  341. package/src/resources/extensions/gsd/mcp-filter.ts +64 -17
  342. package/src/resources/extensions/gsd/mcp-project-config.ts +24 -9
  343. package/src/resources/extensions/gsd/migration-auto-check.ts +6 -0
  344. package/src/resources/extensions/gsd/milestone-actions.ts +2 -0
  345. package/src/resources/extensions/gsd/milestone-reopen-events.ts +28 -0
  346. package/src/resources/extensions/gsd/notification-overlay.ts +12 -11
  347. package/src/resources/extensions/gsd/parallel-merge.ts +6 -4
  348. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +16 -12
  349. package/src/resources/extensions/gsd/post-execution-checks.ts +7 -4
  350. package/src/resources/extensions/gsd/preferences-skills.ts +11 -4
  351. package/src/resources/extensions/gsd/preferences.ts +17 -2
  352. package/src/resources/extensions/gsd/prompt-loader.ts +2 -0
  353. package/src/resources/extensions/gsd/prompts/discuss.md +4 -2
  354. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
  355. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  356. package/src/resources/extensions/gsd/prompts/system.md +3 -20
  357. package/src/resources/extensions/gsd/queue-reorder-ui.ts +29 -20
  358. package/src/resources/extensions/gsd/repo-identity.ts +35 -7
  359. package/src/resources/extensions/gsd/repository-registry.ts +3 -1
  360. package/src/resources/extensions/gsd/safety/evidence-collector.ts +13 -6
  361. package/src/resources/extensions/gsd/skill-activation.ts +292 -0
  362. package/src/resources/extensions/gsd/skill-catalog.data.ts +858 -0
  363. package/src/resources/extensions/gsd/skill-catalog.install.ts +205 -0
  364. package/src/resources/extensions/gsd/skill-catalog.ts +16 -1087
  365. package/src/resources/extensions/gsd/skill-discovery.ts +134 -78
  366. package/src/resources/extensions/gsd/skill-scope.ts +63 -0
  367. package/src/resources/extensions/gsd/skill-telemetry.ts +6 -40
  368. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +1 -1
  369. package/src/resources/extensions/gsd/skills.ts +75 -0
  370. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +499 -0
  371. package/src/resources/extensions/gsd/state-reconciliation/index.ts +40 -0
  372. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +8 -0
  373. package/src/resources/extensions/gsd/state-reconciliation/types.ts +30 -0
  374. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +328 -2
  375. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +75 -0
  376. package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +28 -2
  377. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +30 -0
  378. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +41 -0
  379. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +24 -0
  380. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +436 -0
  381. package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +53 -0
  382. package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +15 -0
  383. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +31 -0
  384. package/src/resources/extensions/gsd/tests/commands-context.test.ts +5 -3
  385. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +15 -2
  386. package/src/resources/extensions/gsd/tests/commands-usage.test.ts +97 -0
  387. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +40 -3
  388. package/src/resources/extensions/gsd/tests/context-chart.test.ts +9 -0
  389. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +64 -0
  390. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +25 -0
  391. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +1 -0
  392. package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +4 -2
  393. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +1 -1
  394. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +71 -1
  395. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +105 -0
  396. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +101 -1
  397. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +30 -0
  398. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +6 -0
  399. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +22 -3
  400. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +43 -0
  401. package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +8 -0
  402. package/src/resources/extensions/gsd/tests/key-manager.test.ts +23 -4
  403. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +19 -1
  404. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +24 -0
  405. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +56 -1
  406. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +6 -1
  407. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +70 -10
  408. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +7 -1
  409. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +9 -0
  410. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +127 -10
  411. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +44 -0
  412. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +93 -0
  413. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +101 -0
  414. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +46 -0
  415. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +116 -11
  416. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +27 -0
  417. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +30 -1
  418. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +4 -0
  419. package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +111 -0
  420. package/src/resources/extensions/gsd/tests/skill-scope-auto.test.ts +67 -0
  421. package/src/resources/extensions/gsd/tests/skills.test.ts +55 -0
  422. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +13 -2
  423. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +303 -0
  424. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +67 -1
  425. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +24 -1
  426. package/src/resources/extensions/gsd/tests/tui-border-assertions.ts +28 -0
  427. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +14 -0
  428. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +18 -0
  429. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +26 -0
  430. package/src/resources/extensions/gsd/tests/vision-ask.test.ts +23 -0
  431. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -1
  432. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +133 -0
  433. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +82 -0
  434. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +16 -1
  435. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +28 -0
  436. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +38 -1
  437. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +10 -0
  438. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +45 -1
  439. package/src/resources/extensions/gsd/tools/complete-task.ts +9 -0
  440. package/src/resources/extensions/gsd/tools/exec-tool.ts +42 -10
  441. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +82 -5
  442. package/src/resources/extensions/gsd/tui/render-kit.ts +82 -0
  443. package/src/resources/extensions/gsd/unit-context-manifest.ts +37 -26
  444. package/src/resources/extensions/gsd/user-input-boundary.ts +1 -1
  445. package/src/resources/extensions/gsd/vision-ask.ts +28 -0
  446. package/src/resources/extensions/gsd/visualizer-overlay.ts +12 -40
  447. package/src/resources/extensions/gsd/worktree-lifecycle.ts +37 -2
  448. package/src/resources/extensions/gsd/worktree-state-projection.ts +33 -0
  449. package/src/resources/extensions/search-the-web/native-search.ts +60 -8
  450. package/src/resources/extensions/shared/confirm-ui.ts +8 -12
  451. package/src/resources/extensions/shared/dialog-frame.ts +71 -0
  452. package/src/resources/extensions/shared/interview-ui.ts +43 -42
  453. package/src/resources/extensions/shared/next-action-ui.ts +6 -6
  454. package/src/resources/extensions/shared/tests/confirm-ui.test.ts +57 -0
  455. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +163 -0
  456. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +55 -0
  457. package/src/resources/extensions/subagent/index.ts +8 -15
  458. package/src/resources/shared/package-manager-detection.ts +39 -0
  459. package/src/resources/skills/agent-browser/SKILL.md +1 -1
  460. package/src/resources/skills/api-design/SKILL.md +1 -1
  461. package/src/resources/skills/code-optimizer/SKILL.md +6 -11
  462. package/src/resources/skills/create-gsd-extension/SKILL.md +1 -1
  463. package/src/resources/skills/create-mcp-server/SKILL.md +1 -1
  464. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
  465. package/src/resources/skills/create-skill/workflows/verify-skill.md +2 -10
  466. package/src/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
  467. package/src/resources/skills/decompose-into-slices/SKILL.md +3 -3
  468. package/src/resources/skills/dependency-upgrade/SKILL.md +1 -1
  469. package/src/resources/skills/forensics/SKILL.md +2 -2
  470. package/src/resources/skills/grill-me/SKILL.md +1 -1
  471. package/src/resources/skills/handoff/SKILL.md +1 -1
  472. package/src/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
  473. package/src/resources/skills/observability/SKILL.md +1 -1
  474. package/src/resources/skills/security-review/SKILL.md +1 -1
  475. package/src/resources/skills/spike-wrap-up/SKILL.md +1 -1
  476. package/src/resources/skills/tdd/SKILL.md +1 -1
  477. package/src/resources/skills/write-docs/SKILL.md +1 -1
  478. package/src/resources/skills/write-milestone-brief/SKILL.md +1 -1
  479. /package/dist/web/standalone/.next/static/{szb-HAt0IoSx3docUZO-E → tH1tnDYt1E0hK9Ien73Z0}/_buildManifest.js +0 -0
  480. /package/dist/web/standalone/.next/static/{szb-HAt0IoSx3docUZO-E → tH1tnDYt1E0hK9Ien73Z0}/_ssgManifest.js +0 -0
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Google local CLI providers.
3
+ *
4
+ * These deliberately use authMode "externalCli": GSD never owns the browser
5
+ * OAuth flow or cached tokens. Users authenticate with the official CLI, then
6
+ * /login activates the provider once the local binary is available.
7
+ */
8
+
9
+ import type { ExtensionAPI } from "@gsd/pi-coding-agent";
10
+ import { GOOGLE_ANTIGRAVITY_MODELS, GOOGLE_GEMINI_CLI_MODELS } from "./models.js";
11
+ import { isAntigravityCliReady, isGeminiCliReady } from "./readiness.js";
12
+ import { streamViaGoogleCli } from "./stream-adapter.js";
13
+
14
+ export default function googleCli(pi: ExtensionAPI) {
15
+ pi.registerProvider("google-gemini-cli", {
16
+ name: "Google Gemini CLI",
17
+ authMode: "externalCli",
18
+ api: "google-gemini-cli",
19
+ baseUrl: "local://google-gemini-cli",
20
+ isReady: isGeminiCliReady,
21
+ streamSimple: streamViaGoogleCli,
22
+ models: GOOGLE_GEMINI_CLI_MODELS,
23
+ });
24
+
25
+ pi.registerProvider("google-antigravity", {
26
+ name: "Google Antigravity",
27
+ authMode: "externalCli",
28
+ api: "google-antigravity",
29
+ baseUrl: "local://google-antigravity",
30
+ isReady: isAntigravityCliReady,
31
+ streamSimple: streamViaGoogleCli,
32
+ models: GOOGLE_ANTIGRAVITY_MODELS,
33
+ });
34
+ }
@@ -0,0 +1,57 @@
1
+ const ZERO_COST = {
2
+ input: 0,
3
+ output: 0,
4
+ cacheRead: 0,
5
+ cacheWrite: 0,
6
+ };
7
+
8
+ export const GOOGLE_GEMINI_CLI_MODELS = [
9
+ {
10
+ id: "gemini-2.5-flash",
11
+ name: "Gemini 2.5 Flash",
12
+ reasoning: true,
13
+ input: ["text" as const],
14
+ cost: ZERO_COST,
15
+ contextWindow: 1_000_000,
16
+ maxTokens: 65_536,
17
+ },
18
+ {
19
+ id: "gemini-2.5-pro",
20
+ name: "Gemini 2.5 Pro",
21
+ reasoning: true,
22
+ input: ["text" as const],
23
+ cost: ZERO_COST,
24
+ contextWindow: 1_000_000,
25
+ maxTokens: 65_536,
26
+ },
27
+ {
28
+ id: "gemini-3-flash-preview",
29
+ name: "Gemini 3 Flash Preview",
30
+ reasoning: true,
31
+ input: ["text" as const],
32
+ cost: ZERO_COST,
33
+ contextWindow: 1_000_000,
34
+ maxTokens: 65_536,
35
+ },
36
+ {
37
+ id: "gemini-3.1-pro-preview",
38
+ name: "Gemini 3.1 Pro Preview",
39
+ reasoning: true,
40
+ input: ["text" as const],
41
+ cost: ZERO_COST,
42
+ contextWindow: 1_000_000,
43
+ maxTokens: 65_536,
44
+ },
45
+ ];
46
+
47
+ export const GOOGLE_ANTIGRAVITY_MODELS = [
48
+ {
49
+ id: "default",
50
+ name: "Antigravity Default",
51
+ reasoning: true,
52
+ input: ["text" as const],
53
+ cost: ZERO_COST,
54
+ contextWindow: 1_000_000,
55
+ maxTokens: 65_536,
56
+ },
57
+ ];
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "@gsd/google-cli",
3
+ "private": true,
4
+ "version": "1.0.0",
5
+ "type": "module",
6
+ "pi": {
7
+ "extensions": [
8
+ "./index.ts"
9
+ ]
10
+ }
11
+ }
@@ -0,0 +1,15 @@
1
+ import { spawnSync } from "node:child_process";
2
+
3
+ function isCommandInPath(command: string): boolean {
4
+ const resolver = process.platform === "win32" ? "where" : "which";
5
+ const result = spawnSync(resolver, [command], { stdio: "ignore" });
6
+ return result.status === 0;
7
+ }
8
+
9
+ export function isGeminiCliReady(): boolean {
10
+ return isCommandInPath("gemini");
11
+ }
12
+
13
+ export function isAntigravityCliReady(): boolean {
14
+ return isCommandInPath("agy");
15
+ }
@@ -0,0 +1,245 @@
1
+ import { spawn } from "node:child_process";
2
+ import type {
3
+ Api,
4
+ AssistantMessage,
5
+ AssistantMessageEventStream,
6
+ Context,
7
+ Message,
8
+ Model,
9
+ SimpleStreamOptions,
10
+ TextContent,
11
+ } from "@gsd/pi-ai";
12
+ import { createAssistantMessageEventStream } from "@gsd/pi-ai";
13
+
14
+ const ZERO_USAGE = {
15
+ input: 0,
16
+ output: 0,
17
+ cacheRead: 0,
18
+ cacheWrite: 0,
19
+ totalTokens: 0,
20
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
21
+ };
22
+
23
+ type GoogleCliProviderId = "google-gemini-cli" | "google-antigravity";
24
+
25
+ interface CliRunResult {
26
+ stdout: string;
27
+ stderr: string;
28
+ code: number | null;
29
+ signal: NodeJS.Signals | null;
30
+ }
31
+
32
+ function textBlocks(content: (TextContent | { type: string })[]): string {
33
+ return content
34
+ .map((block) => block.type === "text" ? (block as TextContent).text : `[${block.type} omitted]`)
35
+ .join("\n");
36
+ }
37
+
38
+ function messageToText(message: Message): string {
39
+ if (message.role === "user") {
40
+ const content = typeof message.content === "string" ? message.content : textBlocks(message.content);
41
+ return `User:\n${content}`;
42
+ }
43
+
44
+ if (message.role === "assistant") {
45
+ const text = message.content
46
+ .map((block) => {
47
+ if (block.type === "text") return block.text;
48
+ if (block.type === "thinking") return `[thinking omitted]`;
49
+ if (block.type === "toolCall") return `[tool call: ${block.name}]`;
50
+ if (block.type === "serverToolUse") return `[server tool: ${block.name}]`;
51
+ if (block.type === "webSearchResult") return `[web search result omitted]`;
52
+ return `[${(block as { type: string }).type} omitted]`;
53
+ })
54
+ .join("\n");
55
+ return `Assistant:\n${text}`;
56
+ }
57
+
58
+ return `Tool result (${message.toolName}):\n${textBlocks(message.content)}`;
59
+ }
60
+
61
+ export function buildGoogleCliPrompt(context: Context): string {
62
+ const parts: string[] = [];
63
+
64
+ if (context.systemPrompt?.trim()) {
65
+ parts.push(`System instructions:\n${context.systemPrompt.trim()}`);
66
+ }
67
+
68
+ if (context.messages.length > 0) {
69
+ parts.push(context.messages.map(messageToText).join("\n\n"));
70
+ }
71
+
72
+ if (context.tools?.length) {
73
+ const names = context.tools.map((tool) => tool.name).join(", ");
74
+ parts.push(
75
+ `Available local GSD tools were not forwarded to this external CLI bridge. ` +
76
+ `If you need to act, use the CLI's own tools or ask the user to switch to a provider with native tool-call support. ` +
77
+ `Requested GSD tools: ${names}`,
78
+ );
79
+ }
80
+
81
+ return parts.join("\n\n").trim();
82
+ }
83
+
84
+ function buildAssistantMessage(
85
+ model: Model<Api>,
86
+ text: string,
87
+ stopReason: AssistantMessage["stopReason"] = "stop",
88
+ errorMessage?: string,
89
+ ): AssistantMessage {
90
+ return {
91
+ role: "assistant",
92
+ content: text ? [{ type: "text", text }] : [],
93
+ api: model.api,
94
+ provider: model.provider,
95
+ model: model.id,
96
+ usage: { ...ZERO_USAGE, cost: { ...ZERO_USAGE.cost } },
97
+ stopReason,
98
+ ...(errorMessage ? { errorMessage } : {}),
99
+ timestamp: Date.now(),
100
+ };
101
+ }
102
+
103
+ function extractGeminiJsonResponse(raw: string): string {
104
+ const trimmed = raw.trim();
105
+ if (!trimmed) return "";
106
+
107
+ try {
108
+ const parsed = JSON.parse(trimmed) as Record<string, unknown>;
109
+ for (const key of ["response", "text", "content", "message"]) {
110
+ const value = parsed[key];
111
+ if (typeof value === "string") return value;
112
+ }
113
+ return JSON.stringify(parsed, null, 2);
114
+ } catch {
115
+ return trimmed;
116
+ }
117
+ }
118
+
119
+ function commandForProvider(provider: GoogleCliProviderId): string {
120
+ return provider === "google-gemini-cli" ? "gemini" : "agy";
121
+ }
122
+
123
+ function argsForProvider(provider: GoogleCliProviderId, model: Model<Api>, prompt: string): string[] {
124
+ if (provider === "google-gemini-cli") {
125
+ const args = ["-p", prompt, "--output-format", "json"];
126
+ if (model.id !== "default") args.unshift("-m", model.id);
127
+ return args;
128
+ }
129
+
130
+ const args = ["-p", prompt];
131
+ if (model.id !== "default") args.unshift("-m", model.id);
132
+ return args;
133
+ }
134
+
135
+ export function buildGoogleCliSpawnInvocation(
136
+ command: string,
137
+ args: string[],
138
+ platform: NodeJS.Platform = process.platform,
139
+ ): { command: string; args: string[] } {
140
+ if (platform === "win32") {
141
+ return { command: "cmd", args: ["/c", command, ...args] };
142
+ }
143
+ return { command, args };
144
+ }
145
+
146
+ function runCli(command: string, args: string[], options?: SimpleStreamOptions): Promise<CliRunResult> {
147
+ return new Promise((resolve, reject) => {
148
+ const invocation = buildGoogleCliSpawnInvocation(command, args);
149
+ const child = spawn(invocation.command, invocation.args, {
150
+ cwd: options?.cwd || process.cwd(),
151
+ env: process.env,
152
+ stdio: ["ignore", "pipe", "pipe"],
153
+ });
154
+
155
+ let stdout = "";
156
+ let stderr = "";
157
+ let settled = false;
158
+
159
+ const settle = (fn: () => void) => {
160
+ if (settled) return;
161
+ settled = true;
162
+ options?.signal?.removeEventListener("abort", onAbort);
163
+ fn();
164
+ };
165
+
166
+ const onAbort = () => {
167
+ child.kill("SIGTERM");
168
+ settle(() => reject(new Error("Request was aborted")));
169
+ };
170
+
171
+ if (options?.signal?.aborted) {
172
+ onAbort();
173
+ return;
174
+ }
175
+ options?.signal?.addEventListener("abort", onAbort);
176
+
177
+ child.stdout.setEncoding("utf8");
178
+ child.stderr.setEncoding("utf8");
179
+ child.stdout.on("data", (chunk) => {
180
+ stdout += chunk;
181
+ });
182
+ child.stderr.on("data", (chunk) => {
183
+ stderr += chunk;
184
+ });
185
+
186
+ child.on("error", (error) => {
187
+ settle(() => reject(error));
188
+ });
189
+
190
+ child.on("close", (code, signal) => {
191
+ settle(() => resolve({ stdout, stderr, code, signal }));
192
+ });
193
+ });
194
+ }
195
+
196
+ function emitText(stream: AssistantMessageEventStream, message: AssistantMessage, text: string): void {
197
+ stream.push({ type: "start", partial: { ...message, content: [] } });
198
+ if (text) {
199
+ stream.push({ type: "text_start", contentIndex: 0, partial: message });
200
+ stream.push({ type: "text_delta", contentIndex: 0, delta: text, partial: message });
201
+ stream.push({ type: "text_end", contentIndex: 0, content: text, partial: message });
202
+ }
203
+ stream.push({ type: "done", reason: "stop", message });
204
+ stream.end(message);
205
+ }
206
+
207
+ function emitError(stream: AssistantMessageEventStream, model: Model<Api>, error: unknown): void {
208
+ const message = error instanceof Error ? error.message : String(error);
209
+ const output = buildAssistantMessage(model, "", "error", message);
210
+ stream.push({ type: "error", reason: "error", error: output });
211
+ stream.end(output);
212
+ }
213
+
214
+ export function streamViaGoogleCli(
215
+ model: Model<Api>,
216
+ context: Context,
217
+ options?: SimpleStreamOptions,
218
+ ): AssistantMessageEventStream {
219
+ const stream = createAssistantMessageEventStream();
220
+ const provider = model.provider as GoogleCliProviderId;
221
+
222
+ queueMicrotask(async () => {
223
+ try {
224
+ const prompt = buildGoogleCliPrompt(context);
225
+ const command = commandForProvider(provider);
226
+ const args = argsForProvider(provider, model, prompt);
227
+ const result = await runCli(command, args, options);
228
+
229
+ if (result.code !== 0) {
230
+ const detail = (result.stderr || result.stdout || `CLI exited with code ${result.code}`).trim();
231
+ throw new Error(detail);
232
+ }
233
+
234
+ const text = provider === "google-gemini-cli"
235
+ ? extractGeminiJsonResponse(result.stdout)
236
+ : result.stdout.trim();
237
+ const message = buildAssistantMessage(model, text);
238
+ emitText(stream, message, text);
239
+ } catch (error) {
240
+ emitError(stream, model, error);
241
+ }
242
+ });
243
+
244
+ return stream;
245
+ }
@@ -106,6 +106,7 @@ import {
106
106
  import { handleCustomEngineReconcile } from "./workflow-custom-engine-reconcile.js";
107
107
  import { handleCustomEngineReconcileOutcome } from "./workflow-custom-engine-reconcile-outcome.js";
108
108
  import { formatLeaseConflictNotice } from "./lease-conflict-notice.js";
109
+ import { setAutoOutcomeWidget, unitVerb } from "../auto-dashboard.js";
109
110
 
110
111
  /**
111
112
  * Returns true if workerId is an active worker in this project whose OS
@@ -834,6 +835,27 @@ export async function autoLoop(
834
835
  },
835
836
  });
836
837
  if (reconcileFlow.action === "break") break;
838
+ if (s.stepMode) {
839
+ if (ctx.hasUI) {
840
+ ctx.ui.setWidget?.("gsd-progress", undefined);
841
+ setAutoOutcomeWidget(ctx, {
842
+ status: "step",
843
+ title: "Step complete",
844
+ detail: `Completed ${unitVerb(iterData.unitType)} ${iterData.unitId}.`,
845
+ unitLabel: `${unitVerb(iterData.unitType)} ${iterData.unitId}`,
846
+ nextAction: "Advance one step, or resume automatic mode.",
847
+ commands: ["/gsd next", "/gsd auto", "/gsd status for overview"],
848
+ startedAt: s.autoStartTime,
849
+ });
850
+ }
851
+ ctx.ui.setStatus("gsd-auto", "next");
852
+ ctx.ui.notify(
853
+ `Step complete: ${unitVerb(iterData.unitType)} ${iterData.unitId}. Run /gsd next for the next step, or /gsd auto to continue automatically.`,
854
+ "info",
855
+ );
856
+ s.preserveStepSurfaceAfterLoopExit = true;
857
+ break;
858
+ }
837
859
  continue;
838
860
  }
839
861
 
@@ -859,10 +881,37 @@ export async function autoLoop(
859
881
  message: orchestrationResult.reason,
860
882
  category: "unknown",
861
883
  });
884
+ finishTurn("paused", "manual-attention", "orchestration-blocked");
862
885
  } else {
863
886
  await deps.stopAuto(ctx, pi, orchestrationResult.reason);
887
+ finishTurn("stopped", "manual-attention", "orchestration-blocked");
864
888
  }
865
- finishTurn("stopped", "manual-attention", "orchestration-blocked");
889
+ finishIncompleteIteration({
890
+ status: orchestrationResult.action === "pause" ? "paused" : "stopped",
891
+ reason: orchestrationResult.reason,
892
+ failureClass: "manual-attention",
893
+ });
894
+ break;
895
+ }
896
+
897
+ if (orchestrationResult.kind === "paused") {
898
+ s.pendingOrchestrationDispatch = null;
899
+ finishTurn("skipped");
900
+ continue;
901
+ }
902
+
903
+ if (orchestrationResult.kind === "error") {
904
+ s.pendingOrchestrationDispatch = null;
905
+ await deps.pauseAuto(ctx, pi, {
906
+ message: orchestrationResult.reason,
907
+ category: "unknown",
908
+ });
909
+ finishTurn("paused", "manual-attention", `orchestration-${orchestrationResult.kind}`);
910
+ finishIncompleteIteration({
911
+ status: "paused",
912
+ reason: orchestrationResult.reason,
913
+ failureClass: "manual-attention",
914
+ });
866
915
  break;
867
916
  }
868
917
 
@@ -896,6 +945,52 @@ export async function autoLoop(
896
945
  isRetry: false,
897
946
  previousTier: undefined,
898
947
  };
948
+ const preDispatchResult = deps.runPreDispatchHooks(
949
+ iterData.unitType,
950
+ iterData.unitId,
951
+ iterData.prompt,
952
+ s.basePath,
953
+ );
954
+ if (preDispatchResult.firedHooks.length > 0) {
955
+ ctx.ui.notify(
956
+ `Pre-dispatch hook${preDispatchResult.firedHooks.length > 1 ? "s" : ""}: ${preDispatchResult.firedHooks.join(", ")}`,
957
+ "info",
958
+ );
959
+ deps.emitJournalEvent({
960
+ ts: new Date().toISOString(),
961
+ flowId: ic.flowId,
962
+ seq: ic.nextSeq(),
963
+ eventType: "pre-dispatch-hook",
964
+ data: {
965
+ firedHooks: preDispatchResult.firedHooks,
966
+ action: preDispatchResult.action,
967
+ },
968
+ });
969
+ }
970
+ if (preDispatchResult.action === "skip") {
971
+ ctx.ui.notify(
972
+ `Skipping ${iterData.unitType} ${iterData.unitId} (pre-dispatch hook).`,
973
+ "info",
974
+ );
975
+ s.pendingOrchestrationDispatch = null;
976
+ emitIterationEnd({ skipped: true });
977
+ completeIteration();
978
+ finishTurn("skipped");
979
+ continue;
980
+ }
981
+ if (preDispatchResult.action === "replace") {
982
+ iterData.prompt = preDispatchResult.prompt ?? iterData.prompt;
983
+ iterData.finalPrompt = iterData.prompt;
984
+ if (preDispatchResult.unitType) {
985
+ iterData.unitType = preDispatchResult.unitType;
986
+ }
987
+ } else if (preDispatchResult.prompt) {
988
+ iterData.prompt = preDispatchResult.prompt;
989
+ iterData.finalPrompt = preDispatchResult.prompt;
990
+ }
991
+ if (preDispatchResult.model) {
992
+ iterData.hookModelOverride = preDispatchResult.model;
993
+ }
899
994
  s.pendingOrchestrationDispatch = null;
900
995
  phaseReporter.report("dispatch", "next", {
901
996
  unitType: iterData.unitType,
@@ -396,9 +396,11 @@ export class AutoOrchestrator implements AutoOrchestrationModule {
396
396
  const activeUnitKey = this.status.activeUnit
397
397
  ? `${this.status.activeUnit.unitType}:${this.status.activeUnit.unitId}`
398
398
  : null;
399
- if (activeUnitKey !== unitKey) return;
399
+ if (activeUnitKey !== unitKey && this.lastFinalizedUnitKey !== unitKey) return;
400
400
 
401
- this.status.activeUnit = undefined;
401
+ if (activeUnitKey === unitKey) {
402
+ this.status.activeUnit = undefined;
403
+ }
402
404
  this.lastAdvanceKey = null;
403
405
  this.lastFinalizedUnitKey = null;
404
406
  this.bumpTransition();
@@ -19,6 +19,7 @@ import {
19
19
  type PostUnitContext,
20
20
  type PreVerificationOpts,
21
21
  } from "../auto-post-unit.js";
22
+ import { lastAssistantText } from "../user-input-boundary.js";
22
23
  import type { Phase } from "../types.js";
23
24
  import {
24
25
  MAX_RECOVERY_CHARS,
@@ -93,9 +94,24 @@ import {
93
94
  detectRootWriteLeak,
94
95
  formatRootWriteLeakMessage,
95
96
  } from "../root-write-leak-guard.js";
97
+ import { classifyError, isTransient } from "../error-classifier.js";
96
98
 
97
99
  export const STUCK_WINDOW_SIZE = 6;
98
100
  const STUCK_RECOVERY_ATTEMPTS_KEY = "stuck_recovery_attempts";
101
+ const ZERO_TOOL_PROVIDER_ERROR_PREFIX_RE =
102
+ /^(?:api error(?::|$|\s*\()|provider error(?::|$|\s*\()|request failed\b|(?:http\s*)?(?:429|500|502|503)\b|\b(?:econnreset|etimedout|econnrefused|epipe)\b|socket hang up\b|fetch failed\b|(?:network|connection|server) error(?::|$)|connection (?:reset|refused)(?::|$|\s+by\b)|dns\b.*(?:fail|error|timeout)|unexpected eof\b|stream idle timeout\b|partial response received\b|stream_exhausted\b|terminated(?::|$)|(?:connection|stream|request)\b.{0,40}\bterminated\b|other side closed\b|rate.?limit(?:ed| exceeded| reached| error)|too many requests\b|you(?:'ve| have) hit your limit\b|usage limit\b|out of extra usage\b|service.?unavailable\b|internal(?: server)? error(?::|$)|internal(?:[_-]server)?[_-]error\b|server[_-]error\b|(?:provider|server|api|model|codex|claude|openai|anthropic|gemini)\b.{0,80}\boverloaded\b|overloaded\b.{0,80}\b(?:provider|server|api|model)\b|context (?:window|length) exceed|context window exceed)/i;
103
+ const ZERO_TOOL_PROVIDER_ERROR_SIGNAL_RE =
104
+ /(?:\b(?:http|status(?: code)?|code|error:)\s*(?:429|500|502|503)\b|\b(?:api|provider) error\s*[:(]?\s*(?:429|500|502|503)\b|\b(?:typeerror|error):\s*(?:fetch failed\b|socket hang up\b|terminated(?::|$)|connection (?:reset|refused)(?::|$|\s+by\b)|(?:network|connection|server) error(?::|$)|stream idle timeout\b|partial response received\b|unexpected eof\b)|\b(?:server_error|api_error|stream_exhausted(?:_without_result)?)\b|\b(?:econnreset|etimedout|econnrefused|epipe)\b|context (?:window|length) exceed|context window exceed)/i;
105
+
106
+ function classifyZeroToolProviderMessage(message: string): ReturnType<typeof classifyError> | null {
107
+ const firstLine = message.trim().split(/\r?\n/, 1)[0]?.trim() ?? "";
108
+ if (
109
+ !firstLine ||
110
+ (!ZERO_TOOL_PROVIDER_ERROR_PREFIX_RE.test(firstLine) &&
111
+ !ZERO_TOOL_PROVIDER_ERROR_SIGNAL_RE.test(firstLine))
112
+ ) return null;
113
+ return classifyError(firstLine);
114
+ }
99
115
 
100
116
  export function resolveDispatchRecoveryAttempts(
101
117
  unitRecoveryCount: Map<string, number>,
@@ -2072,7 +2088,7 @@ export async function runUnitPhase(
2072
2088
  const nextDispatchCount = (s.unitDispatchCount.get(dispatchKey) ?? 0) + 1;
2073
2089
 
2074
2090
  // Status bar (widget + preconditions deferred until after model selection — see #2899)
2075
- ctx.ui.setStatus("gsd-auto", "auto");
2091
+ ctx.ui.setStatus("gsd-auto", s.stepMode ? "next" : "auto");
2076
2092
  if (mid)
2077
2093
  deps.updateSliceProgressCache(s.basePath, mid, state.activeSlice?.id);
2078
2094
 
@@ -2637,6 +2653,36 @@ export async function runUnitPhase(
2637
2653
  (u: { type: string; id: string; startedAt: number; toolCalls: number }) => u.type === unitType && u.id === unitId && u.startedAt === _resolveCurrentUnitStartedAtForTest(s.currentUnit),
2638
2654
  );
2639
2655
  if (lastUnit && lastUnit.toolCalls === 0) {
2656
+ const lastAssistantMessage = lastAssistantText(s.lastUnitAgentEndMessages);
2657
+ const providerMessageClass = classifyZeroToolProviderMessage(lastAssistantMessage);
2658
+ if (providerMessageClass && isTransient(providerMessageClass)) {
2659
+ const retryAfterMs = "retryAfterMs" in providerMessageClass ? providerMessageClass.retryAfterMs : 15_000;
2660
+ await pauseAutoForProviderError(
2661
+ ctx.ui,
2662
+ ` for ${unitType} ${unitId}`,
2663
+ () => deps.pauseAuto(ctx, pi),
2664
+ {
2665
+ isRateLimit: providerMessageClass.kind === "rate-limit",
2666
+ isTransient: true,
2667
+ retryAfterMs,
2668
+ resume: () => {
2669
+ void resumeAutoAfterProviderDelay(pi, ctx).catch((err) => {
2670
+ logWarning("engine", `Provider error auto-resume failed: ${err instanceof Error ? err.message : String(err)}`);
2671
+ });
2672
+ },
2673
+ },
2674
+ );
2675
+ await emitCancelledUnitEnd(ic, unitType, unitId, unitStartSeq, {
2676
+ message: lastAssistantMessage.slice(0, 200),
2677
+ category: "provider",
2678
+ isTransient: true,
2679
+ retryAfterMs,
2680
+ });
2681
+ return {
2682
+ action: "break",
2683
+ reason: providerMessageClass.kind === "rate-limit" ? "rate-limit" : "api-timeout",
2684
+ };
2685
+ }
2640
2686
  if (USER_DRIVEN_DEEP_UNITS.has(unitType) && isAwaitingUserInput(s.lastUnitAgentEndMessages ?? undefined)) {
2641
2687
  debugLog("runUnitPhase", {
2642
2688
  phase: "zero-tool-calls-awaiting-user-input",
@@ -27,6 +27,7 @@ import { logWarning, logError } from "../workflow-logger.js";
27
27
  import { resolveAutoSupervisorConfig } from "../preferences.js";
28
28
  import { readUnitRuntimeRecord, type AutoUnitRuntimeRecord } from "../unit-runtime.js";
29
29
  import { consumeAutoWakeup } from "./schedule-wakeup.js";
30
+ import { applyUnitSkillVisibility } from "../skill-scope.js";
30
31
 
31
32
  const UNIT_FAILSAFE_BUFFER_MS = 30_000;
32
33
  const UNIT_FAILSAFE_RECHECK_MS = 30_000;
@@ -165,6 +166,12 @@ export async function runUnit(
165
166
  }
166
167
  }
167
168
 
169
+ const setVisibleSkills =
170
+ typeof pi.setVisibleSkills === "function" ? pi.setVisibleSkills.bind(pi) : undefined;
171
+ if (setVisibleSkills) {
172
+ applyUnitSkillVisibility({ setVisibleSkills }, unitType);
173
+ }
174
+
168
175
  // ── Create the agent_end promise (per-unit one-shot) ──
169
176
  // This happens after newSession completes so session-switch agent_end events
170
177
  // from the previous session cannot resolve the new unit.
@@ -176,6 +183,7 @@ export async function runUnit(
176
183
  const pendingSwitchCancellation = _consumePendingSwitchCancellation();
177
184
  if (pendingSwitchCancellation) {
178
185
  _clearCurrentResolve();
186
+ setVisibleSkills?.(undefined);
179
187
  return {
180
188
  status: "cancelled",
181
189
  ...(pendingSwitchCancellation.errorContext ? { errorContext: pendingSwitchCancellation.errorContext } : {}),
@@ -200,6 +208,7 @@ export async function runUnit(
200
208
 
201
209
  if (!ready) {
202
210
  _clearCurrentResolve();
211
+ setVisibleSkills?.(undefined);
203
212
  return {
204
213
  status: "cancelled",
205
214
  errorContext: {
@@ -351,6 +360,7 @@ export async function runUnit(
351
360
  } finally {
352
361
  if (unitTimeoutHandle) clearTimeout(unitTimeoutHandle);
353
362
  ctx.ui.setWorkingMessage?.(undefined);
363
+ setVisibleSkills?.(undefined);
354
364
  }
355
365
  debugLog("runUnit", {
356
366
  phase: "agent-end-received",
@@ -218,6 +218,8 @@ export class AutoSession {
218
218
  // ── Isolation degradation ────────────────────────────────────────────
219
219
  /** Set to true when worktree creation fails; prevents merge of nonexistent branch. */
220
220
  isolationDegraded = false;
221
+ /** Temporary recovery mode for stranded work adopted from physical git evidence. */
222
+ strandedRecoveryIsolationMode: "worktree" | "branch" | null = null;
221
223
  /** Project-root dirty snapshot captured before an isolated worktree unit runs. */
222
224
  rootWriteBaseline: RootDirtySnapshot | null = null;
223
225
 
@@ -382,6 +384,7 @@ export class AutoSession {
382
384
  this.lastGitActionFailure = null;
383
385
  this.lastGitActionStatus = null;
384
386
  this.isolationDegraded = false;
387
+ this.strandedRecoveryIsolationMode = null;
385
388
  this.rootWriteBaseline = null;
386
389
  this.milestoneMergedInPhases = false;
387
390
  this.milestoneStartShas = new Map();