@opengsd/gsd-pi 1.0.2-dev.e9a1b49 → 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 (490) 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 +36 -55
  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-post-create-hook.js +117 -0
  94. package/dist/resources/extensions/gsd/worktree-state-projection.js +29 -0
  95. package/dist/resources/extensions/search-the-web/native-search.js +57 -8
  96. package/dist/resources/extensions/shared/confirm-ui.js +9 -6
  97. package/dist/resources/extensions/shared/dialog-frame.js +42 -0
  98. package/dist/resources/extensions/shared/interview-ui.js +42 -30
  99. package/dist/resources/extensions/shared/next-action-ui.js +6 -6
  100. package/dist/resources/extensions/subagent/index.js +8 -15
  101. package/dist/resources/shared/package-manager-detection.js +36 -0
  102. package/dist/resources/skills/agent-browser/SKILL.md +1 -1
  103. package/dist/resources/skills/api-design/SKILL.md +1 -1
  104. package/dist/resources/skills/code-optimizer/SKILL.md +6 -11
  105. package/dist/resources/skills/create-gsd-extension/SKILL.md +1 -1
  106. package/dist/resources/skills/create-mcp-server/SKILL.md +1 -1
  107. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
  108. package/dist/resources/skills/create-skill/workflows/verify-skill.md +2 -10
  109. package/dist/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
  110. package/dist/resources/skills/decompose-into-slices/SKILL.md +3 -3
  111. package/dist/resources/skills/dependency-upgrade/SKILL.md +1 -1
  112. package/dist/resources/skills/forensics/SKILL.md +2 -2
  113. package/dist/resources/skills/grill-me/SKILL.md +1 -1
  114. package/dist/resources/skills/handoff/SKILL.md +1 -1
  115. package/dist/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
  116. package/dist/resources/skills/observability/SKILL.md +1 -1
  117. package/dist/resources/skills/security-review/SKILL.md +1 -1
  118. package/dist/resources/skills/spike-wrap-up/SKILL.md +1 -1
  119. package/dist/resources/skills/tdd/SKILL.md +1 -1
  120. package/dist/resources/skills/write-docs/SKILL.md +1 -1
  121. package/dist/resources/skills/write-milestone-brief/SKILL.md +1 -1
  122. package/dist/update-check.d.ts +6 -2
  123. package/dist/update-check.js +7 -3
  124. package/dist/web/standalone/.next/BUILD_ID +1 -1
  125. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  126. package/dist/web/standalone/.next/build-manifest.json +2 -2
  127. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  128. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  145. package/dist/web/standalone/.next/server/app/index.html +1 -1
  146. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  147. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  153. package/dist/web/standalone/.next/server/chunks/1834.js +2 -2
  154. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  156. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  157. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  158. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  159. package/dist/worktree-cli.d.ts +0 -2
  160. package/dist/worktree-cli.js +21 -9
  161. package/package.json +5 -2
  162. package/packages/cloud-mcp-gateway/bin/gsd-cloud-mcp-gateway.js +14 -0
  163. package/packages/cloud-mcp-gateway/package.json +4 -3
  164. package/packages/contracts/dist/rpc.test.js +5 -0
  165. package/packages/contracts/dist/rpc.test.js.map +1 -1
  166. package/packages/contracts/dist/workflow.d.ts +15 -0
  167. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  168. package/packages/contracts/dist/workflow.js +16 -0
  169. package/packages/contracts/dist/workflow.js.map +1 -1
  170. package/packages/contracts/dist/workflow.test.js +1 -0
  171. package/packages/contracts/dist/workflow.test.js.map +1 -1
  172. package/packages/contracts/package.json +1 -1
  173. package/packages/daemon/package.json +4 -4
  174. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +1 -0
  175. package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
  176. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +22 -8
  177. package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
  178. package/packages/gsd-agent-core/package.json +5 -5
  179. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts +12 -0
  180. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts.map +1 -0
  181. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js +45 -0
  182. package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js.map +1 -0
  183. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts +3 -2
  184. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  185. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js +11 -11
  186. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js.map +1 -1
  187. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts +3 -3
  188. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  189. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js +13 -11
  190. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js.map +1 -1
  191. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts +3 -3
  192. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  193. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js +12 -10
  194. package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js.map +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts +1 -0
  196. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts.map +1 -1
  197. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js +1 -0
  198. package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js.map +1 -1
  199. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  200. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  201. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +2 -2
  202. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
  203. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts +6 -1
  204. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  205. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js +9 -6
  206. package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  207. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  208. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -1
  209. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  210. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  211. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +0 -2
  212. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  213. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -0
  214. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
  215. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -0
  216. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
  217. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  218. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +2 -1
  219. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  220. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts +3 -0
  221. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
  222. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +144 -2
  223. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
  224. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.d.ts.map +1 -1
  225. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js +2 -14
  226. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js.map +1 -1
  227. package/packages/gsd-agent-modes/package.json +7 -7
  228. package/packages/mcp-server/bin/gsd-mcp-server.js +14 -0
  229. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  230. package/packages/mcp-server/dist/server.js +7 -1
  231. package/packages/mcp-server/dist/server.js.map +1 -1
  232. package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
  233. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  234. package/packages/mcp-server/dist/workflow-tools.js +47 -8
  235. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  236. package/packages/mcp-server/package.json +5 -4
  237. package/packages/native/package.json +1 -1
  238. package/packages/pi-agent-core/dist/agent-loop.js +16 -14
  239. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  240. package/packages/pi-agent-core/dist/harness/skills.d.ts.map +1 -1
  241. package/packages/pi-agent-core/dist/harness/skills.js +6 -0
  242. package/packages/pi-agent-core/dist/harness/skills.js.map +1 -1
  243. package/packages/pi-agent-core/dist/harness/system-prompt.d.ts +7 -0
  244. package/packages/pi-agent-core/dist/harness/system-prompt.d.ts.map +1 -1
  245. package/packages/pi-agent-core/dist/harness/system-prompt.js +7 -0
  246. package/packages/pi-agent-core/dist/harness/system-prompt.js.map +1 -1
  247. package/packages/pi-agent-core/package.json +1 -1
  248. package/packages/pi-ai/bin/pi-ai.js +14 -0
  249. package/packages/pi-ai/dist/models.generated.d.ts +48 -206
  250. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  251. package/packages/pi-ai/dist/models.generated.js +73 -226
  252. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  253. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  254. package/packages/pi-ai/dist/providers/anthropic.js +50 -0
  255. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  256. package/packages/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
  257. package/packages/pi-ai/dist/providers/openai-responses-shared.js +28 -4
  258. package/packages/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
  259. package/packages/pi-ai/dist/types.d.ts +2 -0
  260. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  261. package/packages/pi-ai/dist/types.js.map +1 -1
  262. package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js +29 -1
  263. package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js.map +1 -1
  264. package/packages/pi-ai/dist/utils/tool-search-shim.d.ts +4 -1
  265. package/packages/pi-ai/dist/utils/tool-search-shim.d.ts.map +1 -1
  266. package/packages/pi-ai/dist/utils/tool-search-shim.js +58 -10
  267. package/packages/pi-ai/dist/utils/tool-search-shim.js.map +1 -1
  268. package/packages/pi-ai/dist/utils/tool-shims.d.ts +1 -1
  269. package/packages/pi-ai/dist/utils/tool-shims.d.ts.map +1 -1
  270. package/packages/pi-ai/dist/utils/tool-shims.js.map +1 -1
  271. package/packages/pi-ai/package.json +3 -2
  272. package/packages/pi-coding-agent/README.md +1 -1
  273. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +2 -2
  274. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  276. package/packages/pi-coding-agent/dist/core/extensions/loader.js +1 -1
  277. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/extensions/runner.js +8 -2
  280. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/skills.d.ts +3 -0
  282. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/skills.js +3 -0
  284. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/tools/edit.js +5 -7
  287. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -2
  289. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/tools/read.js +5 -4
  291. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/tools/write.js +0 -1
  294. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  295. package/packages/pi-coding-agent/package.json +8 -8
  296. package/packages/pi-tui/package.json +1 -1
  297. package/packages/rpc-client/package.json +2 -2
  298. package/pkg/package.json +1 -1
  299. package/scripts/install/deps.js +10 -0
  300. package/scripts/install/detect-existing.js +17 -3
  301. package/scripts/install/npm-global.js +103 -33
  302. package/scripts/install.js +1 -0
  303. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +36 -11
  304. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +86 -19
  305. package/src/resources/extensions/context7/index.ts +15 -2
  306. package/src/resources/extensions/get-secrets-from-user.ts +17 -16
  307. package/src/resources/extensions/google-cli/index.ts +34 -0
  308. package/src/resources/extensions/google-cli/models.ts +57 -0
  309. package/src/resources/extensions/google-cli/package.json +11 -0
  310. package/src/resources/extensions/google-cli/readiness.ts +15 -0
  311. package/src/resources/extensions/google-cli/stream-adapter.ts +245 -0
  312. package/src/resources/extensions/gsd/auto/loop.ts +96 -1
  313. package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -2
  314. package/src/resources/extensions/gsd/auto/phases.ts +47 -1
  315. package/src/resources/extensions/gsd/auto/run-unit.ts +10 -0
  316. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  317. package/src/resources/extensions/gsd/auto-dispatch.ts +31 -11
  318. package/src/resources/extensions/gsd/auto-post-unit.ts +101 -18
  319. package/src/resources/extensions/gsd/auto-prompts.ts +4 -284
  320. package/src/resources/extensions/gsd/auto-recovery.ts +10 -7
  321. package/src/resources/extensions/gsd/auto-start.ts +307 -56
  322. package/src/resources/extensions/gsd/auto-tool-tracking.ts +3 -1
  323. package/src/resources/extensions/gsd/auto-verification.ts +18 -2
  324. package/src/resources/extensions/gsd/auto-worktree.ts +47 -57
  325. package/src/resources/extensions/gsd/auto.ts +50 -2
  326. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +4 -3
  327. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +9 -4
  328. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +42 -5
  329. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +124 -25
  330. package/src/resources/extensions/gsd/bootstrap/system-context.ts +3 -28
  331. package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +4 -4
  332. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
  333. package/src/resources/extensions/gsd/closeout-recovery.ts +6 -1
  334. package/src/resources/extensions/gsd/commands/handlers/auto.ts +9 -1
  335. package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
  336. package/src/resources/extensions/gsd/commands-usage.ts +110 -5
  337. package/src/resources/extensions/gsd/config-overlay.ts +19 -16
  338. package/src/resources/extensions/gsd/context-overlay.ts +24 -19
  339. package/src/resources/extensions/gsd/dashboard-overlay.ts +14 -27
  340. package/src/resources/extensions/gsd/doctor-engine-checks.ts +99 -0
  341. package/src/resources/extensions/gsd/doctor-git-checks.ts +72 -5
  342. package/src/resources/extensions/gsd/doctor-providers.ts +55 -27
  343. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  344. package/src/resources/extensions/gsd/doctor.ts +7 -2
  345. package/src/resources/extensions/gsd/git-conflict-state.ts +25 -1
  346. package/src/resources/extensions/gsd/guided-flow.ts +5 -6
  347. package/src/resources/extensions/gsd/key-manager.ts +57 -14
  348. package/src/resources/extensions/gsd/mcp-filter.ts +64 -17
  349. package/src/resources/extensions/gsd/mcp-project-config.ts +24 -9
  350. package/src/resources/extensions/gsd/migration-auto-check.ts +6 -0
  351. package/src/resources/extensions/gsd/milestone-actions.ts +2 -0
  352. package/src/resources/extensions/gsd/milestone-reopen-events.ts +28 -0
  353. package/src/resources/extensions/gsd/notification-overlay.ts +12 -11
  354. package/src/resources/extensions/gsd/parallel-merge.ts +6 -4
  355. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +16 -12
  356. package/src/resources/extensions/gsd/post-execution-checks.ts +7 -4
  357. package/src/resources/extensions/gsd/preferences-skills.ts +11 -4
  358. package/src/resources/extensions/gsd/preferences.ts +17 -2
  359. package/src/resources/extensions/gsd/prompt-loader.ts +2 -0
  360. package/src/resources/extensions/gsd/prompts/discuss.md +4 -2
  361. package/src/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
  362. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
  363. package/src/resources/extensions/gsd/prompts/system.md +3 -20
  364. package/src/resources/extensions/gsd/queue-reorder-ui.ts +29 -20
  365. package/src/resources/extensions/gsd/repo-identity.ts +35 -7
  366. package/src/resources/extensions/gsd/repository-registry.ts +3 -1
  367. package/src/resources/extensions/gsd/safety/evidence-collector.ts +13 -6
  368. package/src/resources/extensions/gsd/skill-activation.ts +292 -0
  369. package/src/resources/extensions/gsd/skill-catalog.data.ts +858 -0
  370. package/src/resources/extensions/gsd/skill-catalog.install.ts +205 -0
  371. package/src/resources/extensions/gsd/skill-catalog.ts +16 -1087
  372. package/src/resources/extensions/gsd/skill-discovery.ts +134 -78
  373. package/src/resources/extensions/gsd/skill-scope.ts +63 -0
  374. package/src/resources/extensions/gsd/skill-telemetry.ts +6 -40
  375. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +1 -1
  376. package/src/resources/extensions/gsd/skills.ts +75 -0
  377. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +499 -0
  378. package/src/resources/extensions/gsd/state-reconciliation/index.ts +40 -0
  379. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +8 -0
  380. package/src/resources/extensions/gsd/state-reconciliation/types.ts +30 -0
  381. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +328 -2
  382. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +75 -0
  383. package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +28 -2
  384. package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +30 -0
  385. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +41 -0
  386. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +24 -0
  387. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +436 -0
  388. package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +53 -0
  389. package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +15 -0
  390. package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +31 -0
  391. package/src/resources/extensions/gsd/tests/commands-context.test.ts +5 -3
  392. package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +15 -2
  393. package/src/resources/extensions/gsd/tests/commands-usage.test.ts +97 -0
  394. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +40 -3
  395. package/src/resources/extensions/gsd/tests/context-chart.test.ts +9 -0
  396. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +64 -0
  397. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +25 -0
  398. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +1 -0
  399. package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +4 -2
  400. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +1 -1
  401. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +71 -1
  402. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +105 -0
  403. package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +101 -1
  404. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +30 -0
  405. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +6 -0
  406. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +22 -3
  407. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +43 -0
  408. package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +8 -0
  409. package/src/resources/extensions/gsd/tests/key-manager.test.ts +23 -4
  410. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +19 -1
  411. package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +24 -0
  412. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +56 -1
  413. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +6 -1
  414. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +70 -10
  415. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +7 -1
  416. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +9 -0
  417. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +127 -10
  418. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +44 -0
  419. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +93 -0
  420. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +101 -0
  421. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +46 -0
  422. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +116 -11
  423. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +27 -0
  424. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +30 -1
  425. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +4 -0
  426. package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +111 -0
  427. package/src/resources/extensions/gsd/tests/skill-scope-auto.test.ts +67 -0
  428. package/src/resources/extensions/gsd/tests/skills.test.ts +55 -0
  429. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +13 -2
  430. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +303 -0
  431. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +67 -1
  432. package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +24 -1
  433. package/src/resources/extensions/gsd/tests/tui-border-assertions.ts +28 -0
  434. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +14 -0
  435. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +18 -0
  436. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +26 -0
  437. package/src/resources/extensions/gsd/tests/vision-ask.test.ts +23 -0
  438. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -1
  439. package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +133 -0
  440. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +82 -0
  441. package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +16 -1
  442. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +28 -0
  443. package/src/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +141 -1
  444. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +38 -1
  445. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +10 -0
  446. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +45 -1
  447. package/src/resources/extensions/gsd/tools/complete-task.ts +9 -0
  448. package/src/resources/extensions/gsd/tools/exec-tool.ts +42 -10
  449. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +82 -5
  450. package/src/resources/extensions/gsd/tui/render-kit.ts +82 -0
  451. package/src/resources/extensions/gsd/unit-context-manifest.ts +37 -26
  452. package/src/resources/extensions/gsd/user-input-boundary.ts +1 -1
  453. package/src/resources/extensions/gsd/vision-ask.ts +28 -0
  454. package/src/resources/extensions/gsd/visualizer-overlay.ts +12 -40
  455. package/src/resources/extensions/gsd/worktree-lifecycle.ts +37 -2
  456. package/src/resources/extensions/gsd/worktree-post-create-hook.ts +127 -0
  457. package/src/resources/extensions/gsd/worktree-state-projection.ts +33 -0
  458. package/src/resources/extensions/search-the-web/native-search.ts +60 -8
  459. package/src/resources/extensions/shared/confirm-ui.ts +8 -12
  460. package/src/resources/extensions/shared/dialog-frame.ts +71 -0
  461. package/src/resources/extensions/shared/interview-ui.ts +43 -42
  462. package/src/resources/extensions/shared/next-action-ui.ts +6 -6
  463. package/src/resources/extensions/shared/tests/confirm-ui.test.ts +57 -0
  464. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +163 -0
  465. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +55 -0
  466. package/src/resources/extensions/subagent/index.ts +8 -15
  467. package/src/resources/shared/package-manager-detection.ts +39 -0
  468. package/src/resources/skills/agent-browser/SKILL.md +1 -1
  469. package/src/resources/skills/api-design/SKILL.md +1 -1
  470. package/src/resources/skills/code-optimizer/SKILL.md +6 -11
  471. package/src/resources/skills/create-gsd-extension/SKILL.md +1 -1
  472. package/src/resources/skills/create-mcp-server/SKILL.md +1 -1
  473. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
  474. package/src/resources/skills/create-skill/workflows/verify-skill.md +2 -10
  475. package/src/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
  476. package/src/resources/skills/decompose-into-slices/SKILL.md +3 -3
  477. package/src/resources/skills/dependency-upgrade/SKILL.md +1 -1
  478. package/src/resources/skills/forensics/SKILL.md +2 -2
  479. package/src/resources/skills/grill-me/SKILL.md +1 -1
  480. package/src/resources/skills/handoff/SKILL.md +1 -1
  481. package/src/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
  482. package/src/resources/skills/observability/SKILL.md +1 -1
  483. package/src/resources/skills/security-review/SKILL.md +1 -1
  484. package/src/resources/skills/spike-wrap-up/SKILL.md +1 -1
  485. package/src/resources/skills/tdd/SKILL.md +1 -1
  486. package/src/resources/skills/write-docs/SKILL.md +1 -1
  487. package/src/resources/skills/write-milestone-brief/SKILL.md +1 -1
  488. package/dist/tsconfig.extensions.tsbuildinfo +0 -1
  489. /package/dist/web/standalone/.next/static/{BEjZM0MLHLibeMFbjtMol → tH1tnDYt1E0hK9Ien73Z0}/_buildManifest.js +0 -0
  490. /package/dist/web/standalone/.next/static/{BEjZM0MLHLibeMFbjtMol → tH1tnDYt1E0hK9Ien73Z0}/_ssgManifest.js +0 -0
