@opengsd/gsd-pi 1.0.2-dev.5961fbf → 1.0.2-dev.5f7864c
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/onboarding.js +22 -3
- package/dist/resource-loader.d.ts +2 -0
- package/dist/resource-loader.js +18 -1
- package/dist/resources/.managed-resources-content-hash +1 -1
- 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/session.js +3 -0
- package/dist/resources/extensions/gsd/auto-start.js +232 -49
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +4 -3
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +17 -15
- 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-providers.js +54 -24
- package/dist/resources/extensions/gsd/git-conflict-state.js +26 -1
- package/dist/resources/extensions/gsd/guided-flow.js +1 -1
- package/dist/resources/extensions/gsd/key-manager.js +45 -13
- package/dist/resources/extensions/gsd/notification-overlay.js +8 -9
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +15 -13
- 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/guided-discuss-milestone.md +2 -0
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +28 -18
- package/dist/resources/extensions/gsd/tools/complete-task.js +9 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +40 -1
- package/dist/resources/extensions/gsd/tui/render-kit.js +51 -0
- 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/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/shared/package-manager-detection.js +36 -0
- 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 +6 -6
- 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 +6 -6
- 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/package.json +1 -1
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- 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/transcript-design.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +0 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.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/workflow-tools.js +1 -1
- 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 +13 -13
- package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +57 -17
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +64 -28
- 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/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/package.json +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- 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/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/session.ts +3 -0
- package/src/resources/extensions/gsd/auto-start.ts +307 -56
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +4 -3
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -15
- 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-providers.ts +55 -27
- package/src/resources/extensions/gsd/git-conflict-state.ts +25 -1
- package/src/resources/extensions/gsd/guided-flow.ts +1 -1
- package/src/resources/extensions/gsd/key-manager.ts +57 -14
- package/src/resources/extensions/gsd/notification-overlay.ts +12 -11
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +16 -12
- 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/guided-discuss-milestone.md +2 -0
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +29 -20
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +436 -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/context-chart.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/discuss-prompt.test.ts +4 -2
- package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/key-manager.test.ts +23 -4
- 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/queue-reorder-ui.test.ts +46 -0
- package/src/resources/extensions/gsd/tests/show-config-command.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +13 -2
- 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/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 +60 -0
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +54 -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/zombie-gsd-state.test.ts +45 -1
- package/src/resources/extensions/gsd/tools/complete-task.ts +9 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +56 -4
- package/src/resources/extensions/gsd/tui/render-kit.ts +82 -0
- 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/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/shared/package-manager-detection.ts +39 -0
- /package/dist/web/standalone/.next/static/{spUYLkQXoHJyxYOMH9VQy → IjxvcC7sl_MHNKXsUZrAy}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{spUYLkQXoHJyxYOMH9VQy → IjxvcC7sl_MHNKXsUZrAy}/_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/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))
|
|
@@ -52,6 +52,7 @@ export declare function mergedFingerprint(hoisted: string, internal: string): st
|
|
|
52
52
|
* Syncs all bundled resources to agentDir (~/.gsd/agent/) on every launch.
|
|
53
53
|
*
|
|
54
54
|
* - extensions/ → ~/.gsd/agent/extensions/ (overwrite when version changes)
|
|
55
|
+
* - shared/ → ~/.gsd/agent/shared/ (overwrite when version changes)
|
|
55
56
|
* - agents/ → ~/.gsd/agent/agents/ (overwrite when version changes)
|
|
56
57
|
* - skills/ → ~/.gsd/agent/skills/ (overwrite when version changes)
|
|
57
58
|
* - GSD-WORKFLOW.md → ~/.gsd/agent/GSD-WORKFLOW.md (fallback for env var miss)
|
|
@@ -65,6 +66,7 @@ export declare function mergedFingerprint(hoisted: string, internal: string): st
|
|
|
65
66
|
*/
|
|
66
67
|
export declare function initResources(agentDir: string, skillsDir?: string): void;
|
|
67
68
|
export declare function hasStaleCompiledExtensionSiblings(extensionsDir: string, sourceDir?: string): boolean;
|
|
69
|
+
export declare function hasMissingBundledResourceFiles(destDir: string, sourceDir: string): boolean;
|
|
68
70
|
interface BuildResourceLoaderOptions {
|
|
69
71
|
additionalExtensionPaths?: string[];
|
|
70
72
|
}
|
package/dist/resource-loader.js
CHANGED
|
@@ -560,6 +560,7 @@ function pruneRemovedBundledExtensions(manifest, agentDir) {
|
|
|
560
560
|
* Syncs all bundled resources to agentDir (~/.gsd/agent/) on every launch.
|
|
561
561
|
*
|
|
562
562
|
* - extensions/ → ~/.gsd/agent/extensions/ (overwrite when version changes)
|
|
563
|
+
* - shared/ → ~/.gsd/agent/shared/ (overwrite when version changes)
|
|
563
564
|
* - agents/ → ~/.gsd/agent/agents/ (overwrite when version changes)
|
|
564
565
|
* - skills/ → ~/.gsd/agent/skills/ (overwrite when version changes)
|
|
565
566
|
* - GSD-WORKFLOW.md → ~/.gsd/agent/GSD-WORKFLOW.md (fallback for env var miss)
|
|
@@ -600,12 +601,17 @@ export function initResources(agentDir, skillsDir = join(agentDir, 'skills')) {
|
|
|
600
601
|
// Version matches — check content fingerprint for same-version staleness.
|
|
601
602
|
const currentHash = getCurrentResourceFingerprint();
|
|
602
603
|
const hasStaleExtensionFiles = hasStaleCompiledExtensionSiblings(extensionsDir, bundledExtensionsDir);
|
|
603
|
-
|
|
604
|
+
const hasMissingSharedFiles = hasMissingBundledResourceFiles(join(agentDir, 'shared'), join(resourcesDir, 'shared'));
|
|
605
|
+
if (manifest.contentHash &&
|
|
606
|
+
manifest.contentHash === currentHash &&
|
|
607
|
+
!hasStaleExtensionFiles &&
|
|
608
|
+
!hasMissingSharedFiles) {
|
|
604
609
|
return;
|
|
605
610
|
}
|
|
606
611
|
}
|
|
607
612
|
// Sync bundled resources — overwrite so updates land on next launch.
|
|
608
613
|
syncResourceDir(bundledExtensionsDir, join(agentDir, 'extensions'));
|
|
614
|
+
syncResourceDir(join(resourcesDir, 'shared'), join(agentDir, 'shared'));
|
|
609
615
|
syncResourceDir(join(resourcesDir, 'agents'), join(agentDir, 'agents'));
|
|
610
616
|
syncResourceDir(join(resourcesDir, 'skills'), skillsDir);
|
|
611
617
|
// Sync GSD-WORKFLOW.md to agentDir as a fallback for when GSD_WORKFLOW_PATH
|
|
@@ -691,6 +697,17 @@ export function hasStaleCompiledExtensionSiblings(extensionsDir, sourceDir = bun
|
|
|
691
697
|
}
|
|
692
698
|
return false;
|
|
693
699
|
}
|
|
700
|
+
export function hasMissingBundledResourceFiles(destDir, sourceDir) {
|
|
701
|
+
const sourceFiles = collectRelativeFiles(sourceDir);
|
|
702
|
+
if (sourceFiles.size === 0)
|
|
703
|
+
return false;
|
|
704
|
+
const installedFiles = collectRelativeFiles(destDir);
|
|
705
|
+
for (const relPath of sourceFiles) {
|
|
706
|
+
if (!installedFiles.has(relPath))
|
|
707
|
+
return true;
|
|
708
|
+
}
|
|
709
|
+
return false;
|
|
710
|
+
}
|
|
694
711
|
function collectRelativeFiles(rootDir) {
|
|
695
712
|
const files = new Set();
|
|
696
713
|
if (!existsSync(rootDir))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
3634fde5b897e5e6
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
const ZERO_COST = {
|
|
2
|
+
input: 0,
|
|
3
|
+
output: 0,
|
|
4
|
+
cacheRead: 0,
|
|
5
|
+
cacheWrite: 0,
|
|
6
|
+
};
|
|
7
|
+
export const GOOGLE_GEMINI_CLI_MODELS = [
|
|
8
|
+
{
|
|
9
|
+
id: "gemini-2.5-flash",
|
|
10
|
+
name: "Gemini 2.5 Flash",
|
|
11
|
+
reasoning: true,
|
|
12
|
+
input: ["text"],
|
|
13
|
+
cost: ZERO_COST,
|
|
14
|
+
contextWindow: 1_000_000,
|
|
15
|
+
maxTokens: 65_536,
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
id: "gemini-2.5-pro",
|
|
19
|
+
name: "Gemini 2.5 Pro",
|
|
20
|
+
reasoning: true,
|
|
21
|
+
input: ["text"],
|
|
22
|
+
cost: ZERO_COST,
|
|
23
|
+
contextWindow: 1_000_000,
|
|
24
|
+
maxTokens: 65_536,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: "gemini-3-flash-preview",
|
|
28
|
+
name: "Gemini 3 Flash Preview",
|
|
29
|
+
reasoning: true,
|
|
30
|
+
input: ["text"],
|
|
31
|
+
cost: ZERO_COST,
|
|
32
|
+
contextWindow: 1_000_000,
|
|
33
|
+
maxTokens: 65_536,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: "gemini-3.1-pro-preview",
|
|
37
|
+
name: "Gemini 3.1 Pro Preview",
|
|
38
|
+
reasoning: true,
|
|
39
|
+
input: ["text"],
|
|
40
|
+
cost: ZERO_COST,
|
|
41
|
+
contextWindow: 1_000_000,
|
|
42
|
+
maxTokens: 65_536,
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
export const GOOGLE_ANTIGRAVITY_MODELS = [
|
|
46
|
+
{
|
|
47
|
+
id: "default",
|
|
48
|
+
name: "Antigravity Default",
|
|
49
|
+
reasoning: true,
|
|
50
|
+
input: ["text"],
|
|
51
|
+
cost: ZERO_COST,
|
|
52
|
+
contextWindow: 1_000_000,
|
|
53
|
+
maxTokens: 65_536,
|
|
54
|
+
},
|
|
55
|
+
];
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
function isCommandInPath(command) {
|
|
3
|
+
const resolver = process.platform === "win32" ? "where" : "which";
|
|
4
|
+
const result = spawnSync(resolver, [command], { stdio: "ignore" });
|
|
5
|
+
return result.status === 0;
|
|
6
|
+
}
|
|
7
|
+
export function isGeminiCliReady() {
|
|
8
|
+
return isCommandInPath("gemini");
|
|
9
|
+
}
|
|
10
|
+
export function isAntigravityCliReady() {
|
|
11
|
+
return isCommandInPath("agy");
|
|
12
|
+
}
|