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
|
@@ -144,19 +144,10 @@ test("recoverTimedOutUnit: no top-level bumpTurnGeneration — steering branches
|
|
|
144
144
|
);
|
|
145
145
|
});
|
|
146
146
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
"utf-8",
|
|
155
|
-
);
|
|
156
|
-
const matches = src.match(/bumpAndResolveSynthetic\s*\(/g) ?? [];
|
|
157
|
-
assert.equal(
|
|
158
|
-
matches.length,
|
|
159
|
-
4,
|
|
160
|
-
`expected 4 advance-branch supersede sites (durableComplete, execute-task-exhausted, artifact-already-exists, non-execute-exhausted); found ${matches.length}`,
|
|
161
|
-
);
|
|
162
|
-
});
|
|
147
|
+
// Removed: source-grep count of `bumpAndResolveSynthetic\s*\(` occurrences.
|
|
148
|
+
// A literal 4 hardcodes the current branch shape, not behaviour. The
|
|
149
|
+
// behavioural invariant — "advance branches supersede atomically; non-advance
|
|
150
|
+
// branches do not bump" — is enforced by the previous test (no direct
|
|
151
|
+
// bumpTurnGeneration calls) plus the per-branch behavioural tests above
|
|
152
|
+
// (`recoverTimedOutUnit: …`). Refactors that split a branch into two would
|
|
153
|
+
// trip a count test without affecting correctness. Refs #4851.
|
|
@@ -199,8 +199,8 @@ test("#4934: every manifest declares a tools policy", () => {
|
|
|
199
199
|
}
|
|
200
200
|
});
|
|
201
201
|
|
|
202
|
-
test("#4934: tools.mode is one of the
|
|
203
|
-
const validModes = new Set(["all", "read-only", "planning", "docs"]);
|
|
202
|
+
test("#4934: tools.mode is one of the declared policies", () => {
|
|
203
|
+
const validModes = new Set(["all", "read-only", "planning", "planning-dispatch", "docs"]);
|
|
204
204
|
for (const [unitType, manifest] of Object.entries(UNIT_MANIFESTS)) {
|
|
205
205
|
const mode = (manifest as { tools: { mode: string } }).tools.mode;
|
|
206
206
|
assert.ok(
|
|
@@ -219,7 +219,42 @@ test('#4934: only execute-task and reactive-execute may use tools.mode "all" (fu
|
|
|
219
219
|
allowedAllUnits.has(unitType),
|
|
220
220
|
`manifest "${unitType}" declares tools.mode = "all" but is not on the execute-track. ` +
|
|
221
221
|
'Only execute-task and reactive-execute should have full source write access; ' +
|
|
222
|
-
'planning/discuss/research units must use "planning" (or "docs" for rewrite-docs).',
|
|
222
|
+
'planning/discuss/research units must use "planning" or "planning-dispatch" (or "docs" for rewrite-docs).',
|
|
223
|
+
);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
test('planning-dispatch mode is reserved for slice-level decomposition and completion units', () => {
|
|
229
|
+
const allowedDispatchUnits = new Set([
|
|
230
|
+
"plan-slice",
|
|
231
|
+
"refine-slice",
|
|
232
|
+
"complete-slice",
|
|
233
|
+
"complete-milestone",
|
|
234
|
+
]);
|
|
235
|
+
for (const [unitType, manifest] of Object.entries(UNIT_MANIFESTS)) {
|
|
236
|
+
const mode = (manifest as { tools: { mode: string } }).tools.mode;
|
|
237
|
+
if (mode === "planning-dispatch") {
|
|
238
|
+
assert.ok(
|
|
239
|
+
allowedDispatchUnits.has(unitType),
|
|
240
|
+
`manifest "${unitType}" declares tools.mode = "planning-dispatch" but is not on the dispatch-allowed allowlist. ` +
|
|
241
|
+
'planning-dispatch is intentionally narrow — extend the allowlist consciously when a new unit type genuinely benefits from subagent delegation.',
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
test('planning-dispatch manifests declare non-empty allowedSubagents lists', () => {
|
|
248
|
+
for (const [unitType, manifest] of Object.entries(UNIT_MANIFESTS)) {
|
|
249
|
+
if (manifest.tools.mode !== "planning-dispatch") continue;
|
|
250
|
+
assert.ok(
|
|
251
|
+
Array.isArray(manifest.tools.allowedSubagents) && manifest.tools.allowedSubagents.length > 0,
|
|
252
|
+
`manifest "${unitType}" has planning-dispatch policy but no allowedSubagents — explicit allowlist is required for runtime dispatch gating`,
|
|
253
|
+
);
|
|
254
|
+
for (const agent of manifest.tools.allowedSubagents) {
|
|
255
|
+
assert.ok(
|
|
256
|
+
typeof agent === "string" && agent.length > 0,
|
|
257
|
+
`manifest "${unitType}" has empty/invalid allowedSubagents entry: ${JSON.stringify(agent)}`,
|
|
223
258
|
);
|
|
224
259
|
}
|
|
225
260
|
}
|
|
@@ -76,13 +76,11 @@ describe("#3615 — structural: fallback exists with correct guards", () => {
|
|
|
76
76
|
);
|
|
77
77
|
});
|
|
78
78
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
);
|
|
85
|
-
});
|
|
79
|
+
// Removed: source-grep count of `return null;` occurrences. The behaviour
|
|
80
|
+
// we care about ("function returns null only when no auto-dispatch /
|
|
81
|
+
// guided-resume / fallback path matches") is exercised by the behavioural
|
|
82
|
+
// tests below — counting literal `return null;` tokens encodes statement
|
|
83
|
+
// shape, not contract. Refs #4851.
|
|
86
84
|
});
|
|
87
85
|
|
|
88
86
|
// ── Behavioral tests: RESUME_INTENT_PATTERNS ────────────────────────
|
|
@@ -4,7 +4,7 @@ import { mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
|
4
4
|
import { tmpdir } from "node:os";
|
|
5
5
|
import { join } from "node:path";
|
|
6
6
|
import { execSync } from "node:child_process";
|
|
7
|
-
import { runTurnGitAction } from "../git-service.ts";
|
|
7
|
+
import { handleTurnGitActionError, runTurnGitAction } from "../git-service.ts";
|
|
8
8
|
|
|
9
9
|
function run(cmd: string, cwd: string): string {
|
|
10
10
|
return execSync(cmd, { cwd, stdio: "pipe", encoding: "utf-8" }).trim();
|
|
@@ -83,3 +83,17 @@ test("uok gitops turn action commit creates commit with unit trailer", () => {
|
|
|
83
83
|
rmSync(repo, { recursive: true, force: true });
|
|
84
84
|
}
|
|
85
85
|
});
|
|
86
|
+
|
|
87
|
+
test("uok gitops turn action rethrows infrastructure failures", () => {
|
|
88
|
+
const err = Object.assign(new Error("ENFILE: file table overflow"), { code: "ENFILE" });
|
|
89
|
+
|
|
90
|
+
assert.throws(() => handleTurnGitActionError("commit", err), (thrown) => thrown === err);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test("uok gitops turn action keeps non-infrastructure git failures recoverable", () => {
|
|
94
|
+
const result = handleTurnGitActionError("commit", new Error("nothing to commit"));
|
|
95
|
+
|
|
96
|
+
assert.equal(result.action, "commit");
|
|
97
|
+
assert.equal(result.status, "failed");
|
|
98
|
+
assert.equal(result.error, "nothing to commit");
|
|
99
|
+
});
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
import { test } from "node:test";
|
|
14
14
|
import assert from "node:assert/strict";
|
|
15
15
|
|
|
16
|
-
import { GSDVisualizerOverlay } from "../visualizer-overlay.ts";
|
|
16
|
+
import { GSDVisualizerOverlay, TAB_COUNT } from "../visualizer-overlay.ts";
|
|
17
17
|
|
|
18
18
|
function makeTui() {
|
|
19
19
|
const renders: number[] = [];
|
|
@@ -93,16 +93,16 @@ test("overlay switches tabs via 1–9,0 digit keys", (t) => {
|
|
|
93
93
|
|
|
94
94
|
test("overlay Tab key cycles forward and wraps around at TAB_COUNT", (t) => {
|
|
95
95
|
const { overlay } = makeOverlay(t);
|
|
96
|
-
overlay.activeTab =
|
|
96
|
+
overlay.activeTab = TAB_COUNT - 1;
|
|
97
97
|
overlay.handleInput("\t");
|
|
98
|
-
assert.equal(overlay.activeTab, 0,
|
|
98
|
+
assert.equal(overlay.activeTab, 0, `Tab wraps from ${TAB_COUNT - 1} back to 0`);
|
|
99
99
|
});
|
|
100
100
|
|
|
101
101
|
test("overlay Shift+Tab cycles backward and wraps", (t) => {
|
|
102
102
|
const { overlay } = makeOverlay(t);
|
|
103
103
|
overlay.activeTab = 0;
|
|
104
104
|
overlay.handleInput("\u001b[Z");
|
|
105
|
-
assert.equal(overlay.activeTab,
|
|
105
|
+
assert.equal(overlay.activeTab, TAB_COUNT - 1, `Shift+Tab wraps from 0 to ${TAB_COUNT - 1}`);
|
|
106
106
|
});
|
|
107
107
|
|
|
108
108
|
// ─── Filter mode ─────────────────────────────────────────────────────────
|
|
@@ -331,9 +331,9 @@ test("overlay footer hint mentions tab navigation, filter, scroll, and help", (t
|
|
|
331
331
|
|
|
332
332
|
// ─── Scroll offsets array is sized to TAB_COUNT ──────────────────────────
|
|
333
333
|
|
|
334
|
-
test("overlay scrollOffsets array has one slot per tab
|
|
334
|
+
test("overlay scrollOffsets array has one slot per tab", (t) => {
|
|
335
335
|
const { overlay } = makeOverlay(t);
|
|
336
|
-
assert.equal(overlay.scrollOffsets.length,
|
|
336
|
+
assert.equal(overlay.scrollOffsets.length, TAB_COUNT, "scrollOffsets sized to TAB_COUNT");
|
|
337
337
|
assert.ok(overlay.scrollOffsets.every((n: number) => n === 0), "initialized to zero");
|
|
338
338
|
});
|
|
339
339
|
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
listWorktrees,
|
|
21
21
|
worktreePath,
|
|
22
22
|
} from "../worktree-manager.ts";
|
|
23
|
-
import {
|
|
23
|
+
import { test } from 'node:test';
|
|
24
24
|
import assert from 'node:assert/strict';
|
|
25
25
|
|
|
26
26
|
|
|
@@ -28,37 +28,41 @@ function run(command: string, cwd: string): string {
|
|
|
28
28
|
return execSync(command, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
// Resolve tmpdir to handle macOS /tmp -> /private/var/... symlink.
|
|
34
|
-
const realTmp = realpathSync(tmpdir());
|
|
35
|
-
const base = mkdtempSync(join(realTmp, "gsd-wt-symlink-test-"));
|
|
36
|
-
const externalState = mkdtempSync(join(realTmp, "gsd-wt-symlink-ext-"));
|
|
37
|
-
|
|
38
|
-
run("git init -b main", base);
|
|
39
|
-
run('git config user.name "Test"', base);
|
|
40
|
-
run('git config user.email "test@example.com"', base);
|
|
41
|
-
|
|
42
|
-
// Create external state directory structure
|
|
43
|
-
mkdirSync(join(externalState, "worktrees"), { recursive: true });
|
|
44
|
-
|
|
45
|
-
// Create .gsd as a symlink to the external state directory
|
|
46
|
-
symlinkSync(externalState, join(base, ".gsd"));
|
|
47
|
-
|
|
48
|
-
// Verify the symlink is in place
|
|
49
|
-
assert.ok(existsSync(join(base, ".gsd")), ".gsd symlink exists");
|
|
50
|
-
assert.ok(
|
|
51
|
-
realpathSync(join(base, ".gsd")) === externalState,
|
|
52
|
-
".gsd resolves to external state dir",
|
|
53
|
-
);
|
|
31
|
+
test('worktree-symlink-removal removes the git-registered symlink target safely', (t) => {
|
|
32
|
+
console.log("\n=== #1852: removeWorktree with symlinked .gsd/ ===");
|
|
54
33
|
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
34
|
+
// Set up a test repo with .gsd/ as a symlink to an external directory,
|
|
35
|
+
// mimicking the external state directory layout (~/.gsd/projects/<hash>/).
|
|
36
|
+
// Resolve tmpdir to handle macOS /tmp -> /private/var/... symlink.
|
|
37
|
+
const realTmp = realpathSync(tmpdir());
|
|
38
|
+
const base = mkdtempSync(join(realTmp, "gsd-wt-symlink-test-"));
|
|
39
|
+
const externalState = mkdtempSync(join(realTmp, "gsd-wt-symlink-ext-"));
|
|
40
|
+
t.after(() => {
|
|
41
|
+
rmSync(base, { recursive: true, force: true });
|
|
42
|
+
rmSync(externalState, { recursive: true, force: true });
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
run("git init -b main", base);
|
|
46
|
+
run('git config user.name "Test"', base);
|
|
47
|
+
run('git config user.email "test@example.com"', base);
|
|
48
|
+
|
|
49
|
+
// Create external state directory structure
|
|
50
|
+
mkdirSync(join(externalState, "worktrees"), { recursive: true });
|
|
51
|
+
|
|
52
|
+
// Create .gsd as a symlink to the external state directory
|
|
53
|
+
symlinkSync(externalState, join(base, ".gsd"));
|
|
54
|
+
|
|
55
|
+
// Verify the symlink is in place
|
|
56
|
+
assert.ok(existsSync(join(base, ".gsd")), ".gsd symlink exists");
|
|
57
|
+
assert.ok(
|
|
58
|
+
realpathSync(join(base, ".gsd")) === externalState,
|
|
59
|
+
".gsd resolves to external state dir",
|
|
60
|
+
);
|
|
59
61
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
+
// Create initial commit so we have a valid repo
|
|
63
|
+
writeFileSync(join(base, "README.md"), "# Test\n", "utf-8");
|
|
64
|
+
run("git add .", base);
|
|
65
|
+
run('git commit -m "init"', base);
|
|
62
66
|
|
|
63
67
|
// Create a worktree — git will resolve the symlink and register
|
|
64
68
|
// the worktree at the external path
|
|
@@ -127,7 +131,4 @@ describe('worktree-symlink-removal', async () => {
|
|
|
127
131
|
const listed = listWorktrees(base);
|
|
128
132
|
assert.deepStrictEqual(listed.length, 0, "no worktrees listed after removal");
|
|
129
133
|
|
|
130
|
-
// Cleanup
|
|
131
|
-
rmSync(base, { recursive: true, force: true });
|
|
132
|
-
rmSync(externalState, { recursive: true, force: true });
|
|
133
134
|
});
|
|
@@ -255,6 +255,14 @@ describe('worktree', async () => {
|
|
|
255
255
|
"returns unchanged for non-worktree path",
|
|
256
256
|
);
|
|
257
257
|
|
|
258
|
+
const nestedRepoDir = join(base, "packages", "demo");
|
|
259
|
+
mkdirSync(nestedRepoDir, { recursive: true });
|
|
260
|
+
assert.deepStrictEqual(
|
|
261
|
+
normalizePath(resolveProjectRoot(nestedRepoDir)),
|
|
262
|
+
normalizePath(base),
|
|
263
|
+
"resolves normal repo subdirectories to the project root",
|
|
264
|
+
);
|
|
265
|
+
|
|
258
266
|
// Without GSD_PROJECT_ROOT, direct layout with nested subdirs
|
|
259
267
|
assert.deepStrictEqual(
|
|
260
268
|
resolveProjectRoot("/data/.gsd/worktrees/M003/nested"),
|
|
@@ -9,11 +9,21 @@ import test from 'node:test';
|
|
|
9
9
|
import assert from 'node:assert/strict';
|
|
10
10
|
import { join, sep } from 'node:path';
|
|
11
11
|
|
|
12
|
-
import { shouldBlockPlanningUnit } from '../bootstrap/write-gate.ts';
|
|
12
|
+
import { ALLOWED_PLANNING_DISPATCH_AGENTS, shouldBlockPlanningUnit } from '../bootstrap/write-gate.ts';
|
|
13
|
+
import { extractSubagentAgentClasses } from '../bootstrap/subagent-input.ts';
|
|
14
|
+
import { isDeterministicPolicyError } from '../auto-tool-tracking.ts';
|
|
13
15
|
import type { ToolsPolicy } from '../unit-context-manifest.ts';
|
|
14
16
|
|
|
15
17
|
const BASE = join('/tmp', 'fake-project');
|
|
16
18
|
const PLANNING: ToolsPolicy = { mode: 'planning' };
|
|
19
|
+
const PLANNING_DISPATCH: ToolsPolicy = {
|
|
20
|
+
mode: 'planning-dispatch',
|
|
21
|
+
allowedSubagents: [...ALLOWED_PLANNING_DISPATCH_AGENTS],
|
|
22
|
+
};
|
|
23
|
+
const PLANNING_DISPATCH_REVIEW: ToolsPolicy = {
|
|
24
|
+
mode: 'planning-dispatch',
|
|
25
|
+
allowedSubagents: ['reviewer', 'security', 'tester'],
|
|
26
|
+
};
|
|
17
27
|
const READ_ONLY: ToolsPolicy = { mode: 'read-only' };
|
|
18
28
|
const ALL: ToolsPolicy = { mode: 'all' };
|
|
19
29
|
const DOCS: ToolsPolicy = {
|
|
@@ -36,6 +46,20 @@ test('planning-unit: blocks edit to user source (the b23 forensic)', () => {
|
|
|
36
46
|
assert.match(r.reason!, /discuss-milestone/);
|
|
37
47
|
});
|
|
38
48
|
|
|
49
|
+
test('planning-unit: deterministic block reason is suitable for retry short-circuiting', () => {
|
|
50
|
+
const r = shouldBlockPlanningUnit(
|
|
51
|
+
'edit',
|
|
52
|
+
'src/main.ts',
|
|
53
|
+
BASE,
|
|
54
|
+
'discuss-milestone',
|
|
55
|
+
PLANNING,
|
|
56
|
+
);
|
|
57
|
+
assert.strictEqual(r.block, true);
|
|
58
|
+
assert.match(r.reason!, /HARD BLOCK/);
|
|
59
|
+
assert.match(r.reason!, /tools-policy/);
|
|
60
|
+
assert.strictEqual(isDeterministicPolicyError(r.reason!), true);
|
|
61
|
+
});
|
|
62
|
+
|
|
39
63
|
test('planning-unit: blocks write to user source via relative path', () => {
|
|
40
64
|
const r = shouldBlockPlanningUnit('write', 'src/main.ts', BASE, 'plan-milestone', PLANNING);
|
|
41
65
|
assert.strictEqual(r.block, true);
|
|
@@ -128,6 +152,112 @@ test('planning-unit: blocks task tool (alt subagent name)', () => {
|
|
|
128
152
|
assert.strictEqual(r.block, true);
|
|
129
153
|
});
|
|
130
154
|
|
|
155
|
+
test('planning-dispatch: allows subagent dispatch (delegated recon/planner during slice planning)', () => {
|
|
156
|
+
const r = shouldBlockPlanningUnit('subagent', '', BASE, 'plan-slice', PLANNING_DISPATCH, ['scout']);
|
|
157
|
+
assert.strictEqual(r.block, false);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
test('planning-dispatch: allows task dispatch (delegated recon/planner during slice planning)', () => {
|
|
161
|
+
const r = shouldBlockPlanningUnit('task', '', BASE, 'plan-slice', PLANNING_DISPATCH, ['planner']);
|
|
162
|
+
assert.strictEqual(r.block, false);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
test('planning-dispatch: extracts subagent classes from single, parallel, and chain inputs', () => {
|
|
166
|
+
assert.deepEqual(extractSubagentAgentClasses({ agent: ' scout ' }), ['scout']);
|
|
167
|
+
assert.deepEqual(
|
|
168
|
+
extractSubagentAgentClasses({ tasks: [{ agent: 'planner' }, { agent: ' tester ' }] }),
|
|
169
|
+
['planner', 'tester'],
|
|
170
|
+
);
|
|
171
|
+
assert.deepEqual(
|
|
172
|
+
extractSubagentAgentClasses({ chain: [{ agent: 'reviewer' }, { agent: 'security' }] }),
|
|
173
|
+
['reviewer', 'security'],
|
|
174
|
+
);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
test('planning-dispatch: blocks subagent dispatch when agentClasses is undefined (stale caller shim)', () => {
|
|
178
|
+
const r = shouldBlockPlanningUnit('subagent', '', BASE, 'plan-slice', PLANNING_DISPATCH, undefined);
|
|
179
|
+
assert.strictEqual(r.block, true);
|
|
180
|
+
assert.match(r.reason!, /stale caller/);
|
|
181
|
+
assert.match(r.reason!, /tools-policy "planning-dispatch"/);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
test('planning-dispatch: allows explicitly empty agent classes for downstream validation', () => {
|
|
185
|
+
const emptyClasses = extractSubagentAgentClasses({});
|
|
186
|
+
assert.deepEqual(emptyClasses, []);
|
|
187
|
+
const empty = shouldBlockPlanningUnit('subagent', '', BASE, 'plan-slice', PLANNING_DISPATCH, emptyClasses);
|
|
188
|
+
assert.strictEqual(empty.block, false);
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
test('planning-dispatch: allows all globally allowed specialists when listed by policy', () => {
|
|
192
|
+
const policy: ToolsPolicy = {
|
|
193
|
+
mode: 'planning-dispatch',
|
|
194
|
+
allowedSubagents: [...ALLOWED_PLANNING_DISPATCH_AGENTS],
|
|
195
|
+
};
|
|
196
|
+
const r = shouldBlockPlanningUnit(
|
|
197
|
+
'subagent',
|
|
198
|
+
'',
|
|
199
|
+
BASE,
|
|
200
|
+
'complete-milestone',
|
|
201
|
+
policy,
|
|
202
|
+
[...ALLOWED_PLANNING_DISPATCH_AGENTS],
|
|
203
|
+
);
|
|
204
|
+
assert.strictEqual(r.block, false);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
test('planning-dispatch: blocks implementation-tier agent', () => {
|
|
208
|
+
const r = shouldBlockPlanningUnit('subagent', '', BASE, 'plan-slice', PLANNING_DISPATCH, ['worker']);
|
|
209
|
+
assert.strictEqual(r.block, true);
|
|
210
|
+
assert.match(r.reason!, /"worker"/);
|
|
211
|
+
assert.match(r.reason!, /read-only specialists/);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
test('planning-dispatch: blocks globally disallowed agent even if listed by policy', () => {
|
|
215
|
+
const policy: ToolsPolicy = {
|
|
216
|
+
mode: 'planning-dispatch',
|
|
217
|
+
allowedSubagents: ['refactorer'],
|
|
218
|
+
};
|
|
219
|
+
const r = shouldBlockPlanningUnit('subagent', '', BASE, 'refine-slice', policy, ['refactorer']);
|
|
220
|
+
assert.strictEqual(r.block, true);
|
|
221
|
+
assert.match(r.reason!, /"refactorer"/);
|
|
222
|
+
assert.match(r.reason!, /read-only specialists/);
|
|
223
|
+
assert.doesNotMatch(r.reason!, /ToolsPolicy\.allowedSubagents|permitted agents for this unit/);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
test('planning-dispatch: blocks mixed batch containing a disallowed agent', () => {
|
|
227
|
+
const r = shouldBlockPlanningUnit('subagent', '', BASE, 'plan-slice', PLANNING_DISPATCH, ['scout', 'worker']);
|
|
228
|
+
assert.strictEqual(r.block, true);
|
|
229
|
+
assert.match(r.reason!, /"worker"/);
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
test('planning-dispatch: allows review-tier agent under closeout policy', () => {
|
|
233
|
+
const r = shouldBlockPlanningUnit('subagent', '', BASE, 'complete-slice', PLANNING_DISPATCH_REVIEW, ['reviewer']);
|
|
234
|
+
assert.strictEqual(r.block, false);
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
test('planning-dispatch: blocks recon agent under closeout policy', () => {
|
|
238
|
+
const r = shouldBlockPlanningUnit('subagent', '', BASE, 'complete-slice', PLANNING_DISPATCH_REVIEW, ['scout']);
|
|
239
|
+
assert.strictEqual(r.block, true);
|
|
240
|
+
assert.match(r.reason!, /"scout"/);
|
|
241
|
+
assert.match(r.reason!, /ToolsPolicy\.allowedSubagents|permitted agents for this unit/);
|
|
242
|
+
assert.doesNotMatch(r.reason!, /read-only specialists/);
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
test('planning-dispatch: still blocks writes to user source (write isolation preserved)', () => {
|
|
246
|
+
const r = shouldBlockPlanningUnit('write', join(BASE, 'src', 'main.ts'), BASE, 'plan-slice', PLANNING_DISPATCH);
|
|
247
|
+
assert.strictEqual(r.block, true);
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
test('planning-dispatch: still allows writes inside .gsd/', () => {
|
|
251
|
+
const r = shouldBlockPlanningUnit(
|
|
252
|
+
'write',
|
|
253
|
+
join(BASE, '.gsd', 'milestones', 'M001', 'slices', 'S01', 'PLAN.md'),
|
|
254
|
+
BASE,
|
|
255
|
+
'plan-slice',
|
|
256
|
+
PLANNING_DISPATCH,
|
|
257
|
+
);
|
|
258
|
+
assert.strictEqual(r.block, false);
|
|
259
|
+
});
|
|
260
|
+
|
|
131
261
|
// ─── planning mode: pass-through tools ────────────────────────────────────
|
|
132
262
|
|
|
133
263
|
test('planning-unit: allows read tool', () => {
|
|
@@ -96,8 +96,24 @@ export function executeMemoryCapture(params: MemoryCaptureParams): ToolExecution
|
|
|
96
96
|
const tags = normalizeTags(params.tags);
|
|
97
97
|
|
|
98
98
|
const structuredFields = normalizeStructuredFields(params.structuredFields);
|
|
99
|
-
|
|
99
|
+
let id: string | null;
|
|
100
|
+
try {
|
|
101
|
+
id = createMemory({ category, content, confidence, scope, tags, structuredFields });
|
|
102
|
+
} catch (err) {
|
|
103
|
+
// Surface the underlying SQL message (e.g. "database disk image is
|
|
104
|
+
// malformed", "no such table: memories") so the operator gets the
|
|
105
|
+
// actionable signal instead of an opaque "create_failed". See #4967.
|
|
106
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
107
|
+
return {
|
|
108
|
+
content: [{ type: "text", text: `Error: failed to create memory: ${message}` }],
|
|
109
|
+
details: { operation: "memory_capture", error: message },
|
|
110
|
+
isError: true,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
100
113
|
if (!id) {
|
|
114
|
+
// DB unavailable or adapter missing — distinct from the SQL-error path
|
|
115
|
+
// above. Keep the legacy create_failed token here so any consumers that
|
|
116
|
+
// explicitly key on the unavailable case continue to work.
|
|
101
117
|
return {
|
|
102
118
|
content: [{ type: "text", text: "Error: failed to create memory." }],
|
|
103
119
|
details: { operation: "memory_capture", error: "create_failed" },
|
|
@@ -93,10 +93,10 @@ export type PreferencesPolicy = "none" | "active-only" | "full";
|
|
|
93
93
|
/**
|
|
94
94
|
* Tool-access policy per unit type (#4934).
|
|
95
95
|
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
98
|
-
*
|
|
99
|
-
*
|
|
96
|
+
* Runtime-enforced by the GSD write gate for active auto-mode units. The
|
|
97
|
+
* manifest declares the allowed tool surface; register-hooks.ts resolves the
|
|
98
|
+
* active unit's manifest before each tool call and write-gate.ts rejects
|
|
99
|
+
* violations before the tool executes.
|
|
100
100
|
*
|
|
101
101
|
* Modes:
|
|
102
102
|
* - "all" — Read + Edit/Write/MultiEdit/NotebookEdit + Bash + Task.
|
|
@@ -111,6 +111,12 @@ export type PreferencesPolicy = "none" | "active-only" | "full";
|
|
|
111
111
|
* Task subagent dispatch denied. Catches the bug class
|
|
112
112
|
* where a discuss-milestone turn modifies user source
|
|
113
113
|
* files (forensics: ~/Github/test-apps/b23, #4934).
|
|
114
|
+
* - "planning-dispatch"
|
|
115
|
+
* — Same read + .gsd/** write + safe-Bash surface as
|
|
116
|
+
* "planning", but permits controlled subagent dispatch
|
|
117
|
+
* only to the agents listed in the ToolsPolicy
|
|
118
|
+
* `allowedSubagents` field. See write-gate.ts for the
|
|
119
|
+
* runtime agent-class enforcement details.
|
|
114
120
|
* - "docs" — Read tools always; writes restricted to .gsd/** AND
|
|
115
121
|
* the explicit `allowedPathGlobs` set; Bash safe-allowlist;
|
|
116
122
|
* no subagents. Reserved for rewrite-docs, which legitimately
|
|
@@ -125,6 +131,7 @@ export type ToolsPolicy =
|
|
|
125
131
|
| { readonly mode: "all" }
|
|
126
132
|
| { readonly mode: "read-only" }
|
|
127
133
|
| { readonly mode: "planning" }
|
|
134
|
+
| { readonly mode: "planning-dispatch"; readonly allowedSubagents: readonly string[] }
|
|
128
135
|
| { readonly mode: "docs"; readonly allowedPathGlobs: readonly string[] };
|
|
129
136
|
|
|
130
137
|
// ─── Computed-artifact registry (#4924 v2 contract) ───────────────────────
|
|
@@ -214,10 +221,10 @@ export interface UnitContextManifest {
|
|
|
214
221
|
/** Preferences block policy. */
|
|
215
222
|
readonly preferences: PreferencesPolicy;
|
|
216
223
|
/**
|
|
217
|
-
* Tool-access policy (#4934).
|
|
218
|
-
*
|
|
219
|
-
*
|
|
220
|
-
*
|
|
224
|
+
* Tool-access policy (#4934). Runtime enforcement covers path-scoped write
|
|
225
|
+
* blocking, subagent denial, and bash allowlisting for active auto-mode
|
|
226
|
+
* units. Required on every manifest so missing entries fail loud via the CI
|
|
227
|
+
* invariant test rather than defaulting to "all" silently.
|
|
221
228
|
*/
|
|
222
229
|
readonly tools: ToolsPolicy;
|
|
223
230
|
/** Artifact handling: inline (full body), excerpt (compact), or on-demand (path only). */
|
|
@@ -268,6 +275,18 @@ const COMMON_BUDGET_SMALL = 250_000; // ~65K tokens
|
|
|
268
275
|
|
|
269
276
|
const TOOLS_ALL: ToolsPolicy = { mode: "all" };
|
|
270
277
|
const TOOLS_PLANNING: ToolsPolicy = { mode: "planning" };
|
|
278
|
+
// Like TOOLS_PLANNING but permits dispatch to read-only recon/planning
|
|
279
|
+
// specialists. Runtime-enforced by write-gate.ts before the subagent tool runs.
|
|
280
|
+
const TOOLS_PLANNING_DISPATCH_RECON: ToolsPolicy = {
|
|
281
|
+
mode: "planning-dispatch",
|
|
282
|
+
allowedSubagents: ["scout", "planner"],
|
|
283
|
+
};
|
|
284
|
+
// Like TOOLS_PLANNING_DISPATCH_RECON, but for closeout units that fan out
|
|
285
|
+
// verification work to review-tier specialists.
|
|
286
|
+
const TOOLS_PLANNING_DISPATCH_REVIEW: ToolsPolicy = {
|
|
287
|
+
mode: "planning-dispatch",
|
|
288
|
+
allowedSubagents: ["reviewer", "security", "tester"],
|
|
289
|
+
};
|
|
271
290
|
const TOOLS_DOCS: ToolsPolicy = {
|
|
272
291
|
mode: "docs",
|
|
273
292
|
// Globs are resolved relative to project basePath. The set is intentionally
|
|
@@ -376,7 +395,11 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
376
395
|
memory: "prompt-relevant",
|
|
377
396
|
codebaseMap: false,
|
|
378
397
|
preferences: "active-only",
|
|
379
|
-
|
|
398
|
+
// planning-dispatch: completion is a high-leverage place to fan out to
|
|
399
|
+
// reviewer / security / tester subagents. They read the diff and report
|
|
400
|
+
// findings; they do not write user source. Write isolation to .gsd/ is
|
|
401
|
+
// preserved.
|
|
402
|
+
tools: TOOLS_PLANNING_DISPATCH_REVIEW,
|
|
380
403
|
artifacts: {
|
|
381
404
|
// #4780 landed slice-summary as excerpt for this unit; phase 2 of
|
|
382
405
|
// the architecture will read this manifest as the source of truth
|
|
@@ -409,7 +432,10 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
409
432
|
memory: "prompt-relevant",
|
|
410
433
|
codebaseMap: true,
|
|
411
434
|
preferences: "active-only",
|
|
412
|
-
|
|
435
|
+
// planning-dispatch: allows subagent dispatch so the planner can fan out
|
|
436
|
+
// to scout for codebase recon and to planner/decompose-style specialists
|
|
437
|
+
// for sub-decomposition. Write-isolation to .gsd/ is preserved.
|
|
438
|
+
tools: TOOLS_PLANNING_DISPATCH_RECON,
|
|
413
439
|
artifacts: {
|
|
414
440
|
inline: ["roadmap", "slice-research", "dependency-summaries", "requirements", "decisions", "templates"],
|
|
415
441
|
excerpt: [],
|
|
@@ -423,7 +449,10 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
423
449
|
memory: "prompt-relevant",
|
|
424
450
|
codebaseMap: true,
|
|
425
451
|
preferences: "active-only",
|
|
426
|
-
|
|
452
|
+
// See plan-slice — same rationale: dispatch to scout/planner-style
|
|
453
|
+
// specialists during refinement is materially better than re-doing recon
|
|
454
|
+
// inline.
|
|
455
|
+
tools: TOOLS_PLANNING_DISPATCH_RECON,
|
|
427
456
|
artifacts: {
|
|
428
457
|
inline: ["slice-plan", "slice-research", "dependency-summaries", "templates"],
|
|
429
458
|
excerpt: [],
|
|
@@ -451,7 +480,10 @@ export const UNIT_MANIFESTS: Record<UnitType, UnitContextManifest> = {
|
|
|
451
480
|
memory: "prompt-relevant",
|
|
452
481
|
codebaseMap: false,
|
|
453
482
|
preferences: "active-only",
|
|
454
|
-
|
|
483
|
+
// See complete-milestone — same rationale: dispatch to reviewer / security /
|
|
484
|
+
// tester subagents to fan out review work without bloating this unit's
|
|
485
|
+
// context.
|
|
486
|
+
tools: TOOLS_PLANNING_DISPATCH_REVIEW,
|
|
455
487
|
artifacts: {
|
|
456
488
|
// Phase 3 migration (#4782): matches today's actual
|
|
457
489
|
// buildCompleteSlicePrompt inlining order. Overrides prepend +
|
|
@@ -98,13 +98,15 @@ export function readGitBranch(projectRoot: string): string {
|
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
/**
|
|
101
|
-
* Read MCP server names from .mcp.json
|
|
101
|
+
* Read MCP server names from .mcp.json, .gsd/mcp.json, and the global
|
|
102
|
+
* ~/.gsd/mcp.json (or $GSD_HOME/mcp.json).
|
|
102
103
|
* Returns array of server name strings.
|
|
103
104
|
*/
|
|
104
105
|
export function readMcpServerNames(projectRoot: string): string[] {
|
|
105
106
|
const configPaths = [
|
|
106
107
|
join(projectRoot, ".mcp.json"),
|
|
107
108
|
join(projectRoot, ".gsd", "mcp.json"),
|
|
109
|
+
join(process.env.GSD_HOME || join(homedir(), ".gsd"), "mcp.json"),
|
|
108
110
|
];
|
|
109
111
|
const names: string[] = [];
|
|
110
112
|
const seen = new Set<string>();
|
|
@@ -66,6 +66,7 @@ export type LogComponent =
|
|
|
66
66
|
| "memory-embeddings" // Memory layer embedding generation
|
|
67
67
|
| "memory-ingest" // Memory layer ingestion pipeline
|
|
68
68
|
| "memory-backfill" // ADR-013: decisions->memories backfill
|
|
69
|
+
| "memory-store" // Memory CRUD layer — surfaces SQLite/store-level faults (#4967)
|
|
69
70
|
| "context-mode" // Context-mode exec sandbox and compaction snapshot
|
|
70
71
|
| "preflight" // Clean-root preflight gate at milestone completion
|
|
71
72
|
| "postUnit"; // Post-unit processing (abandon detection, overrides)
|