package/README.md CHANGED
@@ -13,6 +13,28 @@ GSD Pi is a local-first coding agent for planning, implementing, verifying, and
13
13
 
14
14
  It combines a terminal agent, project workflow tools, worktree-aware Git automation, and optional UI integrations so a project can move from idea to reviewed implementation with less manual coordination.
15
15
 
16
+ ## Screenshots
17
+
18
+ GSD runs as a terminal-first TUI with optional browser dashboard controls.
19
+
20
+ ![GSD TUI running an agent workflow](./docs/assets/screenshots/gsd-tui-agent-run.png)
21
+
22
+ ![GSD TUI progress dashboard](./docs/assets/screenshots/gsd-tui-progress-dashboard.png)
23
+
24
+ ![GSD TUI metrics dashboard](./docs/assets/screenshots/gsd-tui-metrics-dashboard.png)
25
+
26
+ ## Feature Roll-Up
27
+
28
+ - **Guided terminal agent** — Start with `gsd`, configure providers, and run planned or quick coding sessions from your shell.
29
+ - **Autonomous project workflow** — Break work into milestones, slices, and tasks, then let auto mode plan, implement, verify, and advance.
30
+ - **Worktree-aware Git automation** — Keep implementation work isolated while preserving a reviewable main checkout.
31
+ - **Local project memory** — Store project requirements, decisions, runtime notes, generated plans, summaries, and validation evidence under `.gsd/`.
32
+ - **Multi-provider model routing** — Use the provider your team already has, with configurable defaults and per-phase model preferences.
33
+ - **Extension surface** — Add project-specific commands, tools, skills, and UI integrations through bundled or community extensions.
34
+ - **Terminal and web surfaces** — Use the TUI by default, or launch `gsd --web` when a visual control plane fits the work better than a terminal.
35
+
36
+ See [CHANGELOG.md](./CHANGELOG.md) for release-by-release fixes and [Legacy Release History](./docs/archive/legacy-release-history.md) for archived history before the `open-gsd/gsd-pi` baseline.
37
+
16
38
  ## Status
