gsd-pi 2.78.0 → 2.78.1-dev.8a893322c
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 +60 -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/google-search/index.js +2 -6
- 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 +112 -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 +45 -8
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +121 -3
- package/dist/resources/extensions/gsd/commands/catalog.js +76 -5
- package/dist/resources/extensions/gsd/commands/handlers/core.js +23 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +8 -0
- 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/commands-worktree.js +309 -0
- 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 -9
- 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 +15 -15
- 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 +15 -15
- 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/welcome-screen.js +27 -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/google-search/index.ts +2 -9
- 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 +121 -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 +50 -8
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +141 -11
- package/src/resources/extensions/gsd/commands/catalog.ts +82 -5
- package/src/resources/extensions/gsd/commands/handlers/core.ts +23 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
- 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/commands-worktree.ts +383 -0
- 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/bundled-skill-triggers.test.ts +50 -27
- package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +58 -0
- package/src/resources/extensions/gsd/tests/commands-worktree-clean.test.ts +48 -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/google-search-stub.test.ts +25 -65
- 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/safety-harness-false-positives.test.ts +34 -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 -10
- 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 → QK8fABiGPmonfTgboN0Y9}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{C1zT2kEfoLhDdbWPWKrXd → QK8fABiGPmonfTgboN0Y9}/_ssgManifest.js +0 -0
|
@@ -11,6 +11,7 @@ import { join, resolve as resolvePath, sep } from "node:path";
|
|
|
11
11
|
import { homedir } from "node:os";
|
|
12
12
|
import { deriveState } from "./state.js";
|
|
13
13
|
import { gsdRoot } from "./paths.js";
|
|
14
|
+
import { getHomeDir } from "./home-dir.js";
|
|
14
15
|
import { appendCapture, hasPendingCaptures, loadPendingCaptures } from "./captures.js";
|
|
15
16
|
import { appendOverride, appendKnowledge } from "./files.js";
|
|
16
17
|
import {
|
|
@@ -68,7 +69,7 @@ async function fetchLatestVersionForCommand(): Promise<string | null> {
|
|
|
68
69
|
}
|
|
69
70
|
|
|
70
71
|
export function dispatchDoctorHeal(pi: ExtensionAPI, scope: string | undefined, reportText: string, structuredIssues: string): void {
|
|
71
|
-
const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(
|
|
72
|
+
const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(getHomeDir(), ".gsd", "agent", "GSD-WORKFLOW.md");
|
|
72
73
|
const workflow = readFileSync(workflowPath, "utf-8");
|
|
73
74
|
const prompt = loadPrompt("doctor-heal", {
|
|
74
75
|
doctorSummary: reportText,
|
|
@@ -255,7 +256,7 @@ export async function handleTriage(ctx: ExtensionCommandContext, pi: ExtensionAP
|
|
|
255
256
|
roadmapContext: roadmapContext || "(no active roadmap)",
|
|
256
257
|
});
|
|
257
258
|
|
|
258
|
-
const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(
|
|
259
|
+
const workflowPath = process.env.GSD_WORKFLOW_PATH ?? join(getHomeDir(), ".gsd", "agent", "GSD-WORKFLOW.md");
|
|
259
260
|
const workflow = readFileSync(workflowPath, "utf-8");
|
|
260
261
|
|
|
261
262
|
pi.sendMessage(
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
14
14
|
|
|
15
15
|
import { existsSync, readFileSync } from "node:fs";
|
|
16
|
+
import { homedir } from "node:os";
|
|
16
17
|
import { join, resolve } from "node:path";
|
|
17
18
|
|
|
18
19
|
import { ensureProjectWorkflowMcpConfig } from "./mcp-project-config.js";
|
|
@@ -69,6 +70,7 @@ function readMcpConfigs(): McpServerRawConfig[] {
|
|
|
69
70
|
const configPaths = [
|
|
70
71
|
join(process.cwd(), ".mcp.json"),
|
|
71
72
|
join(process.cwd(), ".gsd", "mcp.json"),
|
|
73
|
+
join(process.env.GSD_HOME || join(homedir(), ".gsd"), "mcp.json"),
|
|
72
74
|
];
|
|
73
75
|
|
|
74
76
|
for (const configPath of configPaths) {
|
|
@@ -118,7 +120,7 @@ export function formatMcpStatusReport(servers: McpServerStatus[]): string {
|
|
|
118
120
|
return [
|
|
119
121
|
"No MCP servers configured.",
|
|
120
122
|
"",
|
|
121
|
-
"Add servers to .mcp.json or .gsd/mcp.json to enable MCP integrations.",
|
|
123
|
+
"Add servers to .mcp.json, .gsd/mcp.json, or $GSD_HOME/mcp.json (default: ~/.gsd/mcp.json) to enable MCP integrations.",
|
|
122
124
|
"Tip: run /gsd mcp init . to write the local GSD workflow MCP config.",
|
|
123
125
|
"See: https://modelcontextprotocol.io/quickstart",
|
|
124
126
|
].join("\n");
|
|
@@ -1524,6 +1524,18 @@ async function configureAdvanced(ctx: ExtensionCommandContext, prefs: Record<str
|
|
|
1524
1524
|
const tokenCost = await promptBoolean(ctx, "Show token cost in footer", prefs.show_token_cost, false);
|
|
1525
1525
|
if (tokenCost !== undefined) prefs.show_token_cost = tokenCost;
|
|
1526
1526
|
|
|
1527
|
+
const minRequestInterval = await promptInteger(
|
|
1528
|
+
ctx,
|
|
1529
|
+
"Minimum interval between auto-mode LLM requests (ms, 0 to disable)",
|
|
1530
|
+
prefs.min_request_interval_ms,
|
|
1531
|
+
"0",
|
|
1532
|
+
);
|
|
1533
|
+
if (minRequestInterval === "clear") {
|
|
1534
|
+
delete prefs.min_request_interval_ms;
|
|
1535
|
+
} else if (minRequestInterval !== undefined) {
|
|
1536
|
+
prefs.min_request_interval_ms = minRequestInterval;
|
|
1537
|
+
}
|
|
1538
|
+
|
|
1527
1539
|
const widget = await promptEnum(ctx, "Auto-mode widget display", prefs.widget_mode, ["full", "small", "min", "off"], "full");
|
|
1528
1540
|
if (widget !== undefined) prefs.widget_mode = widget;
|
|
1529
1541
|
|
|
@@ -1715,8 +1727,10 @@ export function serializePreferencesToFrontmatter(prefs: Record<string, unknown>
|
|
|
1715
1727
|
"budget_ceiling", "budget_enforcement", "context_pause_threshold",
|
|
1716
1728
|
"notifications", "cmux", "remote_questions", "git",
|
|
1717
1729
|
"stale_commit_threshold_minutes",
|
|
1730
|
+
"min_request_interval_ms",
|
|
1718
1731
|
"post_unit_hooks", "pre_dispatch_hooks",
|
|
1719
|
-
"dynamic_routing", "
|
|
1732
|
+
"dynamic_routing", "disabled_model_providers", "uok", "token_profile",
|
|
1733
|
+
"service_tier", "flat_rate_providers",
|
|
1720
1734
|
"phases", "parallel", "slice_parallel",
|
|
1721
1735
|
"reactive_execution", "gate_evaluation",
|
|
1722
1736
|
"auto_visualize", "auto_report",
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
// GSD-2 — In-TUI handler for /gsd worktree commands (list, merge, clean, remove).
|
|
2
|
+
//
|
|
3
|
+
// Mirrors the CLI subcommands in src/worktree-cli.ts but emits results via
|
|
4
|
+
// ctx.ui.notify() instead of writing colored output to stderr. Reuses the
|
|
5
|
+
// same extension modules (worktree-manager, native-git-bridge, etc.) so the
|
|
6
|
+
// behavior is identical to the CLI surface.
|
|
7
|
+
|
|
8
|
+
import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
9
|
+
import { existsSync } from "node:fs";
|
|
10
|
+
|
|
11
|
+
import { projectRoot } from "./commands/context.js";
|
|
12
|
+
import {
|
|
13
|
+
listWorktrees,
|
|
14
|
+
removeWorktree,
|
|
15
|
+
mergeWorktreeToMain,
|
|
16
|
+
diffWorktreeAll,
|
|
17
|
+
diffWorktreeNumstat,
|
|
18
|
+
worktreeBranchName,
|
|
19
|
+
} from "./worktree-manager.js";
|
|
20
|
+
import {
|
|
21
|
+
nativeHasChanges,
|
|
22
|
+
nativeDetectMainBranch,
|
|
23
|
+
nativeCommitCountBetween,
|
|
24
|
+
} from "./native-git-bridge.js";
|
|
25
|
+
import { inferCommitType } from "./git-service.js";
|
|
26
|
+
import { autoCommitCurrentBranch } from "./worktree.js";
|
|
27
|
+
import { GSDError, GSD_GIT_ERROR } from "./errors.js";
|
|
28
|
+
|
|
29
|
+
// ─── Types ──────────────────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
export interface WorktreeStatus {
|
|
32
|
+
name: string;
|
|
33
|
+
path: string;
|
|
34
|
+
branch: string;
|
|
35
|
+
exists: boolean;
|
|
36
|
+
filesChanged: number;
|
|
37
|
+
linesAdded: number;
|
|
38
|
+
linesRemoved: number;
|
|
39
|
+
uncommitted: boolean;
|
|
40
|
+
commits: number;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// ─── Status helper ─────────────────────────────────────────────────────────
|
|
44
|
+
|
|
45
|
+
function getStatus(basePath: string, name: string, wtPath: string): WorktreeStatus {
|
|
46
|
+
const diff = diffWorktreeAll(basePath, name);
|
|
47
|
+
const numstat = diffWorktreeNumstat(basePath, name);
|
|
48
|
+
const filesChanged = diff.added.length + diff.modified.length + diff.removed.length;
|
|
49
|
+
let linesAdded = 0;
|
|
50
|
+
let linesRemoved = 0;
|
|
51
|
+
for (const s of numstat) {
|
|
52
|
+
linesAdded += s.added;
|
|
53
|
+
linesRemoved += s.removed;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
let uncommitted = false;
|
|
57
|
+
try {
|
|
58
|
+
uncommitted = existsSync(wtPath) && nativeHasChanges(wtPath);
|
|
59
|
+
} catch {
|
|
60
|
+
// native check failure → treat as clean for display purposes
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
let commits = 0;
|
|
64
|
+
try {
|
|
65
|
+
const main = nativeDetectMainBranch(basePath);
|
|
66
|
+
commits = nativeCommitCountBetween(basePath, main, worktreeBranchName(name));
|
|
67
|
+
} catch {
|
|
68
|
+
// commit count unavailable → leave at 0
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return {
|
|
72
|
+
name,
|
|
73
|
+
path: wtPath,
|
|
74
|
+
branch: worktreeBranchName(name),
|
|
75
|
+
exists: existsSync(wtPath),
|
|
76
|
+
filesChanged,
|
|
77
|
+
linesAdded,
|
|
78
|
+
linesRemoved,
|
|
79
|
+
uncommitted,
|
|
80
|
+
commits,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// ─── Formatters (exported for tests) ────────────────────────────────────────
|
|
85
|
+
|
|
86
|
+
export function formatWorktreeList(statuses: WorktreeStatus[]): string {
|
|
87
|
+
if (statuses.length === 0) {
|
|
88
|
+
return "No worktrees.\n\nCreate one from the CLI: gsd -w <name>";
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const lines: string[] = [`Worktrees — ${statuses.length}`, ""];
|
|
92
|
+
for (const s of statuses) {
|
|
93
|
+
const badge = s.uncommitted
|
|
94
|
+
? "(uncommitted)"
|
|
95
|
+
: s.filesChanged > 0
|
|
96
|
+
? "(unmerged)"
|
|
97
|
+
: "(clean)";
|
|
98
|
+
lines.push(` ${s.name} ${badge}`);
|
|
99
|
+
lines.push(` branch ${s.branch}`);
|
|
100
|
+
lines.push(` path ${s.path}`);
|
|
101
|
+
if (s.filesChanged > 0) {
|
|
102
|
+
lines.push(
|
|
103
|
+
` diff ${s.filesChanged} file${s.filesChanged === 1 ? "" : "s"}, +${s.linesAdded} -${s.linesRemoved}, ${s.commits} commit${s.commits === 1 ? "" : "s"}`,
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
lines.push("");
|
|
107
|
+
}
|
|
108
|
+
lines.push("Commands:");
|
|
109
|
+
lines.push(" /gsd worktree merge <name> Merge into main and clean up");
|
|
110
|
+
lines.push(" /gsd worktree remove <name> Remove a worktree (--force to skip safety checks)");
|
|
111
|
+
lines.push(" /gsd worktree clean Remove all merged/empty worktrees");
|
|
112
|
+
return lines.join("\n");
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function formatCleanKeepReason(status: WorktreeStatus): string {
|
|
116
|
+
if (!status.exists) {
|
|
117
|
+
return "directory missing — run 'git worktree prune' to unregister";
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (status.filesChanged > 0) {
|
|
121
|
+
return `${status.filesChanged} changed file${status.filesChanged === 1 ? "" : "s"}${status.uncommitted ? ", uncommitted" : ""}`;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return "uncommitted changes";
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// ─── Subcommand: list ───────────────────────────────────────────────────────
|
|
128
|
+
|
|
129
|
+
async function handleList(ctx: ExtensionCommandContext): Promise<void> {
|
|
130
|
+
const basePath = projectRoot();
|
|
131
|
+
const worktrees = listWorktrees(basePath);
|
|
132
|
+
const statuses = worktrees.map((wt) => getStatus(basePath, wt.name, wt.path));
|
|
133
|
+
ctx.ui.notify(formatWorktreeList(statuses), "info");
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// ─── Subcommand: merge ──────────────────────────────────────────────────────
|
|
137
|
+
|
|
138
|
+
async function handleMerge(args: string, ctx: ExtensionCommandContext): Promise<void> {
|
|
139
|
+
const basePath = projectRoot();
|
|
140
|
+
const worktrees = listWorktrees(basePath);
|
|
141
|
+
const trimmed = args.trim();
|
|
142
|
+
|
|
143
|
+
let target = trimmed;
|
|
144
|
+
if (!target) {
|
|
145
|
+
if (worktrees.length === 1) {
|
|
146
|
+
target = worktrees[0].name;
|
|
147
|
+
} else if (worktrees.length === 0) {
|
|
148
|
+
ctx.ui.notify("No worktrees to merge.", "info");
|
|
149
|
+
return;
|
|
150
|
+
} else {
|
|
151
|
+
const names = worktrees.map((w) => w.name).join(", ");
|
|
152
|
+
ctx.ui.notify(`Usage: /gsd worktree merge <name>\n\nWorktrees: ${names}`, "warning");
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const wt = worktrees.find((w) => w.name === target);
|
|
158
|
+
if (!wt) {
|
|
159
|
+
const available = worktrees.map((w) => w.name).join(", ") || "(none)";
|
|
160
|
+
ctx.ui.notify(`Worktree "${target}" not found.\n\nAvailable: ${available}`, "error");
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const status = getStatus(basePath, target, wt.path);
|
|
165
|
+
if (status.filesChanged === 0 && !status.uncommitted) {
|
|
166
|
+
try {
|
|
167
|
+
removeWorktree(basePath, target, { deleteBranch: true });
|
|
168
|
+
ctx.ui.notify(`Removed empty worktree ${target}.`, "info");
|
|
169
|
+
} catch (err) {
|
|
170
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
171
|
+
ctx.ui.notify(
|
|
172
|
+
`Worktree partially removed: ${msg}\n\nRun 'git worktree prune' to clean up any dangling registrations.`,
|
|
173
|
+
"error",
|
|
174
|
+
);
|
|
175
|
+
}
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (status.uncommitted) {
|
|
180
|
+
try {
|
|
181
|
+
autoCommitCurrentBranch(wt.path, "worktree-merge", target);
|
|
182
|
+
} catch (err) {
|
|
183
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
184
|
+
ctx.ui.notify(
|
|
185
|
+
[
|
|
186
|
+
`Auto-commit before merge failed: ${msg}`,
|
|
187
|
+
"",
|
|
188
|
+
`Commit or stash changes in ${wt.path}, then re-run /gsd worktree merge ${target}.`,
|
|
189
|
+
].join("\n"),
|
|
190
|
+
"error",
|
|
191
|
+
);
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const commitType = inferCommitType(target);
|
|
197
|
+
const mainBranch = nativeDetectMainBranch(basePath);
|
|
198
|
+
const commitMessage = `${commitType}: merge worktree ${target}\n\nGSD-Worktree: ${target}`;
|
|
199
|
+
|
|
200
|
+
try {
|
|
201
|
+
mergeWorktreeToMain(basePath, target, commitMessage);
|
|
202
|
+
} catch (err) {
|
|
203
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
204
|
+
if (err instanceof GSDError && err.code === GSD_GIT_ERROR) {
|
|
205
|
+
ctx.ui.notify(
|
|
206
|
+
`Merge requires the main branch to be checked out: ${msg}\n\nSwitch to ${mainBranch} (e.g. 'git checkout ${mainBranch}'), then re-run /gsd worktree merge ${target}.`,
|
|
207
|
+
"error",
|
|
208
|
+
);
|
|
209
|
+
} else {
|
|
210
|
+
ctx.ui.notify(
|
|
211
|
+
`Merge failed: ${msg}\n\nResolve conflicts manually, then run /gsd worktree merge ${target} again.`,
|
|
212
|
+
"error",
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const successLines = [
|
|
219
|
+
`Merged ${target} → ${mainBranch}`,
|
|
220
|
+
` ${status.filesChanged} file${status.filesChanged === 1 ? "" : "s"}, +${status.linesAdded} -${status.linesRemoved}`,
|
|
221
|
+
` commit: ${commitMessage.split("\n")[0]}`,
|
|
222
|
+
];
|
|
223
|
+
|
|
224
|
+
try {
|
|
225
|
+
removeWorktree(basePath, target, { deleteBranch: true });
|
|
226
|
+
ctx.ui.notify(successLines.join("\n"), "info");
|
|
227
|
+
} catch (err) {
|
|
228
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
229
|
+
const cleanupLines = [
|
|
230
|
+
...successLines,
|
|
231
|
+
"",
|
|
232
|
+
`Cleanup failed after the merge succeeded: ${msg}`,
|
|
233
|
+
err instanceof GSDError && err.code === GSD_GIT_ERROR
|
|
234
|
+
? `Switch to ${mainBranch} (e.g. 'git checkout ${mainBranch}'), then remove the worktree manually with /gsd worktree remove ${target} --force.`
|
|
235
|
+
: `Remove the worktree manually with /gsd worktree remove ${target} --force, or run 'git worktree prune' to clean up dangling registrations.`,
|
|
236
|
+
];
|
|
237
|
+
ctx.ui.notify(cleanupLines.join("\n"), "warning");
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// ─── Subcommand: clean ──────────────────────────────────────────────────────
|
|
242
|
+
|
|
243
|
+
async function handleClean(ctx: ExtensionCommandContext): Promise<void> {
|
|
244
|
+
const basePath = projectRoot();
|
|
245
|
+
const worktrees = listWorktrees(basePath);
|
|
246
|
+
if (worktrees.length === 0) {
|
|
247
|
+
ctx.ui.notify("No worktrees to clean.", "info");
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const removed: string[] = [];
|
|
252
|
+
const kept: string[] = [];
|
|
253
|
+
for (const wt of worktrees) {
|
|
254
|
+
const status = getStatus(basePath, wt.name, wt.path);
|
|
255
|
+
if (status.filesChanged === 0 && !status.uncommitted) {
|
|
256
|
+
try {
|
|
257
|
+
removeWorktree(basePath, wt.name, { deleteBranch: true });
|
|
258
|
+
removed.push(wt.name);
|
|
259
|
+
} catch (err) {
|
|
260
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
261
|
+
kept.push(`${wt.name} (failed: ${msg})`);
|
|
262
|
+
}
|
|
263
|
+
} else {
|
|
264
|
+
const reason = formatCleanKeepReason(status);
|
|
265
|
+
kept.push(`${wt.name} (${reason})`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const lines: string[] = [`Cleaned ${removed.length} worktree${removed.length === 1 ? "" : "s"}.`];
|
|
270
|
+
if (removed.length > 0) {
|
|
271
|
+
lines.push("", "Removed:");
|
|
272
|
+
for (const n of removed) lines.push(` ✓ ${n}`);
|
|
273
|
+
}
|
|
274
|
+
if (kept.length > 0) {
|
|
275
|
+
lines.push("", "Kept:");
|
|
276
|
+
for (const n of kept) lines.push(` ─ ${n}`);
|
|
277
|
+
}
|
|
278
|
+
ctx.ui.notify(lines.join("\n"), "info");
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// ─── Subcommand: remove ─────────────────────────────────────────────────────
|
|
282
|
+
|
|
283
|
+
async function handleRemove(args: string, ctx: ExtensionCommandContext): Promise<void> {
|
|
284
|
+
const basePath = projectRoot();
|
|
285
|
+
const tokens = args.trim().split(/\s+/).filter(Boolean);
|
|
286
|
+
const force = tokens.includes("--force");
|
|
287
|
+
const name = tokens.find((t) => t !== "--force");
|
|
288
|
+
if (!name) {
|
|
289
|
+
ctx.ui.notify("Usage: /gsd worktree remove <name> [--force]", "warning");
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const worktrees = listWorktrees(basePath);
|
|
294
|
+
const wt = worktrees.find((w) => w.name === name);
|
|
295
|
+
if (!wt) {
|
|
296
|
+
const available = worktrees.map((w) => w.name).join(", ") || "(none)";
|
|
297
|
+
ctx.ui.notify(`Worktree "${name}" not found.\n\nAvailable: ${available}`, "error");
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
const status = getStatus(basePath, name, wt.path);
|
|
302
|
+
if ((status.filesChanged > 0 || status.uncommitted) && !force) {
|
|
303
|
+
ctx.ui.notify(
|
|
304
|
+
[
|
|
305
|
+
`Worktree "${name}" has pending changes (${formatCleanKeepReason(status)}).`,
|
|
306
|
+
"",
|
|
307
|
+
` Merge first: /gsd worktree merge ${name}`,
|
|
308
|
+
` Or force-remove: /gsd worktree remove ${name} --force`,
|
|
309
|
+
].join("\n"),
|
|
310
|
+
"warning",
|
|
311
|
+
);
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
try {
|
|
316
|
+
removeWorktree(basePath, name, { deleteBranch: true });
|
|
317
|
+
ctx.ui.notify(`Removed worktree ${name}.`, "info");
|
|
318
|
+
} catch (err) {
|
|
319
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
320
|
+
ctx.ui.notify(
|
|
321
|
+
`Worktree partially removed: ${msg}\n\nRun 'git worktree prune' to clean up any dangling registrations.`,
|
|
322
|
+
"error",
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// ─── Help text ──────────────────────────────────────────────────────────────
|
|
328
|
+
|
|
329
|
+
const HELP_TEXT = [
|
|
330
|
+
"Usage: /gsd worktree <command> [args]",
|
|
331
|
+
"",
|
|
332
|
+
"Commands:",
|
|
333
|
+
" list Show all worktrees with status",
|
|
334
|
+
" merge [name] Merge a worktree into main, then remove it",
|
|
335
|
+
" remove <name> [--force] Remove a worktree (refuses unmerged changes without --force)",
|
|
336
|
+
" clean Remove all merged/empty worktrees",
|
|
337
|
+
"",
|
|
338
|
+
"The -w flag (CLI only) creates/resumes worktrees on session start:",
|
|
339
|
+
" gsd -w Auto-name a new worktree, or resume the only active one",
|
|
340
|
+
" gsd -w my-feature Create or resume a named worktree",
|
|
341
|
+
].join("\n");
|
|
342
|
+
|
|
343
|
+
// ─── Dispatcher ─────────────────────────────────────────────────────────────
|
|
344
|
+
|
|
345
|
+
export async function handleWorktree(args: string, ctx: ExtensionCommandContext): Promise<void> {
|
|
346
|
+
const trimmed = args.trim();
|
|
347
|
+
const lowered = trimmed.toLowerCase();
|
|
348
|
+
|
|
349
|
+
if (!lowered || lowered === "help" || lowered === "--help" || lowered === "-h") {
|
|
350
|
+
ctx.ui.notify(HELP_TEXT, "info");
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
try {
|
|
355
|
+
if (lowered === "list" || lowered === "ls") {
|
|
356
|
+
await handleList(ctx);
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
if (lowered === "merge" || lowered.startsWith("merge ")) {
|
|
360
|
+
await handleMerge(trimmed.replace(/^merge\s*/i, ""), ctx);
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
if (lowered === "clean") {
|
|
364
|
+
await handleClean(ctx);
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
if (
|
|
368
|
+
lowered === "remove" ||
|
|
369
|
+
lowered.startsWith("remove ") ||
|
|
370
|
+
lowered === "rm" ||
|
|
371
|
+
lowered.startsWith("rm ")
|
|
372
|
+
) {
|
|
373
|
+
const stripped = trimmed.replace(/^(remove|rm)\s*/i, "");
|
|
374
|
+
await handleRemove(stripped, ctx);
|
|
375
|
+
return;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
ctx.ui.notify(`Unknown worktree command: ${trimmed}\n\n${HELP_TEXT}`, "warning");
|
|
379
|
+
} catch (err) {
|
|
380
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
381
|
+
ctx.ui.notify(`Worktree command failed: ${msg}`, "error");
|
|
382
|
+
}
|
|
383
|
+
}
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
type UnitMetrics,
|
|
22
22
|
} from "./metrics.js";
|
|
23
23
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
24
|
-
import { getActiveWorktreeName } from "./worktree-
|
|
24
|
+
import { getActiveWorktreeName } from "./worktree-session-state.js";
|
|
25
25
|
import { getWorkerBatches, hasActiveWorkers, type WorkerEntry } from "../subagent/worker-registry.js";
|
|
26
26
|
import { formatDuration, padRight, joinColumns, centerLine, fitColumns, STATUS_GLYPH, STATUS_COLOR } from "../shared/mod.js";
|
|
27
27
|
import { estimateTimeRemaining } from "./auto-dashboard.js";
|
|
@@ -126,6 +126,8 @@ Setting `prefer_skills: []` does **not** disable skill discovery — it just mea
|
|
|
126
126
|
- `idle_timeout_minutes`: minutes of inactivity before the supervisor intervenes (default: 10).
|
|
127
127
|
- `hard_timeout_minutes`: minutes before the supervisor forces termination (default: 30).
|
|
128
128
|
|
|
129
|
+
- `min_request_interval_ms`: number — minimum integer milliseconds between auto-mode LLM request dispatches. Non-integer values are rounded down (e.g., `1000.9 → 1000`). Use this to proactively slow auto-mode on rate-limited providers and reduce 429 errors. Set to `0` to disable. Default: `0` (disabled).
|
|
130
|
+
|
|
129
131
|
- `git`: configures GSD's git behavior. All fields are optional — omit any to use defaults. Keys:
|
|
130
132
|
- `auto_push`: boolean — automatically push commits to the remote after committing. Default: `false`.
|
|
131
133
|
- `push_branches`: boolean — push the milestone branch to the remote after commits. Default: `false`.
|
|
@@ -163,6 +165,12 @@ Setting `prefer_skills: []` does **not** disable skill discovery — it just mea
|
|
|
163
165
|
- `skip_reassess`: boolean — force-disable roadmap reassessment even if `reassess_after_slice` is enabled. Default: `false`.
|
|
164
166
|
- `skip_slice_research`: boolean — skip per-slice research. Default: `false`.
|
|
165
167
|
|
|
168
|
+
- `reactive_execution`: controls automatic parallel task dispatch inside a slice. Reactive execution is enabled by default when omitted; set `enabled: false` to opt out. With default-on behavior, GSD only attempts a reactive batch when at least three ready tasks are available and the task-plan IO graph is non-ambiguous. If you set `enabled: true` explicitly, GSD uses the earlier opt-in threshold of two ready tasks. Keys:
|
|
169
|
+
- `enabled`: boolean — set `false` to force sequential task execution. Default: `true`.
|
|
170
|
+
- `max_parallel`: number — maximum tasks to dispatch in one batch, range `1`-`8`. Default: `2`.
|
|
171
|
+
- `isolation_mode`: `"same-tree"` — currently the only supported value.
|
|
172
|
+
- `subagent_model`: string — optional model override for reactive task subagents. Falls back to the `models.subagent` routing when omitted.
|
|
173
|
+
|
|
166
174
|
- `remote_questions`: route interactive questions to Slack/Discord for headless auto-mode. Keys:
|
|
167
175
|
- `channel`: `"slack"` or `"discord"` — channel type.
|
|
168
176
|
- `channel_id`: string or number — channel ID.
|
|
@@ -193,6 +201,8 @@ Setting `prefer_skills: []` does **not** disable skill discovery — it just mea
|
|
|
193
201
|
- `hooks`: boolean — enable routing hooks. Default: `true`.
|
|
194
202
|
- `capability_routing`: boolean — enable capability-profile scoring for model selection within a tier. Requires `enabled: true`. Default: `false`.
|
|
195
203
|
|
|
204
|
+
- `disabled_model_providers`: string[] — provider IDs to hide from model selection and routing (for example `["google-gemini-cli"]`). This only affects model availability (`/model`, auto-model selection, routing); it does not disable tool auth flows like `google_search`.
|
|
205
|
+
|
|
196
206
|
- `uok`: Unified Orchestration Kernel controls. Keys:
|
|
197
207
|
- `enabled`: boolean — enable kernel wrappers and contract observers. Default: `true`.
|
|
198
208
|
- `legacy_fallback.enabled`: boolean — emergency release fallback that forces legacy orchestration behavior even when `uok.enabled` is `true`. Default: `false`.
|
|
@@ -17,6 +17,7 @@ import { AuthStorage } from "@gsd/pi-coding-agent";
|
|
|
17
17
|
import { getEnvApiKey } from "@gsd/pi-ai";
|
|
18
18
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
19
19
|
import { getAuthPath, PROVIDER_REGISTRY, type ProviderCategory } from "./key-manager.js";
|
|
20
|
+
import { getHomeDir } from "./home-dir.js";
|
|
20
21
|
|
|
21
22
|
// ── Types ──────────────────────────────────────────────────────────────────────
|
|
22
23
|
|
|
@@ -194,7 +195,7 @@ function isCliBinaryInPath(providerId: string): boolean {
|
|
|
194
195
|
}
|
|
195
196
|
|
|
196
197
|
function modelsJsonPaths(): string[] {
|
|
197
|
-
const home =
|
|
198
|
+
const home = getHomeDir();
|
|
198
199
|
return [
|
|
199
200
|
join(home, ".gsd", "agent", "models.json"),
|
|
200
201
|
// Keep parity with custom-provider discovery during auto bootstrap.
|
|
@@ -4,7 +4,7 @@ import { basename, dirname, join } from "node:path";
|
|
|
4
4
|
import type { DoctorIssue, DoctorIssueCode } from "./doctor-types.js";
|
|
5
5
|
import { cleanNumberedGsdVariants } from "./repo-identity.js";
|
|
6
6
|
import { milestonesDir, gsdRoot, resolveGsdRootFile } from "./paths.js";
|
|
7
|
-
import { deriveState } from "./state.js";
|
|
7
|
+
import { deriveState, isGhostMilestone, isReusableGhostMilestone } from "./state.js";
|
|
8
8
|
import { saveFile } from "./files.js";
|
|
9
9
|
import { nativeIsRepo, nativeForEachRef, nativeUpdateRef } from "./native-git-bridge.js";
|
|
10
10
|
import { readCrashLock, isLockProcessAlive, clearLock } from "./crash-recovery.js";
|
|
@@ -12,6 +12,7 @@ import { ensureGitignore, isGsdGitignored } from "./gitignore.js";
|
|
|
12
12
|
import { readAllSessionStatuses, isSessionStale, removeSessionStatus } from "./session-status-io.js";
|
|
13
13
|
import { recoverFailedMigration } from "./migrate-external.js";
|
|
14
14
|
import { splitCompletedKey } from "./forensics.js";
|
|
15
|
+
import { findMilestoneIds } from "./milestone-ids.js";
|
|
15
16
|
|
|
16
17
|
export async function checkRuntimeHealth(
|
|
17
18
|
basePath: string,
|
|
@@ -593,6 +594,43 @@ export async function checkRuntimeHealth(
|
|
|
593
594
|
} catch {
|
|
594
595
|
// Non-fatal — snapshot ref check failed
|
|
595
596
|
}
|
|
597
|
+
|
|
598
|
+
// ── Orphan milestone directories (#4996) ──────────────────────────────
|
|
599
|
+
// Walk every milestone ID on disk. Any dir that has no DB row, no worktree,
|
|
600
|
+
// and no content files is an orphaned stub — it skews nextMilestoneId and
|
|
601
|
+
// was likely created by ensurePreconditions or showHeadlessMilestoneCreation
|
|
602
|
+
// for a phantom forward-reference. Surface as a fixable warning.
|
|
603
|
+
try {
|
|
604
|
+
const milestoneIds = findMilestoneIds(basePath);
|
|
605
|
+
const hasDbFile = existsSync(join(root, "gsd.db"));
|
|
606
|
+
for (const mid of milestoneIds) {
|
|
607
|
+
const isOrphan = isReusableGhostMilestone(basePath, mid)
|
|
608
|
+
|| (!hasDbFile && isGhostMilestone(basePath, mid));
|
|
609
|
+
if (isOrphan) {
|
|
610
|
+
issues.push({
|
|
611
|
+
severity: "warning",
|
|
612
|
+
code: "orphan_milestone_dir",
|
|
613
|
+
scope: "milestone",
|
|
614
|
+
unitId: mid,
|
|
615
|
+
message: `Orphan milestone directory: ${mid} — directory exists on disk with no DB row, no worktree, and no content files. This stub skews milestone ID generation and should be removed.`,
|
|
616
|
+
file: `.gsd/milestones/${mid}`,
|
|
617
|
+
fixable: true,
|
|
618
|
+
});
|
|
619
|
+
|
|
620
|
+
if (shouldFix("orphan_milestone_dir")) {
|
|
621
|
+
try {
|
|
622
|
+
const orphanPath = join(milestonesDir(basePath), mid);
|
|
623
|
+
rmSync(orphanPath, { recursive: true, force: true });
|
|
624
|
+
fixesApplied.push(`removed orphan milestone directory: ${mid}`);
|
|
625
|
+
} catch {
|
|
626
|
+
// Non-fatal — leave for manual cleanup
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
} catch {
|
|
632
|
+
// Non-fatal — orphan milestone directory check failed
|
|
633
|
+
}
|
|
596
634
|
}
|
|
597
635
|
|
|
598
636
|
/**
|
|
@@ -80,7 +80,9 @@ export type DoctorIssueCode =
|
|
|
80
80
|
| "db_done_task_no_summary"
|
|
81
81
|
| "db_duplicate_id"
|
|
82
82
|
| "db_unavailable"
|
|
83
|
-
| "projection_drift"
|
|
83
|
+
| "projection_drift"
|
|
84
|
+
// Milestone filesystem/DB drift (#4996)
|
|
85
|
+
| "orphan_milestone_dir";
|
|
84
86
|
|
|
85
87
|
/**
|
|
86
88
|
* Issue codes that represent global or completion-critical state.
|
|
@@ -59,7 +59,7 @@ const NETWORK_RE = /network|ECONNRESET|ETIMEDOUT|ECONNREFUSED|socket hang up|fet
|
|
|
59
59
|
// Context overflow errors (context window/length exceeded) should be treated as server-class
|
|
60
60
|
// transient errors so auto-mode can retry with reduced budget or fall back to a larger-context model.
|
|
61
61
|
// See: https://github.com/gsd-build/gsd-2/issues/4528
|
|
62
|
-
const SERVER_RE = /internal server error|500|502|503|overloaded|server_error|api_error|service.?unavailable|context (?:window|length) exceed|context window exceed/i;
|
|
62
|
+
const SERVER_RE = /internal(?: server)?[ _-]?error|500|502|503|overloaded|server_error|api_error|service.?unavailable|context (?:window|length) exceed|context window exceed/i;
|
|
63
63
|
// ECONNRESET/ECONNREFUSED are in NETWORK_RE (same-model retry first).
|
|
64
64
|
const CONNECTION_RE = /terminated|connection.?(?:refused|error)|other side closed|EPIPE|network.?(?:is\s+)?unavailable|stream_exhausted(?:_without_result)?/i;
|
|
65
65
|
// Catch-all for V8 JSON.parse errors: all modern variants end with "in JSON at position \d+".
|
|
@@ -12,7 +12,7 @@ import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent
|
|
|
12
12
|
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
|
|
13
13
|
import { join, dirname, relative } from "node:path";
|
|
14
14
|
import { fileURLToPath } from "node:url";
|
|
15
|
-
import {
|
|
15
|
+
import { getHomeDir } from "./home-dir.js";
|
|
16
16
|
|
|
17
17
|
import { extractTrace, type ExecutionTrace } from "./session-forensics.js";
|
|
18
18
|
import { nativeParseJsonlTail } from "./native-parser-bridge.js";
|
|
@@ -244,7 +244,7 @@ export async function handleForensics(
|
|
|
244
244
|
// when import.meta.url resolves to the npm-global install path (Windows).
|
|
245
245
|
let gsdSourceDir = dirname(fileURLToPath(import.meta.url));
|
|
246
246
|
if (!existsSync(join(gsdSourceDir, "prompts"))) {
|
|
247
|
-
const gsdHome = process.env.GSD_HOME || join(
|
|
247
|
+
const gsdHome = process.env.GSD_HOME || join(getHomeDir(), ".gsd");
|
|
248
248
|
const fallback = join(gsdHome, "agent", "extensions", "gsd");
|
|
249
249
|
if (existsSync(join(fallback, "prompts"))) gsdSourceDir = fallback;
|
|
250
250
|
}
|
|
@@ -804,7 +804,7 @@ function detectMissingArtifacts(completedKeys: string[], basePath: string, activ
|
|
|
804
804
|
* the forensics memory-bloat guard in forensics-journal.test.ts — per-event
|
|
805
805
|
* detail stays in the journal itself where the LLM can query it on demand.
|
|
806
806
|
*/
|
|
807
|
-
function detectWorktreeOrphans(
|
|
807
|
+
export function detectWorktreeOrphans(
|
|
808
808
|
summary: WorktreeTelemetrySummary,
|
|
809
809
|
anomalies: ForensicAnomaly[],
|
|
810
810
|
): void {
|
|
@@ -822,7 +822,7 @@ function detectWorktreeOrphans(
|
|
|
822
822
|
reason === "in-progress-unmerged"
|
|
823
823
|
? "Auto-mode exited without completing a milestone; live work sits on an unmerged milestone branch. Run `/gsd auto` to resume, or merge manually."
|
|
824
824
|
: reason === "complete-unmerged"
|
|
825
|
-
? "A completed milestone's branch was never merged back to main. Run `/gsd
|
|
825
|
+
? "A completed milestone's branch was never merged back to main. Run `/gsd doctor fix` to resolve."
|
|
826
826
|
: `Reason: ${reason}.`,
|
|
827
827
|
});
|
|
828
828
|
}
|
|
@@ -1299,10 +1299,15 @@ function formatReportForPrompt(report: ForensicReport): string {
|
|
|
1299
1299
|
function redactForGitHub(text: string, basePath: string): string {
|
|
1300
1300
|
let result = text;
|
|
1301
1301
|
|
|
1302
|
+
// Build regex that matches both / and \ separator variants (Windows)
|
|
1303
|
+
// Normalize to / first, escape for regex, then replace each / with [/\\]
|
|
1304
|
+
const esc = (s: string) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1305
|
+
const pathRe = (p: string) =>
|
|
1306
|
+
new RegExp(esc(p.replace(/\\/g, "/")).replace(/\//g, "[/\\\\]"), "gi");
|
|
1307
|
+
|
|
1302
1308
|
// Replace absolute paths
|
|
1303
|
-
result = result.
|
|
1304
|
-
|
|
1305
|
-
if (home) result = result.replaceAll(home, "~");
|
|
1309
|
+
result = result.replace(pathRe(basePath), ".");
|
|
1310
|
+
result = result.replace(pathRe(getHomeDir()), "~");
|
|
1306
1311
|
|
|
1307
1312
|
// Strip API key patterns
|
|
1308
1313
|
result = result.replace(/sk-[a-zA-Z0-9]{20,}/g, "sk-***");
|