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
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function extractSubagentAgentClasses(input: unknown): string[] {
|
|
2
|
+
if (!input || typeof input !== "object") return [];
|
|
3
|
+
|
|
4
|
+
const record = input as Record<string, unknown>;
|
|
5
|
+
const agentClasses: string[] = [];
|
|
6
|
+
const addAgentClass = (value: unknown): void => {
|
|
7
|
+
if (typeof value === "string" && value.trim().length > 0) agentClasses.push(value.trim());
|
|
8
|
+
};
|
|
9
|
+
const addFromItems = (value: unknown): void => {
|
|
10
|
+
if (!Array.isArray(value)) return;
|
|
11
|
+
for (const item of value) {
|
|
12
|
+
if (item && typeof item === "object") addAgentClass((item as Record<string, unknown>).agent);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
addAgentClass(record.agent);
|
|
17
|
+
addFromItems(record.tasks);
|
|
18
|
+
addFromItems(record.chain);
|
|
19
|
+
return agentClasses;
|
|
20
|
+
}
|
|
@@ -15,7 +15,7 @@ import { resolveGsdRootFile, resolveSliceFile, resolveSlicePath, resolveTaskFile
|
|
|
15
15
|
import { ensureCodebaseMapFresh, readCodebaseMap } from "../codebase-generator.js";
|
|
16
16
|
import { hasSkillSnapshot, detectNewSkills, formatSkillsXml } from "../skill-discovery.js";
|
|
17
17
|
import { getActiveAutoWorktreeContext } from "../auto-worktree.js";
|
|
18
|
-
import { getActiveWorktreeName, getWorktreeOriginalCwd } from "../worktree-
|
|
18
|
+
import { getActiveWorktreeName, getWorktreeOriginalCwd } from "../worktree-session-state.js";
|
|
19
19
|
import { deriveState } from "../state.js";
|
|
20
20
|
import { formatOverridesSection, formatShortcut, loadActiveOverrides, loadFile, parseContinue, parseSummary } from "../files.js";
|
|
21
21
|
import { toPosixPath } from "../../shared/mod.js";
|
|
@@ -52,6 +52,17 @@ export const BUNDLED_SKILL_TRIGGERS: Array<{ trigger: string; skill: string }> =
|
|
|
52
52
|
{ trigger: "HTTP/REST/GraphQL API design — verbs, status codes, pagination, errors, idempotency, versioning", skill: "api-design" },
|
|
53
53
|
{ trigger: "Dependency upgrades — risk-batched, verified between batches, one major per commit", skill: "dependency-upgrade" },
|
|
54
54
|
{ trigger: "Agent-first observability — structured logs, persisted failure state, health surfaces, explicit failure modes", skill: "observability" },
|
|
55
|
+
{ trigger: "React/Next.js performance — components, data fetching, bundle optimization, rendering patterns from Vercel Engineering", skill: "react-best-practices" },
|
|
56
|
+
{ trigger: "Core Web Vitals — fix LCP, CLS, INP; layout shifts; page experience optimization", skill: "core-web-vitals" },
|
|
57
|
+
{ trigger: "GitHub Actions CI/CD — write, run, and debug workflow files; live syntax and run monitoring", skill: "github-workflows" },
|
|
58
|
+
{ trigger: "Comprehensive web quality audit — performance, accessibility, SEO, and best-practices (Lighthouse-style)", skill: "web-quality-audit" },
|
|
59
|
+
{ trigger: "Browser automation — open sites, fill forms, click, screenshot, scrape, or test web apps programmatically", skill: "agent-browser" },
|
|
60
|
+
{ trigger: "Review UI code for Web Interface Guidelines compliance — UX, design, and accessibility patterns", skill: "web-design-guidelines" },
|
|
61
|
+
{ trigger: "UI/UX patterns reference — animations, CSS, typography, prefetching, icons (file:line findings)", skill: "userinterface-wiki" },
|
|
62
|
+
{ trigger: "Author or refine a GSD skill — SKILL.md structure, frontmatter, and best practices", skill: "create-skill" },
|
|
63
|
+
{ trigger: "Create or debug a GSD extension — tools, commands, event hooks, custom TUI, providers", skill: "create-gsd-extension" },
|
|
64
|
+
{ trigger: "Author a YAML workflow definition — steps, triggers, and templates", skill: "create-workflow" },
|
|
65
|
+
{ trigger: "Deep code optimization audit — perf anti-patterns, memory leaks, algorithmic complexity, bundle size, I/O, caching, dead code (parallel pattern-based hunt)", skill: "code-optimizer" },
|
|
55
66
|
];
|
|
56
67
|
|
|
57
68
|
function buildBundledSkillsTable(): string {
|
|
@@ -207,7 +218,14 @@ export async function buildBeforeAgentStartResult(
|
|
|
207
218
|
? `\n\n## Subagent Model\n\nWhen spawning subagents via the \`subagent\` tool, always pass \`model: "${subagentModelConfig.primary}"\` in the tool call parameters. Never omit this — always specify it explicitly.`
|
|
208
219
|
: "";
|
|
209
220
|
|
|
210
|
-
|
|
221
|
+
// memoryBlock is FTS-queried against the user prompt and changes per call.
|
|
222
|
+
// Removing it from `fullSystem` keeps the system-prompt cache breakpoint
|
|
223
|
+
// stable across calls — the only scoped goal of this fix. The pi-ai
|
|
224
|
+
// Anthropic adapter additionally cache-marks the last user turn, so the
|
|
225
|
+
// memoryBlock injected via the context message may itself be cached up to
|
|
226
|
+
// that boundary; that's orthogonal and unchanged from prior behavior. The
|
|
227
|
+
// load-bearing win here is preserving the system+tools cache hit. (#5019)
|
|
228
|
+
const fullSystem = `${event.systemPrompt}\n\n[SYSTEM CONTEXT — GSD]\n\n${systemContent}${preferenceBlock}${knowledgeBlock}${codebaseBlock}${newSkillsBlock}${worktreeBlock}${subagentModelBlock}`;
|
|
211
229
|
|
|
212
230
|
stopContextTimer({
|
|
213
231
|
systemPromptSize: fullSystem.length,
|
|
@@ -216,12 +234,7 @@ export async function buildBeforeAgentStartResult(
|
|
|
216
234
|
hasNewSkills: newSkillsBlock.length > 0,
|
|
217
235
|
});
|
|
218
236
|
|
|
219
|
-
|
|
220
|
-
const contextMessage = injection
|
|
221
|
-
? { customType: "gsd-guided-context", content: injection, display: false as const }
|
|
222
|
-
: forensicsInjection
|
|
223
|
-
? { customType: "gsd-forensics", content: forensicsInjection, display: false as const }
|
|
224
|
-
: null;
|
|
237
|
+
const contextMessage = buildContextMessage({ memoryBlock, injection, forensicsInjection });
|
|
225
238
|
|
|
226
239
|
return {
|
|
227
240
|
systemPrompt: fullSystem,
|
|
@@ -229,6 +242,35 @@ export async function buildBeforeAgentStartResult(
|
|
|
229
242
|
};
|
|
230
243
|
}
|
|
231
244
|
|
|
245
|
+
/**
|
|
246
|
+
* Route the per-call dynamic blocks (memory, guided-execute, forensics) into a
|
|
247
|
+
* single user-message context payload so they ride the volatile suffix instead
|
|
248
|
+
* of the cached system prefix. Priority when both memory and an injection are
|
|
249
|
+
* present: guided > forensics > memory-only. (#5019)
|
|
250
|
+
*
|
|
251
|
+
* Exported for direct unit testing — the surrounding bootstrap has too many
|
|
252
|
+
* filesystem and DB dependencies to exercise this routing logic in-place.
|
|
253
|
+
*/
|
|
254
|
+
export function buildContextMessage(opts: {
|
|
255
|
+
memoryBlock: string;
|
|
256
|
+
injection: string | null;
|
|
257
|
+
forensicsInjection: string | null;
|
|
258
|
+
}): { customType: string; content: string; display: false } | null {
|
|
259
|
+
const memoryContent = opts.memoryBlock.trim();
|
|
260
|
+
if (opts.injection) {
|
|
261
|
+
const content = memoryContent ? `${memoryContent}\n\n${opts.injection}` : opts.injection;
|
|
262
|
+
return { customType: "gsd-guided-context", content, display: false as const };
|
|
263
|
+
}
|
|
264
|
+
if (opts.forensicsInjection) {
|
|
265
|
+
const content = memoryContent ? `${memoryContent}\n\n${opts.forensicsInjection}` : opts.forensicsInjection;
|
|
266
|
+
return { customType: "gsd-forensics", content, display: false as const };
|
|
267
|
+
}
|
|
268
|
+
if (memoryContent) {
|
|
269
|
+
return { customType: "gsd-memory", content: memoryContent, display: false as const };
|
|
270
|
+
}
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
|
|
232
274
|
/**
|
|
233
275
|
* ADR-013 step 4 — auto-injection parity for the memories table.
|
|
234
276
|
*
|
|
@@ -3,15 +3,8 @@ import { isAbsolute, join, relative, resolve, sep } from "node:path";
|
|
|
3
3
|
|
|
4
4
|
import { minimatch } from "minimatch";
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
* branch predates the full unit-context-manifest export (#4934).
|
|
9
|
-
*/
|
|
10
|
-
export type ToolsPolicy =
|
|
11
|
-
| { mode: "all" }
|
|
12
|
-
| { mode: "read-only" }
|
|
13
|
-
| { mode: "planning" }
|
|
14
|
-
| { mode: "docs"; allowedPathGlobs: readonly string[] };
|
|
6
|
+
import type { ToolsPolicy } from "../unit-context-manifest.js";
|
|
7
|
+
import { logWarning } from "../workflow-logger.js";
|
|
15
8
|
|
|
16
9
|
/**
|
|
17
10
|
* Regex matching milestone CONTEXT.md file names in both legacy M001
|
|
@@ -535,10 +528,76 @@ export function shouldBlockQueueExecutionInSnapshot(
|
|
|
535
528
|
}
|
|
536
529
|
|
|
537
530
|
// ─── Planning-unit tools-policy enforcement (#4934) ───────────────────────
|
|
531
|
+
//
|
|
532
|
+
// Runtime half of the declarative ToolsPolicy on UnitContextManifest. The
|
|
533
|
+
// manifest assigns each unit type a tools mode; this predicate is what
|
|
534
|
+
// actually rejects a tool call that violates it.
|
|
535
|
+
//
|
|
536
|
+
// Forensics: a discuss-milestone LLM turn used the host Edit tool to modify
|
|
537
|
+
// index.html in test app b23 (~/Github/test-apps/b23). With this predicate
|
|
538
|
+
// wired into the tool_call hook, the same call returns block=true with a
|
|
539
|
+
// HARD BLOCK reason that the model cannot rationalize past.
|
|
540
|
+
//
|
|
541
|
+
// Activation: the hook supplies the policy resolved from the active unit's
|
|
542
|
+
// manifest. When no unit is active (interactive sessions, unknown unit
|
|
543
|
+
// types), the hook passes null and this predicate is a no-op — falling
|
|
544
|
+
// through to the existing pendingGate / queue-execution / context-write
|
|
545
|
+
// guards.
|
|
538
546
|
|
|
539
547
|
const PLANNING_WRITE_TOOLS = new Set(["write", "edit", "multi_edit", "notebook_edit"]);
|
|
540
548
|
const PLANNING_SUBAGENT_TOOLS = new Set(["subagent", "task"]);
|
|
541
549
|
|
|
550
|
+
/**
|
|
551
|
+
* Canonical registry for agents that planning-dispatch may consider. Unit
|
|
552
|
+
* manifests still declare per-unit subsets via ToolsPolicy.allowedSubagents.
|
|
553
|
+
*/
|
|
554
|
+
const PLANNING_DISPATCH_AGENT_REGISTRY = {
|
|
555
|
+
scout: { readOnlySpecialist: true },
|
|
556
|
+
planner: { readOnlySpecialist: true },
|
|
557
|
+
reviewer: { readOnlySpecialist: true },
|
|
558
|
+
security: { readOnlySpecialist: true },
|
|
559
|
+
tester: { readOnlySpecialist: true },
|
|
560
|
+
} as const satisfies Record<string, { readonly readOnlySpecialist: boolean }>;
|
|
561
|
+
|
|
562
|
+
export const ALLOWED_PLANNING_DISPATCH_AGENTS = new Set<string>(
|
|
563
|
+
Object.entries(PLANNING_DISPATCH_AGENT_REGISTRY)
|
|
564
|
+
.filter(([, metadata]) => metadata.readOnlySpecialist)
|
|
565
|
+
.map(([agentId]) => agentId),
|
|
566
|
+
);
|
|
567
|
+
|
|
568
|
+
let warnedMissingPlanningDispatchAgentClasses = false;
|
|
569
|
+
|
|
570
|
+
function isReadOnlySpecialist(agentId: string): boolean {
|
|
571
|
+
const metadata = PLANNING_DISPATCH_AGENT_REGISTRY[agentId as keyof typeof PLANNING_DISPATCH_AGENT_REGISTRY];
|
|
572
|
+
return metadata?.readOnlySpecialist === true;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
function allowedPlanningDispatchAgentsList(): string {
|
|
576
|
+
return [...ALLOWED_PLANNING_DISPATCH_AGENTS].join(", ");
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
function warnMissingPlanningDispatchAgentClasses(unitType: string, mode: string, toolName: string): void {
|
|
580
|
+
if (warnedMissingPlanningDispatchAgentClasses) return;
|
|
581
|
+
warnedMissingPlanningDispatchAgentClasses = true;
|
|
582
|
+
// TODO(#5060): Remove this migration shim once all subagent/task callers are verified to forward agent identities.
|
|
583
|
+
const message = `[write-gate] planning-dispatch: shouldBlockPlanningUnit called for tool "${toolName}" ` +
|
|
584
|
+
`on unit "${unitType}" without agentClasses - stale caller; blocking dispatch.`;
|
|
585
|
+
console.warn(message);
|
|
586
|
+
logWarning("intercept", message, {
|
|
587
|
+
unitType,
|
|
588
|
+
mode,
|
|
589
|
+
toolName,
|
|
590
|
+
});
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
/**
|
|
594
|
+
* Read-only / planning-safe tools that any non-"all" mode allows. Mirrors
|
|
595
|
+
* QUEUE_SAFE_TOOLS / GATE_SAFE_TOOLS but is the inclusive default for
|
|
596
|
+
* planning units (which need their full discussion + research surface).
|
|
597
|
+
*
|
|
598
|
+
* gsd_* MCP tools are passed through unconditionally — they have their own
|
|
599
|
+
* domain validation (e.g. depth-verification gate, single-writer DB).
|
|
600
|
+
*/
|
|
542
601
|
const PLANNING_SAFE_TOOLS = new Set([
|
|
543
602
|
"read", "grep", "find", "ls", "glob",
|
|
544
603
|
"ask_user_questions",
|
|
@@ -555,6 +614,7 @@ function isPathUnderGsd(absPath: string, basePath: string): boolean {
|
|
|
555
614
|
function matchesAllowedGlob(absPath: string, basePath: string, globs: readonly string[]): boolean {
|
|
556
615
|
const rel = relative(basePath, absPath);
|
|
557
616
|
if (rel.startsWith("..") || isAbsolute(rel)) return false;
|
|
617
|
+
// Normalize Windows separators for minimatch.
|
|
558
618
|
const posix = rel.split(sep).join("/");
|
|
559
619
|
return globs.some(g => minimatch(posix, g, { dot: false, nocase: false }));
|
|
560
620
|
}
|
|
@@ -576,10 +636,24 @@ function blockReason(unitType: string, mode: string, what: string): string {
|
|
|
576
636
|
* - "read-only" → blocks all writes, bash, and subagent dispatch.
|
|
577
637
|
* - "planning" → blocks writes to paths outside <basePath>/.gsd/,
|
|
578
638
|
* bash that isn't read-only, and subagent dispatch.
|
|
639
|
+
* - "planning-dispatch"
|
|
640
|
+
* → like "planning", but permits subagent dispatch only
|
|
641
|
+
* when every forwarded agent class is globally allowed
|
|
642
|
+
* and listed in the policy's allowedSubagents.
|
|
579
643
|
* - "docs" → like "planning" but also allows writes to paths
|
|
580
644
|
* matching `allowedPathGlobs` relative to basePath.
|
|
581
645
|
*
|
|
582
|
-
* `
|
|
646
|
+
* `pathOrCommand` is the file path for write/edit-shaped tools and the
|
|
647
|
+
* shell command for bash. Other tools ignore this argument.
|
|
648
|
+
*
|
|
649
|
+
* `policy` of null means "no manifest resolved" — pass-through. Callers
|
|
650
|
+
* that have no active unit (interactive sessions) pass null and this
|
|
651
|
+
* predicate is a no-op.
|
|
652
|
+
*
|
|
653
|
+
* `agentClasses` is supplied by the tool hook for subagent-shaped calls. If
|
|
654
|
+
* absent, planning-dispatch fails closed so stale callers cannot silently
|
|
655
|
+
* bypass the agent allowlists. An explicitly supplied-but-empty list is
|
|
656
|
+
* allowed through so the downstream tool call can reject the malformed input.
|
|
583
657
|
*/
|
|
584
658
|
export function shouldBlockPlanningUnit(
|
|
585
659
|
toolName: string,
|
|
@@ -587,26 +661,77 @@ export function shouldBlockPlanningUnit(
|
|
|
587
661
|
basePath: string,
|
|
588
662
|
unitType: string,
|
|
589
663
|
policy: ToolsPolicy | null | undefined,
|
|
664
|
+
agentClasses?: readonly string[],
|
|
590
665
|
): { block: boolean; reason?: string } {
|
|
591
666
|
if (!policy) return { block: false };
|
|
592
667
|
if (policy.mode === "all") return { block: false };
|
|
593
668
|
|
|
594
669
|
const tool = toolName;
|
|
595
670
|
|
|
671
|
+
// Read-only mode: only Read-class tools are permitted.
|
|
596
672
|
if (policy.mode === "read-only") {
|
|
597
673
|
if (PLANNING_SAFE_TOOLS.has(tool)) return { block: false };
|
|
598
674
|
if (tool.startsWith("gsd_")) return { block: false };
|
|
599
675
|
if (PLANNING_WRITE_TOOLS.has(tool) || tool === "bash" || PLANNING_SUBAGENT_TOOLS.has(tool)) {
|
|
600
676
|
return { block: true, reason: blockReason(unitType, policy.mode, `${tool} is not permitted (read-only)`) };
|
|
601
677
|
}
|
|
678
|
+
// Unknown tool in read-only mode — block by default.
|
|
602
679
|
return { block: true, reason: blockReason(unitType, policy.mode, `tool "${tool}" is not on the read-only allowlist`) };
|
|
603
680
|
}
|
|
604
681
|
|
|
605
|
-
// planning / docs modes
|
|
682
|
+
// planning / planning-dispatch / docs modes share the same surface for safe tools, bash, and subagent.
|
|
606
683
|
if (PLANNING_SAFE_TOOLS.has(tool)) return { block: false };
|
|
607
684
|
if (tool.startsWith("gsd_")) return { block: false };
|
|
608
685
|
|
|
609
686
|
if (PLANNING_SUBAGENT_TOOLS.has(tool)) {
|
|
687
|
+
if (policy.mode === "planning-dispatch") {
|
|
688
|
+
const requested = (agentClasses ?? []).map(a => a.trim()).filter(Boolean);
|
|
689
|
+
const allowedSubagents = Array.isArray(policy.allowedSubagents) ? policy.allowedSubagents : [];
|
|
690
|
+
const allowed = new Set(allowedSubagents);
|
|
691
|
+
// When agentClasses is undefined, the caller has not been updated to extract
|
|
692
|
+
// agent identities yet. Block and warn so stale callers surface in telemetry
|
|
693
|
+
// instead of silently bypassing the gate.
|
|
694
|
+
if (agentClasses === undefined) {
|
|
695
|
+
warnMissingPlanningDispatchAgentClasses(unitType, policy.mode, tool);
|
|
696
|
+
return {
|
|
697
|
+
block: true,
|
|
698
|
+
reason: blockReason(
|
|
699
|
+
unitType,
|
|
700
|
+
policy.mode,
|
|
701
|
+
`subagent dispatch blocked: stale caller did not supply agent identities for "${tool}"; update extractSubagentAgentClasses to handle this input shape`,
|
|
702
|
+
),
|
|
703
|
+
};
|
|
704
|
+
}
|
|
705
|
+
// agentClasses was explicitly provided but resolved to an empty list (for
|
|
706
|
+
// example, a bare tool call with no agent field). Pass through; no agents
|
|
707
|
+
// to validate means the downstream tool call itself will fail.
|
|
708
|
+
if (requested.length === 0) {
|
|
709
|
+
return { block: false };
|
|
710
|
+
}
|
|
711
|
+
const globallyDisallowed = requested.find(a => !isReadOnlySpecialist(a));
|
|
712
|
+
if (globallyDisallowed) {
|
|
713
|
+
return {
|
|
714
|
+
block: true,
|
|
715
|
+
reason: blockReason(
|
|
716
|
+
unitType,
|
|
717
|
+
policy.mode,
|
|
718
|
+
`subagent dispatch of "${globallyDisallowed}" not permitted; only read-only specialists (${allowedPlanningDispatchAgentsList()}) may be dispatched from planning-dispatch units`,
|
|
719
|
+
),
|
|
720
|
+
};
|
|
721
|
+
}
|
|
722
|
+
const disallowedByPolicy = requested.find(a => !allowed.has(a));
|
|
723
|
+
if (disallowedByPolicy) {
|
|
724
|
+
return {
|
|
725
|
+
block: true,
|
|
726
|
+
reason: blockReason(
|
|
727
|
+
unitType,
|
|
728
|
+
policy.mode,
|
|
729
|
+
`subagent dispatch of "${disallowedByPolicy}" not permitted by ToolsPolicy.allowedSubagents; permitted agents for this unit: ${allowedSubagents.join(", ")}`,
|
|
730
|
+
),
|
|
731
|
+
};
|
|
732
|
+
}
|
|
733
|
+
return { block: false };
|
|
734
|
+
}
|
|
610
735
|
return { block: true, reason: blockReason(unitType, policy.mode, `subagent dispatch is not permitted in planning units`) };
|
|
611
736
|
}
|
|
612
737
|
|
|
@@ -628,8 +753,10 @@ export function shouldBlockPlanningUnit(
|
|
|
628
753
|
}
|
|
629
754
|
const absPath = isAbsolute(pathOrCommand) ? pathOrCommand : resolve(basePath, pathOrCommand);
|
|
630
755
|
|
|
756
|
+
// Always allow .gsd/ writes — that's where planning artifacts live.
|
|
631
757
|
if (isPathUnderGsd(absPath, basePath)) return { block: false };
|
|
632
758
|
|
|
759
|
+
// docs mode additionally allows the manifest's allowedPathGlobs.
|
|
633
760
|
if (policy.mode === "docs" && matchesAllowedGlob(absPath, basePath, policy.allowedPathGlobs)) {
|
|
634
761
|
return { block: false };
|
|
635
762
|
}
|
|
@@ -644,5 +771,8 @@ export function shouldBlockPlanningUnit(
|
|
|
644
771
|
};
|
|
645
772
|
}
|
|
646
773
|
|
|
774
|
+
// Unknown tool name — pass through. Other layers (queue, pending-gate,
|
|
775
|
+
// CONTEXT.md write) catch known mutating shapes; defaulting to allow here
|
|
776
|
+
// avoids breaking gsd_* MCP tools or future safe additions.
|
|
647
777
|
return { block: false };
|
|
648
778
|
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { existsSync, readFileSync, readdirSync } from "node:fs";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
|
-
import { join } from "node:path";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
4
|
|
|
5
5
|
import { loadRegistry } from "../workflow-templates.js";
|
|
6
|
-
import { resolveProjectRoot } from "../worktree.js";
|
|
7
6
|
|
|
8
7
|
const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
9
8
|
|
|
@@ -15,7 +14,7 @@ export interface GsdCommandDefinition {
|
|
|
15
14
|
type CompletionMap = Record<string, readonly GsdCommandDefinition[]>;
|
|
16
15
|
|
|
17
16
|
export const GSD_COMMAND_DESCRIPTION =
|
|
18
|
-
"GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|model|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|debug|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|onboarding|inspect|extensions|update|fast|mcp|rethink|codebase|notifications|ship|do|session-report|backlog|pr-branch|add-tests|scan|language";
|
|
17
|
+
"GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|model|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|debug|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|onboarding|inspect|extensions|update|fast|mcp|rethink|workflow|codebase|notifications|ship|do|session-report|backlog|pr-branch|add-tests|scan|language|worktree";
|
|
19
18
|
|
|
20
19
|
export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
|
|
21
20
|
{ cmd: "help", desc: "Categorized command reference with descriptions" },
|
|
@@ -84,6 +83,7 @@ export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
|
|
|
84
83
|
{ cmd: "add-tests", desc: "Generate tests for completed slices" },
|
|
85
84
|
{ cmd: "scan", desc: "Rapid codebase assessment — lightweight alternative to full map (--focus tech|arch|quality|concerns|tech+arch)" },
|
|
86
85
|
{ cmd: "language", desc: "Set or clear the global response language (e.g. /gsd language Chinese)" },
|
|
86
|
+
{ cmd: "worktree", desc: "Manage worktrees from the TUI (list, merge, clean, remove)" },
|
|
87
87
|
];
|
|
88
88
|
|
|
89
89
|
const NESTED_COMPLETIONS: CompletionMap = {
|
|
@@ -300,6 +300,12 @@ const NESTED_COMPLETIONS: CompletionMap = {
|
|
|
300
300
|
{ cmd: "off", desc: "Clear the language preference (revert to default)" },
|
|
301
301
|
{ cmd: "clear", desc: "Alias for off — clear the language preference" },
|
|
302
302
|
],
|
|
303
|
+
worktree: [
|
|
304
|
+
{ cmd: "list", desc: "Show all worktrees with status" },
|
|
305
|
+
{ cmd: "merge", desc: "Merge a worktree into main and clean up" },
|
|
306
|
+
{ cmd: "clean", desc: "Remove all merged/empty worktrees" },
|
|
307
|
+
{ cmd: "remove", desc: "Remove a worktree (--force to skip safety checks)" },
|
|
308
|
+
],
|
|
303
309
|
};
|
|
304
310
|
|
|
305
311
|
function filterOptions(
|
|
@@ -346,6 +352,77 @@ function getExtensionCompletions(prefix: string, action: string) {
|
|
|
346
352
|
}
|
|
347
353
|
}
|
|
348
354
|
|
|
355
|
+
function normalizePathForCompare(path: string): string {
|
|
356
|
+
return path.replaceAll("\\", "/").replace(/\/+$/, "");
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
function findWorktreeSegment(normalizedPath: string): { gsdIdx: number; afterWorktrees: number } | null {
|
|
360
|
+
const directMarker = "/.gsd/worktrees/";
|
|
361
|
+
const directIdx = normalizedPath.indexOf(directMarker);
|
|
362
|
+
if (directIdx !== -1) {
|
|
363
|
+
return { gsdIdx: directIdx, afterWorktrees: directIdx + directMarker.length };
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
const symlinkMatch = normalizedPath.match(/\/\.gsd\/projects\/[a-f0-9]+\/worktrees\//);
|
|
367
|
+
if (symlinkMatch?.index !== undefined) {
|
|
368
|
+
return { gsdIdx: symlinkMatch.index, afterWorktrees: symlinkMatch.index + symlinkMatch[0].length };
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
return null;
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
function resolveProjectRootFromGitFile(worktreePath: string): string | null {
|
|
375
|
+
try {
|
|
376
|
+
let dir = worktreePath;
|
|
377
|
+
for (let i = 0; i < 30; i++) {
|
|
378
|
+
const gitPath = join(dir, ".git");
|
|
379
|
+
if (existsSync(gitPath)) {
|
|
380
|
+
const content = readFileSync(gitPath, "utf8").trim();
|
|
381
|
+
if (content.startsWith("gitdir: ")) {
|
|
382
|
+
const gitDir = resolve(dir, content.slice(8));
|
|
383
|
+
const dotGitDir = resolve(gitDir, "..", "..");
|
|
384
|
+
if (dotGitDir.endsWith(".git") || dotGitDir.endsWith(".git/") || dotGitDir.endsWith(".git\\")) {
|
|
385
|
+
return resolve(dotGitDir, "..");
|
|
386
|
+
}
|
|
387
|
+
const commonDirPath = join(gitDir, "commondir");
|
|
388
|
+
if (existsSync(commonDirPath)) {
|
|
389
|
+
const commonDir = readFileSync(commonDirPath, "utf8").trim();
|
|
390
|
+
return resolve(resolve(gitDir, commonDir), "..");
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
break;
|
|
394
|
+
}
|
|
395
|
+
const parent = resolve(dir, "..");
|
|
396
|
+
if (parent === dir) break;
|
|
397
|
+
dir = parent;
|
|
398
|
+
}
|
|
399
|
+
} catch {
|
|
400
|
+
// Completion must stay best-effort.
|
|
401
|
+
}
|
|
402
|
+
return null;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
function resolveProjectRootForCompletion(basePath: string): string {
|
|
406
|
+
if (process.env.GSD_PROJECT_ROOT) return process.env.GSD_PROJECT_ROOT;
|
|
407
|
+
|
|
408
|
+
const normalizedPath = normalizePathForCompare(basePath);
|
|
409
|
+
const segment = findWorktreeSegment(normalizedPath);
|
|
410
|
+
if (!segment) return basePath;
|
|
411
|
+
|
|
412
|
+
const separator = basePath.includes("\\") ? "\\" : "/";
|
|
413
|
+
const gsdMarker = `${separator}.gsd${separator}`;
|
|
414
|
+
const gsdIdx = basePath.indexOf(gsdMarker);
|
|
415
|
+
const candidate = gsdIdx !== -1 ? basePath.slice(0, gsdIdx) : basePath.slice(0, segment.gsdIdx);
|
|
416
|
+
|
|
417
|
+
const normalizedGsdHome = normalizePathForCompare(gsdHome);
|
|
418
|
+
const candidateGsdPath = normalizePathForCompare(join(candidate, ".gsd"));
|
|
419
|
+
if (candidateGsdPath === normalizedGsdHome || candidateGsdPath.startsWith(`${normalizedGsdHome}/`)) {
|
|
420
|
+
return resolveProjectRootFromGitFile(basePath) ?? basePath;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
return candidate;
|
|
424
|
+
}
|
|
425
|
+
|
|
349
426
|
export function getGsdArgumentCompletions(prefix: string) {
|
|
350
427
|
const hasTrailingSpace = prefix.endsWith(" ");
|
|
351
428
|
const parts = prefix.trim().split(/\s+/);
|
|
@@ -406,7 +483,7 @@ export function getGsdArgumentCompletions(prefix: string) {
|
|
|
406
483
|
// Workflow definition-name completion for `workflow run <name>` and `workflow validate <name>`
|
|
407
484
|
if (command === "workflow" && (subcommand === "run" || subcommand === "validate") && parts.length <= 3) {
|
|
408
485
|
try {
|
|
409
|
-
const defsDir = join(
|
|
486
|
+
const defsDir = join(resolveProjectRootForCompletion(process.cwd()), ".gsd", "workflow-defs");
|
|
410
487
|
if (existsSync(defsDir)) {
|
|
411
488
|
return readdirSync(defsDir)
|
|
412
489
|
.filter((f) => f.endsWith(".yaml") && f.startsWith(third))
|
|
@@ -443,7 +520,7 @@ export function getGsdArgumentCompletions(prefix: string) {
|
|
|
443
520
|
} catch { /* ignore */ }
|
|
444
521
|
};
|
|
445
522
|
try {
|
|
446
|
-
const base =
|
|
523
|
+
const base = resolveProjectRootForCompletion(process.cwd());
|
|
447
524
|
scanDir(join(base, ".gsd", "workflows"), "project");
|
|
448
525
|
scanDir(join(base, ".gsd", "workflow-defs"), "project-legacy");
|
|
449
526
|
scanDir(join(gsdHome, "workflows"), "global");
|
|
@@ -64,16 +64,21 @@ export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
|
|
|
64
64
|
" /gsd pause Pause auto-mode (preserves state, /gsd auto to resume)",
|
|
65
65
|
" /gsd discuss Start guided milestone/slice discussion",
|
|
66
66
|
" /gsd new-milestone Create milestone from headless context (used by gsd headless)",
|
|
67
|
+
" /gsd quick Execute a quick task without full planning overhead",
|
|
68
|
+
" /gsd dispatch Dispatch a specific phase directly [research|plan|execute|complete|uat|replan]",
|
|
69
|
+
" /gsd parallel Parallel milestone orchestration [start|status|stop|pause|resume|merge|watch]",
|
|
70
|
+
" /gsd workflow Custom workflow lifecycle [new|run|list|validate|pause|resume]",
|
|
67
71
|
"",
|
|
68
72
|
"VISIBILITY",
|
|
69
73
|
` /gsd status Show progress dashboard (${formattedShortcutPair("dashboard")})`,
|
|
70
74
|
` /gsd parallel watch Open parallel worker monitor (${formattedShortcutPair("parallel")})`,
|
|
75
|
+
" /gsd widget Cycle status widget [full|small|min|off]",
|
|
71
76
|
" /gsd visualize Interactive 10-tab TUI (progress, timeline, deps, metrics, health, agent, changes, knowledge, captures, export)",
|
|
72
77
|
" /gsd queue Show queued/dispatched units and execution order",
|
|
73
78
|
" /gsd history View execution history [--cost] [--phase] [--model] [N]",
|
|
74
79
|
" /gsd changelog Show categorized release notes [version]",
|
|
75
80
|
` /gsd notifications View persistent notification history [clear|tail|filter] (${formattedShortcutPair("notifications")})`,
|
|
76
|
-
" /gsd logs Browse activity logs, debug logs, and metrics",
|
|
81
|
+
" /gsd logs Browse activity logs, debug logs, and metrics [debug|tail|clear]",
|
|
77
82
|
" /gsd debug Create/list/continue persistent debug sessions",
|
|
78
83
|
"",
|
|
79
84
|
"COURSE CORRECTION",
|
|
@@ -82,6 +87,9 @@ export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
|
|
|
82
87
|
" /gsd triage Classify and route pending captures",
|
|
83
88
|
" /gsd skip <unit> Prevent a unit from auto-mode dispatch",
|
|
84
89
|
" /gsd undo Revert last completed unit [--force]",
|
|
90
|
+
" /gsd undo-task Reset a specific task's completion state [DB + markdown]",
|
|
91
|
+
" /gsd reset-slice Reset a slice and all its tasks [DB + markdown]",
|
|
92
|
+
" /gsd rate Rate last unit's model tier [over|ok|under]",
|
|
85
93
|
" /gsd rethink Conversational project reorganization — reorder, park, discard, add milestones",
|
|
86
94
|
" /gsd park [id] Park a milestone — skip without deleting [reason]",
|
|
87
95
|
" /gsd unpark [id] Reactivate a parked milestone",
|
|
@@ -90,6 +98,15 @@ export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
|
|
|
90
98
|
" /gsd knowledge <type> <text> Add rule, pattern, or lesson to KNOWLEDGE.md",
|
|
91
99
|
" /gsd codebase [generate|update|stats] Manage the CODEBASE.md cache used in prompt context",
|
|
92
100
|
"",
|
|
101
|
+
"SHIPPING & BACKLOG",
|
|
102
|
+
" /gsd ship Create a PR from milestone artifacts [--dry-run|--draft|--base|--force]",
|
|
103
|
+
" /gsd do <text> Route freeform text to the right GSD command",
|
|
104
|
+
" /gsd session-report Show session cost, tokens, and work summary [--json|--save]",
|
|
105
|
+
" /gsd backlog Manage backlog items [add|promote|remove|list]",
|
|
106
|
+
" /gsd pr-branch Create a clean PR branch filtering .gsd/ commits [--dry-run|--name]",
|
|
107
|
+
" /gsd add-tests Generate tests for completed slices",
|
|
108
|
+
" /gsd scan Rapid codebase assessment [--focus tech|arch|quality|concerns|tech+arch]",
|
|
109
|
+
"",
|
|
93
110
|
"SETUP & CONFIGURATION",
|
|
94
111
|
" /gsd onboarding Re-run setup wizard [--resume|--reset|--step <name>]",
|
|
95
112
|
" /gsd setup Configuration hub [llm|model|search|remote|keys|prefs|onboarding]",
|
|
@@ -102,18 +119,23 @@ export function showHelp(ctx: ExtensionCommandContext, args = ""): void {
|
|
|
102
119
|
" /gsd config (deprecated) Set tool API keys — use /gsd keys instead",
|
|
103
120
|
" /gsd show-config Show effective configuration (models, routing, toggles)",
|
|
104
121
|
" /gsd hooks Show post-unit hook configuration",
|
|
122
|
+
" /gsd run-hook Manually trigger a specific hook",
|
|
123
|
+
" /gsd skill-health Skill lifecycle dashboard",
|
|
105
124
|
" /gsd extensions Manage extensions [list|enable|disable|info]",
|
|
106
125
|
" /gsd fast Toggle OpenAI service tier [on|off|flex|status]",
|
|
107
126
|
" /gsd mcp MCP server status and connectivity [status|check <server>|init [dir]]",
|
|
108
127
|
"",
|
|
109
128
|
"MAINTENANCE",
|
|
110
129
|
" /gsd doctor Diagnose and repair .gsd/ state [audit|fix|heal] [scope]",
|
|
130
|
+
" /gsd forensics Examine execution logs and post-mortem analysis",
|
|
111
131
|
" /gsd export Export milestone/slice results [--json|--markdown|--html] [--all]",
|
|
112
132
|
" /gsd cleanup Remove merged branches or snapshots [branches|snapshots]",
|
|
133
|
+
" /gsd worktree Manage worktrees from the TUI [list|merge|clean|remove]",
|
|
113
134
|
" /gsd migrate Migrate .planning/ (v1) to .gsd/ (v2) format",
|
|
114
135
|
" /gsd remote Control remote auto-mode [slack|discord|status|disconnect]",
|
|
115
136
|
" /gsd inspect Show SQLite DB diagnostics (schema, row counts, recent entries)",
|
|
116
137
|
" /gsd update Update GSD to the latest version via npm",
|
|
138
|
+
" /gsd language Set or clear the global response language [off|clear|<language>]",
|
|
117
139
|
];
|
|
118
140
|
const full = ["full", "--full", "all"].includes(args.trim().toLowerCase());
|
|
119
141
|
ctx.ui.notify((full ? fullLines : summaryLines).join("\n"), "info");
|
|
@@ -262,5 +262,15 @@ Examples:
|
|
|
262
262
|
await handleScan(trimmed.replace(/^scan\s*/, "").trim(), ctx, pi);
|
|
263
263
|
return true;
|
|
264
264
|
}
|
|
265
|
+
if (
|
|
266
|
+
trimmed === "worktree" ||
|
|
267
|
+
trimmed.startsWith("worktree ") ||
|
|
268
|
+
trimmed === "wt" ||
|
|
269
|
+
trimmed.startsWith("wt ")
|
|
270
|
+
) {
|
|
271
|
+
const { handleWorktree } = await import("../../commands-worktree.js");
|
|
272
|
+
await handleWorktree(trimmed.replace(/^(worktree|wt)\s*/, "").trim(), ctx);
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
265
275
|
return false;
|
|
266
276
|
}
|
|
@@ -8,6 +8,7 @@ import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
|
8
8
|
import { AuthStorage } from "@gsd/pi-coding-agent";
|
|
9
9
|
import { existsSync, mkdirSync } from "node:fs";
|
|
10
10
|
import { join, dirname } from "node:path";
|
|
11
|
+
import { getHomeDir } from "./home-dir.js";
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* Tool API key configurations.
|
|
@@ -34,7 +35,7 @@ function getStoredToolKey(auth: AuthStorage, providerId: string): string | undef
|
|
|
34
35
|
*/
|
|
35
36
|
export function loadToolApiKeys(): void {
|
|
36
37
|
try {
|
|
37
|
-
const authPath = join(
|
|
38
|
+
const authPath = join(getHomeDir(), ".gsd", "agent", "auth.json");
|
|
38
39
|
if (!existsSync(authPath)) return;
|
|
39
40
|
|
|
40
41
|
const auth = AuthStorage.create(authPath);
|
|
@@ -50,7 +51,7 @@ export function loadToolApiKeys(): void {
|
|
|
50
51
|
}
|
|
51
52
|
|
|
52
53
|
export function getConfigAuthStorage(): AuthStorage {
|
|
53
|
-
const authPath = join(
|
|
54
|
+
const authPath = join(getHomeDir(), ".gsd", "agent", "auth.json");
|
|
54
55
|
mkdirSync(dirname(authPath), { recursive: true });
|
|
55
56
|
return AuthStorage.create(authPath);
|
|
56
57
|
}
|
|
@@ -12,7 +12,47 @@ import { dirname, join, resolve } from "node:path";
|
|
|
12
12
|
import { homedir, tmpdir } from "node:os";
|
|
13
13
|
import { execFileSync } from "node:child_process";
|
|
14
14
|
import { lockSync, unlockSync } from "proper-lockfile";
|
|
15
|
-
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Strict numeric comparison of two npm-style version strings.
|
|
18
|
+
*
|
|
19
|
+
* Returns true when `a` is strictly greater than `b`. Compares the dotted
|
|
20
|
+
* release components numerically (so `1.10.0` > `1.9.0`) and treats any
|
|
21
|
+
* prerelease suffix (`-beta.1`, `-rc.2`) as less than the equivalent
|
|
22
|
+
* release version (`1.0.0` > `1.0.0-beta.1`). Sufficient for npm package
|
|
23
|
+
* version comparison in the extension installer; we don't need the full
|
|
24
|
+
* semver range/intersect machinery here.
|
|
25
|
+
*
|
|
26
|
+
* Replaces the earlier `import semver from "semver"` — that import broke
|
|
27
|
+
* `tsc -p tsconfig.json` whenever `@types/semver` failed to install
|
|
28
|
+
* (Issue #4946) because the file is pulled in transitively despite being
|
|
29
|
+
* under the `src/resources` exclude.
|
|
30
|
+
*/
|
|
31
|
+
export function isVersionGreater(a: string, b: string): boolean {
|
|
32
|
+
const split = (v: string): { release: number[]; pre: string | null } => {
|
|
33
|
+
const dash = v.indexOf("-");
|
|
34
|
+
const release = (dash === -1 ? v : v.slice(0, dash))
|
|
35
|
+
.split(".")
|
|
36
|
+
.map(part => Number.parseInt(part, 10) || 0);
|
|
37
|
+
const pre = dash === -1 ? null : v.slice(dash + 1);
|
|
38
|
+
return { release, pre };
|
|
39
|
+
};
|
|
40
|
+
const sa = split(a);
|
|
41
|
+
const sb = split(b);
|
|
42
|
+
const len = Math.max(sa.release.length, sb.release.length);
|
|
43
|
+
for (let i = 0; i < len; i++) {
|
|
44
|
+
const ai = sa.release[i] ?? 0;
|
|
45
|
+
const bi = sb.release[i] ?? 0;
|
|
46
|
+
if (ai !== bi) return ai > bi;
|
|
47
|
+
}
|
|
48
|
+
// Release components equal — a release version beats any prerelease,
|
|
49
|
+
// and prerelease strings are compared lexicographically (good enough
|
|
50
|
+
// for `beta.1` vs `beta.2`, the only realistic case here).
|
|
51
|
+
if (sa.pre === null && sb.pre !== null) return true;
|
|
52
|
+
if (sa.pre !== null && sb.pre === null) return false;
|
|
53
|
+
if (sa.pre !== null && sb.pre !== null) return sa.pre > sb.pre;
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
16
56
|
|
|
17
57
|
const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
18
58
|
|
|
@@ -538,7 +578,7 @@ async function updateSingleExtension(
|
|
|
538
578
|
return;
|
|
539
579
|
}
|
|
540
580
|
|
|
541
|
-
if (
|
|
581
|
+
if (isVersionGreater(latest, current)) {
|
|
542
582
|
ctx.ui.notify(`Updating "${id}": v${current} → v${latest}...`, "info");
|
|
543
583
|
await handleInstall(packageName, ctx);
|
|
544
584
|
} else {
|
|
@@ -599,7 +639,7 @@ async function updateAllExtensions(
|
|
|
599
639
|
continue;
|
|
600
640
|
}
|
|
601
641
|
|
|
602
|
-
if (
|
|
642
|
+
if (isVersionGreater(latest, current)) {
|
|
603
643
|
ctx.ui.notify(` ${entry.id}: v${current} → v${latest} (updating)`, "info");
|
|
604
644
|
await handleInstall(packageName, ctx);
|
|
605
645
|
updated++;
|