gsd-pi 2.78.0 → 2.78.1-dev.9d08d820b
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 +59 -23
- package/dist/bundled-resource-path.d.ts +7 -0
- package/dist/bundled-resource-path.js +34 -2
- package/dist/claude-cli-check.js +104 -33
- package/dist/cli-policy.d.ts +13 -0
- package/dist/cli-policy.js +17 -0
- package/dist/cli.js +95 -55
- package/dist/headless-query.d.ts +22 -0
- package/dist/headless-query.js +43 -8
- package/dist/headless.d.ts +10 -0
- package/dist/headless.js +16 -1
- package/dist/loader.js +9 -13
- package/dist/onboarding.d.ts +10 -0
- package/dist/onboarding.js +2 -2
- package/dist/provider-migrations.d.ts +2 -2
- package/dist/provider-migrations.js +5 -2
- package/dist/resource-loader.d.ts +5 -2
- package/dist/resource-loader.js +30 -13
- package/dist/resources/.managed-resources-content-hash +1 -0
- package/dist/resources/extensions/claude-code-cli/readiness.js +128 -32
- package/dist/resources/extensions/gsd/auto/loop.js +23 -0
- package/dist/resources/extensions/gsd/auto/phases.js +5 -13
- package/dist/resources/extensions/gsd/auto/run-unit.js +3 -1
- package/dist/resources/extensions/gsd/auto/session.js +5 -6
- package/dist/resources/extensions/gsd/auto-dashboard.js +3 -2
- package/dist/resources/extensions/gsd/auto-dispatch.js +18 -6
- package/dist/resources/extensions/gsd/auto-prompts.js +63 -2
- package/dist/resources/extensions/gsd/auto-recovery.js +43 -4
- package/dist/resources/extensions/gsd/auto-runtime-state.js +31 -0
- package/dist/resources/extensions/gsd/auto-start.js +1 -1
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -2
- package/dist/resources/extensions/gsd/auto-worktree.js +60 -13
- package/dist/resources/extensions/gsd/auto.js +14 -5
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +14 -2
- package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +7 -5
- package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
- package/dist/resources/extensions/gsd/bootstrap/register-extension.js +5 -4
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +100 -31
- package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +11 -6
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +22 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +34 -8
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +121 -3
- package/dist/resources/extensions/gsd/commands/catalog.js +69 -5
- package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -1
- package/dist/resources/extensions/gsd/commands-config.js +3 -2
- package/dist/resources/extensions/gsd/commands-extensions.js +46 -3
- package/dist/resources/extensions/gsd/commands-handlers.js +3 -2
- package/dist/resources/extensions/gsd/commands-mcp-status.js +3 -1
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +10 -1
- package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
- package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +39 -1
- package/dist/resources/extensions/gsd/error-classifier.js +1 -1
- package/dist/resources/extensions/gsd/forensics.js +10 -8
- package/dist/resources/extensions/gsd/git-service.js +12 -5
- package/dist/resources/extensions/gsd/gsd-db.js +11 -2
- package/dist/resources/extensions/gsd/guided-flow.js +25 -24
- package/dist/resources/extensions/gsd/home-dir.js +16 -0
- package/dist/resources/extensions/gsd/key-manager.js +2 -1
- package/dist/resources/extensions/gsd/memory-store.js +66 -31
- package/dist/resources/extensions/gsd/migrate/command.js +3 -2
- package/dist/resources/extensions/gsd/milestone-id-reservation.js +36 -0
- package/dist/resources/extensions/gsd/model-router.js +114 -9
- package/dist/resources/extensions/gsd/native-git-bridge.js +7 -1
- package/dist/resources/extensions/gsd/preferences-models.js +91 -15
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +32 -0
- package/dist/resources/extensions/gsd/preferences.js +5 -3
- package/dist/resources/extensions/gsd/prompt-loader.js +23 -12
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +10 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -0
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +10 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +10 -0
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +9 -3
- package/dist/resources/extensions/gsd/state.js +42 -0
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- package/dist/resources/extensions/gsd/tools/memory-tools.js +18 -1
- package/dist/resources/extensions/gsd/unit-context-manifest.js +29 -4
- package/dist/resources/extensions/gsd/visualizer-overlay.js +1 -1
- package/dist/resources/extensions/gsd/watch/header-renderer.js +3 -1
- package/dist/resources/extensions/gsd/worktree-command.js +26 -46
- package/dist/resources/extensions/gsd/worktree-manager.js +20 -1
- package/dist/resources/extensions/gsd/worktree-resolver.js +4 -13
- package/dist/resources/extensions/gsd/worktree-root.js +124 -0
- package/dist/resources/extensions/gsd/worktree-session-state.js +33 -0
- package/dist/resources/extensions/gsd/worktree.js +4 -115
- package/dist/resources/extensions/mcp-client/index.js +6 -3
- package/dist/resources/extensions/ollama/index.js +15 -2
- package/dist/resources/extensions/ollama/model-capabilities.js +31 -0
- package/dist/resources/extensions/ollama/ollama-client.js +40 -4
- package/dist/resources/extensions/slash-commands/create-extension.js +36 -22
- package/dist/resources/extensions/subagent/index.js +324 -178
- package/dist/resources/skills/create-gsd-extension/SKILL.md +9 -5
- package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
- package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
- package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
- package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
- package/dist/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
- package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
- package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
- package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
- package/dist/rtk-shared.d.ts +3 -0
- package/dist/rtk-shared.js +17 -0
- package/dist/rtk.d.ts +2 -5
- package/dist/rtk.js +3 -20
- package/dist/runtime-checks.d.ts +27 -0
- package/dist/runtime-checks.js +38 -0
- package/dist/tsconfig.extensions.tsbuildinfo +1 -1
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +44 -4
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- 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/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +4 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
- package/dist/web/standalone/.next/server/chunks/63.js +3 -3
- package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +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/.next/server/webpack-runtime.js +1 -1
- package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +1 -0
- package/dist/web/standalone/.next/static/chunks/2824.08296bc2f9654698.js +1 -0
- package/dist/web/standalone/.next/static/chunks/3026.3af53b279375f082.js +1 -0
- package/dist/web/standalone/.next/static/chunks/315.6f68ae79b67d25cf.js +1 -0
- package/dist/web/standalone/.next/static/chunks/3497.4bfc60a3b3dea717.js +1 -0
- package/dist/web/standalone/.next/static/chunks/5516.4a07c872b5c3a663.js +1 -0
- package/dist/web/standalone/.next/static/chunks/8336.31b019697882acfb.js +10 -0
- package/dist/web/standalone/.next/static/chunks/8845.c9702695e8c5a9c5.js +2 -0
- package/dist/web/standalone/.next/static/chunks/9058.01ef3a463bda88f1.js +20 -0
- package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-9bf2e0c50fb2ca05.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/webpack-f9f0dc45e4f3ac10.js +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/package.json +2 -1
- package/dist/web/standalone/server.js +1 -1
- package/dist/worktree-cli.d.ts +1 -0
- package/dist/worktree-cli.js +9 -3
- package/dist/worktree-status-banner.d.ts +1 -0
- package/dist/worktree-status-banner.js +132 -0
- package/package.json +1 -3
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/dist/alias-telemetry.d.ts +8 -0
- package/packages/mcp-server/dist/alias-telemetry.d.ts.map +1 -0
- package/packages/mcp-server/dist/alias-telemetry.js +30 -0
- package/packages/mcp-server/dist/alias-telemetry.js.map +1 -0
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +74 -46
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/alias-telemetry.test.ts +78 -0
- package/packages/mcp-server/src/alias-telemetry.ts +30 -0
- package/packages/mcp-server/src/workflow-tools.test.ts +78 -0
- package/packages/mcp-server/src/workflow-tools.ts +93 -58
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js +231 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic-shared.js +48 -19
- package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +13 -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/repair-tool-json.d.ts.map +1 -1
- package/packages/pi-ai/dist/utils/repair-tool-json.js +24 -3
- package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +26 -0
- package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +289 -0
- package/packages/pi-ai/src/providers/anthropic-shared.ts +52 -20
- package/packages/pi-ai/src/types.ts +13 -0
- package/packages/pi-ai/src/utils/repair-tool-json.ts +24 -3
- package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +32 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +6 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/messages.js +4 -0
- package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +19 -2
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +10 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +18 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +13 -0
- package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +20 -16
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts +37 -0
- package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/token-telemetry.js +49 -0
- package/packages/pi-coding-agent/dist/core/token-telemetry.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +133 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +14 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js +78 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js +181 -0
- package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +7 -0
- package/packages/pi-coding-agent/src/core/messages.ts +4 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +32 -2
- package/packages/pi-coding-agent/src/core/model-registry.ts +21 -0
- package/packages/pi-coding-agent/src/core/system-prompt.ts +33 -15
- package/packages/pi-coding-agent/src/core/token-telemetry.ts +77 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +212 -0
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +17 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +1 -1
- package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +102 -0
- package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +200 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js +17 -3
- package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +2 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +161 -0
- package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +1 -0
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/autocomplete.test.ts +20 -3
- package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +219 -0
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/claude-code-cli/readiness.ts +130 -30
- package/src/resources/extensions/gsd/auto/loop.ts +24 -2
- package/src/resources/extensions/gsd/auto/phases.ts +6 -14
- package/src/resources/extensions/gsd/auto/run-unit.ts +3 -1
- package/src/resources/extensions/gsd/auto/session.ts +5 -6
- package/src/resources/extensions/gsd/auto/types.ts +1 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +3 -2
- package/src/resources/extensions/gsd/auto-dispatch.ts +18 -6
- package/src/resources/extensions/gsd/auto-prompts.ts +60 -2
- package/src/resources/extensions/gsd/auto-recovery.ts +46 -8
- package/src/resources/extensions/gsd/auto-runtime-state.ts +51 -0
- package/src/resources/extensions/gsd/auto-start.ts +1 -1
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +2 -4
- package/src/resources/extensions/gsd/auto-worktree.ts +82 -12
- package/src/resources/extensions/gsd/auto.ts +14 -4
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +15 -13
- package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +8 -7
- package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
- package/src/resources/extensions/gsd/bootstrap/register-extension.ts +10 -9
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +108 -31
- package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +12 -6
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +20 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +39 -8
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +141 -11
- package/src/resources/extensions/gsd/commands/catalog.ts +75 -5
- package/src/resources/extensions/gsd/commands/handlers/core.ts +22 -1
- package/src/resources/extensions/gsd/commands-config.ts +3 -2
- package/src/resources/extensions/gsd/commands-extensions.ts +43 -3
- package/src/resources/extensions/gsd/commands-handlers.ts +3 -2
- package/src/resources/extensions/gsd/commands-mcp-status.ts +3 -1
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +15 -1
- package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
- package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +39 -1
- package/src/resources/extensions/gsd/doctor-types.ts +3 -1
- package/src/resources/extensions/gsd/error-classifier.ts +1 -1
- package/src/resources/extensions/gsd/forensics.ts +12 -7
- package/src/resources/extensions/gsd/git-service.ts +13 -5
- package/src/resources/extensions/gsd/gsd-db.ts +12 -2
- package/src/resources/extensions/gsd/guided-flow.ts +27 -26
- package/src/resources/extensions/gsd/home-dir.ts +19 -0
- package/src/resources/extensions/gsd/journal.ts +4 -1
- package/src/resources/extensions/gsd/key-manager.ts +2 -1
- package/src/resources/extensions/gsd/memory-store.ts +81 -28
- package/src/resources/extensions/gsd/migrate/command.ts +3 -2
- package/src/resources/extensions/gsd/milestone-id-reservation.ts +47 -0
- package/src/resources/extensions/gsd/model-router.ts +172 -9
- package/src/resources/extensions/gsd/native-git-bridge.ts +7 -1
- package/src/resources/extensions/gsd/preferences-models.ts +101 -15
- package/src/resources/extensions/gsd/preferences-types.ts +6 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +35 -0
- package/src/resources/extensions/gsd/preferences.ts +16 -2
- package/src/resources/extensions/gsd/prompt-loader.ts +26 -12
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +10 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -0
- package/src/resources/extensions/gsd/prompts/plan-slice.md +10 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +10 -0
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +9 -3
- package/src/resources/extensions/gsd/state.ts +42 -0
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +178 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +24 -5
- package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +21 -4
- package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +138 -211
- package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +142 -59
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -4
- package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +89 -32
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +41 -23
- package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +3 -43
- package/src/resources/extensions/gsd/tests/debug-logger.test.ts +5 -3
- package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +22 -87
- package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +7 -118
- package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +18 -60
- package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +14 -76
- package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +22 -83
- package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +1 -63
- package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +47 -0
- package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +26 -1
- package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +30 -0
- package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +81 -0
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +14 -4
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +22 -12
- package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/home-dir.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +72 -1
- package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +0 -23
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/memory-tools.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +124 -0
- package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +152 -0
- package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +18 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +169 -8
- package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +32 -43
- package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +4 -10
- package/src/resources/extensions/gsd/tests/preferences.test.ts +127 -0
- package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +93 -0
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +168 -19
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +7 -1
- package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +23 -1
- package/src/resources/extensions/gsd/tests/steer-worktree-path.test.ts +17 -1
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +101 -0
- package/src/resources/extensions/gsd/tests/token-profile.test.ts +51 -4
- package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +7 -16
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +38 -3
- package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +15 -1
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +34 -33
- package/src/resources/extensions/gsd/tests/worktree.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +131 -1
- package/src/resources/extensions/gsd/tools/memory-tools.ts +17 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +44 -12
- package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
- package/src/resources/extensions/gsd/watch/header-renderer.ts +3 -1
- package/src/resources/extensions/gsd/workflow-logger.ts +1 -0
- package/src/resources/extensions/gsd/worktree-command.ts +31 -44
- package/src/resources/extensions/gsd/worktree-manager.ts +40 -1
- package/src/resources/extensions/gsd/worktree-resolver.ts +4 -14
- package/src/resources/extensions/gsd/worktree-root.ts +144 -0
- package/src/resources/extensions/gsd/worktree-session-state.ts +35 -0
- package/src/resources/extensions/gsd/worktree.ts +8 -119
- package/src/resources/extensions/mcp-client/index.ts +6 -3
- package/src/resources/extensions/mcp-client/tests/global-config.test.ts +91 -0
- package/src/resources/extensions/ollama/index.ts +16 -2
- package/src/resources/extensions/ollama/model-capabilities.ts +34 -0
- package/src/resources/extensions/ollama/ollama-client.ts +41 -4
- package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +96 -0
- package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +147 -0
- package/src/resources/extensions/slash-commands/create-extension.ts +38 -24
- package/src/resources/extensions/subagent/index.ts +165 -7
- package/src/resources/skills/create-gsd-extension/SKILL.md +9 -5
- package/src/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
- package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
- package/src/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
- package/src/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
- package/src/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
- package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
- package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
- package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +2 -2
- package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +3 -3
- package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +58 -0
- package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +32 -12
- package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +0 -601
- package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +0 -651
- package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +0 -91
- package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +0 -53
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +0 -112
- package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +0 -23
- package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +0 -5
- package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
- package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +0 -608
- package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +0 -11
- package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +0 -20
- package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-2e68521d7c82f7c2.js +0 -1
- package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +0 -22
- package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +0 -47
- package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +0 -75
- /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → -Ukk6_YxRd4GY4iUOnRUE}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → -Ukk6_YxRd4GY4iUOnRUE}/_ssgManifest.js +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { AuthStorage, DefaultResourceLoader, ModelRegistry, runPackageCommand, SettingsManager, SessionManager, createAgentSession, InteractiveMode, runPrintMode, runRpcMode, } from '@gsd/pi-coding-agent';
|
|
2
1
|
import { readFileSync } from 'node:fs';
|
|
3
2
|
import { join } from 'node:path';
|
|
4
3
|
import { agentDir, sessionsDir, authFilePath } from './app-paths.js';
|
|
@@ -9,6 +8,7 @@ import { migratePiCredentials } from './pi-migration.js';
|
|
|
9
8
|
import { shouldRunOnboarding, runOnboarding } from './onboarding.js';
|
|
10
9
|
import chalk from 'chalk';
|
|
11
10
|
import { checkForUpdates } from './update-check.js';
|
|
11
|
+
import { shouldBypassManagedResourceMismatchGate } from './cli-policy.js';
|
|
12
12
|
import { printHelp, printSubcommandHelp } from './help-text.js';
|
|
13
13
|
import { applySecurityOverrides } from './security-overrides.js';
|
|
14
14
|
import { validateConfiguredModel } from './startup-model-validation.js';
|
|
@@ -17,8 +17,11 @@ import { buildHeadlessAutoArgs, parseCliArgs, runWebCliBranch, migrateLegacyFlat
|
|
|
17
17
|
import { stopWebMode } from './web-mode.js';
|
|
18
18
|
import { getProjectSessionsDir } from './project-sessions.js';
|
|
19
19
|
import { markStartup, printStartupTimings } from './startup-timings.js';
|
|
20
|
-
import {
|
|
21
|
-
|
|
20
|
+
import { applyRtkProcessEnv, GSD_RTK_DISABLED_ENV, isTruthy } from './rtk-shared.js';
|
|
21
|
+
let piCodingAgentModulePromise;
|
|
22
|
+
function loadPiCodingAgentModule() {
|
|
23
|
+
return (piCodingAgentModulePromise ??= import('@gsd/pi-coding-agent'));
|
|
24
|
+
}
|
|
22
25
|
// ---------------------------------------------------------------------------
|
|
23
26
|
// V8 compile cache — Node 22+ can cache compiled bytecode across runs,
|
|
24
27
|
// eliminating repeated parse/compile overhead for unchanged modules.
|
|
@@ -129,27 +132,53 @@ if (process.argv.includes('--help') || process.argv.includes('-h')) {
|
|
|
129
132
|
// so concurrent callers await the same initialization.
|
|
130
133
|
let rtkBootstrapPromise;
|
|
131
134
|
async function doRtkBootstrap() {
|
|
135
|
+
let rtkStatus;
|
|
136
|
+
let rtkDisabled = isTruthy(process.env[GSD_RTK_DISABLED_ENV]);
|
|
132
137
|
// RTK is opt-in via experimental.rtk preference. Default: disabled.
|
|
133
138
|
// Honor GSD_RTK_DISABLED if already explicitly set in the environment
|
|
134
139
|
// (env var takes precedence over preferences for manual override).
|
|
135
|
-
if (!
|
|
140
|
+
if (!rtkDisabled) {
|
|
141
|
+
const { loadEffectiveGSDPreferences } = await import('./resources/extensions/gsd/preferences.js');
|
|
136
142
|
const prefs = loadEffectiveGSDPreferences();
|
|
137
143
|
const rtkEnabled = prefs?.preferences.experimental?.rtk === true;
|
|
138
144
|
if (!rtkEnabled) {
|
|
139
145
|
process.env[GSD_RTK_DISABLED_ENV] = '1';
|
|
146
|
+
rtkDisabled = true;
|
|
140
147
|
}
|
|
141
148
|
}
|
|
142
|
-
|
|
149
|
+
markStartup('rtkPreferenceCheck');
|
|
150
|
+
if (rtkDisabled) {
|
|
151
|
+
applyRtkProcessEnv(process.env);
|
|
152
|
+
rtkStatus = {
|
|
153
|
+
enabled: false,
|
|
154
|
+
supported: true,
|
|
155
|
+
available: false,
|
|
156
|
+
source: 'disabled',
|
|
157
|
+
reason: `${GSD_RTK_DISABLED_ENV} is set`,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
const { bootstrapRtk } = await import('./rtk.js');
|
|
162
|
+
rtkStatus = await bootstrapRtk();
|
|
163
|
+
}
|
|
143
164
|
markStartup('bootstrapRtk');
|
|
144
165
|
if (!rtkStatus.available && rtkStatus.supported && rtkStatus.enabled && rtkStatus.reason) {
|
|
145
166
|
process.stderr.write(`[gsd] Warning: RTK unavailable — continuing without shell-command compression (${rtkStatus.reason}).\n`);
|
|
146
167
|
}
|
|
147
168
|
}
|
|
148
169
|
function ensureRtkBootstrap() {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
170
|
+
if (!rtkBootstrapPromise) {
|
|
171
|
+
markStartup('preRtkBootstrap');
|
|
172
|
+
rtkBootstrapPromise = doRtkBootstrap();
|
|
173
|
+
}
|
|
174
|
+
return rtkBootstrapPromise;
|
|
175
|
+
}
|
|
176
|
+
// `gsd update` — update to the latest version via npm.
|
|
177
|
+
// MUST run before exitIfManagedResourcesAreNewer(): when the bundled resource
|
|
178
|
+
// manifest is from a newer version than the running binary, every other
|
|
179
|
+
// command is blocked — only `update` should bypass the gate so the user can
|
|
180
|
+
// actually upgrade out of the broken state. See shouldBypassManagedResourceMismatchGate.
|
|
181
|
+
if (shouldBypassManagedResourceMismatchGate(cliFlags.messages[0])) {
|
|
153
182
|
const { runUpdate } = await import('./update-cmd.js');
|
|
154
183
|
await runUpdate();
|
|
155
184
|
process.exit(0);
|
|
@@ -246,20 +275,25 @@ const hasSubcommand = cliFlags.messages.length > 0;
|
|
|
246
275
|
if (!process.stdin.isTTY && !isPrintMode && !hasSubcommand && !cliFlags.listModels && !cliFlags.web) {
|
|
247
276
|
printNonTtyErrorAndExit(undefined, false);
|
|
248
277
|
}
|
|
249
|
-
const
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
278
|
+
const packageCommandNames = new Set(['install', 'remove', 'list']);
|
|
279
|
+
if (packageCommandNames.has(cliFlags.messages[0])) {
|
|
280
|
+
const { runPackageCommand } = await loadPiCodingAgentModule();
|
|
281
|
+
const packageCommand = await runPackageCommand({
|
|
282
|
+
appName: 'gsd',
|
|
283
|
+
args: process.argv.slice(2),
|
|
284
|
+
cwd: process.cwd(),
|
|
285
|
+
agentDir,
|
|
286
|
+
stdout: process.stdout,
|
|
287
|
+
stderr: process.stderr,
|
|
288
|
+
allowedCommands: packageCommandNames,
|
|
289
|
+
});
|
|
290
|
+
if (packageCommand.handled) {
|
|
291
|
+
process.exit(packageCommand.exitCode);
|
|
292
|
+
}
|
|
260
293
|
}
|
|
261
294
|
// `gsd config` — replay the setup wizard and exit
|
|
262
295
|
if (cliFlags.messages[0] === 'config') {
|
|
296
|
+
const { AuthStorage } = await loadPiCodingAgentModule();
|
|
263
297
|
const authStorage = AuthStorage.create(authFilePath);
|
|
264
298
|
loadStoredEnvKeys(authStorage);
|
|
265
299
|
await runOnboarding(authStorage);
|
|
@@ -291,6 +325,7 @@ if (cliFlags.web || (cliFlags.messages[0] === 'web' && cliFlags.messages[1] !==
|
|
|
291
325
|
}
|
|
292
326
|
// `gsd sessions` — list past sessions and pick one to resume
|
|
293
327
|
if (cliFlags.messages[0] === 'sessions') {
|
|
328
|
+
const { SessionManager } = await loadPiCodingAgentModule();
|
|
294
329
|
const cwd = process.cwd();
|
|
295
330
|
const safePath = `--${cwd.replace(/^[/\\]/, '').replace(/[/\\:]/g, '-')}--`;
|
|
296
331
|
const projectSessionsDir = join(sessionsDir, safePath);
|
|
@@ -380,6 +415,35 @@ function flushPendingProviderRegistrations(resourceLoader, modelRegistry) {
|
|
|
380
415
|
if (cliFlags.messages[0] === 'auto') {
|
|
381
416
|
await runHeadlessFromAuto(buildHeadlessAutoArgs(cliFlags));
|
|
382
417
|
}
|
|
418
|
+
// ---------------------------------------------------------------------------
|
|
419
|
+
// Worktree subcommand — `gsd worktree <list|merge|clean|remove>`
|
|
420
|
+
// ---------------------------------------------------------------------------
|
|
421
|
+
if (!isPrintMode &&
|
|
422
|
+
cliFlags.listModels === undefined &&
|
|
423
|
+
(cliFlags.messages[0] === 'worktree' || cliFlags.messages[0] === 'wt')) {
|
|
424
|
+
const { handleList, handleMerge, handleClean, handleRemove } = await import('./worktree-cli.js');
|
|
425
|
+
const sub = cliFlags.messages[1];
|
|
426
|
+
const subArgs = cliFlags.messages.slice(2);
|
|
427
|
+
if (!sub || sub === 'list') {
|
|
428
|
+
await handleList(process.cwd());
|
|
429
|
+
}
|
|
430
|
+
else if (sub === 'merge') {
|
|
431
|
+
await handleMerge(process.cwd(), subArgs);
|
|
432
|
+
}
|
|
433
|
+
else if (sub === 'clean') {
|
|
434
|
+
await handleClean(process.cwd());
|
|
435
|
+
}
|
|
436
|
+
else if (sub === 'remove' || sub === 'rm') {
|
|
437
|
+
await handleRemove(process.cwd(), subArgs);
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
process.stderr.write(`Unknown worktree command: ${sub}\n`);
|
|
441
|
+
process.stderr.write('Commands: list, merge [name], clean, remove <name>\n');
|
|
442
|
+
}
|
|
443
|
+
process.exit(0);
|
|
444
|
+
}
|
|
445
|
+
const { AuthStorage, DefaultResourceLoader, ModelRegistry, SettingsManager, SessionManager, createAgentSession, InteractiveMode, runPrintMode, runRpcMode, } = await loadPiCodingAgentModule();
|
|
446
|
+
markStartup('loadPiCodingAgent');
|
|
383
447
|
// Pi's tool bootstrap can mis-detect already-installed fd/rg on some systems
|
|
384
448
|
// because spawnSync(..., ["--version"]) returns EPERM despite a zero exit code.
|
|
385
449
|
// Provision local managed binaries first so Pi sees them without probing PATH.
|
|
@@ -431,11 +495,7 @@ if (cliFlags.listModels !== undefined) {
|
|
|
431
495
|
additionalExtensionPaths: cliFlags.extensions.length > 0 ? cliFlags.extensions : undefined,
|
|
432
496
|
});
|
|
433
497
|
await listModelsLoader.reload();
|
|
434
|
-
|
|
435
|
-
for (const { name, config } of listModelsExtensions.runtime.pendingProviderRegistrations) {
|
|
436
|
-
modelRegistry.registerProvider(name, config);
|
|
437
|
-
}
|
|
438
|
-
listModelsExtensions.runtime.pendingProviderRegistrations = [];
|
|
498
|
+
flushPendingProviderRegistrations(listModelsLoader, modelRegistry);
|
|
439
499
|
const models = modelRegistry.getAvailable();
|
|
440
500
|
if (models.length === 0) {
|
|
441
501
|
console.log('No models available. Set API keys in environment variables.');
|
|
@@ -483,6 +543,7 @@ if (!settingsManager.getQuietStartup()) {
|
|
|
483
543
|
if (!settingsManager.getCollapseChangelog()) {
|
|
484
544
|
settingsManager.setCollapseChangelog(true);
|
|
485
545
|
}
|
|
546
|
+
markStartup('startupSettings');
|
|
486
547
|
// ---------------------------------------------------------------------------
|
|
487
548
|
// Print / subagent mode — single-shot execution, no TTY required
|
|
488
549
|
// ---------------------------------------------------------------------------
|
|
@@ -515,7 +576,7 @@ if (isPrintMode) {
|
|
|
515
576
|
flushPendingProviderRegistrations(resourceLoader, modelRegistry);
|
|
516
577
|
migrateAnthropicDefaultToClaudeCode({
|
|
517
578
|
authStorage,
|
|
518
|
-
isClaudeCodeReady: modelRegistry.isProviderRequestReady('claude-code'),
|
|
579
|
+
isClaudeCodeReady: () => modelRegistry.isProviderRequestReady('claude-code'),
|
|
519
580
|
settingsManager,
|
|
520
581
|
modelRegistry,
|
|
521
582
|
});
|
|
@@ -577,31 +638,6 @@ if (isPrintMode) {
|
|
|
577
638
|
process.exit(0);
|
|
578
639
|
}
|
|
579
640
|
// ---------------------------------------------------------------------------
|
|
580
|
-
// Worktree subcommand — `gsd worktree <list|merge|clean|remove>`
|
|
581
|
-
// ---------------------------------------------------------------------------
|
|
582
|
-
if (cliFlags.messages[0] === 'worktree' || cliFlags.messages[0] === 'wt') {
|
|
583
|
-
const { handleList, handleMerge, handleClean, handleRemove } = await import('./worktree-cli.js');
|
|
584
|
-
const sub = cliFlags.messages[1];
|
|
585
|
-
const subArgs = cliFlags.messages.slice(2);
|
|
586
|
-
if (!sub || sub === 'list') {
|
|
587
|
-
await handleList(process.cwd());
|
|
588
|
-
}
|
|
589
|
-
else if (sub === 'merge') {
|
|
590
|
-
await handleMerge(process.cwd(), subArgs);
|
|
591
|
-
}
|
|
592
|
-
else if (sub === 'clean') {
|
|
593
|
-
await handleClean(process.cwd());
|
|
594
|
-
}
|
|
595
|
-
else if (sub === 'remove' || sub === 'rm') {
|
|
596
|
-
await handleRemove(process.cwd(), subArgs);
|
|
597
|
-
}
|
|
598
|
-
else {
|
|
599
|
-
process.stderr.write(`Unknown worktree command: ${sub}\n`);
|
|
600
|
-
process.stderr.write('Commands: list, merge [name], clean, remove <name>\n');
|
|
601
|
-
}
|
|
602
|
-
process.exit(0);
|
|
603
|
-
}
|
|
604
|
-
// ---------------------------------------------------------------------------
|
|
605
641
|
// Worktree flag (-w) — create/resume a worktree for the interactive session
|
|
606
642
|
// ---------------------------------------------------------------------------
|
|
607
643
|
if (cliFlags.worktree) {
|
|
@@ -613,11 +649,12 @@ if (cliFlags.worktree) {
|
|
|
613
649
|
// ---------------------------------------------------------------------------
|
|
614
650
|
if (!cliFlags.worktree && !isPrintMode) {
|
|
615
651
|
try {
|
|
616
|
-
const {
|
|
617
|
-
|
|
652
|
+
const { showWorktreeStatusBanner } = await import('./worktree-status-banner.js');
|
|
653
|
+
showWorktreeStatusBanner(process.cwd());
|
|
618
654
|
}
|
|
619
655
|
catch { /* non-fatal */ }
|
|
620
656
|
}
|
|
657
|
+
markStartup('worktreeStatusBanner');
|
|
621
658
|
// ---------------------------------------------------------------------------
|
|
622
659
|
// Auto-redirect: `gsd auto` with piped stdout → headless mode (#2732)
|
|
623
660
|
// When stdout is not a TTY (e.g. `gsd auto | cat`, `gsd auto > file`),
|
|
@@ -651,7 +688,9 @@ markStartup('initResources');
|
|
|
651
688
|
// Overlap resource loading with session manager setup — both are independent.
|
|
652
689
|
// resourceLoader.reload() is the most expensive step (jiti compilation), so
|
|
653
690
|
// starting it early shaves ~50-200ms off interactive startup.
|
|
654
|
-
const resourceLoader = buildResourceLoader(agentDir
|
|
691
|
+
const resourceLoader = await buildResourceLoader(agentDir, {
|
|
692
|
+
additionalExtensionPaths: cliFlags.extensions.length > 0 ? cliFlags.extensions : undefined,
|
|
693
|
+
});
|
|
655
694
|
const resourceLoadPromise = resourceLoader.reload();
|
|
656
695
|
// While resources load, let session manager finish any async I/O it needs.
|
|
657
696
|
// Then await the resource promise before creating the agent session.
|
|
@@ -660,10 +699,11 @@ markStartup('resourceLoader.reload');
|
|
|
660
699
|
flushPendingProviderRegistrations(resourceLoader, modelRegistry);
|
|
661
700
|
migrateAnthropicDefaultToClaudeCode({
|
|
662
701
|
authStorage,
|
|
663
|
-
isClaudeCodeReady: modelRegistry.isProviderRequestReady('claude-code'),
|
|
702
|
+
isClaudeCodeReady: () => modelRegistry.isProviderRequestReady('claude-code'),
|
|
664
703
|
settingsManager,
|
|
665
704
|
modelRegistry,
|
|
666
705
|
});
|
|
706
|
+
markStartup('providerMigrations');
|
|
667
707
|
const { session, extensionsResult, modelFallbackMessage: interactiveFallbackMsg } = await createAgentSession({
|
|
668
708
|
authStorage,
|
|
669
709
|
modelRegistry,
|
package/dist/headless-query.d.ts
CHANGED
|
@@ -14,6 +14,28 @@
|
|
|
14
14
|
* bypassing the extension loader's jiti setup (#1137).
|
|
15
15
|
*/
|
|
16
16
|
import type { GSDState } from './resources/extensions/gsd/types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Resolve the GSD extensions root for headless-query. Prefers the synced
|
|
19
|
+
* agent directory (so headless-query loads the same extension copy as
|
|
20
|
+
* interactive/auto modes — #3471) and falls back to the bundled source
|
|
21
|
+
* resource for source-tree dev workflows.
|
|
22
|
+
*
|
|
23
|
+
* Pure on the given inputs (env + fs probe + bundled resolver) so the
|
|
24
|
+
* #3471 contract can be exercised in tests without spawning a subprocess.
|
|
25
|
+
*/
|
|
26
|
+
export declare function resolveGsdAgentExtensionsDir(env?: NodeJS.ProcessEnv): string;
|
|
27
|
+
/**
|
|
28
|
+
* Decide whether headless-query should load extensions from the agent
|
|
29
|
+
* sync directory (#3471) or fall back to bundled source. Returns the
|
|
30
|
+
* agent dir alongside the decision so a caller can use it directly.
|
|
31
|
+
*/
|
|
32
|
+
export declare function shouldUseAgentExtensionsDir(opts: {
|
|
33
|
+
env?: NodeJS.ProcessEnv;
|
|
34
|
+
fileExists?: (path: string) => boolean;
|
|
35
|
+
}): {
|
|
36
|
+
agentDir: string;
|
|
37
|
+
useAgentDir: boolean;
|
|
38
|
+
};
|
|
17
39
|
export interface QuerySnapshot {
|
|
18
40
|
state: GSDState;
|
|
19
41
|
next: {
|
package/dist/headless-query.js
CHANGED
|
@@ -17,17 +17,52 @@ import { createJiti } from '@mariozechner/jiti';
|
|
|
17
17
|
import { fileURLToPath } from 'node:url';
|
|
18
18
|
import { join } from 'node:path';
|
|
19
19
|
import { homedir } from 'node:os';
|
|
20
|
-
import {
|
|
20
|
+
import { resolveBundledGsdExtensionModule } from './bundled-resource-path.js';
|
|
21
21
|
const jiti = createJiti(fileURLToPath(import.meta.url), { interopDefault: true, debug: false });
|
|
22
|
-
// Resolve extensions from the synced agent directory so headless-query
|
|
23
|
-
// loads the same extension copy as interactive/auto modes (#3471).
|
|
24
|
-
// Falls back to bundled source for source-tree dev workflows.
|
|
25
|
-
const agentExtensionsDir = join(process.env.GSD_AGENT_DIR || join(homedir(), '.gsd', 'agent'), 'extensions', 'gsd');
|
|
26
22
|
const { existsSync } = await import('node:fs');
|
|
27
|
-
|
|
23
|
+
/**
|
|
24
|
+
* Resolve the GSD extensions root for headless-query. Prefers the synced
|
|
25
|
+
* agent directory (so headless-query loads the same extension copy as
|
|
26
|
+
* interactive/auto modes — #3471) and falls back to the bundled source
|
|
27
|
+
* resource for source-tree dev workflows.
|
|
28
|
+
*
|
|
29
|
+
* Pure on the given inputs (env + fs probe + bundled resolver) so the
|
|
30
|
+
* #3471 contract can be exercised in tests without spawning a subprocess.
|
|
31
|
+
*/
|
|
32
|
+
export function resolveGsdAgentExtensionsDir(env = process.env) {
|
|
33
|
+
const agentRoot = env.GSD_AGENT_DIR || join(env.GSD_HOME || join(homedir(), '.gsd'), 'agent');
|
|
34
|
+
return join(agentRoot, 'extensions', 'gsd');
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Decide whether headless-query should load extensions from the agent
|
|
38
|
+
* sync directory (#3471) or fall back to bundled source. Returns the
|
|
39
|
+
* agent dir alongside the decision so a caller can use it directly.
|
|
40
|
+
*/
|
|
41
|
+
export function shouldUseAgentExtensionsDir(opts) {
|
|
42
|
+
const env = opts.env ?? process.env;
|
|
43
|
+
const fileExists = opts.fileExists ?? existsSync;
|
|
44
|
+
const agentDir = resolveGsdAgentExtensionsDir(env);
|
|
45
|
+
return {
|
|
46
|
+
agentDir,
|
|
47
|
+
useAgentDir: fileExists(join(agentDir, 'state.ts')) || fileExists(join(agentDir, 'state.js')),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const agentExtensionsDir = resolveGsdAgentExtensionsDir();
|
|
51
|
+
const { useAgentDir } = shouldUseAgentExtensionsDir({ env: process.env });
|
|
28
52
|
const gsdExtensionPath = (...segments) => useAgentDir
|
|
29
|
-
?
|
|
30
|
-
:
|
|
53
|
+
? resolveAgentExtensionModule(agentExtensionsDir, segments)
|
|
54
|
+
: resolveBundledGsdExtensionModule(import.meta.url, segments.join('/'));
|
|
55
|
+
function resolveAgentExtensionModule(agentDir, segments) {
|
|
56
|
+
const requested = join(agentDir, ...segments);
|
|
57
|
+
if (existsSync(requested))
|
|
58
|
+
return requested;
|
|
59
|
+
if (segments.length === 1 && segments[0].endsWith('.ts')) {
|
|
60
|
+
const jsPath = join(agentDir, segments[0].replace(/\.ts$/, '.js'));
|
|
61
|
+
if (existsSync(jsPath))
|
|
62
|
+
return jsPath;
|
|
63
|
+
}
|
|
64
|
+
return requested;
|
|
65
|
+
}
|
|
31
66
|
async function loadExtensionModules() {
|
|
32
67
|
const stateModule = await jiti.import(gsdExtensionPath('state.ts'), {});
|
|
33
68
|
const dispatchModule = await jiti.import(gsdExtensionPath('auto-dispatch.ts'), {});
|
package/dist/headless.d.ts
CHANGED
|
@@ -32,6 +32,16 @@ export interface HeadlessOptions {
|
|
|
32
32
|
resumeSession?: string;
|
|
33
33
|
bare?: boolean;
|
|
34
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Commands classified as multi-turn in headless mode: they involve multiple
|
|
37
|
+
* question rounds, codebase scanning, and artifact writing before the workflow
|
|
38
|
+
* completes (#3547). Multi-turn commands suppress single-execution-complete
|
|
39
|
+
* exit and disable the default 5-minute timeout.
|
|
40
|
+
*
|
|
41
|
+
* Exported so the regression test can exercise the real classifier rather
|
|
42
|
+
* than grepping the source for identifier names.
|
|
43
|
+
*/
|
|
44
|
+
export declare function isMultiTurnHeadlessCommand(command: string): boolean;
|
|
35
45
|
export interface ResumeSessionResult {
|
|
36
46
|
session?: SessionInfo;
|
|
37
47
|
error?: string;
|
package/dist/headless.js
CHANGED
|
@@ -21,6 +21,21 @@ import { isTerminalNotification, isBlockedNotification, isMilestoneReadyNotifica
|
|
|
21
21
|
import { VALID_OUTPUT_FORMATS } from './headless-types.js';
|
|
22
22
|
import { handleExtensionUIRequest, formatProgress, formatThinkingLine, formatTextStart, formatTextEnd, formatThinkingStart, formatThinkingEnd, startSupervisedStdinReader, } from './headless-ui.js';
|
|
23
23
|
import { loadContext, bootstrapGsdProject, } from './headless-context.js';
|
|
24
|
+
/**
|
|
25
|
+
* Commands classified as multi-turn in headless mode: they involve multiple
|
|
26
|
+
* question rounds, codebase scanning, and artifact writing before the workflow
|
|
27
|
+
* completes (#3547). Multi-turn commands suppress single-execution-complete
|
|
28
|
+
* exit and disable the default 5-minute timeout.
|
|
29
|
+
*
|
|
30
|
+
* Exported so the regression test can exercise the real classifier rather
|
|
31
|
+
* than grepping the source for identifier names.
|
|
32
|
+
*/
|
|
33
|
+
export function isMultiTurnHeadlessCommand(command) {
|
|
34
|
+
return (command === 'auto' ||
|
|
35
|
+
command === 'next' ||
|
|
36
|
+
command === 'discuss' ||
|
|
37
|
+
command === 'plan');
|
|
38
|
+
}
|
|
24
39
|
/**
|
|
25
40
|
* Resolve a session prefix to a single session.
|
|
26
41
|
* Exact id match is preferred over prefix match.
|
|
@@ -186,7 +201,7 @@ async function runHeadlessOnce(options, restartCount) {
|
|
|
186
201
|
const isAutoMode = options.command === 'auto';
|
|
187
202
|
// discuss and plan are multi-turn: they involve multiple question rounds,
|
|
188
203
|
// codebase scanning, and artifact writing before the workflow completes (#3547).
|
|
189
|
-
const isMultiTurnCommand = options.command
|
|
204
|
+
const isMultiTurnCommand = isMultiTurnHeadlessCommand(options.command);
|
|
190
205
|
if (isAutoMode && options.timeout === 300_000) {
|
|
191
206
|
options.timeout = 0;
|
|
192
207
|
}
|
package/dist/loader.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// GSD Startup Loader
|
|
3
|
-
// Copyright (c) 2026 Jeremy McSpadden <jeremy@fluxlabs.net>
|
|
4
3
|
import { fileURLToPath } from 'url';
|
|
5
4
|
import { dirname, resolve, join, relative, delimiter } from 'path';
|
|
6
5
|
import { existsSync, readFileSync, readdirSync, statSync, mkdirSync, symlinkSync, cpSync } from 'fs';
|
|
@@ -32,14 +31,14 @@ if (firstArg === '--help' || firstArg === '-h') {
|
|
|
32
31
|
// package.json (already parsed above) and verifies git is available.
|
|
33
32
|
// ---------------------------------------------------------------------------
|
|
34
33
|
{
|
|
35
|
-
const MIN_NODE_MAJOR =
|
|
34
|
+
const { MIN_NODE_MAJOR, checkNodeVersion, requireGit } = await import('./runtime-checks.js');
|
|
36
35
|
const red = '\x1b[31m';
|
|
37
36
|
const bold = '\x1b[1m';
|
|
38
37
|
const dim = '\x1b[2m';
|
|
39
38
|
const reset = '\x1b[0m';
|
|
40
39
|
// -- Node version --
|
|
41
|
-
const
|
|
42
|
-
if (
|
|
40
|
+
const nodeCheck = checkNodeVersion(process.versions.node, MIN_NODE_MAJOR);
|
|
41
|
+
if (!nodeCheck.ok) {
|
|
43
42
|
process.stderr.write(`\n${red}${bold}Error:${reset} GSD requires Node.js >= ${MIN_NODE_MAJOR}.0.0\n` +
|
|
44
43
|
` You are running Node.js ${process.versions.node}\n\n` +
|
|
45
44
|
`${dim}Install a supported version:${reset}\n` +
|
|
@@ -49,11 +48,9 @@ if (firstArg === '--help' || firstArg === '-h') {
|
|
|
49
48
|
process.exit(1);
|
|
50
49
|
}
|
|
51
50
|
// -- git --
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
51
|
+
const { execFileSync } = await import('child_process');
|
|
52
|
+
const gitOk = requireGit((cmd, args) => execFileSync(cmd, args, { stdio: 'ignore' }));
|
|
53
|
+
if (!gitOk) {
|
|
57
54
|
process.stderr.write(`\n${red}${bold}Error:${reset} GSD requires git but it was not found on PATH.\n\n` +
|
|
58
55
|
`${dim}Install git:${reset}\n` +
|
|
59
56
|
` https://git-scm.com/downloads\n\n`);
|
|
@@ -61,8 +58,9 @@ if (firstArg === '--help' || firstArg === '-h') {
|
|
|
61
58
|
}
|
|
62
59
|
}
|
|
63
60
|
import { agentDir, appRoot } from './app-paths.js';
|
|
64
|
-
import { applyRtkProcessEnv } from './rtk.js';
|
|
61
|
+
import { applyRtkProcessEnv } from './rtk-shared.js';
|
|
65
62
|
import { serializeBundledExtensionPaths } from './bundled-extension-paths.js';
|
|
63
|
+
import { resolveBundledResourcesDirFromPackageRoot } from './bundled-resource-path.js';
|
|
66
64
|
import { discoverExtensionEntryPaths } from './extension-discovery.js';
|
|
67
65
|
import { loadRegistry, readManifestFromEntryPath, isExtensionEnabled } from './extension-registry.js';
|
|
68
66
|
import { renderLogo } from './logo.js';
|
|
@@ -121,9 +119,7 @@ process.env.GSD_BIN_PATH = process.argv[1];
|
|
|
121
119
|
// GSD_WORKFLOW_PATH — absolute path to bundled GSD-WORKFLOW.md, used by patched gsd extension
|
|
122
120
|
// when dispatching workflow prompts. Prefers dist/resources/ (stable, set at build time)
|
|
123
121
|
// over src/resources/ (live working tree) — see resource-loader.ts for rationale.
|
|
124
|
-
const
|
|
125
|
-
const srcRes = join(gsdRoot, 'src', 'resources');
|
|
126
|
-
const resourcesDir = existsSync(distRes) ? distRes : srcRes;
|
|
122
|
+
const resourcesDir = resolveBundledResourcesDirFromPackageRoot(gsdRoot);
|
|
127
123
|
process.env.GSD_WORKFLOW_PATH = join(resourcesDir, 'GSD-WORKFLOW.md');
|
|
128
124
|
// GSD_BUNDLED_EXTENSION_PATHS — dynamically discovered bundled extension entry points.
|
|
129
125
|
// Uses the shared discoverExtensionEntryPaths() to scan the bundled resources
|
package/dist/onboarding.d.ts
CHANGED
|
@@ -24,6 +24,16 @@ interface RunOnboardingOptions {
|
|
|
24
24
|
/** Show logo + intro banner. Disable when onboarding is launched inside an active TUI session. */
|
|
25
25
|
showIntro?: boolean;
|
|
26
26
|
}
|
|
27
|
+
export declare const OTHER_PROVIDERS: ({
|
|
28
|
+
value: string;
|
|
29
|
+
label: string;
|
|
30
|
+
hint: string;
|
|
31
|
+
} | {
|
|
32
|
+
value: string;
|
|
33
|
+
label: string;
|
|
34
|
+
hint?: undefined;
|
|
35
|
+
})[];
|
|
36
|
+
export declare function detectNativeProviderFromBaseUrl(baseUrl: string): 'minimax' | 'minimax-cn' | null;
|
|
27
37
|
/**
|
|
28
38
|
* Determine if the onboarding wizard should run.
|
|
29
39
|
*
|
package/dist/onboarding.js
CHANGED
|
@@ -54,7 +54,7 @@ const API_KEY_PREFIXES = {
|
|
|
54
54
|
anthropic: ['sk-ant-'],
|
|
55
55
|
openai: ['sk-'],
|
|
56
56
|
};
|
|
57
|
-
const OTHER_PROVIDERS = [
|
|
57
|
+
export const OTHER_PROVIDERS = [
|
|
58
58
|
{ value: 'google', label: 'Google (Gemini)', hint: 'aistudio.google.com/app/apikey' },
|
|
59
59
|
{ value: 'groq', label: 'Groq', hint: 'console.groq.com/keys' },
|
|
60
60
|
{ value: 'xai', label: 'xAI (Grok)', hint: 'console.x.ai' },
|
|
@@ -148,7 +148,7 @@ function persistDefaultModel(modelId) {
|
|
|
148
148
|
// Non-fatal: startup fallback logic will still run.
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
|
-
function detectNativeProviderFromBaseUrl(baseUrl) {
|
|
151
|
+
export function detectNativeProviderFromBaseUrl(baseUrl) {
|
|
152
152
|
try {
|
|
153
153
|
const hostname = new URL(baseUrl).hostname.toLowerCase();
|
|
154
154
|
if (hostname === 'api.minimax.io' || hostname.endsWith('.minimax.io')) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AuthStorage } from "@gsd/pi-coding-agent";
|
|
2
2
|
type AnthropicMigrationDeps = {
|
|
3
3
|
authStorage: Pick<AuthStorage, "getCredentialsForProvider">;
|
|
4
|
-
isClaudeCodeReady: boolean;
|
|
4
|
+
isClaudeCodeReady: boolean | (() => boolean);
|
|
5
5
|
defaultProvider: string | undefined;
|
|
6
6
|
env?: NodeJS.ProcessEnv;
|
|
7
7
|
};
|
|
@@ -11,7 +11,7 @@ type MigrationModel = {
|
|
|
11
11
|
};
|
|
12
12
|
type AnthropicDefaultMigrationDeps = {
|
|
13
13
|
authStorage: Pick<AuthStorage, "getCredentialsForProvider">;
|
|
14
|
-
isClaudeCodeReady: boolean;
|
|
14
|
+
isClaudeCodeReady: boolean | (() => boolean);
|
|
15
15
|
settingsManager: {
|
|
16
16
|
getDefaultProvider(): string | undefined;
|
|
17
17
|
getDefaultModel(): string | undefined;
|
|
@@ -5,10 +5,13 @@ export function hasDirectAnthropicApiKey(authStorage, env = process.env) {
|
|
|
5
5
|
return authStorage.getCredentialsForProvider("anthropic").some((credential) => credential?.type === "api_key" && typeof credential?.key === "string" && credential.key.trim().length > 0);
|
|
6
6
|
}
|
|
7
7
|
export function shouldMigrateAnthropicToClaudeCode({ authStorage, isClaudeCodeReady, defaultProvider, env = process.env, }) {
|
|
8
|
-
if (
|
|
8
|
+
if (defaultProvider !== "anthropic") {
|
|
9
9
|
return false;
|
|
10
10
|
}
|
|
11
|
-
|
|
11
|
+
if (hasDirectAnthropicApiKey(authStorage, env)) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
return typeof isClaudeCodeReady === "function" ? isClaudeCodeReady() : isClaudeCodeReady;
|
|
12
15
|
}
|
|
13
16
|
export function migrateAnthropicDefaultToClaudeCode({ authStorage, isClaudeCodeReady, settingsManager, modelRegistry, env = process.env, }) {
|
|
14
17
|
const defaultProvider = settingsManager.getDefaultProvider();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DefaultResourceLoader } from '@gsd/pi-coding-agent';
|
|
1
|
+
import type { DefaultResourceLoader as DefaultResourceLoaderType } from '@gsd/pi-coding-agent';
|
|
2
2
|
export { discoverExtensionEntryPaths } from './extension-discovery.js';
|
|
3
3
|
export declare function getExtensionKey(entryPath: string, extensionsDir: string): string;
|
|
4
4
|
export declare function readManagedResourceVersion(agentDir: string): string | null;
|
|
@@ -63,4 +63,7 @@ export declare function mergedFingerprint(hoisted: string, internal: string): st
|
|
|
63
63
|
*/
|
|
64
64
|
export declare function initResources(agentDir: string, skillsDir?: string): void;
|
|
65
65
|
export declare function hasStaleCompiledExtensionSiblings(extensionsDir: string, sourceDir?: string): boolean;
|
|
66
|
-
|
|
66
|
+
interface BuildResourceLoaderOptions {
|
|
67
|
+
additionalExtensionPaths?: string[];
|
|
68
|
+
}
|
|
69
|
+
export declare function buildResourceLoader(agentDir: string, options?: BuildResourceLoaderOptions): Promise<DefaultResourceLoaderType>;
|
package/dist/resource-loader.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { DefaultResourceLoader, sortExtensionPaths } from '@gsd/pi-coding-agent';
|
|
2
1
|
import { createHash } from 'node:crypto';
|
|
3
2
|
import { homedir } from 'node:os';
|
|
4
3
|
import { chmodSync, copyFileSync, cpSync, existsSync, lstatSync, mkdirSync, openSync, closeSync, readFileSync, readlinkSync, readdirSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
@@ -7,6 +6,11 @@ import { fileURLToPath } from 'node:url';
|
|
|
7
6
|
import { compareSemver } from './update-check.js';
|
|
8
7
|
import { discoverExtensionEntryPaths } from './extension-discovery.js';
|
|
9
8
|
import { loadRegistry, readManifestFromEntryPath, isExtensionEnabled, ensureRegistryEntries } from './extension-registry.js';
|
|
9
|
+
import { resolveBundledResourcesDirFromPackageRoot } from './bundled-resource-path.js';
|
|
10
|
+
let piCodingAgentModulePromise;
|
|
11
|
+
function loadPiCodingAgentModule() {
|
|
12
|
+
return (piCodingAgentModulePromise ??= import('@gsd/pi-coding-agent'));
|
|
13
|
+
}
|
|
10
14
|
// Resolve resources directory — prefer dist/resources/ (stable, set at build time)
|
|
11
15
|
// over src/resources/ (live working tree, changes with git branch).
|
|
12
16
|
//
|
|
@@ -16,16 +20,10 @@ import { loadRegistry, readManifestFromEntryPath, isExtensionEnabled, ensureRegi
|
|
|
16
20
|
// dist/resources/ is populated by the build step (`npm run copy-resources`) and
|
|
17
21
|
// reflects the built state, not the currently checked-out branch.
|
|
18
22
|
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
19
|
-
const
|
|
20
|
-
const srcResources = join(packageRoot, 'src', 'resources');
|
|
21
|
-
// Use dist/resources only if it has the full expected structure.
|
|
22
|
-
// A partial build (tsc without copy-resources) creates dist/resources/extensions/
|
|
23
|
-
// but not agents/ or skills/, causing initResources to sync from an incomplete source.
|
|
24
|
-
const resourcesDir = (existsSync(distResources) && existsSync(join(distResources, 'agents')))
|
|
25
|
-
? distResources
|
|
26
|
-
: srcResources;
|
|
23
|
+
const resourcesDir = resolveBundledResourcesDirFromPackageRoot(packageRoot);
|
|
27
24
|
const bundledExtensionsDir = join(resourcesDir, 'extensions');
|
|
28
25
|
const resourceVersionManifestName = 'managed-resources.json';
|
|
26
|
+
const resourceFingerprintFileName = '.managed-resources-content-hash';
|
|
29
27
|
export { discoverExtensionEntryPaths } from './extension-discovery.js';
|
|
30
28
|
export function getExtensionKey(entryPath, extensionsDir) {
|
|
31
29
|
const relPath = relative(extensionsDir, entryPath);
|
|
@@ -77,7 +75,7 @@ function writeManagedResourceManifest(agentDir) {
|
|
|
77
75
|
const manifest = {
|
|
78
76
|
gsdVersion: getBundledGsdVersion(),
|
|
79
77
|
syncedAt: Date.now(),
|
|
80
|
-
contentHash:
|
|
78
|
+
contentHash: getCurrentResourceFingerprint(),
|
|
81
79
|
installedExtensionRootFiles,
|
|
82
80
|
installedExtensionDirs,
|
|
83
81
|
};
|
|
@@ -125,10 +123,24 @@ export function computeResourceFingerprint(rootDir = resourcesDir) {
|
|
|
125
123
|
entries.sort();
|
|
126
124
|
return createHash('sha256').update(entries.join('\n')).digest('hex').slice(0, 16);
|
|
127
125
|
}
|
|
126
|
+
function getCurrentResourceFingerprint() {
|
|
127
|
+
try {
|
|
128
|
+
const precomputed = readFileSync(join(resourcesDir, resourceFingerprintFileName), 'utf-8').trim();
|
|
129
|
+
if (/^[a-f0-9]{16}$/i.test(precomputed)) {
|
|
130
|
+
return precomputed;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// Source-tree and partial-build workflows may not have a precomputed hash.
|
|
135
|
+
}
|
|
136
|
+
return computeResourceFingerprint();
|
|
137
|
+
}
|
|
128
138
|
function collectFileEntries(dir, root, out) {
|
|
129
139
|
if (!existsSync(dir))
|
|
130
140
|
return;
|
|
131
141
|
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
142
|
+
if (entry.name === resourceFingerprintFileName)
|
|
143
|
+
continue;
|
|
132
144
|
const fullPath = join(dir, entry.name);
|
|
133
145
|
if (entry.isDirectory()) {
|
|
134
146
|
collectFileEntries(fullPath, root, out);
|
|
@@ -548,7 +560,7 @@ export function initResources(agentDir, skillsDir = join(homedir(), '.agents', '
|
|
|
548
560
|
// hotfixes within a release). The content hash catches those at ~1ms cost.
|
|
549
561
|
if (manifest && manifest.gsdVersion === currentVersion) {
|
|
550
562
|
// Version matches — check content fingerprint for same-version staleness.
|
|
551
|
-
const currentHash =
|
|
563
|
+
const currentHash = getCurrentResourceFingerprint();
|
|
552
564
|
const hasStaleExtensionFiles = hasStaleCompiledExtensionSiblings(extensionsDir, bundledExtensionsDir);
|
|
553
565
|
if (manifest.contentHash && manifest.contentHash === currentHash && !hasStaleExtensionFiles) {
|
|
554
566
|
return;
|
|
@@ -736,7 +748,8 @@ function getBundledExtensionKeys() {
|
|
|
736
748
|
}
|
|
737
749
|
return _bundledExtensionKeys;
|
|
738
750
|
}
|
|
739
|
-
export function buildResourceLoader(agentDir) {
|
|
751
|
+
export async function buildResourceLoader(agentDir, options = {}) {
|
|
752
|
+
const { DefaultResourceLoader, sortExtensionPaths } = await loadPiCodingAgentModule();
|
|
740
753
|
const registry = loadRegistry();
|
|
741
754
|
const piAgentDir = join(homedir(), '.pi', 'agent');
|
|
742
755
|
const piExtensionsDir = join(piAgentDir, 'extensions');
|
|
@@ -749,9 +762,13 @@ export function buildResourceLoader(agentDir) {
|
|
|
749
762
|
return true;
|
|
750
763
|
return isExtensionEnabled(registry, manifest.id);
|
|
751
764
|
});
|
|
765
|
+
const additionalExtensionPaths = [
|
|
766
|
+
...piExtensionPaths,
|
|
767
|
+
...(options.additionalExtensionPaths ?? []),
|
|
768
|
+
];
|
|
752
769
|
return new DefaultResourceLoader({
|
|
753
770
|
agentDir,
|
|
754
|
-
additionalExtensionPaths
|
|
771
|
+
additionalExtensionPaths,
|
|
755
772
|
bundledExtensionKeys: bundledKeys,
|
|
756
773
|
extensionPathsTransform: (paths) => {
|
|
757
774
|
// 1. Filter community extensions through the GSD registry
|