gsd-pi 2.82.0 → 3.0.0-dev.8b8d129d7
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 +125 -32
- package/dist/cli.js +20 -9
- package/dist/headless.js +9 -2
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +10 -1
- package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
- package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
- package/dist/resources/extensions/cmux/index.js +5 -0
- package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
- package/dist/resources/extensions/gsd/auto/loop.js +110 -37
- package/dist/resources/extensions/gsd/auto/orchestrator.js +124 -6
- package/dist/resources/extensions/gsd/auto/phases.js +106 -38
- package/dist/resources/extensions/gsd/auto/session.js +6 -0
- package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
- package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
- package/dist/resources/extensions/gsd/auto-dashboard.js +66 -1
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
- package/dist/resources/extensions/gsd/auto-dispatch.js +20 -19
- package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +278 -137
- package/dist/resources/extensions/gsd/auto-prompts.js +47 -13
- package/dist/resources/extensions/gsd/auto-recovery.js +79 -14
- package/dist/resources/extensions/gsd/auto-start.js +87 -14
- package/dist/resources/extensions/gsd/auto-timers.js +11 -3
- package/dist/resources/extensions/gsd/auto-verification.js +102 -34
- package/dist/resources/extensions/gsd/auto-worktree.js +178 -11
- package/dist/resources/extensions/gsd/auto.js +216 -81
- package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +31 -7
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -9
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +10 -4
- package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
- package/dist/resources/extensions/gsd/clean-root-preflight.js +170 -8
- package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
- package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
- package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +17 -2
- package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
- package/dist/resources/extensions/gsd/commands-prefs-wizard.js +7 -2
- package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
- package/dist/resources/extensions/gsd/context-store.js +112 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +43 -5
- package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
- package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
- package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
- package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
- package/dist/resources/extensions/gsd/db-writer.js +150 -84
- package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -1
- package/dist/resources/extensions/gsd/doctor-git-checks.js +87 -7
- package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor.js +2 -28
- package/dist/resources/extensions/gsd/export-html.js +27 -425
- package/dist/resources/extensions/gsd/forensics.js +8 -3
- package/dist/resources/extensions/gsd/git-service.js +138 -10
- package/dist/resources/extensions/gsd/gsd-db.js +76 -33
- package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
- package/dist/resources/extensions/gsd/guided-flow.js +110 -117
- package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
- package/dist/resources/extensions/gsd/init-wizard.js +17 -2
- package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
- package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
- package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
- package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
- package/dist/resources/extensions/gsd/markdown-renderer.js +16 -9
- package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
- package/dist/resources/extensions/gsd/md-importer.js +1 -1
- package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
- package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
- package/dist/resources/extensions/gsd/migrate/command.js +5 -0
- package/dist/resources/extensions/gsd/migrate/parsers.js +10 -0
- package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
- package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
- package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
- package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
- package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
- package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
- package/dist/resources/extensions/gsd/paths.js +4 -0
- package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
- package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
- package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
- package/dist/resources/extensions/gsd/pre-execution-checks.js +38 -11
- package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
- package/dist/resources/extensions/gsd/preferences-types.js +2 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +138 -0
- package/dist/resources/extensions/gsd/preferences.js +2 -0
- package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
- package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/dist/resources/extensions/gsd/prompts/system.md +2 -2
- package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
- package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
- package/dist/resources/extensions/gsd/repository-registry.js +44 -0
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
- package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +59 -2
- package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
- package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
- package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
- package/dist/resources/extensions/gsd/state.js +14 -4
- package/dist/resources/extensions/gsd/status-guards.js +14 -2
- package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
- package/dist/resources/extensions/gsd/templates/plan.md +9 -5
- package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -8
- package/dist/resources/extensions/gsd/tools/complete-slice.js +6 -8
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +119 -0
- package/dist/resources/extensions/gsd/unit-context-manifest.js +36 -17
- package/dist/resources/extensions/gsd/validation.js +23 -1
- package/dist/resources/extensions/gsd/verification-gate.js +142 -7
- package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
- package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
- package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
- package/dist/resources/extensions/gsd/worktree-lifecycle.js +54 -10
- package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
- package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
- package/dist/resources/extensions/shared/html-shell.js +388 -0
- package/dist/resources/extensions/shared/interview-ui.js +6 -4
- package/dist/resources/extensions/subagent/index.js +448 -78
- package/dist/resources/extensions/subagent/launch.js +77 -0
- package/dist/resources/extensions/subagent/run-store.js +148 -0
- package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
- package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
- package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/dist/resources/extensions/visual-brief/index.js +5 -0
- package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
- package/dist/resources/extensions/visual-brief/prompts.js +140 -0
- package/dist/resources/skills/forensics/SKILL.md +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 +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
- 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.js.nft.json +1 -1
- 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 +4 -7
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
- 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 +4 -5
- 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 +2 -5
- 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 +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 +2 -2
- 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 +5 -8
- 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 +5 -8
- 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 +4 -5
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
- 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/4266.js +2 -0
- 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-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/static/chunks/2973.33f26573894b6153.js +2 -0
- package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
- package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.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-8c10ec293ae0f1d5.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.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-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
- package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +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/server.js +1 -1
- package/package.json +6 -5
- package/packages/contracts/dist/rpc.test.js +7 -0
- package/packages/contracts/dist/rpc.test.js.map +1 -1
- package/packages/contracts/dist/workflow.d.ts +21 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +24 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/src/rpc.test.ts +8 -0
- package/packages/contracts/src/workflow.ts +24 -0
- package/packages/daemon/package.json +2 -2
- package/packages/mcp-server/README.md +14 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +80 -0
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +2 -2
- package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
- package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
- package/packages/mcp-server/src/workflow-tools.ts +168 -0
- package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
- package/packages/native/package.json +1 -1
- package/packages/native/tsconfig.json +2 -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/index.d.ts +2 -2
- package/packages/pi-ai/dist/index.d.ts.map +1 -1
- package/packages/pi-ai/dist/index.js +1 -1
- package/packages/pi-ai/dist/index.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
- package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
- package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
- package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.js +5 -6
- package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
- package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
- package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
- package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
- package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
- package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-ai/src/index.ts +7 -2
- package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
- package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
- package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
- package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
- package/packages/pi-ai/src/providers/simple-options.ts +5 -6
- package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
- package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
- package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
- package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
- package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +71 -97
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
- 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 +11 -0
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
- package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
- package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
- package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
- package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
- package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +75 -102
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
- package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
- package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
- package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
- package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
- package/packages/pi-tui/dist/__tests__/tui.test.js +45 -2
- package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
- package/packages/pi-tui/dist/terminal.d.ts +2 -0
- package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
- package/packages/pi-tui/dist/terminal.js +12 -0
- package/packages/pi-tui/dist/terminal.js.map +1 -1
- package/packages/pi-tui/dist/tui.d.ts.map +1 -1
- package/packages/pi-tui/dist/tui.js +108 -24
- package/packages/pi-tui/dist/tui.js.map +1 -1
- package/packages/pi-tui/package.json +1 -1
- package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
- package/packages/pi-tui/src/__tests__/tui.test.ts +59 -2
- package/packages/pi-tui/src/terminal.ts +11 -0
- package/packages/pi-tui/src/tui.ts +111 -24
- package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
- package/packages/rpc-client/package.json +1 -1
- package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +10 -1
- package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
- package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
- package/src/resources/extensions/cmux/index.ts +6 -0
- package/src/resources/extensions/gsd/auto/contracts.ts +62 -16
- package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
- package/src/resources/extensions/gsd/auto/loop.ts +111 -38
- package/src/resources/extensions/gsd/auto/orchestrator.ts +129 -6
- package/src/resources/extensions/gsd/auto/phases.ts +129 -49
- package/src/resources/extensions/gsd/auto/session.ts +16 -0
- package/src/resources/extensions/gsd/auto/types.ts +3 -0
- package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
- package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +72 -1
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
- package/src/resources/extensions/gsd/auto-dispatch.ts +21 -19
- package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +312 -148
- package/src/resources/extensions/gsd/auto-prompts.ts +47 -16
- package/src/resources/extensions/gsd/auto-recovery.ts +83 -11
- package/src/resources/extensions/gsd/auto-start.ts +94 -12
- package/src/resources/extensions/gsd/auto-timers.ts +10 -3
- package/src/resources/extensions/gsd/auto-verification.ts +124 -42
- package/src/resources/extensions/gsd/auto-worktree.ts +195 -11
- package/src/resources/extensions/gsd/auto.ts +217 -70
- package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +42 -7
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +10 -9
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +11 -4
- package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
- package/src/resources/extensions/gsd/clean-root-preflight.ts +174 -8
- package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
- package/src/resources/extensions/gsd/commands/handlers/core.ts +42 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
- package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +21 -2
- package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
- package/src/resources/extensions/gsd/commands-prefs-wizard.ts +8 -3
- package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
- package/src/resources/extensions/gsd/context-store.ts +120 -1
- package/src/resources/extensions/gsd/crash-recovery.ts +44 -4
- package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
- package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
- package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
- package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
- package/src/resources/extensions/gsd/db-writer.ts +167 -84
- package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -1
- package/src/resources/extensions/gsd/doctor-git-checks.ts +89 -7
- package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
- package/src/resources/extensions/gsd/doctor-types.ts +3 -0
- package/src/resources/extensions/gsd/doctor.ts +2 -27
- package/src/resources/extensions/gsd/export-html.ts +27 -427
- package/src/resources/extensions/gsd/forensics.ts +7 -3
- package/src/resources/extensions/gsd/git-service.ts +166 -11
- package/src/resources/extensions/gsd/gsd-db.ts +80 -31
- package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
- package/src/resources/extensions/gsd/guided-flow.ts +142 -134
- package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
- package/src/resources/extensions/gsd/init-wizard.ts +17 -2
- package/src/resources/extensions/gsd/journal.ts +8 -1
- package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
- package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
- package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
- package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
- package/src/resources/extensions/gsd/markdown-renderer.ts +16 -9
- package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
- package/src/resources/extensions/gsd/md-importer.ts +1 -1
- package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
- package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
- package/src/resources/extensions/gsd/migrate/command.ts +5 -0
- package/src/resources/extensions/gsd/migrate/parsers.ts +11 -0
- package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
- package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
- package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
- package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
- package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
- package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
- package/src/resources/extensions/gsd/paths.ts +5 -0
- package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
- package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
- package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
- package/src/resources/extensions/gsd/pre-execution-checks.ts +49 -11
- package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
- package/src/resources/extensions/gsd/preferences-types.ts +33 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +145 -0
- package/src/resources/extensions/gsd/preferences.ts +5 -0
- package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
- package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
- package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
- package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
- package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
- package/src/resources/extensions/gsd/prompts/queue.md +4 -4
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
- package/src/resources/extensions/gsd/prompts/system.md +2 -2
- package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
- package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
- package/src/resources/extensions/gsd/repository-registry.ts +77 -0
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
- package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +52 -1
- package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
- package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
- package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
- package/src/resources/extensions/gsd/state.ts +15 -4
- package/src/resources/extensions/gsd/status-guards.ts +16 -2
- package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
- package/src/resources/extensions/gsd/templates/plan.md +9 -5
- package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
- package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +375 -1
- package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +578 -8
- package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
- package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
- package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +129 -6
- package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
- package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +107 -2
- package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +4 -1
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +5 -9
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
- package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
- package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +86 -2
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
- package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
- package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
- package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
- package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
- package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
- package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
- package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
- package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
- package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
- package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
- package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
- package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
- package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +44 -0
- package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +199 -2
- package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
- package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
- package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
- package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
- package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
- package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
- package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
- package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
- package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +24 -1
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
- package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
- package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
- package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
- package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
- package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
- package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
- package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +70 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
- package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
- package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
- package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
- package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
- package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +72 -1
- package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
- package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +53 -2
- package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
- package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
- package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
- package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
- package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +128 -9
- package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
- package/src/resources/extensions/gsd/tests/verification-gate.test.ts +173 -1
- package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
- package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
- package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
- package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
- package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +8 -10
- package/src/resources/extensions/gsd/tools/complete-slice.ts +6 -8
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
- package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +135 -0
- package/src/resources/extensions/gsd/types.ts +1 -1
- package/src/resources/extensions/gsd/unit-context-manifest.ts +51 -18
- package/src/resources/extensions/gsd/validation.ts +23 -1
- package/src/resources/extensions/gsd/verification-gate.ts +170 -6
- package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
- package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
- package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
- package/src/resources/extensions/gsd/worktree-lifecycle.ts +61 -10
- package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
- package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
- package/src/resources/extensions/shared/html-shell.ts +412 -0
- package/src/resources/extensions/shared/interview-ui.ts +6 -4
- package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
- package/src/resources/extensions/subagent/index.ts +567 -103
- package/src/resources/extensions/subagent/launch.ts +131 -0
- package/src/resources/extensions/subagent/run-store.ts +218 -0
- package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
- package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
- package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
- package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
- package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
- package/src/resources/extensions/visual-brief/index.ts +8 -0
- package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
- package/src/resources/extensions/visual-brief/prompts.ts +183 -0
- package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
- package/src/resources/skills/forensics/SKILL.md +1 -1
- package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
- package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
- package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.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/css/54ec2745c1da488b.css +0 -1
- package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
- package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
- package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → _kljR-_Miq_YV1IW0wpRO}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → _kljR-_Miq_YV1IW0wpRO}/_ssgManifest.js +0 -0
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
// execSync calls because git2 credential handling is too complex.
|
|
7
7
|
|
|
8
8
|
import { execSync, execFileSync } from "node:child_process";
|
|
9
|
+
import type { ExecFileSyncOptionsWithStringEncoding } from "node:child_process";
|
|
9
10
|
import { existsSync, readFileSync, unlinkSync, rmSync, writeFileSync } from "node:fs";
|
|
10
11
|
import { join } from "node:path";
|
|
11
12
|
import { GSDError, GSD_GIT_ERROR } from "./errors.js";
|
|
@@ -16,6 +17,8 @@ import { isInfrastructureError } from "./auto/infra-errors.js";
|
|
|
16
17
|
// Issue #453: keep auto-mode bookkeeping on the stable git CLI path unless a
|
|
17
18
|
// caller explicitly opts into the native helper.
|
|
18
19
|
const NATIVE_GSD_GIT_ENABLED = process.env.GSD_ENABLE_NATIVE_GSD_GIT === "1";
|
|
20
|
+
const TRANSIENT_GIT_RETRY_CODES = new Set(["ENOBUFS", "EAGAIN"]);
|
|
21
|
+
const GIT_RETRY_DELAY_MS = 200;
|
|
19
22
|
|
|
20
23
|
// ─── Native Module Types ──────────────────────────────────────────────────
|
|
21
24
|
|
|
@@ -144,9 +147,46 @@ function gitExec(basePath: string, args: string[], allowFailure = false): string
|
|
|
144
147
|
encoding: "utf-8",
|
|
145
148
|
env: GIT_NO_PROMPT_ENV,
|
|
146
149
|
}).trim();
|
|
147
|
-
} catch {
|
|
150
|
+
} catch (err) {
|
|
148
151
|
if (allowFailure) return "";
|
|
149
|
-
throw new GSDError(GSD_GIT_ERROR, `git ${args.join(" ")} failed in ${basePath}`);
|
|
152
|
+
throw new GSDError(GSD_GIT_ERROR, `git ${args.join(" ")} failed in ${basePath}: ${getErrorMessage(err)}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** sleepSync uses Atomics.wait for a blocking pause without busy-waiting; it blocks the current thread and requires Atomics.wait support. */
|
|
157
|
+
function sleepSync(ms: number): void {
|
|
158
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function isRetryableGitError(err: unknown): boolean {
|
|
162
|
+
const code = isInfrastructureError(err)
|
|
163
|
+
?? isInfrastructureError((err as { stderr?: string })?.stderr ?? "");
|
|
164
|
+
return code !== null && TRANSIENT_GIT_RETRY_CODES.has(code);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
function execGitFileSyncWithRetry(
|
|
168
|
+
basePath: string,
|
|
169
|
+
args: string[],
|
|
170
|
+
options: Partial<ExecFileSyncOptionsWithStringEncoding>,
|
|
171
|
+
): string {
|
|
172
|
+
try {
|
|
173
|
+
return execFileSync("git", args, {
|
|
174
|
+
cwd: basePath,
|
|
175
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
176
|
+
encoding: "utf-8",
|
|
177
|
+
env: GIT_NO_PROMPT_ENV,
|
|
178
|
+
...options,
|
|
179
|
+
}).trim();
|
|
180
|
+
} catch (err) {
|
|
181
|
+
if (!isRetryableGitError(err)) throw err;
|
|
182
|
+
sleepSync(GIT_RETRY_DELAY_MS);
|
|
183
|
+
return execFileSync("git", args, {
|
|
184
|
+
cwd: basePath,
|
|
185
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
186
|
+
encoding: "utf-8",
|
|
187
|
+
env: GIT_NO_PROMPT_ENV,
|
|
188
|
+
...options,
|
|
189
|
+
}).trim();
|
|
150
190
|
}
|
|
151
191
|
}
|
|
152
192
|
|
|
@@ -159,9 +199,9 @@ function gitFileExec(basePath: string, args: string[], allowFailure = false): st
|
|
|
159
199
|
encoding: "utf-8",
|
|
160
200
|
env: GIT_NO_PROMPT_ENV,
|
|
161
201
|
}).trim();
|
|
162
|
-
} catch {
|
|
202
|
+
} catch (err) {
|
|
163
203
|
if (allowFailure) return "";
|
|
164
|
-
throw new GSDError(GSD_GIT_ERROR, `git ${args.join(" ")} failed in ${basePath}`);
|
|
204
|
+
throw new GSDError(GSD_GIT_ERROR, `git ${args.join(" ")} failed in ${basePath}: ${getErrorMessage(err)}`);
|
|
165
205
|
}
|
|
166
206
|
}
|
|
167
207
|
|
|
@@ -428,16 +468,21 @@ export function nativeDiffNameStatus(
|
|
|
428
468
|
|
|
429
469
|
/**
|
|
430
470
|
* Get numstat diff between two refs.
|
|
471
|
+
* useMergeBase: if true, uses three-dot semantics.
|
|
431
472
|
* Native: libgit2 patch line stats.
|
|
432
473
|
* Fallback: `git diff --numstat`.
|
|
433
474
|
*/
|
|
434
|
-
export function nativeDiffNumstat(basePath: string, fromRef: string, toRef: string): GitNumstat[] {
|
|
475
|
+
export function nativeDiffNumstat(basePath: string, fromRef: string, toRef: string, useMergeBase?: boolean): GitNumstat[] {
|
|
435
476
|
const native = loadNative();
|
|
436
|
-
if (native) {
|
|
477
|
+
if (native && !useMergeBase) {
|
|
437
478
|
return native.gitDiffNumstat(basePath, fromRef, toRef);
|
|
438
479
|
}
|
|
439
480
|
|
|
440
|
-
const
|
|
481
|
+
const refspec = useMergeBase ? `${fromRef}...${toRef}` : undefined;
|
|
482
|
+
const args = refspec
|
|
483
|
+
? ["diff", "--numstat", refspec]
|
|
484
|
+
: ["diff", "--numstat", fromRef, toRef];
|
|
485
|
+
const result = gitExec(basePath, args, true);
|
|
441
486
|
if (!result) return [];
|
|
442
487
|
|
|
443
488
|
return result.split("\n").filter(Boolean).map(line => {
|
|
@@ -553,7 +598,10 @@ export function nativeBranchList(basePath: string, pattern?: string): string[] {
|
|
|
553
598
|
const result = gitFileExec(basePath, args, true);
|
|
554
599
|
if (!result) return [];
|
|
555
600
|
|
|
556
|
-
return result
|
|
601
|
+
return result
|
|
602
|
+
.split("\n")
|
|
603
|
+
.map(b => b.trim().replace(/^[*+]\s+/, ""))
|
|
604
|
+
.filter(Boolean);
|
|
557
605
|
}
|
|
558
606
|
|
|
559
607
|
/**
|
|
@@ -935,13 +983,10 @@ export function nativeCommit(
|
|
|
935
983
|
try {
|
|
936
984
|
const args = ["commit", "-F", "-"];
|
|
937
985
|
if (options?.allowEmpty) args.push("--allow-empty");
|
|
938
|
-
const result =
|
|
939
|
-
cwd: basePath,
|
|
986
|
+
const result = execGitFileSyncWithRetry(basePath, args, {
|
|
940
987
|
stdio: ["pipe", "pipe", "pipe"],
|
|
941
|
-
encoding: "utf-8",
|
|
942
|
-
env: GIT_NO_PROMPT_ENV,
|
|
943
988
|
input: message,
|
|
944
|
-
})
|
|
989
|
+
});
|
|
945
990
|
return result;
|
|
946
991
|
} catch (err: unknown) {
|
|
947
992
|
const errObj = err as { stdout?: string; stderr?: string; message?: string };
|
|
@@ -949,7 +994,11 @@ export function nativeCommit(
|
|
|
949
994
|
if (combined.includes("nothing to commit") || combined.includes("nothing added to commit") || combined.includes("no changes added")) {
|
|
950
995
|
return null;
|
|
951
996
|
}
|
|
952
|
-
|
|
997
|
+
const commitDetail = errObj.stderr?.trim() || errObj.message || "git commit failed";
|
|
998
|
+
const wrapped = new Error(`git commit failed: ${commitDetail}`);
|
|
999
|
+
(wrapped as Error & { stdout?: string; stderr?: string }).stdout = errObj.stdout;
|
|
1000
|
+
(wrapped as Error & { stdout?: string; stderr?: string }).stderr = errObj.stderr;
|
|
1001
|
+
throw wrapped;
|
|
953
1002
|
}
|
|
954
1003
|
}
|
|
955
1004
|
|
|
@@ -1005,6 +1005,9 @@ export function refreshWorkerStatuses(
|
|
|
1005
1005
|
for (const [mid, worker] of state.workers) {
|
|
1006
1006
|
const diskStatus = statusMap.get(mid);
|
|
1007
1007
|
if (!diskStatus) {
|
|
1008
|
+
if (worker.state === "stopped" || worker.state === "error") {
|
|
1009
|
+
continue;
|
|
1010
|
+
}
|
|
1008
1011
|
if (!isPidAlive(worker.pid)) {
|
|
1009
1012
|
worker.cleanup?.();
|
|
1010
1013
|
worker.cleanup = undefined;
|
|
@@ -357,6 +357,11 @@ export function resolveGsdPathContract(
|
|
|
357
357
|
};
|
|
358
358
|
}
|
|
359
359
|
|
|
360
|
+
export function gsdProjectionRoot(basePath: string): string {
|
|
361
|
+
const contract = resolveGsdPathContract(basePath);
|
|
362
|
+
return normalizeRealPath(contract.worktreeGsd ?? contract.projectGsd);
|
|
363
|
+
}
|
|
364
|
+
|
|
360
365
|
/**
|
|
361
366
|
* Invalidate the gsdRoot cache.
|
|
362
367
|
* Use ONLY at session-reset boundaries: workspace switch, process exit, or
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// GSD-2 — Pending auto-start handoff state.
|
|
2
|
+
// Stores discuss-to-auto handoff entries keyed by project root.
|
|
3
|
+
|
|
4
|
+
import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
5
|
+
import { createWorkspace, scopeMilestone, type MilestoneScope } from "./workspace.js";
|
|
6
|
+
|
|
7
|
+
export interface PendingAutoStartEntry {
|
|
8
|
+
ctx: ExtensionCommandContext;
|
|
9
|
+
pi: ExtensionAPI;
|
|
10
|
+
basePath: string;
|
|
11
|
+
milestoneId: string;
|
|
12
|
+
step?: boolean;
|
|
13
|
+
createdAt: number;
|
|
14
|
+
readyRejectCount?: number;
|
|
15
|
+
scope: MilestoneScope;
|
|
16
|
+
planBlockedRecoveryCount: number;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface PendingAutoStartInput {
|
|
20
|
+
basePath: string;
|
|
21
|
+
milestoneId: string;
|
|
22
|
+
ctx: ExtensionCommandContext;
|
|
23
|
+
pi: ExtensionAPI;
|
|
24
|
+
step?: boolean;
|
|
25
|
+
createdAt?: number;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const pendingAutoStartMap = new Map<string, PendingAutoStartEntry>();
|
|
29
|
+
|
|
30
|
+
export function getPendingAutoStart(basePath?: string): PendingAutoStartEntry | null {
|
|
31
|
+
if (basePath) return pendingAutoStartMap.get(basePath) ?? null;
|
|
32
|
+
if (pendingAutoStartMap.size === 1) return pendingAutoStartMap.values().next().value!;
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const _getPendingAutoStart = getPendingAutoStart;
|
|
37
|
+
|
|
38
|
+
export function hasPendingAutoStart(basePath?: string): boolean {
|
|
39
|
+
if (basePath) return pendingAutoStartMap.has(basePath);
|
|
40
|
+
return pendingAutoStartMap.size > 0;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function setPendingAutoStart(basePath: string, entry: PendingAutoStartInput): void {
|
|
44
|
+
if (!entry.ctx || !entry.pi) {
|
|
45
|
+
throw new Error("setPendingAutoStart requires ctx and pi");
|
|
46
|
+
}
|
|
47
|
+
const ws = createWorkspace(entry.basePath);
|
|
48
|
+
const scope = scopeMilestone(ws, entry.milestoneId);
|
|
49
|
+
pendingAutoStartMap.set(basePath, {
|
|
50
|
+
createdAt: Date.now(),
|
|
51
|
+
planBlockedRecoveryCount: 0,
|
|
52
|
+
...entry,
|
|
53
|
+
scope,
|
|
54
|
+
ctx: entry.ctx,
|
|
55
|
+
pi: entry.pi,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function deletePendingAutoStart(basePath: string): void {
|
|
60
|
+
pendingAutoStartMap.delete(basePath);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function clearPendingAutoStart(basePath?: string): void {
|
|
64
|
+
if (basePath) {
|
|
65
|
+
pendingAutoStartMap.delete(basePath);
|
|
66
|
+
} else {
|
|
67
|
+
pendingAutoStartMap.clear();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function getDiscussionMilestoneId(basePath?: string): string | null {
|
|
72
|
+
if (basePath) {
|
|
73
|
+
return pendingAutoStartMap.get(basePath)?.milestoneId ?? null;
|
|
74
|
+
}
|
|
75
|
+
if (pendingAutoStartMap.size === 1) {
|
|
76
|
+
return pendingAutoStartMap.values().next().value!.milestoneId;
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
@@ -13,6 +13,10 @@ function isInsideBase(basePath: string, candidate: string): boolean {
|
|
|
13
13
|
return rel === "" || (!!rel && !rel.startsWith("..") && !isAbsolute(rel));
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
function isInsideAnyBase(bases: string[], candidate: string): boolean {
|
|
17
|
+
return bases.some((base) => isInsideBase(base, candidate));
|
|
18
|
+
}
|
|
19
|
+
|
|
16
20
|
/**
|
|
17
21
|
* Planning IO fields are execution contracts. Absolute paths are only safe when
|
|
18
22
|
* they stay inside the active working directory; in worktree mode, an absolute
|
|
@@ -21,13 +25,17 @@ function isInsideBase(basePath: string, candidate: string): boolean {
|
|
|
21
25
|
export function validatePlanningPathScope(
|
|
22
26
|
basePath: string,
|
|
23
27
|
fields: PlanningPathScopeField[],
|
|
28
|
+
allowedAbsoluteRoots?: string[],
|
|
24
29
|
): string | null {
|
|
30
|
+
const absoluteRoots = (allowedAbsoluteRoots && allowedAbsoluteRoots.length > 0)
|
|
31
|
+
? allowedAbsoluteRoots
|
|
32
|
+
: [basePath];
|
|
25
33
|
for (const { field, values } of fields) {
|
|
26
34
|
for (const raw of values) {
|
|
27
35
|
const candidate = normalizePlannedFileReference(raw);
|
|
28
36
|
if (!isAbsolute(candidate)) continue;
|
|
29
|
-
if (
|
|
30
|
-
return `${field} contains absolute path outside
|
|
37
|
+
if (isInsideAnyBase(absoluteRoots, candidate)) continue;
|
|
38
|
+
return `${field} contains absolute path outside allowed repository roots: ${candidate}. Use a path relative to one of: ${absoluteRoots.join(", ")}.`;
|
|
31
39
|
}
|
|
32
40
|
}
|
|
33
41
|
|
|
@@ -46,6 +46,46 @@ export interface PostExecutionResult {
|
|
|
46
46
|
|
|
47
47
|
// ─── Import Resolution Check ─────────────────────────────────────────────────
|
|
48
48
|
|
|
49
|
+
/**
|
|
50
|
+
* Replace the contents of single- and double-quoted string literals on a single
|
|
51
|
+
* source line with spaces so import patterns do not match text inside strings.
|
|
52
|
+
* Template-literal spans are handled separately via the inTemplateLiteral flag.
|
|
53
|
+
*/
|
|
54
|
+
function stripStringLiterals(line: string): string {
|
|
55
|
+
let result = "";
|
|
56
|
+
let i = 0;
|
|
57
|
+
|
|
58
|
+
while (i < line.length) {
|
|
59
|
+
const ch = line[i];
|
|
60
|
+
|
|
61
|
+
if (ch === '"' || ch === "'") {
|
|
62
|
+
result += ch;
|
|
63
|
+
i++;
|
|
64
|
+
|
|
65
|
+
while (i < line.length) {
|
|
66
|
+
const c = line[i];
|
|
67
|
+
|
|
68
|
+
if (c === "\\" && i + 1 < line.length) {
|
|
69
|
+
result += " ";
|
|
70
|
+
i += 2;
|
|
71
|
+
} else if (c === ch) {
|
|
72
|
+
result += ch;
|
|
73
|
+
i++;
|
|
74
|
+
break;
|
|
75
|
+
} else {
|
|
76
|
+
result += " ";
|
|
77
|
+
i++;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
} else {
|
|
81
|
+
result += ch;
|
|
82
|
+
i++;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
|
|
49
89
|
/**
|
|
50
90
|
* Extract relative import paths from TypeScript/JavaScript source code.
|
|
51
91
|
* Returns array of { importPath, lineNum } for relative imports.
|
|
@@ -62,14 +102,23 @@ export function extractRelativeImports(
|
|
|
62
102
|
// import './path'
|
|
63
103
|
// require('./path')
|
|
64
104
|
// require("../path")
|
|
65
|
-
const importPattern = /(
|
|
105
|
+
const importPattern = /(?:^|[;{}]\s*)import\s+(?:.*?\s+from\s+)?(['"])(\.\.?\/[^'"]+)\1/g;
|
|
106
|
+
const requirePattern = /require\s*\(\s*(['"])(\.\.?\/[^'"]+)\1/g;
|
|
66
107
|
|
|
67
108
|
// Track if we're inside a block comment
|
|
68
109
|
let inBlockComment = false;
|
|
110
|
+
let inTemplateLiteral = false;
|
|
69
111
|
|
|
70
112
|
for (let i = 0; i < lines.length; i++) {
|
|
71
113
|
const line = lines[i];
|
|
72
114
|
|
|
115
|
+
if (inTemplateLiteral) {
|
|
116
|
+
if ((line.match(/(?<!\\)`/g) ?? []).length % 2 === 1) {
|
|
117
|
+
inTemplateLiteral = false;
|
|
118
|
+
}
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
|
|
73
122
|
// Handle block comment boundaries
|
|
74
123
|
if (inBlockComment) {
|
|
75
124
|
if (line.includes("*/")) {
|
|
@@ -101,10 +150,22 @@ export function extractRelativeImports(
|
|
|
101
150
|
|
|
102
151
|
// Reset lastIndex for each line
|
|
103
152
|
importPattern.lastIndex = 0;
|
|
153
|
+
requirePattern.lastIndex = 0;
|
|
154
|
+
|
|
155
|
+
const strippedLine = stripStringLiterals(line);
|
|
104
156
|
|
|
105
157
|
while ((match = importPattern.exec(line)) !== null) {
|
|
158
|
+
const importOffset = match[0].indexOf("import");
|
|
159
|
+
const importStart = match.index + importOffset;
|
|
160
|
+
if (
|
|
161
|
+
strippedLine.slice(importStart, importStart + "import".length) !==
|
|
162
|
+
"import"
|
|
163
|
+
) {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
|
|
106
167
|
// Check if this match is after a // comment marker on the same line
|
|
107
|
-
const beforeMatch =
|
|
168
|
+
const beforeMatch = strippedLine.substring(0, match.index);
|
|
108
169
|
if (beforeMatch.includes("//")) {
|
|
109
170
|
continue;
|
|
110
171
|
}
|
|
@@ -114,6 +175,30 @@ export function extractRelativeImports(
|
|
|
114
175
|
lineNum: i + 1,
|
|
115
176
|
});
|
|
116
177
|
}
|
|
178
|
+
|
|
179
|
+
while ((match = requirePattern.exec(line)) !== null) {
|
|
180
|
+
if (
|
|
181
|
+
strippedLine.slice(match.index, match.index + "require".length) !==
|
|
182
|
+
"require"
|
|
183
|
+
) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Check if this match is after a // comment marker on the same line
|
|
188
|
+
const beforeMatch = strippedLine.substring(0, match.index);
|
|
189
|
+
if (beforeMatch.includes("//")) {
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
imports.push({
|
|
194
|
+
importPath: match[2],
|
|
195
|
+
lineNum: i + 1,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if ((strippedLine.match(/(?<!\\)`/g) ?? []).length % 2 === 1) {
|
|
200
|
+
inTemplateLiteral = true;
|
|
201
|
+
}
|
|
117
202
|
}
|
|
118
203
|
|
|
119
204
|
return imports;
|
|
@@ -159,16 +244,6 @@ export function resolveImportPath(
|
|
|
159
244
|
".woff", ".woff2", ".ttf", ".otf", ".eot",
|
|
160
245
|
]);
|
|
161
246
|
const runtimeFallbackExtensions = new Set([".js", ".jsx", ".mjs", ".cjs"]);
|
|
162
|
-
const dottedStemFallbackExtensions = new Set([".server", ".client", ".webhook"]);
|
|
163
|
-
|
|
164
|
-
if (
|
|
165
|
-
explicitExt !== "" &&
|
|
166
|
-
!runtimeFallbackExtensions.has(explicitExt) &&
|
|
167
|
-
!nonFallbackExtensions.has(explicitExt) &&
|
|
168
|
-
!dottedStemFallbackExtensions.has(explicitExt)
|
|
169
|
-
) {
|
|
170
|
-
return { exists: false, resolvedPath: null };
|
|
171
|
-
}
|
|
172
247
|
|
|
173
248
|
if (nonFallbackExtensions.has(explicitExt) && !runtimeFallbackExtensions.has(explicitExt)) {
|
|
174
249
|
return { exists: false, resolvedPath: null };
|
|
@@ -23,6 +23,7 @@ import { homedir } from "node:os";
|
|
|
23
23
|
import { resolve } from "node:path";
|
|
24
24
|
import type { TaskRow } from "./db-task-slice-rows.js";
|
|
25
25
|
import type { PreExecutionCheckJSON } from "./verification-evidence.ts";
|
|
26
|
+
import { validateVerificationCommand } from "./verification-gate.js";
|
|
26
27
|
|
|
27
28
|
const NPM_COMMAND = process.platform === "win32" ? "npm.cmd" : "npm";
|
|
28
29
|
|
|
@@ -37,6 +38,39 @@ export interface PreExecutionResult {
|
|
|
37
38
|
durationMs: number;
|
|
38
39
|
}
|
|
39
40
|
|
|
41
|
+
export interface PreExecutionCheckContext {
|
|
42
|
+
additionalRoots?: string[];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function checkVerificationCommands(tasks: TaskRow[]): PreExecutionCheckJSON[] {
|
|
46
|
+
const results: PreExecutionCheckJSON[] = [];
|
|
47
|
+
|
|
48
|
+
for (const task of tasks) {
|
|
49
|
+
const verify = task.verify.trim();
|
|
50
|
+
if (!verify) continue;
|
|
51
|
+
|
|
52
|
+
const commands = verify
|
|
53
|
+
.split("&&")
|
|
54
|
+
.map((command) => command.trim())
|
|
55
|
+
.filter(Boolean);
|
|
56
|
+
|
|
57
|
+
for (const command of commands) {
|
|
58
|
+
const validation = validateVerificationCommand(command);
|
|
59
|
+
if (!validation.ok) {
|
|
60
|
+
results.push({
|
|
61
|
+
category: "tool",
|
|
62
|
+
target: `${task.id} Verify`,
|
|
63
|
+
passed: false,
|
|
64
|
+
message: `Unsafe or non-runnable Verify command: ${command} (${validation.reason})`,
|
|
65
|
+
blocking: true,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return results;
|
|
72
|
+
}
|
|
73
|
+
|
|
40
74
|
// ─── Package Existence Check ─────────────────────────────────────────────────
|
|
41
75
|
|
|
42
76
|
/**
|
|
@@ -105,7 +139,7 @@ export function extractPackageReferences(description: string): string[] {
|
|
|
105
139
|
while ((importMatch = importPattern.exec(description)) !== null) {
|
|
106
140
|
// Skip relative imports and node builtins
|
|
107
141
|
const pkg = importMatch[1];
|
|
108
|
-
if (!pkg.startsWith(".") && !pkg.startsWith("node:")) {
|
|
142
|
+
if (!pkg.startsWith(".") && !pkg.startsWith("node:") && !pkg.startsWith("@/")) {
|
|
109
143
|
packages.add(normalizePackageName(pkg));
|
|
110
144
|
}
|
|
111
145
|
}
|
|
@@ -450,9 +484,11 @@ function getExpectedOutputsUpTo(tasks: TaskRow[], taskIndex: number): Set<string
|
|
|
450
484
|
*/
|
|
451
485
|
export function checkFilePathConsistency(
|
|
452
486
|
tasks: TaskRow[],
|
|
453
|
-
basePath: string
|
|
487
|
+
basePath: string,
|
|
488
|
+
context?: PreExecutionCheckContext,
|
|
454
489
|
): PreExecutionCheckJSON[] {
|
|
455
490
|
const results: PreExecutionCheckJSON[] = [];
|
|
491
|
+
const resolutionRoots = [basePath, ...(context?.additionalRoots ?? [])];
|
|
456
492
|
|
|
457
493
|
// Build a set of all files created by any task at any position (normalized).
|
|
458
494
|
// Used to suppress consistency errors for files that will be caught with a
|
|
@@ -480,8 +516,7 @@ export function checkFilePathConsistency(
|
|
|
480
516
|
if (containsGlobPattern(normalizedFile)) continue;
|
|
481
517
|
|
|
482
518
|
// Check if file exists on disk
|
|
483
|
-
const
|
|
484
|
-
const existsOnDisk = existsSync(absolutePath);
|
|
519
|
+
const existsOnDisk = resolutionRoots.some((root) => existsSync(resolve(root, normalizedFile)));
|
|
485
520
|
|
|
486
521
|
// Check if file is in prior expected outputs (priorOutputs already normalized)
|
|
487
522
|
const inPriorOutputs = priorOutputs.has(normalizedFile);
|
|
@@ -527,9 +562,11 @@ export function checkFilePathConsistency(
|
|
|
527
562
|
*/
|
|
528
563
|
export function checkTaskOrdering(
|
|
529
564
|
tasks: TaskRow[],
|
|
530
|
-
basePath: string
|
|
565
|
+
basePath: string,
|
|
566
|
+
context?: PreExecutionCheckContext,
|
|
531
567
|
): PreExecutionCheckJSON[] {
|
|
532
568
|
const results: PreExecutionCheckJSON[] = [];
|
|
569
|
+
const resolutionRoots = [basePath, ...(context?.additionalRoots ?? [])];
|
|
533
570
|
|
|
534
571
|
// Build map: normalized file → task index that creates it
|
|
535
572
|
const fileCreators = new Map<string, { taskId: string; index: number; originalPath: string; completed: boolean }>();
|
|
@@ -567,8 +604,7 @@ export function checkTaskOrdering(
|
|
|
567
604
|
// files, and a same-task output under the directory satisfies it.
|
|
568
605
|
if (isDirectoryReference(file)) continue;
|
|
569
606
|
const creator = fileCreators.get(normalizedFile);
|
|
570
|
-
const
|
|
571
|
-
const existsOnDisk = existsSync(absolutePath);
|
|
607
|
+
const existsOnDisk = resolutionRoots.some((root) => existsSync(resolve(root, normalizedFile)));
|
|
572
608
|
// Skip if the creating task has already completed — its output is available
|
|
573
609
|
// regardless of disk state (e.g. file was a temp artifact cleaned up after
|
|
574
610
|
// the task ran, or a replan introduced a new earlier-sequence task that
|
|
@@ -748,17 +784,19 @@ export function checkInterfaceContracts(
|
|
|
748
784
|
*/
|
|
749
785
|
export async function runPreExecutionChecks(
|
|
750
786
|
tasks: TaskRow[],
|
|
751
|
-
basePath: string
|
|
787
|
+
basePath: string,
|
|
788
|
+
context?: PreExecutionCheckContext,
|
|
752
789
|
): Promise<PreExecutionResult> {
|
|
753
790
|
const startTime = Date.now();
|
|
754
791
|
const allChecks: PreExecutionCheckJSON[] = [];
|
|
755
792
|
|
|
756
793
|
// Run sync checks first
|
|
757
|
-
const fileChecks = checkFilePathConsistency(tasks, basePath);
|
|
758
|
-
const orderingChecks = checkTaskOrdering(tasks, basePath);
|
|
794
|
+
const fileChecks = checkFilePathConsistency(tasks, basePath, context);
|
|
795
|
+
const orderingChecks = checkTaskOrdering(tasks, basePath, context);
|
|
759
796
|
const contractChecks = checkInterfaceContracts(tasks, basePath);
|
|
797
|
+
const verificationChecks = checkVerificationCommands(tasks);
|
|
760
798
|
|
|
761
|
-
allChecks.push(...fileChecks, ...orderingChecks, ...contractChecks);
|
|
799
|
+
allChecks.push(...fileChecks, ...orderingChecks, ...contractChecks, ...verificationChecks);
|
|
762
800
|
|
|
763
801
|
// Run async package checks
|
|
764
802
|
const packageChecks = await checkPackageExistence(tasks, basePath);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ClaudeCodeMcpConfig, ClaudeCodeMcpPerModelEntry } from "./preferences-types.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Resolve MCP server config for a given model ID using longest-prefix-wins matching.
|
|
5
|
+
*
|
|
6
|
+
* Keys in config.per_model are model-ID prefixes. When modelId.startsWith(key),
|
|
7
|
+
* the key is a candidate; the longest matching key wins. Returns undefined when
|
|
8
|
+
* no key matches or per_model is empty.
|
|
9
|
+
*/
|
|
10
|
+
export function resolveModelMcpConfig(
|
|
11
|
+
modelId: string,
|
|
12
|
+
config: ClaudeCodeMcpConfig,
|
|
13
|
+
): ClaudeCodeMcpPerModelEntry | undefined {
|
|
14
|
+
let bestKey: string | undefined;
|
|
15
|
+
|
|
16
|
+
const perModel = config.per_model ?? {};
|
|
17
|
+
|
|
18
|
+
for (const key of Object.keys(perModel)) {
|
|
19
|
+
if (modelId.startsWith(key)) {
|
|
20
|
+
if (bestKey === undefined || key.length > bestKey.length) {
|
|
21
|
+
bestKey = key;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return bestKey !== undefined ? perModel[bestKey] : undefined;
|
|
27
|
+
}
|
|
@@ -152,6 +152,8 @@ export const KNOWN_PREFERENCE_KEYS = new Set<string>([
|
|
|
152
152
|
"context_window_override",
|
|
153
153
|
"context_mode",
|
|
154
154
|
"planning_depth",
|
|
155
|
+
"claude_code_mcp",
|
|
156
|
+
"workspace",
|
|
155
157
|
]);
|
|
156
158
|
|
|
157
159
|
/**
|
|
@@ -320,6 +322,33 @@ export interface CodebaseMapPreferences {
|
|
|
320
322
|
collapse_threshold?: number;
|
|
321
323
|
}
|
|
322
324
|
|
|
325
|
+
/** Per-model MCP server allow/block lists for a single model prefix. */
|
|
326
|
+
export interface ClaudeCodeMcpPerModelEntry {
|
|
327
|
+
allowed_servers?: string[];
|
|
328
|
+
blocked_servers?: string[];
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/** Top-level claude_code_mcp preference: maps model-ID prefixes to server filter lists. */
|
|
332
|
+
export interface ClaudeCodeMcpConfig {
|
|
333
|
+
per_model?: Record<string, ClaudeCodeMcpPerModelEntry>;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
export interface WorkspaceRepositoryPreference {
|
|
337
|
+
/** Child repository path; relative paths resolve from the project root. */
|
|
338
|
+
path: string;
|
|
339
|
+
/** Optional human-oriented role label (for prompts/reporting). */
|
|
340
|
+
role?: string;
|
|
341
|
+
/** Optional default verification commands for this repository. */
|
|
342
|
+
verification?: string[];
|
|
343
|
+
/** Optional per-repository commit execution policy for auto-mode turn commits. */
|
|
344
|
+
commit_policy?: "auto" | "skip";
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
export interface WorkspacePreferences {
|
|
348
|
+
/** Parent-workspace uses one parent .gsd coordinating child repos. */
|
|
349
|
+
mode?: "project" | "parent";
|
|
350
|
+
repositories?: Record<string, WorkspaceRepositoryPreference>;
|
|
351
|
+
}
|
|
323
352
|
export interface GSDPreferences {
|
|
324
353
|
version?: number;
|
|
325
354
|
mode?: WorkflowMode;
|
|
@@ -415,6 +444,8 @@ export interface GSDPreferences {
|
|
|
415
444
|
experimental?: ExperimentalPreferences;
|
|
416
445
|
/** Configuration for the codebase map generator (/gsd codebase). */
|
|
417
446
|
codebase?: CodebaseMapPreferences;
|
|
447
|
+
/** Multi-repository parent workspace configuration. */
|
|
448
|
+
workspace?: WorkspacePreferences;
|
|
418
449
|
/** Slice-level parallelism within a milestone. Disabled by default. */
|
|
419
450
|
slice_parallel?: { enabled?: boolean; max_workers?: number };
|
|
420
451
|
/** LLM safety harness configuration. Monitors, validates, and constrains LLM behavior during auto-mode. Enabled by default with warn-and-continue policy. */
|
|
@@ -499,6 +530,8 @@ export interface GSDPreferences {
|
|
|
499
530
|
* (e.g. "Chinese", "zh", "German", "de", "日本語"). Persists across /clear.
|
|
500
531
|
*/
|
|
501
532
|
language?: string;
|
|
533
|
+
/** Per-model MCP server filtering configuration. Uses longest-prefix-wins matching. */
|
|
534
|
+
claude_code_mcp?: ClaudeCodeMcpConfig;
|
|
502
535
|
}
|
|
503
536
|
|
|
504
537
|
export interface LoadedGSDPreferences {
|