17
39
 
18
40
  This repository is starting a new development baseline at version `1.0.0` under the `open-gsd/gsd-pi` project.
@@ -27,41 +49,63 @@ Recommended — guided installer:
27
49
  npx @opengsd/gsd-pi@latest
28
50
  ```
29
51
 
30
- Alternative direct global install:
52
+ For CI or scripted installs:
53
+
54
+ ```bash
55
+ npx @opengsd/gsd-pi@latest --yes
56
+ ```
57
+
58
+ Alternative — direct npm global install:
31
59
 
32
60
  ```bash
33
61
  npm install -g @opengsd/gsd-pi@latest
34
62
  ```
35
63
 
36
- For CI or scripted installs:
64
+ If you want pnpm to own the global install, use pnpm's runner:
37
65
 
38
66
  ```bash
39
- npx @opengsd/gsd-pi@latest --yes
67
+ pnpm setup
68
+ exec $SHELL -l
69
+ pnpm dlx @opengsd/gsd-pi@latest
40
70
  ```
41
71
 
42
72
  Source: [`open-gsd/gsd-pi`](https://github.com/open-gsd/gsd-pi).
43
73
 
44
74
  ## Migrate From Older Installs
45
75
 
46
- GSD Pi now installs from the scoped npm package `@opengsd/gsd-pi`. If you previously installed the older unscoped `gsd-pi` package, remove it first so the old global binary does not shadow the new package.
76
+ GSD Pi now installs from the scoped package `@opengsd/gsd-pi`. If you previously installed the older unscoped `gsd-pi` package, remove it first so the old global binary does not shadow the new package.
47
77
 
48
- macOS / Linux:
78
+ Recommended migration with the guided `npx` installer:
49
79
 
50
80
  ```bash
