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
|
@@ -17,6 +17,7 @@ import { gsdRoot } from "./paths.js";
|
|
|
17
17
|
import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
|
|
18
18
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
19
19
|
import { logWarning } from "./workflow-logger.js";
|
|
20
|
+
import { createRepositoryRegistryFromPreferences } from "./repository-registry.js";
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
import {
|
|
@@ -123,6 +124,10 @@ export interface TurnGitActionResult {
|
|
|
123
124
|
commitMessage?: string;
|
|
124
125
|
snapshotLabel?: string;
|
|
125
126
|
dirty?: boolean;
|
|
127
|
+
dirtyRepositories?: Record<string, boolean>;
|
|
128
|
+
commitMessages?: Record<string, string>;
|
|
129
|
+
commitErrors?: Record<string, string>;
|
|
130
|
+
skippedRepositories?: string[];
|
|
126
131
|
error?: string;
|
|
127
132
|
}
|
|
128
133
|
|
|
@@ -270,6 +275,30 @@ function isExcludedScopedPath(path: string, exclusions: readonly string[]): bool
|
|
|
270
275
|
return false;
|
|
271
276
|
}
|
|
272
277
|
|
|
278
|
+
function submodulePathsFromLsFiles(output: string): Set<string> {
|
|
279
|
+
const submodulePaths = new Set<string>();
|
|
280
|
+
if (!output) return submodulePaths;
|
|
281
|
+
|
|
282
|
+
for (const line of output.split("\n")) {
|
|
283
|
+
const match = line.match(/^160000\s+\S+\s+\d+\t(.+)$/);
|
|
284
|
+
if (!match) continue;
|
|
285
|
+
submodulePaths.add(match[1].replace(/\\/g, "/").replace(/\/+$/, ""));
|
|
286
|
+
}
|
|
287
|
+
return submodulePaths;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function isInsideSubmodule(path: string, submodulePaths: ReadonlySet<string>): boolean {
|
|
291
|
+
const normalizedPath = path.replace(/\\/g, "/");
|
|
292
|
+
if (submodulePaths.has(normalizedPath)) return true;
|
|
293
|
+
|
|
294
|
+
let slashIndex = normalizedPath.lastIndexOf("/");
|
|
295
|
+
while (slashIndex > 0) {
|
|
296
|
+
if (submodulePaths.has(normalizedPath.slice(0, slashIndex))) return true;
|
|
297
|
+
slashIndex = normalizedPath.lastIndexOf("/", slashIndex - 1);
|
|
298
|
+
}
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
|
|
273
302
|
/**
|
|
274
303
|
* Thrown when a slice merge hits code conflicts in non-.gsd files.
|
|
275
304
|
* The working tree is left in a conflicted state (no reset) so the
|
|
@@ -364,6 +393,9 @@ export function readIntegrationBranch(basePath: string, milestoneId: string): st
|
|
|
364
393
|
}
|
|
365
394
|
}
|
|
366
395
|
|
|
396
|
+
/** Re-export for backward compatibility — canonical definitions in branch-patterns.ts */
|
|
397
|
+
export { QUICK_BRANCH_RE, WORKFLOW_BRANCH_RE } from "./branch-patterns.js";
|
|
398
|
+
|
|
367
399
|
/**
|
|
368
400
|
* Persist the integration branch for a milestone.
|
|
369
401
|
*
|
|
@@ -374,14 +406,14 @@ export function readIntegrationBranch(basePath: string, milestoneId: string): st
|
|
|
374
406
|
*
|
|
375
407
|
* The file is committed immediately so the metadata is persisted in git.
|
|
376
408
|
*/
|
|
377
|
-
/** Re-export for backward compatibility — canonical definitions in branch-patterns.ts */
|
|
378
|
-
export { QUICK_BRANCH_RE, WORKFLOW_BRANCH_RE } from "./branch-patterns.js";
|
|
379
|
-
|
|
380
409
|
export function writeIntegrationBranch(
|
|
381
410
|
basePath: string,
|
|
382
411
|
milestoneId: string,
|
|
383
412
|
branch: string,
|
|
384
413
|
): void {
|
|
414
|
+
// Never persist milestone branches as integration targets.
|
|
415
|
+
// They are ephemeral execution branches and can cause self-diff corruption.
|
|
416
|
+
if (branch.startsWith("milestone/")) return;
|
|
385
417
|
// Don't record slice branches as the integration target
|
|
386
418
|
if (SLICE_BRANCH_RE.test(branch)) return;
|
|
387
419
|
// Don't record quick-task branches — they are ephemeral and merge back
|
|
@@ -764,6 +796,26 @@ export class GitServiceImpl {
|
|
|
764
796
|
.filter(file => !nativeIsIgnored(this.basePath, file))
|
|
765
797
|
.filter(file => !isExcludedScopedPath(file, allExclusions));
|
|
766
798
|
|
|
799
|
+
const scopedPaths: string[] = [];
|
|
800
|
+
const submodulePaths: string[] = [];
|
|
801
|
+
const repoSubmodules = submodulePathsFromLsFiles(
|
|
802
|
+
runGit(this.basePath, ["ls-files", "--stage"], { allowFailure: true }),
|
|
803
|
+
);
|
|
804
|
+
for (const path of normalized) {
|
|
805
|
+
if (isInsideSubmodule(path, repoSubmodules)) {
|
|
806
|
+
submodulePaths.push(path);
|
|
807
|
+
} else {
|
|
808
|
+
scopedPaths.push(path);
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
if (submodulePaths.length > 0) {
|
|
812
|
+
logWarning(
|
|
813
|
+
"engine",
|
|
814
|
+
`scoped stage: dropping ${submodulePaths.length} keyFile(s) inside git submodule(s): ${submodulePaths.join(", ")}`,
|
|
815
|
+
{ file: "git-service.ts" },
|
|
816
|
+
);
|
|
817
|
+
}
|
|
818
|
+
|
|
767
819
|
// Drop entries that don't exist on disk. The LLM occasionally lists files
|
|
768
820
|
// it intended to write but didn't (or names them with wrong casing/path).
|
|
769
821
|
// Pre-`b304f738b` `git add -A` swallowed these silently; the scoped
|
|
@@ -771,7 +823,7 @@ export class GitServiceImpl {
|
|
|
771
823
|
// the whole commit fail (see #5500). Filter so valid paths still commit.
|
|
772
824
|
const missing: string[] = [];
|
|
773
825
|
const existing: string[] = [];
|
|
774
|
-
for (const path of
|
|
826
|
+
for (const path of scopedPaths) {
|
|
775
827
|
if (existsSync(join(this.basePath, path))) {
|
|
776
828
|
existing.push(path);
|
|
777
829
|
} else {
|
|
@@ -859,7 +911,19 @@ export class GitServiceImpl {
|
|
|
859
911
|
const message = taskContext
|
|
860
912
|
? buildTaskCommitMessage(taskContext)
|
|
861
913
|
: `chore: auto-commit after ${unitType}\n\nGSD-Unit: ${unitId}`;
|
|
862
|
-
|
|
914
|
+
try {
|
|
915
|
+
nativeCommit(this.basePath, message, { allowEmpty: false });
|
|
916
|
+
} catch (err) {
|
|
917
|
+
// Some pre-commit hooks intentionally rewrite files and fail the first
|
|
918
|
+
// commit to force a re-stage + retry.
|
|
919
|
+
if (!nativeHasChanges(this.basePath)) throw err;
|
|
920
|
+
const retriedScoped = taskContext
|
|
921
|
+
? this.scopedStageTaskFiles(taskContext, extraExclusions)
|
|
922
|
+
: false;
|
|
923
|
+
if (!retriedScoped) this.smartStage(extraExclusions);
|
|
924
|
+
if (!nativeHasStagedChanges(this.basePath)) throw err;
|
|
925
|
+
nativeCommit(this.basePath, message, { allowEmpty: false });
|
|
926
|
+
}
|
|
863
927
|
|
|
864
928
|
// Absorb any preceding gsd snapshot commits into this real commit.
|
|
865
929
|
// Walk backwards from HEAD~1 counting consecutive snapshot subjects,
|
|
@@ -1153,28 +1217,97 @@ export function handleTurnGitActionError(action: TurnGitActionMode, err: unknown
|
|
|
1153
1217
|
if (isInfrastructureError(err)) {
|
|
1154
1218
|
throw err;
|
|
1155
1219
|
}
|
|
1220
|
+
const errorWithStreams = err as { stderr?: string; message?: string };
|
|
1156
1221
|
return {
|
|
1157
1222
|
action,
|
|
1158
1223
|
status: "failed",
|
|
1159
|
-
error: getErrorMessage(err),
|
|
1224
|
+
error: errorWithStreams.stderr?.trim() || errorWithStreams.message || getErrorMessage(err),
|
|
1160
1225
|
};
|
|
1161
1226
|
}
|
|
1162
1227
|
|
|
1228
|
+
function collectRepositoryDirtyStatus(basePath: string): Record<string, boolean> {
|
|
1229
|
+
const preferences = loadEffectiveGSDPreferences(basePath)?.preferences;
|
|
1230
|
+
const registry = createRepositoryRegistryFromPreferences(basePath, preferences);
|
|
1231
|
+
const dirtyByRepository: Record<string, boolean> = {};
|
|
1232
|
+
for (const repo of registry.repositories) {
|
|
1233
|
+
try {
|
|
1234
|
+
dirtyByRepository[repo.id] = runGit(repo.root, ["status", "--porcelain"]).length > 0;
|
|
1235
|
+
} catch {
|
|
1236
|
+
// Fallback preserves legacy behavior if explicit status probing fails.
|
|
1237
|
+
dirtyByRepository[repo.id] = nativeHasChanges(repo.root);
|
|
1238
|
+
}
|
|
1239
|
+
}
|
|
1240
|
+
return dirtyByRepository;
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
function runPerRepositoryCommitAction(args: {
|
|
1244
|
+
basePath: string;
|
|
1245
|
+
unitType: string;
|
|
1246
|
+
unitId: string;
|
|
1247
|
+
taskContext?: TaskCommitContext;
|
|
1248
|
+
targetRepositories?: string[];
|
|
1249
|
+
}): {
|
|
1250
|
+
commitMessages: Record<string, string>;
|
|
1251
|
+
commitErrors: Record<string, string>;
|
|
1252
|
+
skippedRepositories: string[];
|
|
1253
|
+
} {
|
|
1254
|
+
const preferences = loadEffectiveGSDPreferences(args.basePath)?.preferences;
|
|
1255
|
+
const registry = createRepositoryRegistryFromPreferences(args.basePath, preferences);
|
|
1256
|
+
const repoIds = args.targetRepositories ?? ["project"];
|
|
1257
|
+
const gitPrefs = preferences?.git ?? {};
|
|
1258
|
+
const commitMessages: Record<string, string> = {};
|
|
1259
|
+
const commitErrors: Record<string, string> = {};
|
|
1260
|
+
const skippedRepositories: string[] = [];
|
|
1261
|
+
|
|
1262
|
+
for (const repoId of repoIds) {
|
|
1263
|
+
const repo = registry.byId.get(repoId);
|
|
1264
|
+
if (!repo) {
|
|
1265
|
+
commitErrors[repoId] = `unknown repository target: ${repoId}`;
|
|
1266
|
+
continue;
|
|
1267
|
+
}
|
|
1268
|
+
if (repo.commitPolicy === "skip") {
|
|
1269
|
+
skippedRepositories.push(repo.id);
|
|
1270
|
+
continue;
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
try {
|
|
1274
|
+
const message =
|
|
1275
|
+
new GitServiceImpl(repo.root, gitPrefs).autoCommit(
|
|
1276
|
+
args.unitType,
|
|
1277
|
+
args.unitId,
|
|
1278
|
+
[],
|
|
1279
|
+
args.taskContext,
|
|
1280
|
+
) ?? "";
|
|
1281
|
+
if (message) {
|
|
1282
|
+
commitMessages[repo.id] = message;
|
|
1283
|
+
}
|
|
1284
|
+
} catch (err) {
|
|
1285
|
+
commitErrors[repo.id] = getErrorMessage(err);
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
return { commitMessages, commitErrors, skippedRepositories };
|
|
1290
|
+
}
|
|
1291
|
+
|
|
1163
1292
|
export function runTurnGitAction(args: {
|
|
1164
1293
|
basePath: string;
|
|
1165
1294
|
action: TurnGitActionMode;
|
|
1166
1295
|
unitType: string;
|
|
1167
1296
|
unitId: string;
|
|
1168
1297
|
taskContext?: TaskCommitContext;
|
|
1298
|
+
targetRepositories?: string[];
|
|
1169
1299
|
}): TurnGitActionResult {
|
|
1170
1300
|
try {
|
|
1171
1301
|
// Force fresh working-tree status per turn; nativeHasChanges caches briefly.
|
|
1172
1302
|
_resetHasChangesCache();
|
|
1303
|
+
const dirtyRepositories = collectRepositoryDirtyStatus(args.basePath);
|
|
1304
|
+
const dirty = Object.values(dirtyRepositories).some(Boolean);
|
|
1173
1305
|
if (args.action === "status-only") {
|
|
1174
1306
|
return {
|
|
1175
1307
|
action: args.action,
|
|
1176
1308
|
status: "ok",
|
|
1177
|
-
dirty
|
|
1309
|
+
dirty,
|
|
1310
|
+
dirtyRepositories,
|
|
1178
1311
|
};
|
|
1179
1312
|
}
|
|
1180
1313
|
|
|
@@ -1186,16 +1319,38 @@ export function runTurnGitAction(args: {
|
|
|
1186
1319
|
action: args.action,
|
|
1187
1320
|
status: "ok",
|
|
1188
1321
|
snapshotLabel: label,
|
|
1189
|
-
dirty
|
|
1322
|
+
dirty,
|
|
1323
|
+
dirtyRepositories,
|
|
1324
|
+
};
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
const repoCommitResult = runPerRepositoryCommitAction(args);
|
|
1328
|
+
if (Object.keys(repoCommitResult.commitErrors).length > 0) {
|
|
1329
|
+
return {
|
|
1330
|
+
action: args.action,
|
|
1331
|
+
status: "failed",
|
|
1332
|
+
error: Object.entries(repoCommitResult.commitErrors)
|
|
1333
|
+
.map(([repoId, msg]) => `${repoId}: ${msg}`)
|
|
1334
|
+
.join("; "),
|
|
1335
|
+
dirty,
|
|
1336
|
+
dirtyRepositories,
|
|
1337
|
+
commitMessages: repoCommitResult.commitMessages,
|
|
1338
|
+
commitErrors: repoCommitResult.commitErrors,
|
|
1339
|
+
skippedRepositories: repoCommitResult.skippedRepositories,
|
|
1190
1340
|
};
|
|
1191
1341
|
}
|
|
1192
1342
|
|
|
1193
|
-
const
|
|
1343
|
+
const primaryMessage =
|
|
1344
|
+
repoCommitResult.commitMessages[args.targetRepositories?.[0] ?? "project"]
|
|
1345
|
+
?? Object.values(repoCommitResult.commitMessages)[0];
|
|
1194
1346
|
return {
|
|
1195
1347
|
action: args.action,
|
|
1196
1348
|
status: "ok",
|
|
1197
|
-
commitMessage,
|
|
1198
|
-
dirty
|
|
1349
|
+
commitMessage: primaryMessage,
|
|
1350
|
+
dirty,
|
|
1351
|
+
dirtyRepositories,
|
|
1352
|
+
commitMessages: repoCommitResult.commitMessages,
|
|
1353
|
+
skippedRepositories: repoCommitResult.skippedRepositories,
|
|
1199
1354
|
};
|
|
1200
1355
|
} catch (err) {
|
|
1201
1356
|
return handleTurnGitActionError(args.action, err);
|
|
@@ -81,6 +81,7 @@ import {
|
|
|
81
81
|
applyMigrationV26MilestoneCommitAttributions,
|
|
82
82
|
applyMigrationV27ArtifactHash,
|
|
83
83
|
applyMigrationV28MemoryLastHitAt,
|
|
84
|
+
applyMigrationV29RepositoryTargets,
|
|
84
85
|
} from "./db-migration-steps.js";
|
|
85
86
|
import { isMemoriesFtsAvailableSchema, tryCreateMemoriesFtsSchema } from "./db-memory-fts-schema.js";
|
|
86
87
|
import { createDbOpenState, type DbOpenPhase } from "./db-open-state.js";
|
|
@@ -109,15 +110,17 @@ const providerLoader = createSqliteProviderLoader({
|
|
|
109
110
|
writeStderr: (message: string) => process.stderr.write(message),
|
|
110
111
|
});
|
|
111
112
|
|
|
112
|
-
export const SCHEMA_VERSION =
|
|
113
|
+
export const SCHEMA_VERSION = 29;
|
|
114
|
+
const TERMINAL_STATUS_SQL = "'complete', 'done', 'skipped', 'closed'";
|
|
113
115
|
|
|
114
|
-
function initSchema(db: DbAdapter, fileBacked: boolean): void {
|
|
115
|
-
|
|
116
|
+
function initSchema(db: DbAdapter, fileBacked: boolean, dbPath: string | null): void {
|
|
117
|
+
const conservativeFilePragmas = fileBacked && _isLikelyWslDrvFsPathForTest(dbPath);
|
|
118
|
+
if (fileBacked) db.exec(conservativeFilePragmas ? "PRAGMA journal_mode=DELETE" : "PRAGMA journal_mode=WAL");
|
|
116
119
|
if (fileBacked) db.exec("PRAGMA busy_timeout = 5000");
|
|
117
|
-
if (fileBacked) db.exec("PRAGMA synchronous = NORMAL");
|
|
120
|
+
if (fileBacked) db.exec(conservativeFilePragmas ? "PRAGMA synchronous = FULL" : "PRAGMA synchronous = NORMAL");
|
|
118
121
|
if (fileBacked) db.exec("PRAGMA auto_vacuum = INCREMENTAL");
|
|
119
122
|
if (fileBacked) db.exec("PRAGMA cache_size = -8000"); // 8 MB page cache
|
|
120
|
-
if (fileBacked && process.platform !== "darwin") db.exec("PRAGMA mmap_size = 67108864"); // 64 MB mmap
|
|
123
|
+
if (fileBacked && !conservativeFilePragmas && process.platform !== "darwin") db.exec("PRAGMA mmap_size = 67108864"); // 64 MB mmap
|
|
121
124
|
db.exec("PRAGMA temp_store = MEMORY");
|
|
122
125
|
db.exec("PRAGMA foreign_keys = ON");
|
|
123
126
|
|
|
@@ -156,6 +159,17 @@ function initSchema(db: DbAdapter, fileBacked: boolean): void {
|
|
|
156
159
|
migrateSchema(db);
|
|
157
160
|
}
|
|
158
161
|
|
|
162
|
+
export function _isLikelyWslDrvFsPathForTest(dbPath: string | null): boolean {
|
|
163
|
+
if (!dbPath || process.platform !== "linux") return false;
|
|
164
|
+
const drvFsPathPattern = /^\/mnt\/[a-z](?:\/|$)/i;
|
|
165
|
+
if (drvFsPathPattern.test(dbPath)) return true;
|
|
166
|
+
try {
|
|
167
|
+
return drvFsPathPattern.test(realpathSync(dbPath));
|
|
168
|
+
} catch {
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
159
173
|
/**
|
|
160
174
|
* Create the FTS5 virtual table for memories plus the triggers that keep it
|
|
161
175
|
* in sync with the base table. FTS5 may be unavailable on stripped-down
|
|
@@ -348,6 +362,11 @@ function migrateSchema(db: DbAdapter): void {
|
|
|
348
362
|
recordSchemaVersion(db, 28);
|
|
349
363
|
}
|
|
350
364
|
|
|
365
|
+
if (currentVersion < 29) {
|
|
366
|
+
applyMigrationV29RepositoryTargets(db);
|
|
367
|
+
recordSchemaVersion(db, 29);
|
|
368
|
+
}
|
|
369
|
+
|
|
351
370
|
db.exec("COMMIT");
|
|
352
371
|
} catch (err) {
|
|
353
372
|
db.exec("ROLLBACK");
|
|
@@ -605,14 +624,14 @@ export function openDatabase(path: string): boolean {
|
|
|
605
624
|
const adapter = createDbAdapter(rawDb);
|
|
606
625
|
const fileBacked = path !== ":memory:";
|
|
607
626
|
try {
|
|
608
|
-
initSchema(adapter, fileBacked);
|
|
627
|
+
initSchema(adapter, fileBacked, path);
|
|
609
628
|
} catch (err) {
|
|
610
629
|
// Corrupt freelist: DDL fails with "malformed" but VACUUM can rebuild.
|
|
611
630
|
// Attempt VACUUM recovery before giving up (see #2519).
|
|
612
631
|
if (fileBacked && err instanceof Error && err.message?.includes("malformed")) {
|
|
613
632
|
try {
|
|
614
633
|
adapter.exec("VACUUM");
|
|
615
|
-
initSchema(adapter, fileBacked);
|
|
634
|
+
initSchema(adapter, fileBacked, path);
|
|
616
635
|
process.stderr.write("gsd-db: recovered corrupt database via VACUUM\n");
|
|
617
636
|
} catch (retryErr) {
|
|
618
637
|
_dbOpenState.recordError("vacuum-recovery", retryErr);
|
|
@@ -962,6 +981,7 @@ export interface SlicePlanningRecord {
|
|
|
962
981
|
proofLevel: string;
|
|
963
982
|
integrationClosure: string;
|
|
964
983
|
observabilityImpact: string;
|
|
984
|
+
targetRepositories?: string[];
|
|
965
985
|
}
|
|
966
986
|
|
|
967
987
|
export interface TaskPlanningRecord {
|
|
@@ -974,6 +994,7 @@ export interface TaskPlanningRecord {
|
|
|
974
994
|
expectedOutput: string[];
|
|
975
995
|
observabilityImpact: string;
|
|
976
996
|
fullPlanMd?: string;
|
|
997
|
+
targetRepositories?: string[];
|
|
977
998
|
}
|
|
978
999
|
|
|
979
1000
|
export function insertMilestone(m: {
|
|
@@ -1071,16 +1092,16 @@ export function insertSlice(s: {
|
|
|
1071
1092
|
currentDb.prepare(
|
|
1072
1093
|
`INSERT INTO slices (
|
|
1073
1094
|
milestone_id, id, title, status, risk, depends, demo, created_at,
|
|
1074
|
-
goal, success_criteria, proof_level, integration_closure, observability_impact, sequence,
|
|
1095
|
+
goal, success_criteria, proof_level, integration_closure, observability_impact, target_repositories, sequence,
|
|
1075
1096
|
is_sketch, sketch_scope
|
|
1076
1097
|
) VALUES (
|
|
1077
1098
|
:milestone_id, :id, :title, :status, :risk, :depends, :demo, :created_at,
|
|
1078
|
-
:goal, :success_criteria, :proof_level, :integration_closure, :observability_impact, :sequence,
|
|
1099
|
+
:goal, :success_criteria, :proof_level, :integration_closure, :observability_impact, :target_repositories, :sequence,
|
|
1079
1100
|
:is_sketch, :sketch_scope
|
|
1080
1101
|
)
|
|
1081
1102
|
ON CONFLICT (milestone_id, id) DO UPDATE SET
|
|
1082
1103
|
title = CASE WHEN :raw_title IS NOT NULL THEN excluded.title ELSE slices.title END,
|
|
1083
|
-
status = CASE WHEN slices.status IN (
|
|
1104
|
+
status = CASE WHEN slices.status IN (${TERMINAL_STATUS_SQL}) THEN slices.status ELSE excluded.status END,
|
|
1084
1105
|
risk = CASE WHEN :raw_risk IS NOT NULL THEN excluded.risk ELSE slices.risk END,
|
|
1085
1106
|
depends = excluded.depends,
|
|
1086
1107
|
demo = CASE WHEN :raw_demo IS NOT NULL THEN excluded.demo ELSE slices.demo END,
|
|
@@ -1089,6 +1110,7 @@ export function insertSlice(s: {
|
|
|
1089
1110
|
proof_level = CASE WHEN :raw_proof_level IS NOT NULL THEN excluded.proof_level ELSE slices.proof_level END,
|
|
1090
1111
|
integration_closure = CASE WHEN :raw_integration_closure IS NOT NULL THEN excluded.integration_closure ELSE slices.integration_closure END,
|
|
1091
1112
|
observability_impact = CASE WHEN :raw_observability_impact IS NOT NULL THEN excluded.observability_impact ELSE slices.observability_impact END,
|
|
1113
|
+
target_repositories = CASE WHEN :raw_target_repositories IS NOT NULL THEN excluded.target_repositories ELSE slices.target_repositories END,
|
|
1092
1114
|
sequence = CASE WHEN :raw_sequence IS NOT NULL THEN excluded.sequence ELSE slices.sequence END,
|
|
1093
1115
|
is_sketch = CASE WHEN :raw_is_sketch IS NOT NULL THEN excluded.is_sketch ELSE slices.is_sketch END,
|
|
1094
1116
|
sketch_scope = CASE WHEN :raw_sketch_scope IS NOT NULL THEN excluded.sketch_scope ELSE slices.sketch_scope END`,
|
|
@@ -1106,6 +1128,7 @@ export function insertSlice(s: {
|
|
|
1106
1128
|
":proof_level": s.planning?.proofLevel ?? "",
|
|
1107
1129
|
":integration_closure": s.planning?.integrationClosure ?? "",
|
|
1108
1130
|
":observability_impact": s.planning?.observabilityImpact ?? "",
|
|
1131
|
+
":target_repositories": JSON.stringify(s.planning?.targetRepositories ?? []),
|
|
1109
1132
|
":sequence": s.sequence ?? 0,
|
|
1110
1133
|
":is_sketch": s.isSketch ? 1 : 0,
|
|
1111
1134
|
":sketch_scope": s.sketchScope ?? "",
|
|
@@ -1118,6 +1141,7 @@ export function insertSlice(s: {
|
|
|
1118
1141
|
":raw_proof_level": s.planning?.proofLevel ?? null,
|
|
1119
1142
|
":raw_integration_closure": s.planning?.integrationClosure ?? null,
|
|
1120
1143
|
":raw_observability_impact": s.planning?.observabilityImpact ?? null,
|
|
1144
|
+
":raw_target_repositories": s.planning?.targetRepositories ? JSON.stringify(s.planning.targetRepositories) : null,
|
|
1121
1145
|
":raw_sequence": s.sequence ?? null,
|
|
1122
1146
|
":raw_is_sketch": s.isSketch === undefined ? null : (s.isSketch ? 1 : 0),
|
|
1123
1147
|
// NOTE: use !== undefined (not ??) so an explicit empty string "" is treated
|
|
@@ -1157,7 +1181,8 @@ export function upsertSlicePlanning(milestoneId: string, sliceId: string, planni
|
|
|
1157
1181
|
success_criteria = COALESCE(:success_criteria, success_criteria),
|
|
1158
1182
|
proof_level = COALESCE(:proof_level, proof_level),
|
|
1159
1183
|
integration_closure = COALESCE(:integration_closure, integration_closure),
|
|
1160
|
-
observability_impact = COALESCE(:observability_impact, observability_impact)
|
|
1184
|
+
observability_impact = COALESCE(:observability_impact, observability_impact),
|
|
1185
|
+
target_repositories = COALESCE(:target_repositories, target_repositories)
|
|
1161
1186
|
WHERE milestone_id = :milestone_id AND id = :id`,
|
|
1162
1187
|
).run({
|
|
1163
1188
|
":milestone_id": milestoneId,
|
|
@@ -1167,6 +1192,7 @@ export function upsertSlicePlanning(milestoneId: string, sliceId: string, planni
|
|
|
1167
1192
|
":proof_level": planning.proofLevel ?? null,
|
|
1168
1193
|
":integration_closure": planning.integrationClosure ?? null,
|
|
1169
1194
|
":observability_impact": planning.observabilityImpact ?? null,
|
|
1195
|
+
":target_repositories": planning.targetRepositories ? JSON.stringify(planning.targetRepositories) : null,
|
|
1170
1196
|
});
|
|
1171
1197
|
}
|
|
1172
1198
|
|
|
@@ -1196,11 +1222,13 @@ export function insertTask(t: {
|
|
|
1196
1222
|
verification_result, duration, completed_at, blocker_discovered,
|
|
1197
1223
|
deviations, known_issues, key_files, key_decisions, full_summary_md,
|
|
1198
1224
|
description, estimate, files, verify, inputs, expected_output, observability_impact, sequence
|
|
1225
|
+
, target_repositories
|
|
1199
1226
|
) VALUES (
|
|
1200
1227
|
:milestone_id, :slice_id, :id, :title, :status, :one_liner, :narrative,
|
|
1201
1228
|
:verification_result, :duration, :completed_at, :blocker_discovered,
|
|
1202
1229
|
:deviations, :known_issues, :key_files, :key_decisions, :full_summary_md,
|
|
1203
1230
|
:description, :estimate, :files, :verify, :inputs, :expected_output, :observability_impact, :sequence
|
|
1231
|
+
, :target_repositories
|
|
1204
1232
|
)
|
|
1205
1233
|
ON CONFLICT(milestone_id, slice_id, id) DO UPDATE SET
|
|
1206
1234
|
title = CASE WHEN NULLIF(:title, '') IS NOT NULL THEN :title ELSE tasks.title END,
|
|
@@ -1223,7 +1251,11 @@ export function insertTask(t: {
|
|
|
1223
1251
|
inputs = CASE WHEN NULLIF(:inputs, '[]') IS NOT NULL THEN :inputs ELSE tasks.inputs END,
|
|
1224
1252
|
expected_output = CASE WHEN NULLIF(:expected_output, '[]') IS NOT NULL THEN :expected_output ELSE tasks.expected_output END,
|
|
1225
1253
|
observability_impact = CASE WHEN NULLIF(:observability_impact, '') IS NOT NULL THEN :observability_impact ELSE tasks.observability_impact END,
|
|
1226
|
-
sequence = :sequence
|
|
1254
|
+
sequence = :sequence,
|
|
1255
|
+
target_repositories = CASE
|
|
1256
|
+
WHEN :raw_target_repositories IS NOT NULL THEN :target_repositories
|
|
1257
|
+
ELSE tasks.target_repositories
|
|
1258
|
+
END`,
|
|
1227
1259
|
).run({
|
|
1228
1260
|
":milestone_id": t.milestoneId,
|
|
1229
1261
|
":slice_id": t.sliceId,
|
|
@@ -1249,6 +1281,11 @@ export function insertTask(t: {
|
|
|
1249
1281
|
":expected_output": JSON.stringify(t.planning?.expectedOutput ?? []),
|
|
1250
1282
|
":observability_impact": t.planning?.observabilityImpact ?? "",
|
|
1251
1283
|
":sequence": t.sequence ?? 0,
|
|
1284
|
+
":target_repositories": JSON.stringify(t.planning?.targetRepositories ?? []),
|
|
1285
|
+
":raw_target_repositories":
|
|
1286
|
+
t.planning && "targetRepositories" in t.planning
|
|
1287
|
+
? JSON.stringify(t.planning.targetRepositories ?? [])
|
|
1288
|
+
: null,
|
|
1252
1289
|
});
|
|
1253
1290
|
}
|
|
1254
1291
|
|
|
@@ -1285,7 +1322,8 @@ export function upsertTaskPlanning(milestoneId: string, sliceId: string, taskId:
|
|
|
1285
1322
|
inputs = COALESCE(:inputs, inputs),
|
|
1286
1323
|
expected_output = COALESCE(:expected_output, expected_output),
|
|
1287
1324
|
observability_impact = COALESCE(:observability_impact, observability_impact),
|
|
1288
|
-
full_plan_md = COALESCE(:full_plan_md, full_plan_md)
|
|
1325
|
+
full_plan_md = COALESCE(:full_plan_md, full_plan_md),
|
|
1326
|
+
target_repositories = COALESCE(:target_repositories, target_repositories)
|
|
1289
1327
|
WHERE milestone_id = :milestone_id AND slice_id = :slice_id AND id = :id`,
|
|
1290
1328
|
).run({
|
|
1291
1329
|
":milestone_id": milestoneId,
|
|
@@ -1300,6 +1338,7 @@ export function upsertTaskPlanning(milestoneId: string, sliceId: string, taskId:
|
|
|
1300
1338
|
":expected_output": planning.expectedOutput ? JSON.stringify(planning.expectedOutput) : null,
|
|
1301
1339
|
":observability_impact": planning.observabilityImpact ?? null,
|
|
1302
1340
|
":full_plan_md": planning.fullPlanMd ?? null,
|
|
1341
|
+
":target_repositories": planning.targetRepositories ? JSON.stringify(planning.targetRepositories) : null,
|
|
1303
1342
|
});
|
|
1304
1343
|
}
|
|
1305
1344
|
|
|
@@ -1603,7 +1642,7 @@ export function updateMilestoneStatus(milestoneId: string, status: string, compl
|
|
|
1603
1642
|
export function getActiveMilestoneFromDb(): MilestoneRow | null {
|
|
1604
1643
|
if (!currentDb) return null;
|
|
1605
1644
|
const row = currentDb.prepare(
|
|
1606
|
-
"SELECT * FROM milestones WHERE status NOT IN ('complete', 'parked') ORDER BY id LIMIT 1",
|
|
1645
|
+
"SELECT * FROM milestones WHERE status NOT IN ('complete', 'done', 'skipped', 'closed', 'parked') ORDER BY id LIMIT 1",
|
|
1607
1646
|
).get();
|
|
1608
1647
|
if (!row) return null;
|
|
1609
1648
|
return rowToMilestone(row);
|
|
@@ -1659,7 +1698,7 @@ export function getArtifact(path: string): ArtifactRow | null {
|
|
|
1659
1698
|
export function getActiveMilestoneIdFromDb(): IdStatusSummary | null {
|
|
1660
1699
|
if (!currentDb) return null;
|
|
1661
1700
|
const row = currentDb.prepare(
|
|
1662
|
-
"SELECT id, status FROM milestones WHERE status NOT IN ('complete', 'parked') ORDER BY id LIMIT 1",
|
|
1701
|
+
"SELECT id, status FROM milestones WHERE status NOT IN ('complete', 'done', 'skipped', 'closed', 'parked') ORDER BY id LIMIT 1",
|
|
1663
1702
|
).get();
|
|
1664
1703
|
if (!row) return null;
|
|
1665
1704
|
return rowToIdStatusSummary(row);
|
|
@@ -1788,12 +1827,14 @@ export function reconcileWorktreeDb(
|
|
|
1788
1827
|
const wtSliceInfo = adapter.prepare("PRAGMA wt.table_info('slices')").all();
|
|
1789
1828
|
const hasIsSketch = wtSliceInfo.some((col) => col["name"] === "is_sketch");
|
|
1790
1829
|
const hasSketchScope = wtSliceInfo.some((col) => col["name"] === "sketch_scope");
|
|
1830
|
+
const hasSliceTargetRepositories = wtSliceInfo.some((col) => col["name"] === "target_repositories");
|
|
1791
1831
|
const wtTaskInfo = adapter.prepare("PRAGMA wt.table_info('tasks')").all();
|
|
1792
1832
|
const hasBlockerSource = wtTaskInfo.some((col) => col["name"] === "blocker_source");
|
|
1793
1833
|
const hasEscalationPending = wtTaskInfo.some((col) => col["name"] === "escalation_pending");
|
|
1794
1834
|
const hasEscalationAwaiting = wtTaskInfo.some((col) => col["name"] === "escalation_awaiting_review");
|
|
1795
1835
|
const hasEscalationArtifact = wtTaskInfo.some((col) => col["name"] === "escalation_artifact_path");
|
|
1796
1836
|
const hasEscalationOverride = wtTaskInfo.some((col) => col["name"] === "escalation_override_applied_at");
|
|
1837
|
+
const hasTaskTargetRepositories = wtTaskInfo.some((col) => col["name"] === "target_repositories");
|
|
1797
1838
|
const wtArtifactInfo = adapter.prepare("PRAGMA wt.table_info('artifacts')").all();
|
|
1798
1839
|
const hasArtifactContentHash = wtArtifactInfo.some((col) => col["name"] === "content_hash");
|
|
1799
1840
|
const wtMemoryInfo = adapter.prepare("PRAGMA wt.table_info('memories')").all();
|
|
@@ -1874,16 +1915,16 @@ export function reconcileWorktreeDb(
|
|
|
1874
1915
|
)
|
|
1875
1916
|
SELECT w.id, w.title,
|
|
1876
1917
|
CASE
|
|
1877
|
-
WHEN m.status IN (
|
|
1918
|
+
WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
|
|
1878
1919
|
THEN m.status ELSE w.status
|
|
1879
1920
|
END,
|
|
1880
1921
|
w.depends_on,
|
|
1881
1922
|
CASE
|
|
1882
|
-
WHEN m.status IN (
|
|
1923
|
+
WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
|
|
1883
1924
|
THEN m.created_at ELSE w.created_at
|
|
1884
1925
|
END,
|
|
1885
1926
|
CASE
|
|
1886
|
-
WHEN m.status IN (
|
|
1927
|
+
WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
|
|
1887
1928
|
THEN m.completed_at ELSE w.completed_at
|
|
1888
1929
|
END,
|
|
1889
1930
|
w.vision, w.success_criteria, w.key_risks, w.proof_strategy,
|
|
@@ -1902,21 +1943,23 @@ export function reconcileWorktreeDb(
|
|
|
1902
1943
|
INSERT OR REPLACE INTO slices (
|
|
1903
1944
|
milestone_id, id, title, status, risk, depends, demo, created_at, completed_at,
|
|
1904
1945
|
full_summary_md, full_uat_md, goal, success_criteria, proof_level,
|
|
1905
|
-
integration_closure, observability_impact, sequence, replan_triggered_at,
|
|
1946
|
+
integration_closure, observability_impact, target_repositories, sequence, replan_triggered_at,
|
|
1906
1947
|
is_sketch, sketch_scope
|
|
1907
1948
|
)
|
|
1908
1949
|
SELECT w.milestone_id, w.id, w.title,
|
|
1909
1950
|
CASE
|
|
1910
|
-
WHEN m.status IN (
|
|
1951
|
+
WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
|
|
1911
1952
|
THEN m.status ELSE w.status
|
|
1912
1953
|
END,
|
|
1913
1954
|
w.risk, w.depends, w.demo, w.created_at,
|
|
1914
1955
|
CASE
|
|
1915
|
-
WHEN m.status IN (
|
|
1956
|
+
WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
|
|
1916
1957
|
THEN m.completed_at ELSE w.completed_at
|
|
1917
1958
|
END,
|
|
1918
1959
|
w.full_summary_md, w.full_uat_md, w.goal, w.success_criteria, w.proof_level,
|
|
1919
|
-
w.integration_closure, w.observability_impact,
|
|
1960
|
+
w.integration_closure, w.observability_impact,
|
|
1961
|
+
${hasSliceTargetRepositories ? "w.target_repositories" : "COALESCE(m.target_repositories, '[]')"},
|
|
1962
|
+
w.sequence, w.replan_triggered_at,
|
|
1920
1963
|
${hasIsSketch ? "w.is_sketch" : "COALESCE(m.is_sketch, 0)"},
|
|
1921
1964
|
${hasSketchScope ? "w.sketch_scope" : "COALESCE(m.sketch_scope, '')"}
|
|
1922
1965
|
FROM wt.slices w
|
|
@@ -1932,25 +1975,27 @@ export function reconcileWorktreeDb(
|
|
|
1932
1975
|
verification_result, duration, completed_at, blocker_discovered,
|
|
1933
1976
|
deviations, known_issues, key_files, key_decisions, full_summary_md,
|
|
1934
1977
|
description, estimate, files, verify, inputs, expected_output,
|
|
1935
|
-
observability_impact, full_plan_md, sequence,
|
|
1978
|
+
observability_impact, full_plan_md, target_repositories, sequence,
|
|
1936
1979
|
blocker_source, escalation_pending, escalation_awaiting_review,
|
|
1937
1980
|
escalation_artifact_path, escalation_override_applied_at
|
|
1938
1981
|
)
|
|
1939
1982
|
SELECT w.milestone_id, w.slice_id, w.id, w.title,
|
|
1940
1983
|
CASE
|
|
1941
|
-
WHEN m.status IN (
|
|
1984
|
+
WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
|
|
1942
1985
|
THEN m.status ELSE w.status
|
|
1943
1986
|
END,
|
|
1944
1987
|
w.one_liner, w.narrative,
|
|
1945
1988
|
w.verification_result, w.duration,
|
|
1946
1989
|
CASE
|
|
1947
|
-
WHEN m.status IN (
|
|
1990
|
+
WHEN m.status IN (${TERMINAL_STATUS_SQL}) AND w.status NOT IN (${TERMINAL_STATUS_SQL})
|
|
1948
1991
|
THEN m.completed_at ELSE w.completed_at
|
|
1949
1992
|
END,
|
|
1950
1993
|
w.blocker_discovered,
|
|
1951
1994
|
w.deviations, w.known_issues, w.key_files, w.key_decisions, w.full_summary_md,
|
|
1952
1995
|
w.description, w.estimate, w.files, w.verify, w.inputs, w.expected_output,
|
|
1953
|
-
w.observability_impact, w.full_plan_md,
|
|
1996
|
+
w.observability_impact, w.full_plan_md,
|
|
1997
|
+
${hasTaskTargetRepositories ? "w.target_repositories" : "COALESCE(m.target_repositories, '[]')"},
|
|
1998
|
+
w.sequence,
|
|
1954
1999
|
${hasBlockerSource ? "w.blocker_source" : "COALESCE(m.blocker_source, '')"},
|
|
1955
2000
|
${hasEscalationPending ? "w.escalation_pending" : "COALESCE(m.escalation_pending, 0)"},
|
|
1956
2001
|
${hasEscalationAwaiting ? "w.escalation_awaiting_review" : "COALESCE(m.escalation_awaiting_review, 0)"},
|
|
@@ -2081,6 +2126,9 @@ export function deleteTask(milestoneId: string, sliceId: string, taskId: string)
|
|
|
2081
2126
|
currentDb!.prepare(
|
|
2082
2127
|
`DELETE FROM verification_evidence WHERE milestone_id = :mid AND slice_id = :sid AND task_id = :tid`,
|
|
2083
2128
|
).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
2129
|
+
currentDb!.prepare(
|
|
2130
|
+
`DELETE FROM quality_gates WHERE milestone_id = :mid AND slice_id = :sid AND task_id = :tid`,
|
|
2131
|
+
).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
2084
2132
|
currentDb!.prepare(
|
|
2085
2133
|
`DELETE FROM tasks WHERE milestone_id = :mid AND slice_id = :sid AND id = :tid`,
|
|
2086
2134
|
).run({ ":mid": milestoneId, ":sid": sliceId, ":tid": taskId });
|
|
@@ -2777,8 +2825,8 @@ export function restoreManifest(manifest: StateManifest): void {
|
|
|
2777
2825
|
`INSERT INTO slices (milestone_id, id, title, status, risk, depends, demo,
|
|
2778
2826
|
created_at, completed_at, full_summary_md, full_uat_md,
|
|
2779
2827
|
goal, success_criteria, proof_level, integration_closure, observability_impact,
|
|
2780
|
-
sequence, replan_triggered_at, is_sketch, sketch_scope)
|
|
2781
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
2828
|
+
target_repositories, sequence, replan_triggered_at, is_sketch, sketch_scope)
|
|
2829
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
2782
2830
|
);
|
|
2783
2831
|
for (const s of manifest.slices) {
|
|
2784
2832
|
slStmt.run(
|
|
@@ -2786,6 +2834,7 @@ export function restoreManifest(manifest: StateManifest): void {
|
|
|
2786
2834
|
JSON.stringify(s.depends), s.demo,
|
|
2787
2835
|
s.created_at, s.completed_at, s.full_summary_md, s.full_uat_md,
|
|
2788
2836
|
s.goal, s.success_criteria, s.proof_level, s.integration_closure, s.observability_impact,
|
|
2837
|
+
JSON.stringify(s.target_repositories ?? []),
|
|
2789
2838
|
s.sequence, s.replan_triggered_at,
|
|
2790
2839
|
s.is_sketch ?? 0,
|
|
2791
2840
|
s.sketch_scope ?? "",
|
|
@@ -2798,10 +2847,10 @@ export function restoreManifest(manifest: StateManifest): void {
|
|
|
2798
2847
|
one_liner, narrative, verification_result, duration, completed_at,
|
|
2799
2848
|
blocker_discovered, deviations, known_issues, key_files, key_decisions,
|
|
2800
2849
|
full_summary_md, description, estimate, files, verify,
|
|
2801
|
-
inputs, expected_output, observability_impact, sequence,
|
|
2850
|
+
inputs, expected_output, observability_impact, target_repositories, sequence,
|
|
2802
2851
|
blocker_source, escalation_pending, escalation_awaiting_review,
|
|
2803
2852
|
escalation_artifact_path, escalation_override_applied_at)
|
|
2804
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
2853
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
2805
2854
|
);
|
|
2806
2855
|
for (const t of manifest.tasks) {
|
|
2807
2856
|
tkStmt.run(
|
|
@@ -2811,7 +2860,7 @@ export function restoreManifest(manifest: StateManifest): void {
|
|
|
2811
2860
|
JSON.stringify(t.key_files), JSON.stringify(t.key_decisions),
|
|
2812
2861
|
t.full_summary_md, t.description, t.estimate, JSON.stringify(t.files), t.verify,
|
|
2813
2862
|
JSON.stringify(t.inputs), JSON.stringify(t.expected_output),
|
|
2814
|
-
t.observability_impact, t.sequence,
|
|
2863
|
+
t.observability_impact, JSON.stringify(t.target_repositories ?? []), t.sequence,
|
|
2815
2864
|
t.blocker_source ?? "",
|
|
2816
2865
|
t.escalation_pending ?? 0,
|
|
2817
2866
|
t.escalation_awaiting_review ?? 0,
|