@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.
- package/README.md +63 -12
- package/dist/headless-answers.js +2 -1
- package/dist/headless-events.d.ts +1 -0
- package/dist/headless-events.js +8 -1
- package/dist/onboarding.js +22 -3
- package/dist/resource-loader.d.ts +7 -0
- package/dist/resource-loader.js +44 -9
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +34 -11
- package/dist/resources/extensions/context7/index.js +12 -2
- package/dist/resources/extensions/get-secrets-from-user.js +16 -16
- package/dist/resources/extensions/google-cli/index.js +30 -0
- package/dist/resources/extensions/google-cli/models.js +55 -0
- package/dist/resources/extensions/google-cli/package.json +11 -0
- package/dist/resources/extensions/google-cli/readiness.js +12 -0
- package/dist/resources/extensions/google-cli/stream-adapter.js +191 -0
- package/dist/resources/extensions/gsd/auto/loop.js +81 -1
- package/dist/resources/extensions/gsd/auto/orchestrator.js +4 -2
- package/dist/resources/extensions/gsd/auto/phases.js +38 -1
- package/dist/resources/extensions/gsd/auto/run-unit.js +8 -0
- package/dist/resources/extensions/gsd/auto/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +17 -7
- package/dist/resources/extensions/gsd/auto-post-unit.js +65 -16
- package/dist/resources/extensions/gsd/auto-prompts.js +5 -236
- package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
- package/dist/resources/extensions/gsd/auto-start.js +232 -49
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -1
- package/dist/resources/extensions/gsd/auto-verification.js +14 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +34 -1
- package/dist/resources/extensions/gsd/auto.js +40 -2
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +4 -3
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +39 -5
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +107 -27
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +3 -27
- package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +4 -4
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
- package/dist/resources/extensions/gsd/closeout-recovery.js +7 -1
- package/dist/resources/extensions/gsd/commands/handlers/auto.js +9 -1
- package/dist/resources/extensions/gsd/commands-handlers.js +3 -0
- package/dist/resources/extensions/gsd/commands-usage.js +105 -1
- package/dist/resources/extensions/gsd/config-overlay.js +20 -14
- package/dist/resources/extensions/gsd/context-overlay.js +22 -16
- package/dist/resources/extensions/gsd/dashboard-overlay.js +10 -23
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +87 -0
- package/dist/resources/extensions/gsd/doctor-git-checks.js +70 -5
- package/dist/resources/extensions/gsd/doctor-providers.js +54 -24
- package/dist/resources/extensions/gsd/doctor.js +7 -2
- package/dist/resources/extensions/gsd/git-conflict-state.js +26 -1
- package/dist/resources/extensions/gsd/guided-flow.js +5 -6
- package/dist/resources/extensions/gsd/key-manager.js +45 -13
- package/dist/resources/extensions/gsd/mcp-filter.js +57 -18
- package/dist/resources/extensions/gsd/mcp-project-config.js +15 -9
- package/dist/resources/extensions/gsd/migration-auto-check.js +5 -1
- package/dist/resources/extensions/gsd/milestone-actions.js +3 -0
- package/dist/resources/extensions/gsd/milestone-reopen-events.js +28 -0
- package/dist/resources/extensions/gsd/notification-overlay.js +8 -9
- package/dist/resources/extensions/gsd/parallel-merge.js +6 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +15 -13
- package/dist/resources/extensions/gsd/post-execution-checks.js +5 -4
- package/dist/resources/extensions/gsd/preferences-skills.js +11 -4
- package/dist/resources/extensions/gsd/preferences.js +14 -2
- package/dist/resources/extensions/gsd/prompt-loader.js +2 -0
- package/dist/resources/extensions/gsd/prompts/discuss.md +4 -2
- package/dist/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/dist/resources/extensions/gsd/prompts/system.md +3 -20
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +28 -18
- package/dist/resources/extensions/gsd/repo-identity.js +36 -6
- package/dist/resources/extensions/gsd/repository-registry.js +3 -1
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +13 -6
- package/dist/resources/extensions/gsd/skill-activation.js +233 -0
- package/dist/resources/extensions/gsd/skill-catalog.data.js +820 -0
- package/dist/resources/extensions/gsd/skill-catalog.install.js +179 -0
- package/dist/resources/extensions/gsd/skill-catalog.js +5 -1028
- package/dist/resources/extensions/gsd/skill-discovery.js +121 -79
- package/dist/resources/extensions/gsd/skill-scope.js +52 -0
- package/dist/resources/extensions/gsd/skill-telemetry.js +6 -39
- package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +1 -1
- package/dist/resources/extensions/gsd/skills.js +60 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +351 -0
- package/dist/resources/extensions/gsd/state-reconciliation/index.js +41 -0
- package/dist/resources/extensions/gsd/state-reconciliation/registry.js +4 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +9 -0
- package/dist/resources/extensions/gsd/tools/exec-tool.js +42 -8
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +63 -2
- package/dist/resources/extensions/gsd/tui/render-kit.js +51 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +35 -26
- package/dist/resources/extensions/gsd/user-input-boundary.js +1 -1
- package/dist/resources/extensions/gsd/vision-ask.js +22 -0
- package/dist/resources/extensions/gsd/visualizer-overlay.js +8 -36
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +24 -3
- package/dist/resources/extensions/gsd/worktree-state-projection.js +29 -0
- package/dist/resources/extensions/search-the-web/native-search.js +57 -8
- package/dist/resources/extensions/shared/confirm-ui.js +9 -6
- package/dist/resources/extensions/shared/dialog-frame.js +42 -0
- package/dist/resources/extensions/shared/interview-ui.js +42 -30
- package/dist/resources/extensions/shared/next-action-ui.js +6 -6
- package/dist/resources/extensions/subagent/index.js +8 -15
- package/dist/resources/shared/package-manager-detection.js +36 -0
- package/dist/resources/skills/agent-browser/SKILL.md +1 -1
- package/dist/resources/skills/api-design/SKILL.md +1 -1
- package/dist/resources/skills/code-optimizer/SKILL.md +6 -11
- package/dist/resources/skills/create-gsd-extension/SKILL.md +1 -1
- package/dist/resources/skills/create-mcp-server/SKILL.md +1 -1
- package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
- package/dist/resources/skills/create-skill/workflows/verify-skill.md +2 -10
- package/dist/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
- package/dist/resources/skills/decompose-into-slices/SKILL.md +3 -3
- package/dist/resources/skills/dependency-upgrade/SKILL.md +1 -1
- package/dist/resources/skills/forensics/SKILL.md +2 -2
- package/dist/resources/skills/grill-me/SKILL.md +1 -1
- package/dist/resources/skills/handoff/SKILL.md +1 -1
- package/dist/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
- package/dist/resources/skills/observability/SKILL.md +1 -1
- package/dist/resources/skills/security-review/SKILL.md +1 -1
- package/dist/resources/skills/spike-wrap-up/SKILL.md +1 -1
- package/dist/resources/skills/tdd/SKILL.md +1 -1
- package/dist/resources/skills/write-docs/SKILL.md +1 -1
- package/dist/resources/skills/write-milestone-brief/SKILL.md +1 -1
- package/dist/update-check.d.ts +6 -2
- package/dist/update-check.js +7 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
- package/dist/web/standalone/.next/build-manifest.json +2 -2
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
- package/dist/web/standalone/.next/server/chunks/1834.js +2 -2
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
- package/package.json +5 -2
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.test.js +5 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +15 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +16 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/dist/workflow.test.js +1 -0
- package/packages/contracts/dist/workflow.test.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts +1 -0
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js +22 -8
- package/packages/gsd-agent-core/dist/session/agent-session-extensions.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts +12 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.d.ts.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js +45 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/dialog-container.js.map +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts +3 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js +11 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js +13 -11
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts +3 -3
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js +12 -10
- package/packages/gsd-agent-modes/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/index.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +2 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts +6 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js +9 -6
- package/packages/gsd-agent-modes/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +3 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +0 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-class-constants.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +2 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts +3 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js +144 -2
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-auth.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js +2 -14
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-session.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +7 -1
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +13 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +47 -8
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +3 -3
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent-loop.js +16 -14
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/skills.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/skills.js +6 -0
- package/packages/pi-agent-core/dist/harness/skills.js.map +1 -1
- package/packages/pi-agent-core/dist/harness/system-prompt.d.ts +7 -0
- package/packages/pi-agent-core/dist/harness/system-prompt.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/harness/system-prompt.js +7 -0
- package/packages/pi-agent-core/dist/harness/system-prompt.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +48 -206
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +67 -220
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +50 -0
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses-shared.js +28 -4
- package/packages/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +2 -0
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js +29 -1
- package/packages/pi-ai/dist/utils/tests/tool-search-shim.test.js.map +1 -1
- package/packages/pi-ai/dist/utils/tool-search-shim.d.ts +4 -1
- package/packages/pi-ai/dist/utils/tool-search-shim.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/tool-search-shim.js +58 -10
- package/packages/pi-ai/dist/utils/tool-search-shim.js.map +1 -1
- package/packages/pi-ai/dist/utils/tool-shims.d.ts +1 -1
- package/packages/pi-ai/dist/utils/tool-shims.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/tool-shims.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/README.md +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +8 -2
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +3 -0
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit.js +5 -7
- package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/read.js +5 -4
- package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js +0 -1
- package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
- package/packages/pi-coding-agent/package.json +8 -8
- package/packages/pi-tui/package.json +1 -1
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/scripts/install/detect-existing.js +17 -3
- package/scripts/install/npm-global.js +103 -33
- package/scripts/install.js +1 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +36 -11
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +86 -19
- package/src/resources/extensions/context7/index.ts +15 -2
- package/src/resources/extensions/get-secrets-from-user.ts +17 -16
- package/src/resources/extensions/google-cli/index.ts +34 -0
- package/src/resources/extensions/google-cli/models.ts +57 -0
- package/src/resources/extensions/google-cli/package.json +11 -0
- package/src/resources/extensions/google-cli/readiness.ts +15 -0
- package/src/resources/extensions/google-cli/stream-adapter.ts +245 -0
- package/src/resources/extensions/gsd/auto/loop.ts +96 -1
- package/src/resources/extensions/gsd/auto/orchestrator.ts +4 -2
- package/src/resources/extensions/gsd/auto/phases.ts +47 -1
- package/src/resources/extensions/gsd/auto/run-unit.ts +10 -0
- package/src/resources/extensions/gsd/auto/session.ts +3 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +31 -11
- package/src/resources/extensions/gsd/auto-post-unit.ts +101 -18
- package/src/resources/extensions/gsd/auto-prompts.ts +4 -284
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -7
- package/src/resources/extensions/gsd/auto-start.ts +307 -56
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +3 -1
- package/src/resources/extensions/gsd/auto-verification.ts +18 -2
- package/src/resources/extensions/gsd/auto-worktree.ts +45 -1
- package/src/resources/extensions/gsd/auto.ts +50 -2
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +4 -3
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +9 -4
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +42 -5
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +124 -25
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +3 -28
- package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +4 -4
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
- package/src/resources/extensions/gsd/closeout-recovery.ts +6 -1
- package/src/resources/extensions/gsd/commands/handlers/auto.ts +9 -1
- package/src/resources/extensions/gsd/commands-handlers.ts +2 -0
- package/src/resources/extensions/gsd/commands-usage.ts +110 -5
- package/src/resources/extensions/gsd/config-overlay.ts +19 -16
- package/src/resources/extensions/gsd/context-overlay.ts +24 -19
- package/src/resources/extensions/gsd/dashboard-overlay.ts +14 -27
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +99 -0
- package/src/resources/extensions/gsd/doctor-git-checks.ts +72 -5
- package/src/resources/extensions/gsd/doctor-providers.ts +55 -27
- package/src/resources/extensions/gsd/doctor-types.ts +2 -0
- package/src/resources/extensions/gsd/doctor.ts +7 -2
- package/src/resources/extensions/gsd/git-conflict-state.ts +25 -1
- package/src/resources/extensions/gsd/guided-flow.ts +5 -6
- package/src/resources/extensions/gsd/key-manager.ts +57 -14
- package/src/resources/extensions/gsd/mcp-filter.ts +64 -17
- package/src/resources/extensions/gsd/mcp-project-config.ts +24 -9
- package/src/resources/extensions/gsd/migration-auto-check.ts +6 -0
- package/src/resources/extensions/gsd/milestone-actions.ts +2 -0
- package/src/resources/extensions/gsd/milestone-reopen-events.ts +28 -0
- package/src/resources/extensions/gsd/notification-overlay.ts +12 -11
- package/src/resources/extensions/gsd/parallel-merge.ts +6 -4
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +16 -12
- package/src/resources/extensions/gsd/post-execution-checks.ts +7 -4
- package/src/resources/extensions/gsd/preferences-skills.ts +11 -4
- package/src/resources/extensions/gsd/preferences.ts +17 -2
- package/src/resources/extensions/gsd/prompt-loader.ts +2 -0
- package/src/resources/extensions/gsd/prompts/discuss.md +4 -2
- package/src/resources/extensions/gsd/prompts/gate-evaluate.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +2 -0
- package/src/resources/extensions/gsd/prompts/system.md +3 -20
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +29 -20
- package/src/resources/extensions/gsd/repo-identity.ts +35 -7
- package/src/resources/extensions/gsd/repository-registry.ts +3 -1
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +13 -6
- package/src/resources/extensions/gsd/skill-activation.ts +292 -0
- package/src/resources/extensions/gsd/skill-catalog.data.ts +858 -0
- package/src/resources/extensions/gsd/skill-catalog.install.ts +205 -0
- package/src/resources/extensions/gsd/skill-catalog.ts +16 -1087
- package/src/resources/extensions/gsd/skill-discovery.ts +134 -78
- package/src/resources/extensions/gsd/skill-scope.ts +63 -0
- package/src/resources/extensions/gsd/skill-telemetry.ts +6 -40
- package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +1 -1
- package/src/resources/extensions/gsd/skills.ts +75 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +499 -0
- package/src/resources/extensions/gsd/state-reconciliation/index.ts +40 -0
- package/src/resources/extensions/gsd/state-reconciliation/registry.ts +8 -0
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +328 -2
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +28 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-evidence-crossref-4909.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +41 -0
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +436 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-untracked-content.test.ts +53 -0
- package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +15 -0
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +31 -0
- package/src/resources/extensions/gsd/tests/commands-context.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/commands-dispatcher-workspace-git.test.ts +15 -2
- package/src/resources/extensions/gsd/tests/commands-usage.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +40 -3
- package/src/resources/extensions/gsd/tests/context-chart.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +64 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +71 -1
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +101 -1
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +22 -3
- package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +43 -0
- package/src/resources/extensions/gsd/tests/interactive-tool-idle-exemption.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +23 -4
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +19 -1
- package/src/resources/extensions/gsd/tests/mcp-project-config.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +56 -1
- package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +70 -10
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +127 -10
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +116 -11
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +30 -1
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +111 -0
- package/src/resources/extensions/gsd/tests/skill-scope-auto.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/skills.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +13 -2
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +303 -0
- package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +67 -1
- package/src/resources/extensions/gsd/tests/tool-param-optionality.test.ts +24 -1
- package/src/resources/extensions/gsd/tests/tui-border-assertions.ts +28 -0
- package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +18 -0
- package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/vision-ask.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/workflow-mcp-auto-prep.test.ts +133 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +82 -0
- package/src/resources/extensions/gsd/tests/workspace-git-preflight.test.ts +16 -1
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +45 -1
- package/src/resources/extensions/gsd/tools/complete-task.ts +9 -0
- package/src/resources/extensions/gsd/tools/exec-tool.ts +42 -10
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +82 -5
- package/src/resources/extensions/gsd/tui/render-kit.ts +82 -0
- package/src/resources/extensions/gsd/unit-context-manifest.ts +37 -26
- package/src/resources/extensions/gsd/user-input-boundary.ts +1 -1
- package/src/resources/extensions/gsd/vision-ask.ts +28 -0
- package/src/resources/extensions/gsd/visualizer-overlay.ts +12 -40
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +37 -2
- package/src/resources/extensions/gsd/worktree-state-projection.ts +33 -0
- package/src/resources/extensions/search-the-web/native-search.ts +60 -8
- package/src/resources/extensions/shared/confirm-ui.ts +8 -12
- package/src/resources/extensions/shared/dialog-frame.ts +71 -0
- package/src/resources/extensions/shared/interview-ui.ts +43 -42
- package/src/resources/extensions/shared/next-action-ui.ts +6 -6
- package/src/resources/extensions/shared/tests/confirm-ui.test.ts +57 -0
- package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +163 -0
- package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +55 -0
- package/src/resources/extensions/subagent/index.ts +8 -15
- package/src/resources/shared/package-manager-detection.ts +39 -0
- package/src/resources/skills/agent-browser/SKILL.md +1 -1
- package/src/resources/skills/api-design/SKILL.md +1 -1
- package/src/resources/skills/code-optimizer/SKILL.md +6 -11
- package/src/resources/skills/create-gsd-extension/SKILL.md +1 -1
- package/src/resources/skills/create-mcp-server/SKILL.md +1 -1
- package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +1 -1
- package/src/resources/skills/create-skill/workflows/verify-skill.md +2 -10
- package/src/resources/skills/debug-like-expert/references/when-to-research.md +1 -5
- package/src/resources/skills/decompose-into-slices/SKILL.md +3 -3
- package/src/resources/skills/dependency-upgrade/SKILL.md +1 -1
- package/src/resources/skills/forensics/SKILL.md +2 -2
- package/src/resources/skills/grill-me/SKILL.md +1 -1
- package/src/resources/skills/handoff/SKILL.md +1 -1
- package/src/resources/skills/make-interfaces-feel-better/SKILL.md +1 -1
- package/src/resources/skills/observability/SKILL.md +1 -1
- package/src/resources/skills/security-review/SKILL.md +1 -1
- package/src/resources/skills/spike-wrap-up/SKILL.md +1 -1
- package/src/resources/skills/tdd/SKILL.md +1 -1
- package/src/resources/skills/write-docs/SKILL.md +1 -1
- package/src/resources/skills/write-milestone-brief/SKILL.md +1 -1
- /package/dist/web/standalone/.next/static/{szb-HAt0IoSx3docUZO-E → tH1tnDYt1E0hK9Ien73Z0}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{szb-HAt0IoSx3docUZO-E → 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
|
+

|
|
21
|
+
|
|
22
|
+

|
|
23
|
+
|
|
24
|
+

|
|
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
|
-
|
|
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
|
-
|
|
64
|
+
If you want pnpm to own the global install, use pnpm's runner:
|
|
37
65
|
|
|
38
66
|
```bash
|
|
39
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
54
|
-
|
|
83
|
+
npx @opengsd/gsd-pi@latest
|
|
84
|
+
command -v gsd
|
|
55
85
|
gsd --version
|
|
56
86
|
```
|
|
57
87
|
|
|
58
|
-
|
|
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
|
-
|
|
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
|
|
package/dist/headless-answers.js
CHANGED
|
@@ -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;
|
package/dist/headless-events.js
CHANGED
|
@@ -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(
|
|
146
|
+
return INTERACTIVE_HEADLESS_TOOLS.has(canonicalHeadlessToolName(toolName));
|
|
140
147
|
}
|
|
141
148
|
export function shouldArmHeadlessIdleTimeout(toolCallCount, interactiveToolCount) {
|
|
142
149
|
return toolCallCount > 0 && interactiveToolCount === 0;
|
package/dist/onboarding.js
CHANGED
|
@@ -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
|
-
|
|
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
|
}
|
package/dist/resource-loader.js
CHANGED
|
@@ -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
|
|
315
|
-
* - Global install (npm/bun/pnpm): merge
|
|
316
|
-
* packageRoot/node_modules so
|
|
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 =
|
|
321
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
197
|
-
|
|
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 =
|
|
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,
|
|
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,
|
|
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,
|
|
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(
|
|
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
|
-
|
|
171
|
-
|
|
172
|
-
cachedLines
|
|
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
|
|
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
|
-
|
|
255
|
-
|
|
256
|
-
cachedLines
|
|
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
|
+
}
|