51
- npm uninstall -g gsd-pi
81
+ npm uninstall -g gsd-pi @opengsd/gsd-pi
52
82
  rm -f ~/.gsd/.update-check ~/.gsd/agent/managed-resources.json
53
- npm install -g @opengsd/gsd-pi@latest
54
- which gsd
83
+ npx @opengsd/gsd-pi@latest
84
+ command -v gsd
55
85
  gsd --version
56
86
  ```
57
87
 
58
- Windows PowerShell:
88
+ If the old package was installed with `sudo npm install -g`, use `sudo npm uninstall -g gsd-pi` for the old package removal.
89
+
90
+ To migrate from old npm globals to a pnpm-owned global install:
91
+
92
+ ```bash
93
+ npm uninstall -g gsd-pi @opengsd/gsd-pi
94
+ rm -f ~/.gsd/.update-check ~/.gsd/agent/managed-resources.json
95
+ pnpm setup
96
+ exec $SHELL -l
97
+ pnpm dlx @opengsd/gsd-pi@latest
98
+ command -v gsd
99
+ gsd --version
100
+ ```
101
+
102
+ Windows PowerShell with the guided `npx` installer:
59
103
 
60
104
  ```powershell
61
- npm uninstall -g gsd-pi
105
+ npm uninstall -g gsd-pi @opengsd/gsd-pi
62
106
  Remove-Item "$env:USERPROFILE\.gsd\.update-check" -Force -ErrorAction SilentlyContinue
63
107
  Remove-Item "$env:USERPROFILE\.gsd\agent\managed-resources.json" -Force -ErrorAction SilentlyContinue
64
- npm install -g @opengsd/gsd-pi@latest
108
+ npx @opengsd/gsd-pi@latest
65
109
  where.exe gsd
66
110
  gsd --version
67
111
  ```
@@ -85,6 +129,14 @@ npm uninstall -g @opengsd/gsd-pi gsd-pi
85
129
  rm -rf ~/.gsd
86
130
  ```
87
131
 
132
+ If you installed GSD with pnpm, use pnpm for the pnpm-owned package. If pnpm reports that its global bin directory is not on `PATH`, run `pnpm setup`, restart your shell, then retry.
133
+
134
+ ```bash
135
+ pnpm remove -g @opengsd/gsd-pi
136
+ npm uninstall -g gsd-pi
137
+ rm -rf ~/.gsd
138
+ ```
139
+
88
140
  Windows PowerShell:
89
141
 
