@opengsd/gsd-pi 1.9.0 → 1.10.0-dev.a5e42e99
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 +10 -9
- package/dist/headless.js +2 -1
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +2 -2
- package/dist/resources/extensions/gsd/artifact-verification.js +3 -4
- package/dist/resources/extensions/gsd/auto/loop.js +24 -4
- package/dist/resources/extensions/gsd/auto/run-unit.js +19 -1
- package/dist/resources/extensions/gsd/auto/unit-phase.js +37 -5
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +14 -8
- package/dist/resources/extensions/gsd/auto-dispatch.js +2 -0
- package/dist/resources/extensions/gsd/auto-model-selection.js +1 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +102 -21
- package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
- package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -5
- package/dist/resources/extensions/gsd/auto-start.js +30 -10
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +40 -0
- package/dist/resources/extensions/gsd/auto-verification.js +25 -12
- package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +7 -3
- package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +15 -5
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -0
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -7
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +7 -26
- package/dist/resources/extensions/gsd/commands-verdict.js +10 -9
- package/dist/resources/extensions/gsd/compat/compat-marker.js +80 -5
- package/dist/resources/extensions/gsd/constants.js +12 -13
- package/dist/resources/extensions/gsd/context-masker.js +97 -21
- package/dist/resources/extensions/gsd/db/engine.js +5 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +33 -2
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +40 -12
- package/dist/resources/extensions/gsd/error-classifier.js +12 -2
- package/dist/resources/extensions/gsd/exec-sandbox.js +1 -0
- package/dist/resources/extensions/gsd/flat-phase-migration.js +12 -0
- package/dist/resources/extensions/gsd/git-service.js +19 -7
- package/dist/resources/extensions/gsd/gsd-db.js +75 -31
- package/dist/resources/extensions/gsd/guided-flow.js +11 -5
- package/dist/resources/extensions/gsd/markdown-renderer.js +5 -21
- package/dist/resources/extensions/gsd/md-importer.js +5 -6
- package/dist/resources/extensions/gsd/model-cost-table.js +6 -1
- package/dist/resources/extensions/gsd/model-router.js +16 -0
- package/dist/resources/extensions/gsd/paths.js +66 -15
- package/dist/resources/extensions/gsd/planning-subagent-policy.js +37 -0
- package/dist/resources/extensions/gsd/planning-subagent-registry.js +33 -0
- package/dist/resources/extensions/gsd/preferences-models.js +50 -10
- package/dist/resources/extensions/gsd/preferences-types.js +6 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +86 -4
- package/dist/resources/extensions/gsd/preferences.js +24 -0
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
- package/dist/resources/extensions/gsd/provider-payload-policy.js +16 -5
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +1 -1
- package/dist/resources/extensions/gsd/skill-activation.js +17 -3
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +98 -2
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +4 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +5 -2
- package/dist/resources/extensions/gsd/stop-notice.js +9 -0
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +8 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +12 -5
- package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -1
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +14 -5
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +15 -5
- package/dist/resources/extensions/gsd/tools/reopen-task.js +16 -10
- package/dist/resources/extensions/gsd/unit-context-composer.js +28 -5
- package/dist/resources/extensions/gsd/verification-evidence.js +5 -3
- package/dist/resources/extensions/gsd/workflow-projections.js +2 -3
- package/dist/resources/extensions/gsd/workspace.js +2 -1
- package/dist/resources/extensions/gsd/worktree-state-projection.js +20 -18
- package/dist/resources/extensions/ollama/ollama-chat-provider.js +2 -2
- package/dist/resources/extensions/shared/interview-ui.js +43 -6
- package/dist/resources/extensions/subagent/index.js +1 -1
- package/dist/startup-model-validation.d.ts +1 -1
- 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 +9 -9
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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/mcp-connections/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/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 +2 -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 +1 -1
- 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 +1 -1
- 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 +9 -9
- package/dist/web/standalone/.next/server/chunks/1991.js +2 -2
- package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- 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/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- 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/server.js +1 -1
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
- package/integrations/hermes/pyproject.toml +1 -1
- package/package.json +8 -6
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/rpc.d.ts +1 -1
- package/packages/contracts/dist/rpc.d.ts.map +1 -1
- package/packages/contracts/dist/rpc.js +1 -1
- package/packages/contracts/dist/rpc.js.map +1 -1
- package/packages/contracts/dist/rpc.test.js +1 -1
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/package.json +4 -4
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js +36 -4
- package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +1 -0
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/dist/cli/args.js +2 -2
- package/packages/gsd-agent-modes/dist/cli/args.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +1 -0
- package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/gsd-cloud/README.md +21 -5
- package/packages/gsd-cloud/dist/background-cli.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/background-cli.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/background-cli.test.js +325 -0
- package/packages/gsd-cloud/dist/background-cli.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cli.d.ts.map +1 -1
- package/packages/gsd-cloud/dist/cli.js +146 -16
- package/packages/gsd-cloud/dist/cli.js.map +1 -1
- package/packages/gsd-cloud/dist/cloud-config.d.ts +1 -1
- package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -1
- package/packages/gsd-cloud/dist/cloud-config.js +7 -1
- package/packages/gsd-cloud/dist/cloud-config.js.map +1 -1
- package/packages/gsd-cloud/dist/cloud-runtime.d.ts +7 -4
- package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -1
- package/packages/gsd-cloud/dist/cloud-runtime.js +115 -31
- package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -1
- package/packages/gsd-cloud/dist/cloud-runtime.test.js +224 -59
- package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -1
- package/packages/gsd-cloud/dist/runtime-artifacts.d.ts +3 -0
- package/packages/gsd-cloud/dist/runtime-artifacts.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-artifacts.js +36 -0
- package/packages/gsd-cloud/dist/runtime-artifacts.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.d.ts +32 -0
- package/packages/gsd-cloud/dist/runtime-process.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.js +640 -0
- package/packages/gsd-cloud/dist/runtime-process.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/runtime-process.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.test.js +543 -0
- package/packages/gsd-cloud/dist/runtime-process.test.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.d.ts +117 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.js +291 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.test.js +434 -0
- package/packages/gsd-cloud/dist/runtime-telemetry.test.js.map +1 -0
- package/packages/gsd-cloud/package.json +2 -2
- package/packages/mcp-server/README.md +7 -2
- package/packages/mcp-server/dist/cli-runner.d.ts +3 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-runner.js +119 -33
- package/packages/mcp-server/dist/cli-runner.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +5 -5
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +4 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -1
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/dist/types.d.ts +2 -2
- package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/types.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +187 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +145 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/models.js +18 -6
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +3 -2
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +6 -1
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts +1 -1
- package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-vertex.js.map +1 -1
- package/packages/pi-ai/dist/providers/google.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +103 -0
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.d.ts +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.d.ts +1 -1
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/dist/types.d.ts +9 -1
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +2 -2
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +14 -4
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +54 -0
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/theme/theme.js +1 -0
- package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/dist/theme/theme.d.ts +1 -1
- package/pkg/dist/theme/theme.d.ts.map +1 -1
- package/pkg/dist/theme/theme.js +1 -0
- package/pkg/dist/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +2 -2
- package/src/resources/extensions/gsd/artifact-verification.ts +3 -8
- package/src/resources/extensions/gsd/auto/loop.ts +48 -4
- package/src/resources/extensions/gsd/auto/run-unit.ts +20 -1
- package/src/resources/extensions/gsd/auto/unit-phase.ts +41 -5
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +14 -7
- package/src/resources/extensions/gsd/auto-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-model-selection.ts +1 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +118 -19
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
- package/src/resources/extensions/gsd/auto-runtime-state.ts +12 -7
- package/src/resources/extensions/gsd/auto-start.ts +32 -9
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +56 -0
- package/src/resources/extensions/gsd/auto-verification.ts +46 -12
- package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +10 -3
- package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +20 -7
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +1 -0
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -12
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +10 -31
- package/src/resources/extensions/gsd/commands-verdict.ts +16 -9
- package/src/resources/extensions/gsd/compat/compat-marker.ts +99 -5
- package/src/resources/extensions/gsd/constants.ts +14 -13
- package/src/resources/extensions/gsd/context-masker.ts +98 -2
- package/src/resources/extensions/gsd/db/engine.ts +5 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +33 -2
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +45 -11
- package/src/resources/extensions/gsd/error-classifier.ts +13 -2
- package/src/resources/extensions/gsd/exec-sandbox.ts +1 -0
- package/src/resources/extensions/gsd/flat-phase-migration.ts +14 -0
- package/src/resources/extensions/gsd/git-service.ts +19 -6
- package/src/resources/extensions/gsd/gsd-db.ts +85 -33
- package/src/resources/extensions/gsd/guided-flow.ts +11 -4
- package/src/resources/extensions/gsd/markdown-renderer.ts +5 -23
- package/src/resources/extensions/gsd/md-importer.ts +5 -5
- package/src/resources/extensions/gsd/model-cost-table.ts +14 -1
- package/src/resources/extensions/gsd/model-router.ts +17 -0
- package/src/resources/extensions/gsd/paths.ts +73 -15
- package/src/resources/extensions/gsd/planning-subagent-policy.ts +58 -0
- package/src/resources/extensions/gsd/planning-subagent-registry.ts +45 -0
- package/src/resources/extensions/gsd/preferences-models.ts +54 -10
- package/src/resources/extensions/gsd/preferences-types.ts +26 -2
- package/src/resources/extensions/gsd/preferences-validation.ts +108 -3
- package/src/resources/extensions/gsd/preferences.ts +38 -0
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
- package/src/resources/extensions/gsd/provider-payload-policy.ts +18 -4
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +1 -1
- package/src/resources/extensions/gsd/skill-activation.ts +17 -3
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +132 -2
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +4 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +4 -2
- package/src/resources/extensions/gsd/stop-notice.ts +11 -0
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +8 -0
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +264 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +74 -1
- package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/compat-marker.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +76 -1
- package/src/resources/extensions/gsd/tests/context-masker.test.ts +204 -8
- package/src/resources/extensions/gsd/tests/db-engine-cjs-compat.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/db-tools-alias-suppression.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +147 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +8 -9
- package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +13 -0
- package/src/resources/extensions/gsd/tests/integration/paths.test.ts +22 -4
- package/src/resources/extensions/gsd/tests/integration-branch-meta-location.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/model-isolation.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +7 -5
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +24 -0
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/preferences.test.ts +151 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +33 -7
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -16
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +13 -7
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/workflow-authority-faults.test.ts +238 -0
- package/src/resources/extensions/gsd/tests/workflow-authority-fixture.test.ts +48 -0
- package/src/resources/extensions/gsd/tests/workflow-authority-fixture.ts +141 -0
- package/src/resources/extensions/gsd/tests/workflow-authority-projection-conflict.test.ts +177 -0
- package/src/resources/extensions/gsd/tests/workflow-fault-harness.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/workflow-fault-harness.ts +72 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +74 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +20 -5
- package/src/resources/extensions/gsd/tools/plan-slice.ts +5 -1
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +24 -5
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +25 -5
- package/src/resources/extensions/gsd/tools/reopen-task.ts +23 -9
- package/src/resources/extensions/gsd/unit-context-composer.ts +34 -8
- package/src/resources/extensions/gsd/verification-evidence.ts +5 -2
- package/src/resources/extensions/gsd/workflow-projections.ts +2 -3
- package/src/resources/extensions/gsd/workspace.ts +2 -1
- package/src/resources/extensions/gsd/worktree-state-projection.ts +21 -24
- package/src/resources/extensions/ollama/ollama-chat-provider.ts +2 -2
- package/src/resources/extensions/ollama/tests/ollama-chat-provider-think.test.ts +4 -0
- package/src/resources/extensions/shared/interview-ui.ts +47 -8
- package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +29 -0
- package/src/resources/extensions/subagent/index.ts +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
- /package/dist/web/standalone/.next/static/{BE5XoklToI6lZjRzpXih8 → xwUaOqui04jIIFVsIBLiL}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{BE5XoklToI6lZjRzpXih8 → xwUaOqui04jIIFVsIBLiL}/_ssgManifest.js +0 -0
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
import type { ExtensionContext, ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
17
17
|
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
18
|
-
import { gsdProjectionRoot, relMilestoneFile, resolveSliceFile, resolveSlicePath } from "./paths.js";
|
|
18
|
+
import { gsdProjectionRoot, legacyMilestonesDir, relMilestoneFile, resolveMilestonePath, resolveSliceFile, resolveSlicePath } from "./paths.js";
|
|
19
19
|
import { resolveMilestoneValidationVerdict } from "./milestone-validation-verdict.js";
|
|
20
20
|
import { resolveCanonicalMilestoneRoot } from "./worktree-manager.js";
|
|
21
21
|
import { parseUnitId } from "./unit-id.js";
|
|
@@ -62,6 +62,30 @@ export interface VerificationContext {
|
|
|
62
62
|
export type VerificationResult = "continue" | "retry" | "pause";
|
|
63
63
|
type PauseAutoFn = (ctx?: ExtensionContext, pi?: ExtensionAPI, errorContext?: ErrorContext) => Promise<void>;
|
|
64
64
|
|
|
65
|
+
interface VerificationEvidenceLocation {
|
|
66
|
+
dir: string;
|
|
67
|
+
fileSliceId?: string;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function resolveVerificationEvidenceLocation(
|
|
71
|
+
basePath: string,
|
|
72
|
+
milestoneId: string,
|
|
73
|
+
sliceId: string,
|
|
74
|
+
): VerificationEvidenceLocation | null {
|
|
75
|
+
const mDir = resolveMilestonePath(basePath, milestoneId);
|
|
76
|
+
if (!mDir) return null;
|
|
77
|
+
|
|
78
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
79
|
+
const isLegacy = mDir.startsWith(legacyBase + "/") || mDir.startsWith(legacyBase + "\\");
|
|
80
|
+
if (!isLegacy) {
|
|
81
|
+
return { dir: mDir, fileSliceId: sliceId };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const sDir = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
85
|
+
if (!sDir) return null;
|
|
86
|
+
return { dir: join(sDir, "tasks") };
|
|
87
|
+
}
|
|
88
|
+
|
|
65
89
|
function getCurrentUnitCostStats(unitId: string): { unitCostUsd: number; rollingAvgUsd: number } {
|
|
66
90
|
const ledger = getLedger();
|
|
67
91
|
if (!ledger || !Array.isArray(ledger.units) || ledger.units.length === 0) {
|
|
@@ -551,11 +575,18 @@ export async function runPostUnitVerification(
|
|
|
551
575
|
const taskAlreadyComplete = taskRow?.status === "complete" || taskRow?.status === "done";
|
|
552
576
|
if (mid && sid && tid) {
|
|
553
577
|
try {
|
|
554
|
-
const
|
|
555
|
-
if (
|
|
556
|
-
const tasksDir = join(sDir, "tasks");
|
|
578
|
+
const evidenceLocation = resolveVerificationEvidenceLocation(s.basePath, mid, sid);
|
|
579
|
+
if (evidenceLocation) {
|
|
557
580
|
if (result.passed) {
|
|
558
|
-
writeVerificationJSON(
|
|
581
|
+
writeVerificationJSON(
|
|
582
|
+
result,
|
|
583
|
+
evidenceLocation.dir,
|
|
584
|
+
tid,
|
|
585
|
+
s.currentUnit.id,
|
|
586
|
+
undefined,
|
|
587
|
+
undefined,
|
|
588
|
+
evidenceLocation.fileSliceId,
|
|
589
|
+
);
|
|
559
590
|
} else {
|
|
560
591
|
const nextAttempt = attempt + 1;
|
|
561
592
|
const includeRetryMetadata =
|
|
@@ -566,11 +597,12 @@ export async function runPostUnitVerification(
|
|
|
566
597
|
nextAttempt <= maxRetries;
|
|
567
598
|
writeVerificationJSON(
|
|
568
599
|
result,
|
|
569
|
-
|
|
600
|
+
evidenceLocation.dir,
|
|
570
601
|
tid,
|
|
571
602
|
s.currentUnit.id,
|
|
572
603
|
includeRetryMetadata ? nextAttempt : undefined,
|
|
573
604
|
includeRetryMetadata ? maxRetries : undefined,
|
|
605
|
+
evidenceLocation.fileSliceId,
|
|
574
606
|
);
|
|
575
607
|
}
|
|
576
608
|
}
|
|
@@ -718,9 +750,8 @@ export async function runPostUnitVerification(
|
|
|
718
750
|
// Re-write verification evidence JSON with post-execution checks
|
|
719
751
|
if (postExecChecks && postExecChecks.length > 0 && mid && sid && tid) {
|
|
720
752
|
try {
|
|
721
|
-
const
|
|
722
|
-
if (
|
|
723
|
-
const tasksDir = join(sDir, "tasks");
|
|
753
|
+
const evidenceLocation = resolveVerificationEvidenceLocation(s.basePath, mid, sid);
|
|
754
|
+
if (evidenceLocation) {
|
|
724
755
|
// Add postExecutionChecks to the result for the JSON write
|
|
725
756
|
const resultWithPostExec = {
|
|
726
757
|
...result,
|
|
@@ -730,12 +761,13 @@ export async function runPostUnitVerification(
|
|
|
730
761
|
// Manually write with postExecutionChecks field
|
|
731
762
|
writeVerificationJSONWithPostExec(
|
|
732
763
|
resultWithPostExec,
|
|
733
|
-
|
|
764
|
+
evidenceLocation.dir,
|
|
734
765
|
tid,
|
|
735
766
|
s.currentUnit.id,
|
|
736
767
|
postExecChecks,
|
|
737
768
|
postExecBlockingFailure ? attempt + 1 : undefined,
|
|
738
|
-
postExecBlockingFailure ? maxRetries : undefined
|
|
769
|
+
postExecBlockingFailure ? maxRetries : undefined,
|
|
770
|
+
evidenceLocation.fileSliceId,
|
|
739
771
|
);
|
|
740
772
|
}
|
|
741
773
|
} catch (evidenceErr) {
|
|
@@ -940,6 +972,7 @@ function writeVerificationJSONWithPostExec(
|
|
|
940
972
|
postExecutionChecks: PostExecutionCheckJSON[],
|
|
941
973
|
retryAttempt?: number,
|
|
942
974
|
maxRetries?: number,
|
|
975
|
+
sliceId?: string,
|
|
943
976
|
): void {
|
|
944
977
|
mkdirSync(tasksDir, { recursive: true });
|
|
945
978
|
|
|
@@ -980,6 +1013,7 @@ function writeVerificationJSONWithPostExec(
|
|
|
980
1013
|
}));
|
|
981
1014
|
}
|
|
982
1015
|
|
|
983
|
-
const
|
|
1016
|
+
const fileName = sliceId ? `${sliceId}-${taskId}-VERIFY.json` : `${taskId}-VERIFY.json`;
|
|
1017
|
+
const filePath = join(tasksDir, fileName);
|
|
984
1018
|
writeFileSync(filePath, JSON.stringify(evidence, null, 2) + "\n", "utf-8");
|
|
985
1019
|
}
|
|
@@ -10,6 +10,7 @@ import { existsSync, realpathSync, unlinkSync } from "node:fs";
|
|
|
10
10
|
import { isAbsolute, join, relative } from "node:path";
|
|
11
11
|
|
|
12
12
|
import { gsdRoot } from "./paths.js";
|
|
13
|
+
import { milestoneMetaPath } from "./git-service.js";
|
|
13
14
|
import { logWarning } from "./workflow-logger.js";
|
|
14
15
|
|
|
15
16
|
function isSamePath(a: string, b: string): boolean {
|
|
@@ -93,6 +94,9 @@ export function clearProjectRootStateFiles(
|
|
|
93
94
|
// worth removing on teardown.
|
|
94
95
|
const transientFiles = [
|
|
95
96
|
join(gsdDir, "STATE.md"),
|
|
97
|
+
// Integration-branch META now lives flat at .gsd/<MID>-META.json (ADR-045).
|
|
98
|
+
milestoneMetaPath(basePath, milestoneId),
|
|
99
|
+
// Legacy location — still cleaned for pre-migration trees.
|
|
96
100
|
join(gsdDir, "milestones", milestoneId, `${milestoneId}-META.json`),
|
|
97
101
|
];
|
|
98
102
|
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
_isSamePath as isSamePath,
|
|
17
17
|
_shouldReconcileWorktreeDb,
|
|
18
18
|
} from "./auto-worktree-cleanup.js";
|
|
19
|
-
import { resolveGsdPathContract } from "./paths.js";
|
|
19
|
+
import { dirIsContentBearingLegacyMilestone, resolveGsdPathContract } from "./paths.js";
|
|
20
20
|
import type { MilestoneScope } from "./workspace.js";
|
|
21
21
|
import { WorktreeStateProjection } from "./worktree-state-projection.js";
|
|
22
22
|
import { logWarning } from "./workflow-logger.js";
|
|
@@ -211,10 +211,17 @@ function syncMilestoneLayout(
|
|
|
211
211
|
if (!existsSync(mainMilestonesDir)) return;
|
|
212
212
|
|
|
213
213
|
try {
|
|
214
|
-
mkdirSync(wtMilestonesDir, { recursive: true });
|
|
215
214
|
const mainMilestones = readdirSync(mainMilestonesDir, { withFileTypes: true })
|
|
216
215
|
.filter((entry) => entry.isDirectory())
|
|
217
|
-
.map((entry) => entry.name)
|
|
216
|
+
.map((entry) => entry.name)
|
|
217
|
+
.filter((name) =>
|
|
218
|
+
layoutSegment !== "milestones" ||
|
|
219
|
+
dirIsContentBearingLegacyMilestone(join(mainMilestonesDir, name)),
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
if (mainMilestones.length === 0) return;
|
|
223
|
+
|
|
224
|
+
mkdirSync(wtMilestonesDir, { recursive: true });
|
|
218
225
|
|
|
219
226
|
for (const milestoneId of mainMilestones) {
|
|
220
227
|
syncMilestoneDirectory(
|
|
@@ -65,7 +65,7 @@ export function teardownAutoWorktree(
|
|
|
65
65
|
|
|
66
66
|
// Mirror cleanup steps from mergeMilestoneToMain abort path:
|
|
67
67
|
|
|
68
|
-
// 1. Remove transient state files (STATE.md, auto.lock, {MID}-META.json).
|
|
68
|
+
// 1. Remove transient state files (STATE.md, auto.lock, .gsd/{MID}-META.json).
|
|
69
69
|
// Non-fatal — must not block teardown.
|
|
70
70
|
try {
|
|
71
71
|
clearProjectRootStateFiles(originalBasePath, milestoneId);
|
|
@@ -110,9 +110,7 @@ import {
|
|
|
110
110
|
getOldestInFlightToolStart,
|
|
111
111
|
hasInteractiveToolInFlight,
|
|
112
112
|
clearInFlightTools,
|
|
113
|
-
|
|
114
|
-
isQueuedUserMessageSkip,
|
|
115
|
-
isDeterministicPolicyError,
|
|
113
|
+
updateToolInvocationError,
|
|
116
114
|
} from "./auto-tool-tracking.js";
|
|
117
115
|
import { closeoutUnit } from "./auto-unit-closeout.js";
|
|
118
116
|
import { recoverTimedOutUnit } from "./auto-timeout-recovery.js";
|
|
@@ -1001,14 +999,17 @@ export function markToolEnd(toolCallId: string): void {
|
|
|
1001
999
|
* Called from tool_execution_end when a GSD tool fails with isError.
|
|
1002
1000
|
* Stores the error if it matches:
|
|
1003
1001
|
* - tool-invocation-error pattern (malformed/truncated JSON)
|
|
1002
|
+
* - failed ScheduleWakeup continuation validation (#1379)
|
|
1004
1003
|
* - queued-user-message skip pattern
|
|
1005
1004
|
* - deterministic policy rejection (#4973, e.g. context_write_blocked)
|
|
1006
1005
|
*/
|
|
1007
1006
|
export function recordToolInvocationError(toolName: string, errorMsg: string): void {
|
|
1008
1007
|
if (!s.active) return;
|
|
1009
|
-
|
|
1010
|
-
s.lastToolInvocationError
|
|
1011
|
-
|
|
1008
|
+
s.lastToolInvocationError = updateToolInvocationError(
|
|
1009
|
+
s.lastToolInvocationError,
|
|
1010
|
+
toolName,
|
|
1011
|
+
errorMsg,
|
|
1012
|
+
);
|
|
1012
1013
|
}
|
|
1013
1014
|
|
|
1014
1015
|
export function getOldestInFlightToolAgeMs(): number {
|
|
@@ -3162,7 +3163,19 @@ export async function dispatchHookUnit(
|
|
|
3162
3163
|
workspaceRoot: s.basePath,
|
|
3163
3164
|
});
|
|
3164
3165
|
|
|
3165
|
-
const
|
|
3166
|
+
const cmdCtx = s.cmdCtx;
|
|
3167
|
+
if (typeof cmdCtx?.newSession !== "function") {
|
|
3168
|
+
const message = "Auto-mode has no command context for dispatch.";
|
|
3169
|
+
ctx.ui.notify(message, "error");
|
|
3170
|
+
const unitToCommit = previousCurrentUnit ?? s.currentUnit;
|
|
3171
|
+
if (unitToCommit) {
|
|
3172
|
+
await autoCommitUnit(s.basePath, unitToCommit.type, unitToCommit.id, ctx);
|
|
3173
|
+
}
|
|
3174
|
+
await stopAuto(ctx, pi, message, { preserveWorktree: true });
|
|
3175
|
+
return false;
|
|
3176
|
+
}
|
|
3177
|
+
|
|
3178
|
+
const result = await cmdCtx.newSession({ workspaceRoot: s.basePath });
|
|
3166
3179
|
if (result.cancelled) {
|
|
3167
3180
|
await stopAuto(ctx, pi);
|
|
3168
3181
|
return false;
|
|
@@ -58,6 +58,7 @@ function registerAlias(pi: ExtensionAPI, toolDef: any, aliasName: string, canoni
|
|
|
58
58
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- toolDef shape matches ToolDefinition but varies by schema
|
|
59
59
|
function registerWorkflowTool(pi: ExtensionAPI, toolDef: any): void {
|
|
60
60
|
pi.registerTool(toolDef);
|
|
61
|
+
if (process.env.GSD_ADVERTISE_TOOL_ALIASES !== "1") return; // canonical-only model surface (see plan 035)
|
|
61
62
|
for (const alias of aliasesForWorkflowTool(toolDef.name)) {
|
|
62
63
|
registerAlias(pi, toolDef, alias, toolDef.name);
|
|
63
64
|
}
|
|
@@ -51,7 +51,9 @@ import {
|
|
|
51
51
|
confirmDestructiveCommand,
|
|
52
52
|
consumeDestructiveConfirmation,
|
|
53
53
|
isDestructiveConfirmGateId,
|
|
54
|
+
peekPendingDestructiveCommand,
|
|
54
55
|
requestDestructiveConfirmation,
|
|
56
|
+
resetDestructiveConfirmation,
|
|
55
57
|
} from "../safety/destructive-confirmation.js";
|
|
56
58
|
import { logWarning as safetyLogWarning, setStderrLoggingEnabled } from "../workflow-logger.js";
|
|
57
59
|
import { isUnitCloseoutTool, runInteractiveUnitCloseout } from "../unit-closeout.js";
|
|
@@ -59,6 +61,7 @@ import { installNotifyInterceptor } from "./notify-interceptor.js";
|
|
|
59
61
|
import { initNotificationStore } from "../notification-store.js";
|
|
60
62
|
import { initNotificationWidget } from "../notification-widget.js";
|
|
61
63
|
import { notifyPreferenceDiagnostics } from "../preferences-diagnostics.js";
|
|
64
|
+
import { resolveEffectivePlanningToolsPolicy } from "../planning-subagent-policy.js";
|
|
62
65
|
import { resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
63
66
|
import { extractSubagentAgentClasses } from "./subagent-input.js";
|
|
64
67
|
import {
|
|
@@ -187,6 +190,7 @@ function suppressWelcomeHeader(ctx: ExtensionContext): void {
|
|
|
187
190
|
* are bounded — cleared on activation, session boundaries, and verification.
|
|
188
191
|
*/
|
|
189
192
|
const deferredApprovalGates = new Map<string, string>();
|
|
193
|
+
const deferredDestructiveConfirmationPauses = new Set<string>();
|
|
190
194
|
|
|
191
195
|
export const MINIMAL_GSD_TOOL_NAMES = [
|
|
192
196
|
"gsd_exec",
|
|
@@ -618,6 +622,23 @@ function clearDeferredApprovalGate(basePath?: string): void {
|
|
|
618
622
|
}
|
|
619
623
|
}
|
|
620
624
|
|
|
625
|
+
function deferDestructiveConfirmationPause(basePath: string): void {
|
|
626
|
+
deferredDestructiveConfirmationPauses.add(basePath);
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
function clearDeferredDestructiveConfirmationPause(basePath?: string): void {
|
|
630
|
+
if (!basePath) {
|
|
631
|
+
deferredDestructiveConfirmationPauses.clear();
|
|
632
|
+
} else {
|
|
633
|
+
deferredDestructiveConfirmationPauses.delete(basePath);
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
function isDestructiveConfirmationBlocking(basePath: string): boolean {
|
|
638
|
+
return deferredDestructiveConfirmationPauses.has(basePath)
|
|
639
|
+
&& Boolean(peekPendingDestructiveCommand(basePath));
|
|
640
|
+
}
|
|
641
|
+
|
|
621
642
|
function deferApprovalGate(gateId: string, basePath: string): void {
|
|
622
643
|
// Verified-on-disk wins (same adapter policy as activation/re-arm): if the
|
|
623
644
|
// workflow MCP child already verified this gate, deferring would block
|
|
@@ -1015,6 +1036,7 @@ export function registerHooks(
|
|
|
1015
1036
|
await applyToolCallLoopGuardConfig(basePath);
|
|
1016
1037
|
approvalQuestionAbortInFlight = false;
|
|
1017
1038
|
clearDeferredApprovalGate();
|
|
1039
|
+
clearDeferredDestructiveConfirmationPause();
|
|
1018
1040
|
await resetAskUserQuestionsTurnCache();
|
|
1019
1041
|
await syncServiceTierStatus(ctx);
|
|
1020
1042
|
await applyDisabledModelProviderPolicy(ctx);
|
|
@@ -1106,6 +1128,7 @@ export function registerHooks(
|
|
|
1106
1128
|
resetToolCallLoopGuard();
|
|
1107
1129
|
await applyToolCallLoopGuardConfig(basePath);
|
|
1108
1130
|
clearDeferredApprovalGate();
|
|
1131
|
+
clearDeferredDestructiveConfirmationPause();
|
|
1109
1132
|
await resetAskUserQuestionsTurnCache();
|
|
1110
1133
|
clearDiscussionFlowState(basePath);
|
|
1111
1134
|
// /clear or /new destroys the conversation holding a discuss interview, so
|
|
@@ -1157,6 +1180,7 @@ export function registerHooks(
|
|
|
1157
1180
|
}
|
|
1158
1181
|
}
|
|
1159
1182
|
clearDeferredApprovalGate(beforeAgentBasePath);
|
|
1183
|
+
clearDeferredDestructiveConfirmationPause(beforeAgentBasePath);
|
|
1160
1184
|
|
|
1161
1185
|
// session_start can fire before the active provider has settled. By
|
|
1162
1186
|
// before_agent_start, Claude Code CLI sessions should get the same
|
|
@@ -1244,12 +1268,20 @@ export function registerHooks(
|
|
|
1244
1268
|
await handleAgentEnd(pi, event, ctx);
|
|
1245
1269
|
} finally {
|
|
1246
1270
|
activateDeferredApprovalGate(agentEndBasePath);
|
|
1271
|
+
const destructiveConfirmationBlocking = isDestructiveConfirmationBlocking(agentEndBasePath);
|
|
1272
|
+
clearDeferredDestructiveConfirmationPause(agentEndBasePath);
|
|
1247
1273
|
await maybePauseAutoForApprovalGate(
|
|
1248
1274
|
ctx,
|
|
1249
1275
|
pi,
|
|
1250
1276
|
isApprovalGateBlocking(agentEndBasePath),
|
|
1251
1277
|
"Depth confirmation is waiting for your answer — pausing auto-mode.",
|
|
1252
1278
|
);
|
|
1279
|
+
await maybePauseAutoForApprovalGate(
|
|
1280
|
+
ctx,
|
|
1281
|
+
pi,
|
|
1282
|
+
destructiveConfirmationBlocking,
|
|
1283
|
+
"Destructive-command confirmation is waiting for your answer — pausing auto-mode.",
|
|
1284
|
+
);
|
|
1253
1285
|
}
|
|
1254
1286
|
});
|
|
1255
1287
|
|
|
@@ -1559,6 +1591,7 @@ export function registerHooks(
|
|
|
1559
1591
|
const activeUnitType = dash.currentUnit?.type ?? guidedUnit?.unitType;
|
|
1560
1592
|
if (activeUnitType) {
|
|
1561
1593
|
const manifest = resolveManifest(activeUnitType);
|
|
1594
|
+
const planningBasePath = dash.basePath || guidedUnit?.basePath || discussionBasePath;
|
|
1562
1595
|
let planningInput = "";
|
|
1563
1596
|
let agentClasses: string[] | undefined;
|
|
1564
1597
|
if (isToolCallEventType("write", event)) {
|
|
@@ -1574,9 +1607,9 @@ export function registerHooks(
|
|
|
1574
1607
|
const planningGuard = shouldBlockPlanningUnit(
|
|
1575
1608
|
event.toolName,
|
|
1576
1609
|
planningInput,
|
|
1577
|
-
|
|
1610
|
+
planningBasePath,
|
|
1578
1611
|
activeUnitType,
|
|
1579
|
-
manifest?.tools,
|
|
1612
|
+
resolveEffectivePlanningToolsPolicy(activeUnitType, manifest?.tools, planningBasePath),
|
|
1580
1613
|
agentClasses,
|
|
1581
1614
|
(event as { input?: unknown }).input,
|
|
1582
1615
|
dash.currentUnit?.id,
|
|
@@ -1685,6 +1718,7 @@ export function registerHooks(
|
|
|
1685
1718
|
// Record the command as pending so an affirmative answer to a
|
|
1686
1719
|
// destructive_confirm gate (handled in tool_result) can confirm it.
|
|
1687
1720
|
requestDestructiveConfirmation(command, guardBasePath);
|
|
1721
|
+
deferDestructiveConfirmationPause(guardBasePath);
|
|
1688
1722
|
const reason = [
|
|
1689
1723
|
"HARD BLOCK: destructive Bash command requires explicit human confirmation.",
|
|
1690
1724
|
`Detected: ${classification.labels.join(", ")}`,
|
|
@@ -1695,14 +1729,6 @@ export function registerHooks(
|
|
|
1695
1729
|
safetyLogWarning("safety", `destructive command: ${classification.labels.join(", ")}`, {
|
|
1696
1730
|
command: String(command).slice(0, 200),
|
|
1697
1731
|
});
|
|
1698
|
-
if (ctx) {
|
|
1699
|
-
await maybePauseAutoForApprovalGate(
|
|
1700
|
-
ctx,
|
|
1701
|
-
pi,
|
|
1702
|
-
isAutoActive(),
|
|
1703
|
-
"Destructive-command confirmation is waiting for your answer — pausing auto-mode.",
|
|
1704
|
-
);
|
|
1705
|
-
}
|
|
1706
1732
|
return { block: true, reason };
|
|
1707
1733
|
}
|
|
1708
1734
|
}
|
|
@@ -1743,7 +1769,7 @@ export function registerHooks(
|
|
|
1743
1769
|
recordToolInvocationError(event.toolName, errorText);
|
|
1744
1770
|
recordRetryableHarnessToolError(toolName, resultPayload, errorText);
|
|
1745
1771
|
} else if (isAutoActive()) {
|
|
1746
|
-
clearToolInvocationError();
|
|
1772
|
+
clearToolInvocationError(event.toolName);
|
|
1747
1773
|
}
|
|
1748
1774
|
// Interactive Closeout adapter (ADR-032): auto-mode owns closeout for its
|
|
1749
1775
|
// own units; interactive completions get the durable git subset (commit +
|
|
@@ -1884,7 +1910,10 @@ export function registerHooks(
|
|
|
1884
1910
|
const answer = details.response?.answers?.[question.id];
|
|
1885
1911
|
if (isDepthConfirmationAnswer(answer?.selected, question.options)) {
|
|
1886
1912
|
confirmDestructiveCommand(basePath);
|
|
1913
|
+
} else {
|
|
1914
|
+
resetDestructiveConfirmation(basePath);
|
|
1887
1915
|
}
|
|
1916
|
+
clearDeferredDestructiveConfirmationPause(basePath);
|
|
1888
1917
|
break;
|
|
1889
1918
|
}
|
|
1890
1919
|
}
|
|
@@ -1951,7 +1980,7 @@ export function registerHooks(
|
|
|
1951
1980
|
recordToolInvocationError(event.toolName, errorText);
|
|
1952
1981
|
recordRetryableHarnessToolError(toolName, event.result, errorText);
|
|
1953
1982
|
} else if (isAutoActive()) {
|
|
1954
|
-
clearToolInvocationError();
|
|
1983
|
+
clearToolInvocationError(event.toolName);
|
|
1955
1984
|
}
|
|
1956
1985
|
// Safety harness: record tool execution results for evidence cross-referencing
|
|
1957
1986
|
if (isAutoActive()) {
|
|
@@ -21,6 +21,14 @@ import { formatOverridesSection, formatShortcut, loadActiveOverrides, loadFile,
|
|
|
21
21
|
import { toPosixPath } from "../../shared/mod.js";
|
|
22
22
|
import { autoEnableCmuxPreferences } from "../commands-cmux.js";
|
|
23
23
|
import { gsdHome } from "../gsd-home.js";
|
|
24
|
+
import { GSD_CONTEXT_MESSAGE_SENTINEL } from "../constants.js";
|
|
25
|
+
|
|
26
|
+
// Single source of truth lives in ../constants.js; re-exported here because
|
|
27
|
+
// buildContextMessage() stamps this marker on every context injection and the
|
|
28
|
+
// provider payload policy (filterSupersededContextInjections in
|
|
29
|
+
// context-masker.ts) matches it to dedupe. Adding a new context customType?
|
|
30
|
+
// Ensure buildContextMessage still prepends this sentinel.
|
|
31
|
+
export { GSD_CONTEXT_MESSAGE_SENTINEL };
|
|
24
32
|
|
|
25
33
|
const DEFAULT_CONTEXT_MESSAGE_MAX_CHARS = 4_000;
|
|
26
34
|
const DEFAULT_KNOWLEDGE_MAX_CHARS = 12_000;
|
|
@@ -448,14 +456,14 @@ export function buildContextMessage(opts: {
|
|
|
448
456
|
const memoryContent = markMemoryContextSupplied(opts.memoryBlock.trim());
|
|
449
457
|
if (opts.injection) {
|
|
450
458
|
const content = limitContextMessageContent(
|
|
451
|
-
memoryContent ? `${memoryContent}\n\n${opts.injection}` : opts.injection
|
|
459
|
+
`${GSD_CONTEXT_MESSAGE_SENTINEL}\n${memoryContent ? `${memoryContent}\n\n${opts.injection}` : opts.injection}`,
|
|
452
460
|
contextCharLimit,
|
|
453
461
|
);
|
|
454
462
|
return { customType: "gsd-guided-context", content, display: false as const };
|
|
455
463
|
}
|
|
456
464
|
if (opts.forensicsInjection) {
|
|
457
465
|
const content = limitContextMessageContent(
|
|
458
|
-
memoryContent ? `${memoryContent}\n\n${opts.forensicsInjection}` : opts.forensicsInjection
|
|
466
|
+
`${GSD_CONTEXT_MESSAGE_SENTINEL}\n${memoryContent ? `${memoryContent}\n\n${opts.forensicsInjection}` : opts.forensicsInjection}`,
|
|
459
467
|
contextCharLimit,
|
|
460
468
|
);
|
|
461
469
|
return { customType: "gsd-forensics", content, display: false as const };
|
|
@@ -463,7 +471,7 @@ export function buildContextMessage(opts: {
|
|
|
463
471
|
if (memoryContent) {
|
|
464
472
|
return {
|
|
465
473
|
customType: "gsd-memory",
|
|
466
|
-
content: limitContextMessageContent(memoryContent
|
|
474
|
+
content: limitContextMessageContent(`${GSD_CONTEXT_MESSAGE_SENTINEL}\n${memoryContent}`, contextCharLimit),
|
|
467
475
|
display: false as const,
|
|
468
476
|
};
|
|
469
477
|
}
|
|
@@ -7,8 +7,12 @@ import { minimatch } from "minimatch";
|
|
|
7
7
|
import { GSD_PHASE_SCOPE_DISPLAY_REASON, shouldBlockAutoUnitToolCall } from "../auto-unit-tool-scope.js";
|
|
8
8
|
import { canonicalToolName } from "../engine-hook-contract.js";
|
|
9
9
|
import { loadJsonFileOrNull } from "../json-persistence.js";
|
|
10
|
-
import { getIsolationMode } from "../preferences.js";
|
|
10
|
+
import { getIsolationMode, loadEffectiveGSDPreferences } from "../preferences.js";
|
|
11
11
|
import { compileSubagentPermissionContract, type ToolsPolicy } from "../unit-context-manifest.js";
|
|
12
|
+
import {
|
|
13
|
+
allowedPlanningDispatchAgentsList,
|
|
14
|
+
isReadOnlyPlanningDispatchAgent,
|
|
15
|
+
} from "../planning-subagent-registry.js";
|
|
12
16
|
import { logWarning } from "../workflow-logger.js";
|
|
13
17
|
import { acquireSyncLock, releaseSyncLock } from "../sync-lock.js";
|
|
14
18
|
import { isGsdWorktreePath, resolveWorktreeProjectRoot } from "../worktree-root.js";
|
|
@@ -1191,36 +1195,10 @@ export function shouldBlockQueueExecutionInSnapshot(
|
|
|
1191
1195
|
const PLANNING_WRITE_TOOLS = new Set(["write", "edit", "multi_edit", "notebook_edit"]);
|
|
1192
1196
|
const PLANNING_SUBAGENT_TOOLS = new Set(["subagent", "task"]);
|
|
1193
1197
|
|
|
1194
|
-
|
|
1195
|
-
* Canonical registry for agents that planning-dispatch may consider. Unit
|
|
1196
|
-
* manifests still declare per-unit subsets via ToolsPolicy.allowedSubagents.
|
|
1197
|
-
*/
|
|
1198
|
-
const PLANNING_DISPATCH_AGENT_REGISTRY = {
|
|
1199
|
-
mnemo: { readOnlySpecialist: true },
|
|
1200
|
-
scout: { readOnlySpecialist: true },
|
|
1201
|
-
planner: { readOnlySpecialist: true },
|
|
1202
|
-
reviewer: { readOnlySpecialist: true },
|
|
1203
|
-
security: { readOnlySpecialist: true },
|
|
1204
|
-
tester: { readOnlySpecialist: true },
|
|
1205
|
-
} as const satisfies Record<string, { readonly readOnlySpecialist: boolean }>;
|
|
1206
|
-
|
|
1207
|
-
export const ALLOWED_PLANNING_DISPATCH_AGENTS = new Set<string>(
|
|
1208
|
-
Object.entries(PLANNING_DISPATCH_AGENT_REGISTRY)
|
|
1209
|
-
.filter(([, metadata]) => metadata.readOnlySpecialist)
|
|
1210
|
-
.map(([agentId]) => agentId),
|
|
1211
|
-
);
|
|
1198
|
+
export { ALLOWED_PLANNING_DISPATCH_AGENTS } from "../planning-subagent-registry.js";
|
|
1212
1199
|
|
|
1213
1200
|
let warnedMissingControlledDispatchAgentClasses = false;
|
|
1214
1201
|
|
|
1215
|
-
function isReadOnlySpecialist(agentId: string): boolean {
|
|
1216
|
-
const metadata = PLANNING_DISPATCH_AGENT_REGISTRY[agentId as keyof typeof PLANNING_DISPATCH_AGENT_REGISTRY];
|
|
1217
|
-
return metadata?.readOnlySpecialist === true;
|
|
1218
|
-
}
|
|
1219
|
-
|
|
1220
|
-
function allowedPlanningDispatchAgentsList(): string {
|
|
1221
|
-
return [...ALLOWED_PLANNING_DISPATCH_AGENTS].join(", ");
|
|
1222
|
-
}
|
|
1223
|
-
|
|
1224
1202
|
function allowsControlledSubagentDispatch(
|
|
1225
1203
|
policy: ToolsPolicy,
|
|
1226
1204
|
): policy is ToolsPolicy & { readonly allowedSubagents: readonly string[] } {
|
|
@@ -1376,6 +1354,7 @@ export function shouldBlockPlanningUnit(
|
|
|
1376
1354
|
const dispatchContract = compileSubagentPermissionContract(policy);
|
|
1377
1355
|
const allowedSubagents = dispatchContract.allowedSubagents;
|
|
1378
1356
|
const allowed = new Set(allowedSubagents);
|
|
1357
|
+
const planningSubagentRegistry = loadEffectiveGSDPreferences(basePath)?.preferences.planning_subagent_registry;
|
|
1379
1358
|
// When agentClasses is undefined, the caller has not been updated to extract
|
|
1380
1359
|
// agent identities yet. Block and warn so stale callers surface in telemetry
|
|
1381
1360
|
// instead of silently bypassing the gate.
|
|
@@ -1393,12 +1372,12 @@ export function shouldBlockPlanningUnit(
|
|
|
1393
1372
|
if (requested.length === 0) {
|
|
1394
1373
|
return { block: false };
|
|
1395
1374
|
}
|
|
1396
|
-
const globallyDisallowed = requested.find(a => !
|
|
1375
|
+
const globallyDisallowed = requested.find(a => !isReadOnlyPlanningDispatchAgent(a, planningSubagentRegistry));
|
|
1397
1376
|
if (globallyDisallowed) {
|
|
1398
1377
|
return planningBlock(
|
|
1399
1378
|
unitType,
|
|
1400
1379
|
policy.mode,
|
|
1401
|
-
`subagent dispatch of "${globallyDisallowed}" not permitted; only read-only specialists (${allowedPlanningDispatchAgentsList()}) may be dispatched from ${policy.mode} units`,
|
|
1380
|
+
`subagent dispatch of "${globallyDisallowed}" not permitted; only read-only specialists (${allowedPlanningDispatchAgentsList(planningSubagentRegistry)}) may be dispatched from ${policy.mode} units`,
|
|
1402
1381
|
);
|
|
1403
1382
|
}
|
|
1404
1383
|
const disallowedByPolicy = requested.find(a => !allowed.has(a));
|
|
@@ -1406,7 +1385,7 @@ export function shouldBlockPlanningUnit(
|
|
|
1406
1385
|
return planningBlock(
|
|
1407
1386
|
unitType,
|
|
1408
1387
|
policy.mode,
|
|
1409
|
-
`subagent dispatch of "${disallowedByPolicy}" not permitted by ToolsPolicy.allowedSubagents; permitted agents for this unit: ${allowedSubagents.join(", ")}`,
|
|
1388
|
+
`subagent dispatch of "${disallowedByPolicy}" not permitted by unit allowlist (ToolsPolicy.allowedSubagents/planning_subagents); permitted agents for this unit: ${allowedSubagents.join(", ")}`,
|
|
1410
1389
|
);
|
|
1411
1390
|
}
|
|
1412
1391
|
return { block: false };
|
|
@@ -11,6 +11,7 @@ import { executeValidateMilestone } from "./tools/workflow-tool-executors.js";
|
|
|
11
11
|
import { ensureDbOpen } from "./bootstrap/dynamic-tools.js";
|
|
12
12
|
import { getLatestAssessmentByScope } from "./gsd-db.js";
|
|
13
13
|
import { checkpointWorkflowDatabase } from "./db-workspace.js";
|
|
14
|
+
import { formatVerdictRecordedNotice, formatVerdictRejectedNotice } from "./stop-notice.js";
|
|
14
15
|
import {
|
|
15
16
|
VALIDATION_VERDICTS,
|
|
16
17
|
extractVerdict,
|
|
@@ -165,17 +166,17 @@ export async function handleVerdict(
|
|
|
165
166
|
basePath: string,
|
|
166
167
|
): Promise<void> {
|
|
167
168
|
if (!rawArgs.trim()) {
|
|
168
|
-
ctx.ui.notify(USAGE, "warning");
|
|
169
|
+
ctx.ui.notify(formatVerdictRejectedNotice(USAGE), "warning");
|
|
169
170
|
return;
|
|
170
171
|
}
|
|
171
172
|
|
|
172
173
|
const parsed = parseArgs(rawArgs);
|
|
173
174
|
if ("error" in parsed) {
|
|
174
|
-
ctx.ui.notify(`${parsed.error}\n${USAGE}
|
|
175
|
+
ctx.ui.notify(formatVerdictRejectedNotice(`${parsed.error}\n${USAGE}`), "warning");
|
|
175
176
|
return;
|
|
176
177
|
}
|
|
177
178
|
if (!parsed.verdict) {
|
|
178
|
-
ctx.ui.notify(USAGE, "warning");
|
|
179
|
+
ctx.ui.notify(formatVerdictRejectedNotice(USAGE), "warning");
|
|
179
180
|
return;
|
|
180
181
|
}
|
|
181
182
|
|
|
@@ -184,7 +185,7 @@ export async function handleVerdict(
|
|
|
184
185
|
const state = await deriveState(basePath);
|
|
185
186
|
if (!state.activeMilestone) {
|
|
186
187
|
ctx.ui.notify(
|
|
187
|
-
"No active milestone — pass --milestone Mxxx to target a specific milestone.",
|
|
188
|
+
formatVerdictRejectedNotice("No active milestone — pass --milestone Mxxx to target a specific milestone."),
|
|
188
189
|
"warning",
|
|
189
190
|
);
|
|
190
191
|
return;
|
|
@@ -195,7 +196,9 @@ export async function handleVerdict(
|
|
|
195
196
|
const existingValidation = await loadExistingValidation(basePath, milestoneId);
|
|
196
197
|
if (!existingValidation) {
|
|
197
198
|
ctx.ui.notify(
|
|
198
|
-
|
|
199
|
+
formatVerdictRejectedNotice(
|
|
200
|
+
`No milestone validation found for ${milestoneId}. Run /gsd auto to validate first, then retry /gsd verdict.`,
|
|
201
|
+
),
|
|
199
202
|
"warning",
|
|
200
203
|
);
|
|
201
204
|
return;
|
|
@@ -205,7 +208,7 @@ export async function handleVerdict(
|
|
|
205
208
|
|
|
206
209
|
if (parsed.verdict !== "pass" && !parsed.rationale) {
|
|
207
210
|
ctx.ui.notify(
|
|
208
|
-
`--rationale is required when overriding to ${parsed.verdict}
|
|
211
|
+
formatVerdictRejectedNotice(`--rationale is required when overriding to ${parsed.verdict}.`),
|
|
209
212
|
"warning",
|
|
210
213
|
);
|
|
211
214
|
return;
|
|
@@ -234,7 +237,7 @@ export async function handleVerdict(
|
|
|
234
237
|
if (result.isError) {
|
|
235
238
|
const msg =
|
|
236
239
|
result.content[0]?.type === "text" ? result.content[0].text : "Unknown error";
|
|
237
|
-
ctx.ui.notify(msg, "error");
|
|
240
|
+
ctx.ui.notify(formatVerdictRejectedNotice(msg), "error");
|
|
238
241
|
return;
|
|
239
242
|
}
|
|
240
243
|
|
|
@@ -244,12 +247,16 @@ export async function handleVerdict(
|
|
|
244
247
|
const effectiveVerdict = extractEffectiveVerdict(result.details, parsed.verdict);
|
|
245
248
|
if (effectiveVerdict !== parsed.verdict) {
|
|
246
249
|
ctx.ui.notify(
|
|
247
|
-
|
|
250
|
+
formatVerdictRecordedNotice(
|
|
251
|
+
`Milestone ${milestoneId} verdict requested: ${parsed.verdict}, effective: ${effectiveVerdict} (${existingValidation.source})`,
|
|
252
|
+
),
|
|
248
253
|
"warning",
|
|
249
254
|
);
|
|
250
255
|
} else {
|
|
251
256
|
ctx.ui.notify(
|
|
252
|
-
|
|
257
|
+
formatVerdictRecordedNotice(
|
|
258
|
+
`Milestone ${milestoneId} verdict: ${prevVerdict} -> ${effectiveVerdict} (${existingValidation.source})`,
|
|
259
|
+
),
|
|
253
260
|
"success",
|
|
254
261
|
);
|
|
255
262
|
}
|