90
142
  ```powershell
@@ -139,7 +191,6 @@ Then use slash commands inside the GSD session:
139
191
  | `native/` | Native engine packaging and platform binaries |
140
192
  | `studio/` | Desktop studio app |
141
193
  | `web/` | Web UI and API surface |
142
- | `vscode-extension/` | VS Code integration |
143
194
  | `docs/` | User and developer documentation |
144
195
  | `scripts/` | Build, release, migration, and maintenance scripts |
145
196
 
@@ -7,6 +7,7 @@
7
7
  */
8
8
  import { readFileSync } from 'node:fs';
9
9
  import { serializeJsonLine } from '@gsd/agent-modes';
10
+ import { canonicalHeadlessToolName } from './headless-events.js';
10
11
  export function normalizeQuestionId(id) {
11
12
  return id.trim().toLowerCase().replace(/[-\s]+/g, '_').replace(/_confirm$/, '');
12
13
  }
@@ -98,7 +99,7 @@ export class AnswerInjector {
98
99
  * Observe every event for question metadata (tool_execution_start of ask_user_questions).
99
100
  */
100
101
  observeEvent(event) {
101
- if (event.type !== 'tool_execution_start' || event.toolName !== 'ask_user_questions')
102
+ if (event.type !== 'tool_execution_start' || canonicalHeadlessToolName(String(event.toolName ?? '')) !== 'ask_user_questions')
102
103
  return;
103
104
  // Extract questions from event.input.questions or event.args?.questions
104
105
  const input = (event.input ?? event.args);
@@ -46,6 +46,7 @@ export declare const PAUSED_PREFIXES: string[];
46
46
  export declare const TERMINAL_PREFIXES: string[];
47
47
  export declare const IDLE_TIMEOUT_MS = 15000;
48
48
  export declare const NEW_MILESTONE_IDLE_TIMEOUT_MS = 120000;
49
+ export declare function canonicalHeadlessToolName(toolName: string | undefined): string;
49
50
  export declare function isTerminalNotification(event: Record<string, unknown>): boolean;
50
51
  export declare function isBlockedNotification(event: Record<string, unknown>): boolean;
51
52
  export declare function isMilestoneReadyNotification(event: Record<string, unknown>): boolean;
@@ -79,6 +79,13 @@ export const IDLE_TIMEOUT_MS = 15_000;
79
79
  // longer idle timeout to avoid killing the session prematurely (#808).
80
80
  export const NEW_MILESTONE_IDLE_TIMEOUT_MS = 120_000;
81
81
  const INTERACTIVE_HEADLESS_TOOLS = new Set(['ask_user_questions', 'secure_env_collect']);
82
+ export function canonicalHeadlessToolName(toolName) {
83
+ const name = String(toolName ?? '');
84
+ if (!name.startsWith('mcp__'))
85
+ return name;
86
+ const toolSeparator = name.indexOf('__', 'mcp__'.length);
87
+ return toolSeparator >= 0 ? name.slice(toolSeparator + 2) : name;
88
+ }
82
89
  function isManualResolutionNotification(message) {
83
90
  return (message.includes('resolve manually and re-run /gsd auto') ||
84
91
  message.includes('resolve conflicts manually and run /gsd auto to resume') ||
@@ -136,7 +143,7 @@ export function isMilestoneReadyNotification(event) {
136
143
  return /milestone\s+m\d+.*ready/i.test(String(event.message ?? ''));
137
144
  }
138
145
  export function isInteractiveHeadlessTool(toolName) {
139
- return INTERACTIVE_HEADLESS_TOOLS.has(String(toolName ?? ''));
146
+ return INTERACTIVE_HEADLESS_TOOLS.has(canonicalHeadlessToolName(toolName));
140
147
  }
141
148
  export function shouldArmHeadlessIdleTimeout(toolCallCount, interactiveToolCount) {
142
149
  return toolCallCount > 0 && interactiveToolCount === 0;
@@ -15,6 +15,7 @@ import { dirname, join } from 'node:path';
15
15
  import { renderGsdPiLogo, GSD_PI_BRAND, GSD_WEBSITE } from './logo.js';
16
16
  import { agentDir } from './app-paths.js';
17
17
  import { isClaudeCliReady } from './claude-cli-check.js';
18
+ import { isAntigravityCliReady, isGeminiCliReady } from './resources/extensions/google-cli/readiness.js';
18
19
  import { markOnboardingComplete, markStepCompleted, markStepSkipped, isOnboardingComplete, } from './resources/extensions/gsd/onboarding-state.js';
19
20
  import { getLlmProviderIds } from './resources/extensions/gsd/setup-catalog.js';
20
21
  // ─── Constants ────────────────────────────────────────────────────────────────
@@ -358,7 +359,13 @@ export async function runLlmStep(p, pc, authStorage) {
358
359
  if (isClaudeCliReady()) {
359
360
  authOptions.push({ value: 'claude-cli', label: 'Use Claude Code CLI', hint: 'recommended — uses your existing Claude subscription' });
360
361
  }
361
- authOptions.push({ value: 'browser', label: 'Sign in with your browser', hint: 'GitHub Copilot, ChatGPT, Google, etc.' }, { 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' });
362
+ if (isGeminiCliReady()) {
363
+ authOptions.push({ value: 'gemini-cli', label: 'Use Google Gemini CLI', hint: 'uses your existing Gemini CLI session' });
364
+ }
365
+ if (isAntigravityCliReady()) {
366
+ authOptions.push({ value: 'antigravity-cli', label: 'Use Antigravity CLI', hint: 'uses your existing Antigravity session' });
367
+ }
368
+ 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' });
362
369
  const method = await p.select({
363
370
  message: existingAuth ? `LLM provider: ${existingAuth} — change it?` : 'How do you want to sign in?',
364
371
  options: authOptions,
@@ -377,6 +384,20 @@ export async function runLlmStep(p, pc, authStorage) {
377
384
  persistDefaultProvider('claude-code');
378
385
  return true;
379
386
  }
387
+ if (method === 'gemini-cli') {
388
+ p.log.success('Google Gemini CLI detected — routing through local CLI');
389
+ p.log.info('Your Gemini CLI session will be used for inference. No API key needed.');
390
+ authStorage.set('google-gemini-cli', { type: 'api_key', key: 'cli' });
391
+ persistDefaultProvider('google-gemini-cli');
392
+ return true;
393
+ }
394
+ if (method === 'antigravity-cli') {
395
+ p.log.success('Antigravity CLI detected — routing through local CLI');
396
+ p.log.info('Your Antigravity session will be used for inference. No API key needed.');
397
+ authStorage.set('google-antigravity', { type: 'api_key', key: 'cli' });
398
+ persistDefaultProvider('google-antigravity');
399
+ return true;
400
+ }
380
401
  // ── Step 2: Which provider? ──────────────────────────────────────────────
381
402
  if (method === 'browser') {
382
403
  // Anthropic OAuth is removed from browser auth — it violates Anthropic TOS for
@@ -387,8 +408,6 @@ export async function runLlmStep(p, pc, authStorage) {
387
408
  options: [
388
409
  { value: 'github-copilot', label: 'GitHub Copilot' },
389
410
  { value: 'openai-codex', label: 'ChatGPT Plus/Pro (Codex)' },
390
- { value: 'google-gemini-cli', label: 'Google Gemini CLI' },
391
- { value: 'google-antigravity', label: 'Antigravity (Gemini 3, Claude, GPT-OSS)' },
392
411
  ],
393
412
  });
394
413
  if (p.isCancel(provider))
@@ -33,6 +33,11 @@ export declare function getNewerManagedResourceVersion(agentDir: string, current
33
33
  * 4. Makes the result writable for the next upgrade cycle.
34
34
  */
35
35
  export declare function syncResourceDir(srcDir: string, destDir: string): void;
36
+ export declare function resolvePackageNodeModulesLayout(root: string): {
37
+ internalNodeModules: string;
38
+ hoistedNodeModules: string | null;
39
+ };
40
+ export declare function findNearestNodeModulesAncestor(startPath: string): string | null;
36
41
  /** Check if any GSD workspace scopes exist in internal but not in hoisted node_modules */
37
42
  export declare function hasMissingWorkspaceScopes(hoisted: string, internal: string): boolean;
38
43
  /**
@@ -47,6 +52,7 @@ export declare function mergedFingerprint(hoisted: string, internal: string): st
47
52
  * Syncs all bundled resources to agentDir (~/.gsd/agent/) on every launch.
48
53
  *
49
54
  * - extensions/ → ~/.gsd/agent/extensions/ (overwrite when version changes)
55
+ * - shared/ → ~/.gsd/agent/shared/ (overwrite when version changes)
50
56
  * - agents/ → ~/.gsd/agent/agents/ (overwrite when version changes)
51
57
  * - skills/ → ~/.gsd/agent/skills/ (overwrite when version changes)
52
58
  * - GSD-WORKFLOW.md → ~/.gsd/agent/GSD-WORKFLOW.md (fallback for env var miss)
@@ -60,6 +66,7 @@ export declare function mergedFingerprint(hoisted: string, internal: string): st
60
66
  */
61
67
  export declare function initResources(agentDir: string, skillsDir?: string): void;
62
68
  export declare function hasStaleCompiledExtensionSiblings(extensionsDir: string, sourceDir?: string): boolean;
69
+ export declare function hasMissingBundledResourceFiles(destDir: string, sourceDir: string): boolean;
63
70
  interface BuildResourceLoaderOptions {
64
71
  additionalExtensionPaths?: string[];
65
72
  }
@@ -311,16 +311,15 @@ function copyDirRecursive(src, dest) {
311
311
  * them without requiring every call site to use jiti.
312
312
  *
313
313
  * Layout differences by install method:
314
- * - Source/monorepo: packageRoot/node_modules has everything simple symlink
315
- * - Global install (npm/bun/pnpm): merge hoisted dirname(packageRoot)/node_modules with
316
- * packageRoot/node_modules so package-local deps like @sinclair/typebox resolve (#3529, #3564)
314
+ * - Source/monorepo: packageRoot/node_modules has everything -> simple symlink
315
+ * - Global install (npm/bun/pnpm): merge the nearest ancestor node_modules
316
+ * with packageRoot/node_modules so both hoisted deps like yaml and
317
+ * package-local deps like @sinclair/typebox resolve (#3529, #3564).
317
318
  */
318
319
  function ensureNodeModulesSymlink(agentDir) {
319
320
  const agentNodeModules = join(agentDir, 'node_modules');
320
- const internalNodeModules = join(packageRoot, 'node_modules');
321
- const hoistedNodeModules = dirname(packageRoot);
322
- const isGlobalInstall = basename(hoistedNodeModules) === 'node_modules';
323
- if (!isGlobalInstall) {
321
+ const { internalNodeModules, hoistedNodeModules } = resolvePackageNodeModulesLayout(packageRoot);
322
+ if (!hoistedNodeModules) {
324
323
  // Source/monorepo: internal node_modules has everything
325
324
  reconcileSymlink(agentNodeModules, internalNodeModules);
326
325
  return;
@@ -330,6 +329,23 @@ function ensureNodeModulesSymlink(agentDir) {
330
329
  // @gsd/* scopes are hoisted — a hoisted-only symlink breaks extension imports.
331
330
  reconcileMergedNodeModules(agentNodeModules, hoistedNodeModules, internalNodeModules);
332
331
  }
332
+ export function resolvePackageNodeModulesLayout(root) {
333
+ return {
334
+ internalNodeModules: join(root, 'node_modules'),
335
+ hoistedNodeModules: findNearestNodeModulesAncestor(root),
336
+ };
337
+ }
338
+ export function findNearestNodeModulesAncestor(startPath) {
339
+ let current = resolve(startPath);
340
+ while (true) {
341
+ if (basename(current) === 'node_modules')
342
+ return current;
343
+ const parent = dirname(current);
344
+ if (parent === current)
345
+ return null;
346
+ current = parent;
347
+ }
348
+ }
333
349
  /** Check if any GSD workspace scopes exist in internal but not in hoisted node_modules */
334
350
  export function hasMissingWorkspaceScopes(hoisted, internal) {
335
351
  if (!existsSync(internal))
@@ -544,6 +560,7 @@ function pruneRemovedBundledExtensions(manifest, agentDir) {
544
560
  * Syncs all bundled resources to agentDir (~/.gsd/agent/) on every launch.
545
561
  *
546
562
  * - extensions/ → ~/.gsd/agent/extensions/ (overwrite when version changes)
563
+ * - shared/ → ~/.gsd/agent/shared/ (overwrite when version changes)
547
564
  * - agents/ → ~/.gsd/agent/agents/ (overwrite when version changes)
548
565
  * - skills/ → ~/.gsd/agent/skills/ (overwrite when version changes)
549
566
  * - GSD-WORKFLOW.md → ~/.gsd/agent/GSD-WORKFLOW.md (fallback for env var miss)
@@ -584,12 +601,19 @@ export function initResources(agentDir, skillsDir = join(agentDir, 'skills')) {
584
601
  // Version matches — check content fingerprint for same-version staleness.
585
602
  const currentHash = getCurrentResourceFingerprint();
586
603
  const hasStaleExtensionFiles = hasStaleCompiledExtensionSiblings(extensionsDir, bundledExtensionsDir);
587
- if (manifest.contentHash && manifest.contentHash === currentHash && !hasStaleExtensionFiles) {
604
+ const hasMissingSharedFiles = hasMissingBundledResourceFiles(join(agentDir, 'shared'), join(resourcesDir, 'shared'));
605
+ const hasMissingSkillFiles = hasMissingBundledResourceFiles(skillsDir, join(resourcesDir, 'skills'));
606
+ if (manifest.contentHash &&
607
+ manifest.contentHash === currentHash &&
608
+ !hasStaleExtensionFiles &&
609
+ !hasMissingSharedFiles &&
610
+ !hasMissingSkillFiles) {
588
611
  return;
589
612
  }
590
613
  }
591
614
  // Sync bundled resources — overwrite so updates land on next launch.
592
615
  syncResourceDir(bundledExtensionsDir, join(agentDir, 'extensions'));
616
+ syncResourceDir(join(resourcesDir, 'shared'), join(agentDir, 'shared'));
593
617
  syncResourceDir(join(resourcesDir, 'agents'), join(agentDir, 'agents'));
594
618
  syncResourceDir(join(resourcesDir, 'skills'), skillsDir);
595
619
  // Sync GSD-WORKFLOW.md to agentDir as a fallback for when GSD_WORKFLOW_PATH
@@ -627,7 +651,7 @@ function cleanupBundledSkillsFromEcosystemDir() {
627
651
  makeTreeWritable(targetPath);
628
652
  rmSync(targetPath, { recursive: true, force: true });
629
653
  }
630
- else {
654
+ else if (process.env.GSD_RESOURCE_LOADER_DEBUG === '1') {
631
655
  console.warn(`[GSD] Leaving ambiguous skill collision in ${targetPath}; ` +
632
656
  `the bundled copy will be used from ~/.gsd/agent/skills/${entry.name}.`);
633
657
  }
@@ -675,6 +699,17 @@ export function hasStaleCompiledExtensionSiblings(extensionsDir, sourceDir = bun
675
699
  }
676
700
  return false;
677
701
  }
702
+ export function hasMissingBundledResourceFiles(destDir, sourceDir) {
703
+ const sourceFiles = collectRelativeFiles(sourceDir);
704
+ if (sourceFiles.size === 0)
705
+ return false;
706
+ const installedFiles = collectRelativeFiles(destDir);
707
+ for (const relPath of sourceFiles) {
708
+ if (!installedFiles.has(relPath))
709
+ return true;
710
+ }
711
+ return false;
712
+ }
678
713
  function collectRelativeFiles(rootDir) {
679
714
  const files = new Set();
680
715
  if (!existsSync(rootDir))
@@ -1 +1 @@
1
- f796c99ee5d78c73
1
+ 2fb7ab216cf81556
@@ -17,7 +17,7 @@ import { dirname, join } from "node:path";
17
17
  import { PartialMessageBuilder, ZERO_USAGE, mapUsage } from "./partial-builder.js";
18
18
  import { buildWorkflowMcpServers, resolveWorkflowMcpProjectRoot } from "../gsd/workflow-mcp.js";
19
19
  import { loadProjectGSDPreferences } from "../gsd/preferences.js";
20
- import { discoverMcpServerNames, computeMcpDisallowedTools } from "../gsd/mcp-filter.js";
20
+ import { discoverMcpServerNames, discoverWorkflowMcpServerName, computeMcpDisallowedTools } from "../gsd/mcp-filter.js";
21
21
  import { showInterviewRound } from "../shared/tui.js";
22
22
  export function serverToolUseToToolCallLike(block) {
23
23
  const argumentsValue = block.input && typeof block.input === "object" && !Array.isArray(block.input)
@@ -177,7 +177,7 @@ function extractMessageText(msg) {
177
177
  * user turns in its own output. XML tags read as document structure and
178
178
  * don't get mirrored in free text.
179
179
  */
180
- export function buildPromptFromContext(context) {
180
+ export function buildPromptFromContext(context, toolContext = {}) {
181
181
  const hasContent = Boolean(context.systemPrompt) || context.messages.some((m) => extractMessageText(m));
182
182
  if (!hasContent)
183
183
  return "";
@@ -185,6 +185,14 @@ export function buildPromptFromContext(context) {
185
185
  "Respond only to the final user message below. " +
186
186
  "Do not emit <user_message>, <assistant_message>, or <prior_system_context> tags in your response.",
187
187
  ];
188
+ const workflowToolLine = toolContext.workflowMcpServerName
189
+ ? "- GSD workflow tools (gsd_exec, gsd_slice_complete, gsd_task_complete, gsd_plan_slice, gsd_save_gate_result, etc.) " +
190
+ `are MCP tools — call them as mcp__${toolContext.workflowMcpServerName}__<tool_name> ` +
191
+ `(e.g. mcp__${toolContext.workflowMcpServerName}__gsd_exec, mcp__${toolContext.workflowMcpServerName}__gsd_save_gate_result)\n`
192
+ : "- GSD workflow MCP tools are unavailable in this Claude Code run.\n";
193
+ const toolSearchLine = toolContext.workflowMcpServerName
194
+ ? "- ToolSearch is NOT available — never use it to discover tools; invoke the MCP tool directly\n"
195
+ : "- ToolSearch is NOT available — never use it to discover tools\n";
188
196
  // The prior system context lists pi-native tool names (lowercase: bash, read, gsd_exec, etc.)
189
197
  // but this process runs inside Claude Code where tool names differ. Inject a remapping note
190
198
  // before the prior context so the model uses correct names regardless of what the prior
@@ -193,10 +201,8 @@ export function buildPromptFromContext(context) {
193
201
  "You are running inside Claude Code. Use these exact tool names — do not use lowercase or pi-native names:\n" +
194
202
  "- Shell commands: 'Bash' (not 'bash')\n" +
195
203
  "- File operations: 'Read', 'Write', 'Edit', 'Glob', 'Grep' (PascalCase, not lowercase)\n" +
196
- "- GSD workflow tools (gsd_exec, gsd_slice_complete, gsd_task_complete, gsd_plan_slice, gsd_save_gate_result, etc.) " +
197
- "are MCP tools — call them as mcp__gsd-workflow__<tool_name> " +
198
- "(e.g. mcp__gsd-workflow__gsd_exec, mcp__gsd-workflow__gsd_save_gate_result)\n" +
199
- "- ToolSearch is NOT available — never use it to discover tools; invoke the MCP tool directly\n" +
204
+ workflowToolLine +
205
+ toolSearchLine +
200
206
  "</tool_context>");
201
207
  if (context.systemPrompt) {
202
208
  parts.push(`<prior_system_context>\n${context.systemPrompt}\n</prior_system_context>`);
@@ -1160,6 +1166,18 @@ function mapThinkingLevelToAnthropicEffort(level, modelId) {
1160
1166
  return "high";
1161
1167
  }
1162
1168
  }
1169
+ function workflowMcpServerNameFromAllowedTools(allowedTools) {
1170
+ if (!Array.isArray(allowedTools))
1171
+ return undefined;
1172
+ for (const toolName of allowedTools) {
1173
+ if (typeof toolName !== "string")
1174
+ continue;
1175
+ const match = /^mcp__(.+)__\*$/.exec(toolName);
1176
+ if (match?.[1])
1177
+ return match[1];
1178
+ }
1179
+ return undefined;
1180
+ }
1163
1181
  /**
1164
1182
  * Build the options object passed to the Claude Agent SDK's `query()` call.
1165
1183
  *
@@ -1181,14 +1199,17 @@ export function buildSdkOptions(modelId, prompt, overrides, extraOptions = {}) {
1181
1199
  const permissionMode = overrides?.permissionMode ?? "bypassPermissions";
1182
1200
  const preferences = loadProjectGSDPreferences(projectRoot);
1183
1201
  const mcpConfig = preferences?.preferences.claude_code_mcp;
1184
- const workflowServerName = mcpServers ? Object.keys(mcpServers)[0] : undefined;
1185
1202
  // Always discover project MCPs — needed for both duplicate detection and filtering.
1186
1203
  const discovered = discoverMcpServerNames(projectRoot);
1204
+ const injectedWorkflowServerName = mcpServers ? Object.keys(mcpServers)[0] : undefined;
1205
+ const projectWorkflowServerName = discoverWorkflowMcpServerName(projectRoot);
1206
+ const workflowServerName = projectWorkflowServerName ?? injectedWorkflowServerName;
1187
1207
  // If the workflow MCP is already declared in the project's .mcp.json or
1188
1208
  // .claude/settings.json, do not inject it again via mcpServers. Passing the
1189
1209
  // same server name from two sources causes a duplicate registration conflict
1190
1210
  // that prevents the MCP server from loading (tools become unavailable).
1191
- const workflowAlreadyInProject = workflowServerName !== undefined && discovered.includes(workflowServerName);
1211
+ const workflowAlreadyInProject = projectWorkflowServerName !== undefined
1212
+ || (injectedWorkflowServerName !== undefined && discovered.includes(injectedWorkflowServerName));
1192
1213
  let filteredMcpServers = workflowAlreadyInProject ? undefined : mcpServers;
1193
1214
  let extraDisallowedTools = [];
1194
1215
  let workflowExplicitlyBlocked = false;
@@ -1501,8 +1522,6 @@ async function pumpSdkMessages(model, context, options, stream) {
1501
1522
  if (options?.signal) {
1502
1523
  options.signal.addEventListener("abort", () => controller.abort(), { once: true });
1503
1524
  }
1504
- const prompt = buildPromptFromContext(context);
1505
- const queryPrompt = buildSdkQueryPrompt(context, prompt);
1506
1525
  const permissionMode = await resolveClaudePermissionMode();
1507
1526
  const uiContext = options?.extensionUIContext;
1508
1527
  const onExternalToolCall = options?.onExternalToolCall;
@@ -1513,7 +1532,7 @@ async function pumpSdkMessages(model, context, options, stream) {
1513
1532
  // tool requests. This replaces the old bypassPermissions workaround.
1514
1533
  const canUseToolFallback = canUseToolHandler
1515
1534
  ?? (async (_toolName, _input, opts) => ({ behavior: "allow", toolUseID: opts.toolUseID }));
1516
- const sdkOpts = buildSdkOptions(modelId, prompt, { permissionMode }, {
1535
+ const sdkOpts = buildSdkOptions(modelId, "", { permissionMode }, {
1517
1536
  cwd,
1518
1537
  reasoning: options?.reasoning,
1519
1538
  canUseTool: canUseToolFallback,
@@ -1523,6 +1542,10 @@ async function pumpSdkMessages(model, context, options, stream) {
1523
1542
  }
1524
1543
  : {}),
1525
1544
  });
1545
+ const prompt = buildPromptFromContext(context, {
1546
+ workflowMcpServerName: workflowMcpServerNameFromAllowedTools(sdkOpts.allowedTools),
1547
+ });
1548
+ const queryPrompt = buildSdkQueryPrompt(context, prompt);
1526
1549
  const queryResult = sdk.query({
1527
1550
  prompt: queryPrompt,
1528
1551
  options: {
@@ -92,6 +92,16 @@ function formatLibraryList(libs, query) {
92
92
  lines.push("\nUse the ID (e.g. /websites/react_dev) with get_library_docs to fetch documentation.");
93
93
  return lines.join("\n");
94
94
  }
95
+ function getFirstTextContent(result) {
96
+ const content = result.content;
97
+ if (!Array.isArray(content))
98
+ return undefined;
99
+ const textBlock = content.find((block) => typeof block === "object" &&
100
+ block !== null &&
101
+ block.type === "text" &&
102
+ typeof block.text === "string");
103
+ return textBlock?.text.trim() || undefined;
104
+ }
95
105
  // ─── Extension ───────────────────────────────────────────────────────────────
96
106
  export default function (pi) {
97
107
  // ── resolve_library ──────────────────────────────────────────────────────
@@ -164,7 +174,7 @@ export default function (pi) {
164
174
  if (isPartial)
165
175
  return new Text(theme.fg("warning", "Searching Context7..."), 0, 0);
166
176
  if (result.isError || d?.error) {
167
- return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
177
+ return new Text(theme.fg("error", `Error: ${d?.error ?? getFirstTextContent(result) ?? "unknown"}`), 0, 0);
168
178
  }
169
179
  let text = theme.fg("success", `${d?.resultCount ?? 0} ${d?.resultCount === 1 ? "library" : "libraries"} found`);
170
180
  if (d?.cached)
@@ -303,7 +313,7 @@ export default function (pi) {
303
313
  if (isPartial)
304
314
  return new Text(theme.fg("warning", "Fetching documentation..."), 0, 0);
305
315
  if (result.isError || d?.error) {
306
- return new Text(theme.fg("error", `Error: ${d?.error ?? "unknown"}`), 0, 0);
316
+ return new Text(theme.fg("error", `Error: ${d?.error ?? getFirstTextContent(result) ?? "unknown"}`), 0, 0);
307
317
  }
308
318
  let text = theme.fg("success", `${(d?.charCount ?? 0).toLocaleString()} chars`);
309
319
  text += theme.fg("dim", ` · ${d?.tokens ?? 5000} token budget`);
@@ -10,6 +10,7 @@ import { existsSync, statSync } from "node:fs";
10
10
  import { resolve } from "node:path";
11
11
  import { Editor, Key, matchesKey, Text, truncateToWidth, wrapTextWithAnsi } from "@gsd/pi-tui";
12
12
  import { Type } from "@sinclair/typebox";
13
+ import { renderSharedDialogFrame } from "./shared/dialog-frame.js";
13
14
  import { makeUI } from "./shared/tui.js";
14
15
  import { maskEditorLine } from "./shared/mod.js";
15
16
  import { parseSecretsManifest, formatSecretsManifest } from "./gsd/files.js";
@@ -22,6 +23,9 @@ function maskPreview(value) {
22
23
  return "*".repeat(value.length);
23
24
  return `${value.slice(0, 4)}${"*".repeat(Math.max(4, value.length - 8))}${value.slice(-4)}`;
24
25
  }
26
+ function dialogContentWidth(width) {
27
+ return width < 4 ? Math.max(1, width) : Math.max(1, width - 4);
28
+ }
25
29
  function shellEscapeSingle(value) {
26
30
  return `'${value.replace(/'/g, `'\\''`)}'`;
27
31
  }
@@ -132,9 +136,9 @@ async function collectOneSecret(ctx, pageIndex, totalPages, keyName, hint, guida
132
136
  function render(width) {
133
137
  if (cachedLines)
134
138
  return cachedLines;
139
+ const contentWidth = dialogContentWidth(width);
135
140
  const lines = [];
136
- const add = (s) => lines.push(truncateToWidth(s, width));
137
- add(theme.fg("accent", "─".repeat(width)));
141
+ const add = (s) => lines.push(truncateToWidth(s, contentWidth));
138
142
  add(theme.fg("dim", ` Page ${pageIndex + 1}/${totalPages} · Secure Env Setup`));
139
143
  lines.push("");
140
144
  // Key name as big header
@@ -148,7 +152,7 @@ async function collectOneSecret(ctx, pageIndex, totalPages, keyName, hint, guida
148
152
  for (let g = 0; g < guidance.length; g++) {
149
153
  const prefix = ` ${g + 1}. `;
150
154
  const step = guidance[g];
151
- const wrappedLines = wrapTextWithAnsi(step, width - 4);
155
+ const wrappedLines = wrapTextWithAnsi(step, Math.max(1, contentWidth - 4));
152
156
  for (let w = 0; w < wrappedLines.length; w++) {
153
157
  const indent = w === 0 ? prefix : " ".repeat(prefix.length);
154
158
  lines.push(theme.fg("dim", `${indent}${wrappedLines[w]}`));
@@ -163,14 +167,13 @@ async function collectOneSecret(ctx, pageIndex, totalPages, keyName, hint, guida
163
167
  lines.push("");
164
168
  // Editor
165
169
  add(theme.fg("muted", " Enter value:"));
166
- for (const line of editor.render(width - 2)) {
170
+ for (const line of editor.render(Math.max(1, contentWidth - 2))) {
167
171
  add(theme.fg("text", maskEditorLine(line)));
168
172
  }
169
173
  lines.push("");
170
- add(theme.fg("dim", ` enter to confirm | ctrl+s or esc to skip | esc cancels`));
171
- add(theme.fg("accent", "─".repeat(width)));
172
- cachedLines = lines;
173
- return lines;
174
+ const footer = theme.fg("dim", " enter to confirm | ctrl+s or esc to skip | esc cancels");
175
+ cachedLines = renderSharedDialogFrame(theme, "Secure Env Setup", lines, width, { footer });
176
+ return cachedLines;
174
177
  }
175
178
  return {
176
179
  render,
@@ -224,13 +227,11 @@ export async function showSecretsSummary(ctx, entries, existingKeys) {
224
227
  function render(width) {
225
228
  if (cachedLines)
226
229
  return cachedLines;
227
- const ui = makeUI(theme, width);
230
+ const contentWidth = dialogContentWidth(width);
231
+ const ui = makeUI(theme, contentWidth);
228
232
  const lines = [];
229
233
  const push = (...rows) => { for (const r of rows)
230
234
  lines.push(...r); };
231
- push(ui.bar());
232
- push(ui.blank());
233
- push(ui.header(" Secrets Summary"));
234
235
  push(ui.blank());
235
236
  for (const entry of entries) {
236
237
  let status;
@@ -251,10 +252,9 @@ export async function showSecretsSummary(ctx, entries, existingKeys) {
251
252
  push(ui.progressItem(entry.key, status, { detail }));
252
253
  }
253
254
  push(ui.blank());
254
- push(ui.hints(["any key to continue"]));
255
- push(ui.bar());
256
- cachedLines = lines;
257
- return lines;
255
+ const footer = ui.hints(["any key to continue"])[0] ?? "";
256
+ cachedLines = renderSharedDialogFrame(theme, "Secrets Summary", lines, width, { footer });
257
+ return cachedLines;
258
258
  }
259
259
  return {
260
260
  render,
@@ -0,0 +1,30 @@
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
+ import { GOOGLE_ANTIGRAVITY_MODELS, GOOGLE_GEMINI_CLI_MODELS } from "./models.js";
9
+ import { isAntigravityCliReady, isGeminiCliReady } from "./readiness.js";
10
+ import { streamViaGoogleCli } from "./stream-adapter.js";
11
+ export default function googleCli(pi) {
12
+ pi.registerProvider("google-gemini-cli", {
13
+ name: "Google Gemini CLI",
14
+ authMode: "externalCli",
15
+ api: "google-gemini-cli",
16
+ baseUrl: "local://google-gemini-cli",
17
+ isReady: isGeminiCliReady,
18
+ streamSimple: streamViaGoogleCli,
19
+ models: GOOGLE_GEMINI_CLI_MODELS,
20
+ });
21
+ pi.registerProvider("google-antigravity", {
22
+ name: "Google Antigravity",
23
+ authMode: "externalCli",
24
+ api: "google-antigravity",
25
+ baseUrl: "local://google-antigravity",
26
+ isReady: isAntigravityCliReady,
27
+ streamSimple: streamViaGoogleCli,
28
+ models: GOOGLE_ANTIGRAVITY_MODELS,
29
+ });
30
+ }