@opengsd/gsd-pi 1.8.1 → 1.9.0-dev.97ef11e3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -8
- package/dist/cli.js +5 -1
- package/dist/headless-events.d.ts +2 -1
- package/dist/headless-events.js +11 -3
- package/dist/headless-milestone-readiness.d.ts +29 -0
- package/dist/headless-milestone-readiness.js +161 -0
- package/dist/headless.js +27 -3
- package/dist/print-mode-exit.d.ts +12 -0
- package/dist/print-mode-exit.js +14 -0
- package/dist/resources/.managed-resources-content-hash +1 -1
- package/dist/resources/GSD-WORKFLOW.md +18 -49
- package/dist/resources/extensions/browser-tools/capture.js +2 -77
- package/dist/resources/extensions/browser-tools/screenshot-constraints.js +83 -0
- package/dist/resources/extensions/claude-code-cli/stream-adapter.js +17 -2
- package/dist/resources/extensions/claude-code-cli/turn-assembler.js +30 -2
- package/dist/resources/extensions/gsd/artifact-verification.js +3 -4
- package/dist/resources/extensions/gsd/auto/loop.js +24 -4
- package/dist/resources/extensions/gsd/auto/run-unit.js +19 -1
- package/dist/resources/extensions/gsd/auto/unit-phase.js +37 -5
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +16 -10
- package/dist/resources/extensions/gsd/auto-dispatch.js +76 -19
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +137 -22
- package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
- package/dist/resources/extensions/gsd/auto-runtime-state.js +5 -5
- package/dist/resources/extensions/gsd/auto-start.js +29 -9
- package/dist/resources/extensions/gsd/auto-tool-tracking.js +40 -0
- package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +7 -3
- package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +20 -6
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -4
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +33 -7
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +10 -3
- package/dist/resources/extensions/gsd/bootstrap/write-gate.js +88 -50
- package/dist/resources/extensions/gsd/command-feedback.js +16 -12
- package/dist/resources/extensions/gsd/commands-verdict.js +10 -9
- package/dist/resources/extensions/gsd/compat/compat-marker.js +98 -6
- package/dist/resources/extensions/gsd/constants.js +12 -13
- package/dist/resources/extensions/gsd/context-masker.js +97 -21
- package/dist/resources/extensions/gsd/db/command-queue.js +7 -2
- package/dist/resources/extensions/gsd/db/engine.js +56 -18
- package/dist/resources/extensions/gsd/db/writers/cascades.js +5 -1
- package/dist/resources/extensions/gsd/db/writers/status.js +13 -3
- package/dist/resources/extensions/gsd/db-base-schema.js +28 -0
- package/dist/resources/extensions/gsd/db-migration-steps.js +30 -0
- package/dist/resources/extensions/gsd/db-schema-metadata.js +4 -1
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +26 -4
- package/dist/resources/extensions/gsd/doctor-engine-checks.js +24 -8
- package/dist/resources/extensions/gsd/error-classifier.js +12 -2
- package/dist/resources/extensions/gsd/exec-sandbox.js +1 -0
- package/dist/resources/extensions/gsd/flat-phase-migration.js +168 -21
- package/dist/resources/extensions/gsd/git-service.js +19 -7
- package/dist/resources/extensions/gsd/gsd-db.js +262 -76
- package/dist/resources/extensions/gsd/guided-flow.js +40 -15
- package/dist/resources/extensions/gsd/markdown-renderer.js +20 -22
- package/dist/resources/extensions/gsd/md-importer.js +107 -20
- package/dist/resources/extensions/gsd/migrate/command.js +19 -162
- package/dist/resources/extensions/gsd/migrate/execution.js +98 -0
- package/dist/resources/extensions/gsd/migrate/plan.js +49 -0
- package/dist/resources/extensions/gsd/migrate/planning-writer.js +12 -17
- package/dist/resources/extensions/gsd/migrate/presentation.js +64 -0
- package/dist/resources/extensions/gsd/model-cost-table.js +2 -0
- package/dist/resources/extensions/gsd/model-router.js +11 -0
- package/dist/resources/extensions/gsd/parallel-eligibility.js +5 -4
- package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +28 -43
- package/dist/resources/extensions/gsd/paths.js +70 -16
- package/dist/resources/extensions/gsd/phase-anchor.js +7 -2
- package/dist/resources/extensions/gsd/planning-subagent-policy.js +37 -0
- package/dist/resources/extensions/gsd/planning-subagent-registry.js +25 -0
- package/dist/resources/extensions/gsd/post-execution-checks.js +4 -4
- package/dist/resources/extensions/gsd/preferences-types.js +5 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +48 -1
- package/dist/resources/extensions/gsd/preferences.js +17 -0
- package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
- package/dist/resources/extensions/gsd/provider-payload-policy.js +16 -5
- package/dist/resources/extensions/gsd/safety/destructive-guard.js +1 -1
- package/dist/resources/extensions/gsd/safety/evidence-collector.js +26 -1
- package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +30 -5
- package/dist/resources/extensions/gsd/skill-activation.js +17 -3
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +125 -15
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +17 -4
- package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +5 -2
- package/dist/resources/extensions/gsd/stop-notice.js +24 -1
- package/dist/resources/extensions/gsd/sync-lock.js +13 -7
- package/dist/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +94 -6
- package/dist/resources/extensions/gsd/tools/plan-task.js +13 -15
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +18 -15
- package/dist/resources/extensions/gsd/tools/reopen-milestone.js +14 -5
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +15 -5
- package/dist/resources/extensions/gsd/tools/reopen-task.js +16 -10
- package/dist/resources/extensions/gsd/tools/replan-task.js +128 -0
- package/dist/resources/extensions/gsd/tools/rework-brief.js +74 -0
- package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +81 -0
- package/dist/resources/extensions/gsd/unit-context-composer.js +28 -5
- package/dist/resources/extensions/gsd/unit-registry.js +4 -0
- package/dist/resources/extensions/gsd/uok/plan-v2.js +19 -3
- package/dist/resources/extensions/gsd/workflow-projections.js +2 -3
- package/dist/resources/extensions/gsd/workspace.js +2 -1
- package/dist/resources/extensions/gsd/worktree-state-projection.js +26 -18
- package/dist/resources/extensions/mac-tools/index.js +31 -9
- package/dist/resources/extensions/shared/interview-ui.js +43 -6
- 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 +7 -7
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- 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 -4
- 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 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +5 -5
- 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 -5
- 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 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +7 -7
- package/dist/web/standalone/.next/server/chunks/1991.js +2 -2
- package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
- package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
- package/dist/web/standalone/.next/server/chunks/8357.js +3 -3
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +1 -1
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-a6fb1847f67f167c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-b35cbfff38aaf4cf.js → layout-4ae2d68984392bbf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-72a856634ad14c10.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-590a74400e35f685.js → main-app-90d1d8d5e5d2dc6b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1115d46ac61b9823.js +1 -0
- package/dist/web/standalone/.next/static/css/3b1ceb7abfb9a230.css +1 -0
- package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/package.json +0 -1
- package/dist/web/standalone/server.js +1 -1
- package/dist/web-mode.js +31 -3
- package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
- package/integrations/hermes/pyproject.toml +1 -1
- package/package.json +13 -10
- package/packages/cloud-mcp-gateway/package.json +2 -2
- package/packages/contracts/dist/workflow.d.ts +14 -0
- package/packages/contracts/dist/workflow.d.ts.map +1 -1
- package/packages/contracts/dist/workflow.js +16 -0
- package/packages/contracts/dist/workflow.js.map +1 -1
- package/packages/contracts/package.json +1 -1
- package/packages/daemon/dist/cloud-config.d.ts +1 -1
- package/packages/daemon/dist/cloud-config.d.ts.map +1 -1
- package/packages/daemon/dist/cloud-config.js +5 -1
- package/packages/daemon/dist/cloud-config.js.map +1 -1
- package/packages/daemon/dist/cloud-config.test.js +51 -1
- package/packages/daemon/dist/cloud-config.test.js.map +1 -1
- package/packages/daemon/dist/local-tool-executor.d.ts.map +1 -1
- package/packages/daemon/dist/local-tool-executor.js +2 -0
- package/packages/daemon/dist/local-tool-executor.js.map +1 -1
- package/packages/daemon/package.json +6 -6
- package/packages/gsd-agent-core/dist/compaction/compaction.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/compaction/compaction.js +36 -4
- package/packages/gsd-agent-core/dist/compaction/compaction.js.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
- package/packages/gsd-agent-core/dist/sdk.js +1 -0
- package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
- package/packages/gsd-agent-core/package.json +5 -5
- package/packages/gsd-agent-modes/package.json +7 -7
- package/packages/gsd-cloud/README.md +9 -3
- package/packages/gsd-cloud/dist/background-cli.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/background-cli.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/background-cli.test.js +248 -0
- package/packages/gsd-cloud/dist/background-cli.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cli.d.ts +5 -0
- package/packages/gsd-cloud/dist/cli.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cli.js +266 -0
- package/packages/gsd-cloud/dist/cli.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.d.ts +19 -0
- package/packages/gsd-cloud/dist/cloud-config.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.js +237 -0
- package/packages/gsd-cloud/dist/cloud-config.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/cloud-config.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-config.test.js +118 -0
- package/packages/gsd-cloud/dist/cloud-config.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js +37 -0
- package/packages/gsd-cloud/dist/cloud-gateway-lookup.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.d.ts +33 -0
- package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.js +260 -0
- package/packages/gsd-cloud/dist/cloud-runtime.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.js +88 -0
- package/packages/gsd-cloud/dist/cloud-runtime.test.js.map +1 -0
- package/packages/gsd-cloud/dist/cloud-token.d.ts +3 -0
- package/packages/gsd-cloud/dist/cloud-token.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-token.js +37 -0
- package/packages/gsd-cloud/dist/cloud-token.js.map +1 -0
- package/packages/gsd-cloud/dist/config.d.ts +17 -0
- package/packages/gsd-cloud/dist/config.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/config.js +146 -0
- package/packages/gsd-cloud/dist/config.js.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.d.ts +24 -0
- package/packages/gsd-cloud/dist/device-flow.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.js +128 -0
- package/packages/gsd-cloud/dist/device-flow.js.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/device-flow.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/device-flow.test.js +155 -0
- package/packages/gsd-cloud/dist/device-flow.test.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.d.ts +6 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.js +15 -0
- package/packages/gsd-cloud/dist/executors/claude-executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.d.ts +6 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.js +15 -0
- package/packages/gsd-cloud/dist/executors/codex-executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/executor.d.ts +28 -0
- package/packages/gsd-cloud/dist/executors/executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/executor.js +11 -0
- package/packages/gsd-cloud/dist/executors/executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts +34 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js +179 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js +44 -0
- package/packages/gsd-cloud/dist/executors/gsd-pi-executor.test.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/index.d.ts +17 -0
- package/packages/gsd-cloud/dist/executors/index.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/index.js +29 -0
- package/packages/gsd-cloud/dist/executors/index.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts +36 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js +176 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.js.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js +34 -0
- package/packages/gsd-cloud/dist/executors/mcp-stdio-client.test.js.map +1 -0
- package/packages/gsd-cloud/dist/index.d.ts +7 -0
- package/packages/gsd-cloud/dist/index.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/index.js +8 -0
- package/packages/gsd-cloud/dist/index.js.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.d.ts +16 -0
- package/packages/gsd-cloud/dist/inject-gateway.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.js +29 -0
- package/packages/gsd-cloud/dist/inject-gateway.js.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.js +41 -0
- package/packages/gsd-cloud/dist/inject-gateway.test.js.map +1 -0
- package/packages/gsd-cloud/dist/logger.d.ts +25 -0
- package/packages/gsd-cloud/dist/logger.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/logger.js +72 -0
- package/packages/gsd-cloud/dist/logger.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.d.ts +27 -0
- package/packages/gsd-cloud/dist/runtime-process.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.js +272 -0
- package/packages/gsd-cloud/dist/runtime-process.js.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.test.d.ts +2 -0
- package/packages/gsd-cloud/dist/runtime-process.test.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/runtime-process.test.js +97 -0
- package/packages/gsd-cloud/dist/runtime-process.test.js.map +1 -0
- package/packages/gsd-cloud/dist/types.d.ts +51 -0
- package/packages/gsd-cloud/dist/types.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/types.js +9 -0
- package/packages/gsd-cloud/dist/types.js.map +1 -0
- package/packages/gsd-cloud/package.json +3 -3
- package/packages/mcp-server/README.md +15 -2
- package/packages/mcp-server/dist/cli-runner.d.ts +3 -0
- package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
- package/packages/mcp-server/dist/cli-runner.js +119 -33
- package/packages/mcp-server/dist/cli-runner.js.map +1 -1
- package/packages/mcp-server/dist/server.d.ts.map +1 -1
- package/packages/mcp-server/dist/server.js +5 -5
- package/packages/mcp-server/dist/server.js.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.d.ts +4 -3
- package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
- package/packages/mcp-server/dist/workflow-tools.js +64 -2
- package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
- package/packages/mcp-server/package.json +4 -4
- package/packages/native/package.json +1 -1
- package/packages/pi-agent-core/dist/agent.d.ts +5 -1
- package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/packages/pi-agent-core/dist/agent.js +2 -0
- package/packages/pi-agent-core/dist/agent.js.map +1 -1
- package/packages/pi-agent-core/package.json +1 -1
- package/packages/pi-ai/dist/models.generated.d.ts +136 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +124 -0
- package/packages/pi-ai/dist/models.generated.js.map +1 -1
- package/packages/pi-ai/dist/providers/amazon-bedrock.js +1 -0
- package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
- package/packages/pi-ai/dist/providers/anthropic.js +25 -1
- package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js +1 -1
- package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
- package/packages/pi-ai/dist/providers/openai-completions.js +103 -0
- package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.js +1 -1
- package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
- package/packages/pi-ai/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js +1 -1
- package/packages/pi-coding-agent/dist/core/capability-patches.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -1
- package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +11 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
- package/packages/pi-coding-agent/package.json +7 -7
- package/packages/pi-tui/package.json +2 -2
- package/packages/rpc-client/package.json +2 -2
- package/pkg/package.json +1 -1
- package/src/resources/GSD-WORKFLOW.md +18 -49
- package/src/resources/extensions/browser-tools/capture.ts +2 -86
- package/src/resources/extensions/browser-tools/screenshot-constraints.ts +94 -0
- package/src/resources/extensions/claude-code-cli/stream-adapter.ts +18 -1
- package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -0
- package/src/resources/extensions/claude-code-cli/turn-assembler.ts +30 -2
- package/src/resources/extensions/gsd/artifact-verification.ts +3 -8
- package/src/resources/extensions/gsd/auto/loop.ts +48 -4
- package/src/resources/extensions/gsd/auto/run-unit.ts +20 -1
- package/src/resources/extensions/gsd/auto/unit-phase.ts +41 -5
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +16 -9
- package/src/resources/extensions/gsd/auto-dispatch.ts +87 -19
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +156 -20
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
- package/src/resources/extensions/gsd/auto-runtime-state.ts +12 -7
- package/src/resources/extensions/gsd/auto-start.ts +31 -8
- package/src/resources/extensions/gsd/auto-tool-tracking.ts +56 -0
- package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +10 -3
- package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +25 -8
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +92 -4
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -12
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +11 -3
- package/src/resources/extensions/gsd/bootstrap/write-gate.ts +87 -53
- package/src/resources/extensions/gsd/command-feedback.ts +19 -12
- package/src/resources/extensions/gsd/commands-verdict.ts +16 -9
- package/src/resources/extensions/gsd/compat/compat-marker.ts +119 -8
- package/src/resources/extensions/gsd/constants.ts +14 -13
- package/src/resources/extensions/gsd/context-masker.ts +98 -2
- package/src/resources/extensions/gsd/db/command-queue.ts +7 -1
- package/src/resources/extensions/gsd/db/engine.ts +58 -19
- package/src/resources/extensions/gsd/db/writers/cascades.ts +5 -1
- package/src/resources/extensions/gsd/db/writers/status.ts +25 -8
- package/src/resources/extensions/gsd/db-base-schema.ts +30 -0
- package/src/resources/extensions/gsd/db-migration-steps.ts +32 -0
- package/src/resources/extensions/gsd/db-schema-metadata.ts +4 -1
- package/src/resources/extensions/gsd/docs/preferences-reference.md +26 -4
- package/src/resources/extensions/gsd/doctor-engine-checks.ts +30 -7
- package/src/resources/extensions/gsd/error-classifier.ts +13 -2
- package/src/resources/extensions/gsd/exec-sandbox.ts +1 -0
- package/src/resources/extensions/gsd/flat-phase-migration.ts +174 -19
- package/src/resources/extensions/gsd/git-service.ts +19 -6
- package/src/resources/extensions/gsd/gsd-db.ts +340 -85
- package/src/resources/extensions/gsd/guided-flow.ts +50 -14
- package/src/resources/extensions/gsd/markdown-renderer.ts +28 -30
- package/src/resources/extensions/gsd/md-importer.ts +114 -16
- package/src/resources/extensions/gsd/migrate/command.ts +21 -227
- package/src/resources/extensions/gsd/migrate/execution.ts +136 -0
- package/src/resources/extensions/gsd/migrate/plan.ts +101 -0
- package/src/resources/extensions/gsd/migrate/planning-writer.ts +12 -20
- package/src/resources/extensions/gsd/migrate/presentation.ts +83 -0
- package/src/resources/extensions/gsd/model-cost-table.ts +2 -0
- package/src/resources/extensions/gsd/model-router.ts +12 -0
- package/src/resources/extensions/gsd/parallel-eligibility.ts +5 -4
- package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +37 -40
- package/src/resources/extensions/gsd/paths.ts +77 -16
- package/src/resources/extensions/gsd/phase-anchor.ts +8 -2
- package/src/resources/extensions/gsd/planning-subagent-policy.ts +58 -0
- package/src/resources/extensions/gsd/planning-subagent-registry.ts +31 -0
- package/src/resources/extensions/gsd/post-execution-checks.ts +4 -4
- package/src/resources/extensions/gsd/preferences-types.ts +16 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +62 -0
- package/src/resources/extensions/gsd/preferences.ts +25 -0
- package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +5 -5
- package/src/resources/extensions/gsd/provider-payload-policy.ts +18 -4
- package/src/resources/extensions/gsd/safety/destructive-guard.ts +1 -1
- package/src/resources/extensions/gsd/safety/evidence-collector.ts +28 -1
- package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +31 -5
- package/src/resources/extensions/gsd/skill-activation.ts +17 -3
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +162 -15
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +20 -4
- package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +4 -2
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +2 -2
- package/src/resources/extensions/gsd/stop-notice.ts +29 -1
- package/src/resources/extensions/gsd/sync-lock.ts +14 -6
- package/src/resources/extensions/gsd/templates/PREFERENCES.md +5 -0
- package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +7 -7
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +264 -0
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +21 -1
- package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +74 -1
- package/src/resources/extensions/gsd/tests/before-provider-context-management.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +96 -1
- package/src/resources/extensions/gsd/tests/command-feedback.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +10 -0
- package/src/resources/extensions/gsd/tests/compat-marker.test.ts +129 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +362 -1
- package/src/resources/extensions/gsd/tests/context-masker.test.ts +204 -8
- package/src/resources/extensions/gsd/tests/db-engine-cjs-compat.test.ts +12 -0
- package/src/resources/extensions/gsd/tests/db-engine-migrate-guards.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/db-tools-alias-suppression.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/destructive-confirmation.test.ts +33 -0
- package/src/resources/extensions/gsd/tests/destructive-guard.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +123 -0
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +49 -0
- package/src/resources/extensions/gsd/tests/doctor-scope-db-unavailable.test.ts +83 -0
- package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +81 -0
- package/src/resources/extensions/gsd/tests/evidence-xref-gsd-exec.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +33 -1
- package/src/resources/extensions/gsd/tests/external-edit-scoped-import.test.ts +262 -0
- package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +201 -0
- package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +20 -1
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +57 -0
- package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/import-slice-milestone-completion-preserve.test.ts +116 -0
- package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +13 -0
- package/src/resources/extensions/gsd/tests/integration/paths.test.ts +22 -4
- package/src/resources/extensions/gsd/tests/integration-branch-meta-location.test.ts +62 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +5 -5
- package/src/resources/extensions/gsd/tests/migrate-plan.test.ts +68 -0
- package/src/resources/extensions/gsd/tests/migrate-presentation.test.ts +98 -0
- package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +55 -0
- package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +9 -1
- package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/parallel-eligibility-file-overlap.test.ts +146 -0
- package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +59 -0
- package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +7 -5
- package/src/resources/extensions/gsd/tests/phase-anchor.test.ts +32 -4
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +26 -23
- package/src/resources/extensions/gsd/tests/planning-writer.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +22 -0
- package/src/resources/extensions/gsd/tests/preferences.test.ts +84 -0
- package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +87 -0
- package/src/resources/extensions/gsd/tests/provider-errors.test.ts +121 -1
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +39 -0
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +50 -0
- package/src/resources/extensions/gsd/tests/register-hooks-loop-guard-auto.test.ts +105 -0
- package/src/resources/extensions/gsd/tests/replan-task-handler.test.ts +103 -0
- package/src/resources/extensions/gsd/tests/rework-brief.test.ts +197 -0
- package/src/resources/extensions/gsd/tests/service-tier.test.ts +4 -0
- package/src/resources/extensions/gsd/tests/single-writer-v3-tool-surface.test.ts +33 -7
- package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -16
- package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +21 -0
- package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +52 -0
- package/src/resources/extensions/gsd/tests/stop-notice.test.ts +38 -1
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +13 -7
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +14 -0
- package/src/resources/extensions/gsd/tests/tool-invocation-error-loop-break.test.ts +19 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +8 -0
- package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +73 -0
- package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +93 -1
- package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/workflow-migration-gates.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -4
- package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +36 -0
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +60 -0
- package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +34 -0
- package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +52 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +140 -5
- package/src/resources/extensions/gsd/tools/plan-task.ts +14 -16
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +18 -17
- package/src/resources/extensions/gsd/tools/reopen-milestone.ts +24 -5
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +25 -5
- package/src/resources/extensions/gsd/tools/reopen-task.ts +23 -9
- package/src/resources/extensions/gsd/tools/replan-task.ts +160 -0
- package/src/resources/extensions/gsd/tools/rework-brief.ts +91 -0
- package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +92 -0
- package/src/resources/extensions/gsd/types.ts +11 -0
- package/src/resources/extensions/gsd/unit-context-composer.ts +34 -8
- package/src/resources/extensions/gsd/unit-registry.ts +4 -0
- package/src/resources/extensions/gsd/uok/plan-v2.ts +20 -3
- package/src/resources/extensions/gsd/workflow-projections.ts +2 -3
- package/src/resources/extensions/gsd/workspace.ts +2 -1
- package/src/resources/extensions/gsd/worktree-state-projection.ts +33 -24
- package/src/resources/extensions/mac-tools/index.ts +52 -9
- package/src/resources/extensions/mac-tools/tests/mac-screenshot-payload.test.cjs +70 -0
- package/src/resources/extensions/shared/interview-ui.ts +47 -8
- package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +29 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-49f565245e1e4afe.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-bc4c723c6a19c6f0.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ec3eaffc9785ba48.js +0 -1
- package/dist/web/standalone/.next/static/css/18c2fdf261bfc1b7.css +0 -1
- /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → DXD9fZPnqtjZSlT5xdC3v}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → DXD9fZPnqtjZSlT5xdC3v}/_ssgManifest.js +0 -0
|
@@ -19,11 +19,18 @@ import { getDbOrNull } from "../engine.js";
|
|
|
19
19
|
import { GSDError, GSD_STALE_STATE } from "../../errors.js";
|
|
20
20
|
import { isClosedStatus } from "../../status-guards.js";
|
|
21
21
|
|
|
22
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* A single row-level status write, discriminated by entity (the faces' arity).
|
|
24
|
+
*
|
|
25
|
+
* preserveCompletion (#1291): when true, an existing non-null completed_at on the
|
|
26
|
+
* row is kept rather than overwritten. Mirrors the task upsert's guard so a
|
|
27
|
+
* markdown re-import cannot re-stamp an already-complete slice/milestone with the
|
|
28
|
+
* current import time — the DB row is strictly richer than the plan.
|
|
29
|
+
*/
|
|
23
30
|
export type StatusTransition =
|
|
24
|
-
| { entity: "task"; milestoneId: string; sliceId: string; taskId: string; status: string; completedAt?: string | null }
|
|
25
|
-
| { entity: "slice"; milestoneId: string; sliceId: string; status: string; completedAt?: string | null }
|
|
26
|
-
| { entity: "milestone"; milestoneId: string; status: string; completedAt?: string | null };
|
|
31
|
+
| { entity: "task"; milestoneId: string; sliceId: string; taskId: string; status: string; completedAt?: string | null; preserveCompletion?: boolean }
|
|
32
|
+
| { entity: "slice"; milestoneId: string; sliceId: string; status: string; completedAt?: string | null; preserveCompletion?: boolean }
|
|
33
|
+
| { entity: "milestone"; milestoneId: string; status: string; completedAt?: string | null; preserveCompletion?: boolean };
|
|
27
34
|
|
|
28
35
|
function requireDb() {
|
|
29
36
|
const db = getDbOrNull();
|
|
@@ -44,15 +51,19 @@ function requireDb() {
|
|
|
44
51
|
export function applyStatusTransition(t: StatusTransition): void {
|
|
45
52
|
const db = requireDb();
|
|
46
53
|
const completedAt = t.completedAt ?? null;
|
|
54
|
+
const preserve = t.preserveCompletion ? 1 : 0;
|
|
47
55
|
|
|
48
56
|
switch (t.entity) {
|
|
49
57
|
case "task":
|
|
50
58
|
db.prepare(
|
|
51
|
-
`UPDATE tasks SET status = :status,
|
|
59
|
+
`UPDATE tasks SET status = :status,
|
|
60
|
+
completed_at = CASE WHEN :preserve_completion = 1 AND tasks.completed_at IS NOT NULL
|
|
61
|
+
THEN tasks.completed_at ELSE :completed_at END
|
|
52
62
|
WHERE milestone_id = :milestone_id AND slice_id = :slice_id AND id = :id`,
|
|
53
63
|
).run({
|
|
54
64
|
":status": t.status,
|
|
55
65
|
":completed_at": completedAt,
|
|
66
|
+
":preserve_completion": preserve,
|
|
56
67
|
":milestone_id": t.milestoneId,
|
|
57
68
|
":slice_id": t.sliceId,
|
|
58
69
|
":id": t.taskId,
|
|
@@ -61,11 +72,14 @@ export function applyStatusTransition(t: StatusTransition): void {
|
|
|
61
72
|
|
|
62
73
|
case "slice":
|
|
63
74
|
db.prepare(
|
|
64
|
-
`UPDATE slices SET status = :status,
|
|
75
|
+
`UPDATE slices SET status = :status,
|
|
76
|
+
completed_at = CASE WHEN :preserve_completion = 1 AND slices.completed_at IS NOT NULL
|
|
77
|
+
THEN slices.completed_at ELSE :completed_at END
|
|
65
78
|
WHERE milestone_id = :milestone_id AND id = :id`,
|
|
66
79
|
).run({
|
|
67
80
|
":status": t.status,
|
|
68
81
|
":completed_at": completedAt,
|
|
82
|
+
":preserve_completion": preserve,
|
|
69
83
|
":milestone_id": t.milestoneId,
|
|
70
84
|
":id": t.sliceId,
|
|
71
85
|
});
|
|
@@ -80,8 +94,11 @@ export function applyStatusTransition(t: StatusTransition): void {
|
|
|
80
94
|
);
|
|
81
95
|
}
|
|
82
96
|
db.prepare(
|
|
83
|
-
`UPDATE milestones SET status = :status,
|
|
84
|
-
|
|
97
|
+
`UPDATE milestones SET status = :status,
|
|
98
|
+
completed_at = CASE WHEN :preserve_completion = 1 AND milestones.completed_at IS NOT NULL
|
|
99
|
+
THEN milestones.completed_at ELSE :completed_at END
|
|
100
|
+
WHERE id = :id`,
|
|
101
|
+
).run({ ":status": t.status, ":completed_at": completedAt, ":preserve_completion": preserve, ":id": t.milestoneId });
|
|
85
102
|
return;
|
|
86
103
|
}
|
|
87
104
|
}
|
|
@@ -245,6 +245,34 @@ export function createBaseSchemaObjects(db: DbAdapter, hooks: BaseSchemaHooks):
|
|
|
245
245
|
)
|
|
246
246
|
`);
|
|
247
247
|
|
|
248
|
+
db.exec(`
|
|
249
|
+
CREATE TABLE IF NOT EXISTS rework_briefs (
|
|
250
|
+
id TEXT PRIMARY KEY,
|
|
251
|
+
milestone_id TEXT NOT NULL DEFAULT '',
|
|
252
|
+
slice_id TEXT NOT NULL DEFAULT '',
|
|
253
|
+
task_id TEXT NOT NULL DEFAULT '',
|
|
254
|
+
created_at TEXT NOT NULL DEFAULT '',
|
|
255
|
+
updated_at TEXT NOT NULL DEFAULT ''
|
|
256
|
+
)
|
|
257
|
+
`);
|
|
258
|
+
|
|
259
|
+
db.exec(`
|
|
260
|
+
CREATE TABLE IF NOT EXISTS rework_brief_findings (
|
|
261
|
+
brief_id TEXT NOT NULL,
|
|
262
|
+
finding_id TEXT NOT NULL,
|
|
263
|
+
severity TEXT NOT NULL DEFAULT 'blocking',
|
|
264
|
+
description TEXT NOT NULL DEFAULT '',
|
|
265
|
+
required_fix TEXT NOT NULL DEFAULT '',
|
|
266
|
+
verification_commands TEXT NOT NULL DEFAULT '[]',
|
|
267
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
268
|
+
evidence TEXT NOT NULL DEFAULT '',
|
|
269
|
+
decision_ref TEXT NOT NULL DEFAULT '',
|
|
270
|
+
updated_at TEXT NOT NULL DEFAULT '',
|
|
271
|
+
PRIMARY KEY (brief_id, finding_id),
|
|
272
|
+
FOREIGN KEY (brief_id) REFERENCES rework_briefs(id)
|
|
273
|
+
)
|
|
274
|
+
`);
|
|
275
|
+
|
|
248
276
|
db.exec(`
|
|
249
277
|
CREATE TABLE IF NOT EXISTS assessments (
|
|
250
278
|
path TEXT PRIMARY KEY,
|
|
@@ -367,6 +395,8 @@ export function createBaseSchemaObjects(db: DbAdapter, hooks: BaseSchemaHooks):
|
|
|
367
395
|
|
|
368
396
|
db.exec("CREATE INDEX IF NOT EXISTS idx_memories_active ON memories(superseded_by)");
|
|
369
397
|
db.exec("CREATE INDEX IF NOT EXISTS idx_replan_history_milestone ON replan_history(milestone_id, created_at)");
|
|
398
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_rework_briefs_task ON rework_briefs(milestone_id, slice_id, task_id)");
|
|
399
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_rework_findings_status ON rework_brief_findings(brief_id, severity, status)");
|
|
370
400
|
db.exec("CREATE INDEX IF NOT EXISTS idx_tasks_active ON tasks(milestone_id, slice_id, status)");
|
|
371
401
|
db.exec("CREATE INDEX IF NOT EXISTS idx_slices_active ON slices(milestone_id, status)");
|
|
372
402
|
db.exec("CREATE INDEX IF NOT EXISTS idx_milestones_status ON milestones(status)");
|
|
@@ -462,3 +462,35 @@ export function applyMigrationV22QualityGateRepair(db: DbAdapter, hooks: Migrati
|
|
|
462
462
|
ensureColumn(db, "quality_gates", "scope", "ALTER TABLE quality_gates ADD COLUMN scope TEXT NOT NULL DEFAULT 'slice'");
|
|
463
463
|
ensureColumn(db, "assessments", "scope", "ALTER TABLE assessments ADD COLUMN scope TEXT NOT NULL DEFAULT ''");
|
|
464
464
|
}
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
export function applyMigrationV30ReworkBriefs(db: DbAdapter): void {
|
|
468
|
+
db.exec(`
|
|
469
|
+
CREATE TABLE IF NOT EXISTS rework_briefs (
|
|
470
|
+
id TEXT PRIMARY KEY,
|
|
471
|
+
milestone_id TEXT NOT NULL DEFAULT '',
|
|
472
|
+
slice_id TEXT NOT NULL DEFAULT '',
|
|
473
|
+
task_id TEXT NOT NULL DEFAULT '',
|
|
474
|
+
created_at TEXT NOT NULL DEFAULT '',
|
|
475
|
+
updated_at TEXT NOT NULL DEFAULT ''
|
|
476
|
+
)
|
|
477
|
+
`);
|
|
478
|
+
db.exec(`
|
|
479
|
+
CREATE TABLE IF NOT EXISTS rework_brief_findings (
|
|
480
|
+
brief_id TEXT NOT NULL,
|
|
481
|
+
finding_id TEXT NOT NULL,
|
|
482
|
+
severity TEXT NOT NULL DEFAULT 'blocking',
|
|
483
|
+
description TEXT NOT NULL DEFAULT '',
|
|
484
|
+
required_fix TEXT NOT NULL DEFAULT '',
|
|
485
|
+
verification_commands TEXT NOT NULL DEFAULT '[]',
|
|
486
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
487
|
+
evidence TEXT NOT NULL DEFAULT '',
|
|
488
|
+
decision_ref TEXT NOT NULL DEFAULT '',
|
|
489
|
+
updated_at TEXT NOT NULL DEFAULT '',
|
|
490
|
+
PRIMARY KEY (brief_id, finding_id),
|
|
491
|
+
FOREIGN KEY (brief_id) REFERENCES rework_briefs(id)
|
|
492
|
+
)
|
|
493
|
+
`);
|
|
494
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_rework_briefs_task ON rework_briefs(milestone_id, slice_id, task_id)");
|
|
495
|
+
db.exec("CREATE INDEX IF NOT EXISTS idx_rework_findings_status ON rework_brief_findings(brief_id, severity, status)");
|
|
496
|
+
}
|
|
@@ -19,8 +19,11 @@ export function ensureColumn(db: DbAdapter, table: string, column: string, ddl:
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
export function getCurrentSchemaVersion(db: DbAdapter): number {
|
|
22
|
+
// MAX(version) on an empty table returns a row whose value is NULL —
|
|
23
|
+
// treat that (and any non-numeric value) as version 0, not NULL-as-number.
|
|
22
24
|
const row = db.prepare("SELECT MAX(version) as v FROM schema_version").get();
|
|
23
|
-
|
|
25
|
+
const v = row?.["v"];
|
|
26
|
+
return typeof v === "number" ? v : 0;
|
|
24
27
|
}
|
|
25
28
|
|
|
26
29
|
export function recordSchemaVersion(db: DbAdapter, version: number): void {
|
|
@@ -128,7 +128,7 @@ Diagnostics record the file path, scope (global/project), severity (error/warnin
|
|
|
128
128
|
- Two equivalent ways to set it: inline as `models.<phase>.thinking`, or as a separate `thinking:` block keyed by phase. For the same phase, the inline value wins over the block; project preferences win over global; a phase that's unset inherits via the same sibling chain as `models` (e.g. `discuss → planning`).
|
|
129
129
|
- If no thinking is configured for a phase, the session level (set via `/model`) is used, exactly as before — this is fully backward-compatible.
|
|
130
130
|
- `execute-task` (code-writing) has a measured reasoning floor of `medium`: at lower levels models stop planning edits and thrash on file re-reads. The floor applies to the session/default path. An **explicit** `execution` thinking level bypasses the floor and is honored verbatim (with a one-time advisory) — set `execution: low` deliberately if you want it.
|
|
131
|
-
- Levels a model can't support are clamped to the nearest supported level at dispatch and never sent to the provider, so a model/level mismatch never fails a unit mid-run. `xhigh` is
|
|
131
|
+
- Levels a model can't support are clamped to the nearest supported level at dispatch and never sent to the provider, so a model/level mismatch never fails a unit mid-run. `xhigh` support is model-dependent; current examples include OpenAI Codex Max models and Claude Sonnet 5 on Amazon Bedrock.
|
|
132
132
|
|
|
133
133
|
- `skill_staleness_days`: number — skills unused for this many days get deprioritized during discovery. Set to `0` to disable staleness tracking. Default: `60`.
|
|
134
134
|
|
|
@@ -357,6 +357,28 @@ In `"parent"` mode, slice/task `targetRepositories` default to the declared chil
|
|
|
357
357
|
- `"replace"` requires `prompt`.
|
|
358
358
|
- `"skip"` is valid with no additional fields.
|
|
359
359
|
|
|
360
|
+
- `planning_subagents`: object — project-local widening for read-only planning subagent dispatch. Supported unit keys are `plan-milestone` and `plan-slice`; each has:
|
|
361
|
+
- `allowed`: string[] — additional planning-safe agents for that unit.
|
|
362
|
+
|
|
363
|
+
Agents must already be classified by GSD as read-only planning specialists: `mnemo`, `scout`, `planner`, `reviewer`, `security`, or `tester`. The write gate still blocks source writes outside `.gsd/**`, unrestricted bash, stale subagent calls without agent identities, agents outside the global read-only registry, and agents not listed for the active unit.
|
|
364
|
+
|
|
365
|
+
Example:
|
|
366
|
+
|
|
367
|
+
```yaml
|
|
368
|
+
planning_subagents:
|
|
369
|
+
plan-milestone:
|
|
370
|
+
allowed:
|
|
371
|
+
- scout
|
|
372
|
+
- planner
|
|
373
|
+
- security
|
|
374
|
+
plan-slice:
|
|
375
|
+
allowed:
|
|
376
|
+
- scout
|
|
377
|
+
- planner
|
|
378
|
+
- reviewer
|
|
379
|
+
- security
|
|
380
|
+
```
|
|
381
|
+
|
|
360
382
|
**Known unit types for `before`/`after`:** `research-milestone`, `plan-milestone`, `research-slice`, `plan-slice`, `execute-task`, `complete-slice`, `replan-slice`, `reassess-roadmap`, `run-uat`.
|
|
361
383
|
|
|
362
384
|
- `experimental`: opt-in experimental features. All features here are **off by default** — you must explicitly set each one to `true` to enable it. Features in this block may change or be removed without a deprecation cycle while in experimental status. Keys:
|
|
@@ -482,13 +504,13 @@ Inline form — thinking pinned alongside the model:
|
|
|
482
504
|
version: 1
|
|
483
505
|
models:
|
|
484
506
|
planning:
|
|
485
|
-
model:
|
|
507
|
+
model: bedrock/global.anthropic.claude-sonnet-5
|
|
486
508
|
thinking: xhigh
|
|
487
509
|
execution:
|
|
488
|
-
model:
|
|
510
|
+
model: bedrock/global.anthropic.claude-sonnet-5
|
|
489
511
|
thinking: low # explicit → bypasses the execute-task medium floor
|
|
490
512
|
validation:
|
|
491
|
-
model:
|
|
513
|
+
model: bedrock/global.anthropic.claude-sonnet-5
|
|
492
514
|
thinking: high
|
|
493
515
|
---
|
|
494
516
|
```
|
|
@@ -15,13 +15,13 @@ import {
|
|
|
15
15
|
import { MEMORIES_FTS_REBUILT_KEY } from "./db-memory-fts-schema.js";
|
|
16
16
|
import { isAfter, latestExplicitReopenAt } from "./milestone-reopen-events.js";
|
|
17
17
|
import {
|
|
18
|
-
buildTaskFileName,
|
|
19
18
|
gsdProjectionRoot,
|
|
20
19
|
gsdRoot,
|
|
21
20
|
resolveGsdPathContract,
|
|
22
21
|
resolveMilestoneFile,
|
|
23
22
|
resolveMilestonePath,
|
|
24
23
|
resolveSliceFile,
|
|
24
|
+
resolveTaskFile,
|
|
25
25
|
} from "./paths.js";
|
|
26
26
|
import { deriveState } from "./state.js";
|
|
27
27
|
import { isClosedStatus } from "./status-guards.js";
|
|
@@ -95,6 +95,25 @@ function reportCheckboxDbStatusDivergence(
|
|
|
95
95
|
});
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
+
function bareDuplicateMilestoneId(milestoneId: string): string | null {
|
|
99
|
+
const match = milestoneId.match(/^(M\d{3})-[a-z0-9]{6}$/i);
|
|
100
|
+
return match?.[1]?.toUpperCase() ?? null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function checkboxDbStatusMilestoneIds(basePath: string, milestoneIds: string[]): string[] {
|
|
104
|
+
if (!hasFlatPhaseLayout(basePath)) return milestoneIds;
|
|
105
|
+
|
|
106
|
+
// Flat-phase directories are keyed by phase number. A restored
|
|
107
|
+
// M003-xxxxxx row alongside M003 is a stale duplicate for the same
|
|
108
|
+
// phases/03-* projection, so checking both can compare DB status against two
|
|
109
|
+
// competing PLAN files and report a persistent false divergence.
|
|
110
|
+
const allIds = new Set(milestoneIds.map((id) => id.toUpperCase()));
|
|
111
|
+
return milestoneIds.filter((milestoneId) => {
|
|
112
|
+
const bareId = bareDuplicateMilestoneId(milestoneId);
|
|
113
|
+
return !bareId || !allIds.has(bareId);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
98
117
|
function checkProjectionCheckboxDbStatus(basePath: string, milestoneIds: string[], issues: DoctorIssue[]): void {
|
|
99
118
|
for (const milestoneId of milestoneIds) {
|
|
100
119
|
const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
@@ -208,10 +227,8 @@ function resolveFlatPhaseArtifactDiskPath(basePath: string, row: ArtifactRow): s
|
|
|
208
227
|
if (!artifactType) return null;
|
|
209
228
|
|
|
210
229
|
if (row.slice_id && row.task_id) {
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
const candidate = join(phaseDir, buildTaskFileName(row.task_id, artifactType));
|
|
214
|
-
return existsSync(candidate) ? candidate : null;
|
|
230
|
+
const candidate = resolveTaskFile(basePath, row.milestone_id, row.slice_id, row.task_id, artifactType);
|
|
231
|
+
return candidate && isFlatPhaseDiskPath(basePath, candidate) ? candidate : null;
|
|
215
232
|
}
|
|
216
233
|
|
|
217
234
|
const candidate = row.slice_id
|
|
@@ -436,7 +453,9 @@ function staleMilestonesArtifactRowFixable(basePath: string, row: ArtifactRow, a
|
|
|
436
453
|
|
|
437
454
|
function stalePhasesArtifactRowFixable(basePath: string, row: ArtifactRow, artifactRows: ArtifactRow[]): boolean {
|
|
438
455
|
const issuePath = artifactPathRelativeToGsd(row.path);
|
|
439
|
-
return issuePath.startsWith(`${LAYOUT_SEGMENTS.level1}/`) &&
|
|
456
|
+
return issuePath.startsWith(`${LAYOUT_SEGMENTS.level1}/`) &&
|
|
457
|
+
(hasPresentFlatPhaseReplacement(basePath, row, artifactRows) ||
|
|
458
|
+
hasPresentMilestonesReplacement(basePath, row, artifactRows));
|
|
440
459
|
}
|
|
441
460
|
|
|
442
461
|
function staleArtifactRowFixable(basePath: string, row: ArtifactRow, artifactRows: ArtifactRow[]): boolean {
|
|
@@ -809,7 +828,11 @@ export async function checkEngineHealth(
|
|
|
809
828
|
// block doctor.
|
|
810
829
|
try {
|
|
811
830
|
if (isDbAvailable()) {
|
|
812
|
-
checkProjectionCheckboxDbStatus(
|
|
831
|
+
checkProjectionCheckboxDbStatus(
|
|
832
|
+
basePath,
|
|
833
|
+
checkboxDbStatusMilestoneIds(basePath, getAllMilestones().map((milestone) => milestone.id)),
|
|
834
|
+
issues,
|
|
835
|
+
);
|
|
813
836
|
}
|
|
814
837
|
} catch {
|
|
815
838
|
// Non-fatal: checkbox-vs-DB divergence check must never block doctor
|
|
@@ -65,8 +65,12 @@ const NETWORK_RE = /network|ECONNRESET|ETIMEDOUT|ECONNREFUSED|socket hang up|web
|
|
|
65
65
|
// transient errors so auto-mode can retry with reduced budget or fall back to a larger-context model.
|
|
66
66
|
// See: https://github.com/open-gsd/gsd-pi/issues/4528
|
|
67
67
|
const SERVER_RE = /internal(?: server)?[ _-]?error|server[ _-]?error|500|502|503|overloaded|server_error|api_error|service.?unavailable|context (?:window|length) exceed|context window exceed/i;
|
|
68
|
+
// Provider adapters throw this when an upstream stop reason reaches Pi before
|
|
69
|
+
// the adapter knows how to map it. Keep the match scoped so plain "unknown"
|
|
70
|
+
// runtime errors still pause for inspection instead of being retried forever.
|
|
71
|
+
const PROVIDER_STOP_REASON_RE = /unhandled stop reason:\s*(?:abort|unknown)\b/i;
|
|
68
72
|
// ECONNRESET/ECONNREFUSED are in NETWORK_RE (same-model retry first).
|
|
69
|
-
const CONNECTION_RE = /terminated|connection.?(?:refused|error)|other side closed|EPIPE|network.?(?:is\s+)?unavailable|stream_exhausted(?:_without_result)?/i;
|
|
73
|
+
const CONNECTION_RE = /terminated|\babort\b|connection.?(?:refused|error)|other side closed|EPIPE|network.?(?:is\s+)?unavailable|stream_exhausted(?:_without_result)?/i;
|
|
70
74
|
// Catch-all for V8 JSON.parse errors: all modern variants end with "in JSON at position \d+".
|
|
71
75
|
// This eliminates the need to enumerate every error message variant individually.
|
|
72
76
|
const STREAM_RE = /in JSON at position \d+|Unexpected end of JSON|SyntaxError.*JSON/i;
|
|
@@ -103,7 +107,7 @@ const UNSUPPORTED_MODEL_SCOPE_RE = /\b(?:account|plan|tier|subscription)\b/i;
|
|
|
103
107
|
* 3. Network (ECONNRESET, ETIMEDOUT, socket hang up, fetch failed, dns)
|
|
104
108
|
* 4. Stream truncation (malformed JSON from mid-stream cut)
|
|
105
109
|
* 5. Server (500/502/503, overloaded, server_error)
|
|
106
|
-
* 6. Connection (terminated, ECONNREFUSED, EPIPE, other side closed)
|
|
110
|
+
* 6. Connection (terminated, abort/unknown stop reason, ECONNREFUSED, EPIPE, other side closed)
|
|
107
111
|
* 7. Model error (400 invalid argument / payload rejected for this model)
|
|
108
112
|
* 8. Unknown
|
|
109
113
|
*/
|
|
@@ -163,6 +167,13 @@ export function classifyError(errorMsg: string, retryAfterMs?: number): ErrorCla
|
|
|
163
167
|
return { kind: "rate-limit", retryAfterMs: delayMs };
|
|
164
168
|
}
|
|
165
169
|
|
|
170
|
+
// Provider stop-reason adapter gaps are usually request/stream failures from
|
|
171
|
+
// the current model. Treat the scoped adapter message as fallback-eligible,
|
|
172
|
+
// but keep generic unknown errors on the indefinite pause path.
|
|
173
|
+
if (PROVIDER_STOP_REASON_RE.test(errorMsg)) {
|
|
174
|
+
return { kind: "connection", retryAfterMs: retryAfterMs ?? 15_000 };
|
|
175
|
+
}
|
|
176
|
+
|
|
166
177
|
// 3. Network errors — same-model retry candidate
|
|
167
178
|
if (NETWORK_RE.test(errorMsg)) {
|
|
168
179
|
// Exclude if also matches permanent signals (already handled above for
|
|
@@ -6,7 +6,13 @@ import { cpSync, existsSync, mkdirSync, readdirSync, renameSync, rmSync, statSyn
|
|
|
6
6
|
import { join } from "node:path";
|
|
7
7
|
|
|
8
8
|
import { renderAllFromDb, renderRoadmapFromDb } from "./markdown-renderer.js";
|
|
9
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
deleteArtifactByPath,
|
|
11
|
+
deleteArtifactsByPathPrefix,
|
|
12
|
+
getAllMilestones,
|
|
13
|
+
getArtifactsByPathPrefix,
|
|
14
|
+
getMilestoneSlices,
|
|
15
|
+
} from "./gsd-db.js";
|
|
10
16
|
import { migrateFromMarkdown } from "./md-importer.js";
|
|
11
17
|
import { countDbHierarchy } from "./migration-auto-check.js";
|
|
12
18
|
import { logWarning } from "./workflow-logger.js";
|
|
@@ -14,6 +20,7 @@ import { LAYOUT_SEGMENTS } from "./layout-policy.js";
|
|
|
14
20
|
import {
|
|
15
21
|
canonicalPhaseDirName,
|
|
16
22
|
dirIsContentBearingLegacyMilestone,
|
|
23
|
+
gsdProjectionRoot,
|
|
17
24
|
milestonesDir,
|
|
18
25
|
resolveMilestonePath,
|
|
19
26
|
} from "./paths.js";
|
|
@@ -83,6 +90,40 @@ function expectedPhaseDirs(basePath: string): string[] {
|
|
|
83
90
|
);
|
|
84
91
|
}
|
|
85
92
|
|
|
93
|
+
/**
|
|
94
|
+
* Return the most-recent existing `.gsd-backups/migrate-<ts>/` snapshot, or null.
|
|
95
|
+
*
|
|
96
|
+
* The flat-phase migration can re-fire on later dispatches when the legacy
|
|
97
|
+
* `.gsd/milestones/` layout reappears (e.g. a marker-key mismatch re-triggers a
|
|
98
|
+
* whole-tree re-import — issue #1292). The DB was already reconciled from that
|
|
99
|
+
* tree before the backup step runs, so re-snapshotting an identical legacy tree
|
|
100
|
+
* on every dispatch only leaks a fresh `migrate-<ts>/` directory each time. When
|
|
101
|
+
* a prior snapshot already exists we reuse it as the rollback fallback instead
|
|
102
|
+
* of creating a duplicate, bounding the accumulation to one recovery copy.
|
|
103
|
+
*/
|
|
104
|
+
function existingMigrateBackup(basePath: string): string | null {
|
|
105
|
+
const backupRoot = join(basePath, ".gsd-backups");
|
|
106
|
+
if (!existsSync(backupRoot)) return null;
|
|
107
|
+
try {
|
|
108
|
+
let latest: { path: string; mtimeMs: number } | null = null;
|
|
109
|
+
for (const entry of readdirSync(backupRoot)) {
|
|
110
|
+
if (!entry.startsWith("migrate-")) continue;
|
|
111
|
+
const dirPath = join(backupRoot, entry);
|
|
112
|
+
try {
|
|
113
|
+
const st = statSync(dirPath);
|
|
114
|
+
if (!st.isDirectory()) continue;
|
|
115
|
+
if (!hasLegacyMilestoneSubdirs(dirPath)) continue;
|
|
116
|
+
if (!latest || st.mtimeMs > latest.mtimeMs) latest = { path: dirPath, mtimeMs: st.mtimeMs };
|
|
117
|
+
} catch {
|
|
118
|
+
// Non-fatal: skip unreadable entries.
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return latest?.path ?? null;
|
|
122
|
+
} catch {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
86
127
|
function hasLegacyMilestoneSubdirs(dirPath: string): boolean {
|
|
87
128
|
if (!existsSync(dirPath)) return false;
|
|
88
129
|
try {
|
|
@@ -94,10 +135,76 @@ function hasLegacyMilestoneSubdirs(dirPath: string): boolean {
|
|
|
94
135
|
}
|
|
95
136
|
}
|
|
96
137
|
|
|
138
|
+
function backupFlatProjectionIfPresent(basePath: string, phasesPath: string, backupDir: string): void {
|
|
139
|
+
if (!existsSync(phasesPath)) return;
|
|
140
|
+
const phaseBackupDir = join(backupDir, "__phases");
|
|
141
|
+
try {
|
|
142
|
+
mkdirSync(backupDir, { recursive: true });
|
|
143
|
+
if (existsSync(phaseBackupDir)) {
|
|
144
|
+
removePathWithRetries(phaseBackupDir);
|
|
145
|
+
}
|
|
146
|
+
fsOps.cpSync(phasesPath, phaseBackupDir, { recursive: true, force: true });
|
|
147
|
+
} catch (err) {
|
|
148
|
+
logWarning("migration", `flat-phase projection backup failed: ${(err as Error).message}`);
|
|
149
|
+
throw err;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function isInsideFlatProjectionBackup(backupDir: string, src: string): boolean {
|
|
154
|
+
const phaseBackupDir = join(backupDir, "__phases");
|
|
155
|
+
return src === phaseBackupDir || src.startsWith(`${phaseBackupDir}/`) || src.startsWith(`${phaseBackupDir}\\`);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function removeFlatProjectionBackup(backupDir: string): void {
|
|
159
|
+
const phaseBackupDir = join(backupDir, "__phases");
|
|
160
|
+
if (!existsSync(phaseBackupDir)) return;
|
|
161
|
+
try {
|
|
162
|
+
removePathWithRetries(phaseBackupDir);
|
|
163
|
+
} catch (err) {
|
|
164
|
+
logWarning(
|
|
165
|
+
"migration",
|
|
166
|
+
`flat-phase migration succeeded but could not remove temporary ${LAYOUT_SEGMENTS.level1}/ backup: ${(err as Error).message}`,
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function restoreFlatProjectionFromBackup(basePath: string, backupDir: string): void {
|
|
172
|
+
const phaseBackupDir = join(backupDir, "__phases");
|
|
173
|
+
if (!existsSync(phaseBackupDir)) return;
|
|
174
|
+
const phasesPath = join(basePath, ".gsd", LAYOUT_SEGMENTS.level1);
|
|
175
|
+
try {
|
|
176
|
+
if (existsSync(phasesPath)) {
|
|
177
|
+
removePathWithRetries(phasesPath);
|
|
178
|
+
}
|
|
179
|
+
mkdirSync(join(basePath, ".gsd"), { recursive: true });
|
|
180
|
+
cpSync(phaseBackupDir, phasesPath, { recursive: true });
|
|
181
|
+
} catch (restoreErr) {
|
|
182
|
+
logWarning(
|
|
183
|
+
"migration",
|
|
184
|
+
`rollback: could not restore ${LAYOUT_SEGMENTS.level1}/ from backup: ${(restoreErr as Error).message}`,
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function pruneStaleFlatPhaseArtifactRows(basePath: string): number {
|
|
190
|
+
const projectionRoot = gsdProjectionRoot(basePath);
|
|
191
|
+
let pruned = 0;
|
|
192
|
+
for (const row of getArtifactsByPathPrefix(`${LAYOUT_SEGMENTS.level1}/`)) {
|
|
193
|
+
if (existsSync(join(projectionRoot, row.path))) continue;
|
|
194
|
+
const staleTaskPlan = row.artifact_type.toUpperCase() === "PLAN" && Boolean(row.task_id);
|
|
195
|
+
const skippedEmptyArtifact = row.full_content.trim() === "";
|
|
196
|
+
if (!staleTaskPlan && !skippedEmptyArtifact) continue;
|
|
197
|
+
deleteArtifactByPath(row.path);
|
|
198
|
+
pruned++;
|
|
199
|
+
}
|
|
200
|
+
return pruned;
|
|
201
|
+
}
|
|
202
|
+
|
|
97
203
|
function rollbackPartialMigration(
|
|
98
204
|
basePath: string,
|
|
99
205
|
backupDir: string,
|
|
100
206
|
migratingPath?: string,
|
|
207
|
+
backupCreatedThisRun = true,
|
|
101
208
|
): void {
|
|
102
209
|
// Remove the partially-written phases/ dir.
|
|
103
210
|
try {
|
|
@@ -113,7 +220,8 @@ function rollbackPartialMigration(
|
|
|
113
220
|
// preserved migrating tree (the sole surviving data source) and must never be
|
|
114
221
|
// removed here. Deleting the backup after a successful rollback keeps the gate
|
|
115
222
|
// from leaking one .gsd-backups/migrate-<ts>/ per session_start.
|
|
116
|
-
const isDisposableBackup =
|
|
223
|
+
const isDisposableBackup =
|
|
224
|
+
Boolean(backupDir) && backupDir !== migratingPath && backupCreatedThisRun;
|
|
117
225
|
const cleanupBackup = (): void => {
|
|
118
226
|
if (!isDisposableBackup || !existsSync(backupDir)) return;
|
|
119
227
|
try {
|
|
@@ -131,11 +239,16 @@ function rollbackPartialMigration(
|
|
|
131
239
|
try {
|
|
132
240
|
if (migratingPath && existsSync(migratingPath) && !existsSync(milestonesPath)) {
|
|
133
241
|
movePathWithCopyDeleteFallback(migratingPath, milestonesPath);
|
|
242
|
+
restoreFlatProjectionFromBackup(basePath, backupDir);
|
|
134
243
|
cleanupBackup();
|
|
135
244
|
return;
|
|
136
245
|
}
|
|
137
246
|
if (existsSync(backupDir)) {
|
|
138
|
-
cpSync(backupDir, milestonesPath, {
|
|
247
|
+
cpSync(backupDir, milestonesPath, {
|
|
248
|
+
recursive: true,
|
|
249
|
+
filter: (src) => !isInsideFlatProjectionBackup(backupDir, src),
|
|
250
|
+
});
|
|
251
|
+
restoreFlatProjectionFromBackup(basePath, backupDir);
|
|
139
252
|
cleanupBackup();
|
|
140
253
|
}
|
|
141
254
|
if (migratingPath && existsSync(migratingPath)) {
|
|
@@ -244,16 +357,34 @@ export async function migrateToFlatPhase(basePath: string): Promise<void> {
|
|
|
244
357
|
}
|
|
245
358
|
|
|
246
359
|
let backupDir = migratingPath;
|
|
360
|
+
let backupCreatedThisRun = false;
|
|
247
361
|
if (!resumingInterrupted) {
|
|
248
|
-
// 2. Backup (only reached when the DB has rows and migration will proceed)
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
362
|
+
// 2. Backup (only reached when the DB has rows and migration will proceed).
|
|
363
|
+
// migrateFromMarkdown above already reconciled the legacy tree into the DB,
|
|
364
|
+
// so its content is safely persisted. If a prior successful migration
|
|
365
|
+
// already snapshotted the legacy tree, a re-fire of this gate (issue #1292:
|
|
366
|
+
// marker-key mismatch re-importing the whole tree at dispatch boundaries)
|
|
367
|
+
// must not leak a fresh .gsd-backups/migrate-<ts>/ every dispatch. Treat it
|
|
368
|
+
// as a marker-refresh re-projection: reuse the existing snapshot as the
|
|
369
|
+
// rollback fallback instead of creating a duplicate.
|
|
370
|
+
const priorBackup = existingMigrateBackup(basePath);
|
|
371
|
+
if (priorBackup) {
|
|
372
|
+
backupDir = priorBackup;
|
|
373
|
+
logWarning(
|
|
374
|
+
"migration",
|
|
375
|
+
`flat-phase migration re-fired; reusing existing backup ${priorBackup} instead of re-snapshotting (issue #1292)`,
|
|
376
|
+
);
|
|
377
|
+
} else {
|
|
378
|
+
const ts = Date.now();
|
|
379
|
+
backupDir = join(basePath, ".gsd-backups", `migrate-${ts}`);
|
|
380
|
+
try {
|
|
381
|
+
mkdirSync(join(basePath, ".gsd-backups"), { recursive: true });
|
|
382
|
+
cpSync(milestonesPath, backupDir, { recursive: true });
|
|
383
|
+
backupCreatedThisRun = true;
|
|
384
|
+
} catch (err) {
|
|
385
|
+
logWarning("migration", `flat-phase migration backup failed: ${(err as Error).message}`);
|
|
386
|
+
throw err;
|
|
387
|
+
}
|
|
257
388
|
}
|
|
258
389
|
|
|
259
390
|
if (existsSync(migratingPath)) {
|
|
@@ -269,15 +400,35 @@ export async function migrateToFlatPhase(basePath: string): Promise<void> {
|
|
|
269
400
|
logWarning("migration", `failed to rename legacy milestones/ before render: ${(err as Error).message}`);
|
|
270
401
|
throw err;
|
|
271
402
|
}
|
|
403
|
+
} else {
|
|
404
|
+
const priorBackup = existingMigrateBackup(basePath);
|
|
405
|
+
if (priorBackup) {
|
|
406
|
+
backupDir = priorBackup;
|
|
407
|
+
} else {
|
|
408
|
+
const ts = Date.now();
|
|
409
|
+
backupDir = join(basePath, ".gsd-backups", `migrate-${ts}`);
|
|
410
|
+
try {
|
|
411
|
+
mkdirSync(join(basePath, ".gsd-backups"), { recursive: true });
|
|
412
|
+
cpSync(migratingPath, backupDir, { recursive: true });
|
|
413
|
+
backupCreatedThisRun = true;
|
|
414
|
+
} catch (err) {
|
|
415
|
+
logWarning(
|
|
416
|
+
"migration",
|
|
417
|
+
`flat-phase migration backup failed during resume: ${(err as Error).message}`,
|
|
418
|
+
);
|
|
419
|
+
throw err;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
272
422
|
}
|
|
273
423
|
|
|
274
424
|
// Clear any stale or partially-rendered flat projection before this run
|
|
275
425
|
// writes. Verification below checks the current DB render, not leftovers.
|
|
276
426
|
try {
|
|
427
|
+
backupFlatProjectionIfPresent(basePath, phasesPath, backupDir);
|
|
277
428
|
removePathWithRetries(phasesPath);
|
|
278
429
|
} catch (err) {
|
|
279
430
|
logWarning("migration", `failed to clear stale phases/ before render: ${(err as Error).message}`);
|
|
280
|
-
rollbackPartialMigration(basePath, backupDir, migratingPath);
|
|
431
|
+
rollbackPartialMigration(basePath, backupDir, migratingPath, backupCreatedThisRun);
|
|
281
432
|
throw err;
|
|
282
433
|
}
|
|
283
434
|
|
|
@@ -299,7 +450,7 @@ export async function migrateToFlatPhase(basePath: string): Promise<void> {
|
|
|
299
450
|
}
|
|
300
451
|
} catch (err) {
|
|
301
452
|
logWarning("migration", `flat-phase render failed: ${(err as Error).message}`);
|
|
302
|
-
rollbackPartialMigration(basePath, backupDir, migratingPath);
|
|
453
|
+
rollbackPartialMigration(basePath, backupDir, migratingPath, backupCreatedThisRun);
|
|
303
454
|
throw err;
|
|
304
455
|
}
|
|
305
456
|
|
|
@@ -309,7 +460,7 @@ export async function migrateToFlatPhase(basePath: string): Promise<void> {
|
|
|
309
460
|
"migration",
|
|
310
461
|
`flat-phase render had ${renderResult.errors.length} error(s): ${renderResult.errors.join("; ")}`,
|
|
311
462
|
);
|
|
312
|
-
rollbackPartialMigration(basePath, backupDir, migratingPath);
|
|
463
|
+
rollbackPartialMigration(basePath, backupDir, migratingPath, backupCreatedThisRun);
|
|
313
464
|
throw new Error(
|
|
314
465
|
`flat-phase migration render failed: ${renderResult.errors.slice(0, 3).join("; ")}`,
|
|
315
466
|
);
|
|
@@ -322,7 +473,7 @@ export async function migrateToFlatPhase(basePath: string): Promise<void> {
|
|
|
322
473
|
"migration",
|
|
323
474
|
`flat-phase migration missing ${missingPhaseDirs.length} expected phase dir(s): ${missingPhaseDirs.join(", ")}`,
|
|
324
475
|
);
|
|
325
|
-
rollbackPartialMigration(basePath, backupDir, migratingPath);
|
|
476
|
+
rollbackPartialMigration(basePath, backupDir, migratingPath, backupCreatedThisRun);
|
|
326
477
|
throw new Error("flat-phase migration verification failed: missing rendered phase directories");
|
|
327
478
|
}
|
|
328
479
|
if (db.slices > 0 && renderResult.rendered === 0) {
|
|
@@ -330,17 +481,20 @@ export async function migrateToFlatPhase(basePath: string): Promise<void> {
|
|
|
330
481
|
"migration",
|
|
331
482
|
"flat-phase migration verification failed: render produced no artifacts for populated DB",
|
|
332
483
|
);
|
|
333
|
-
rollbackPartialMigration(basePath, backupDir, migratingPath);
|
|
484
|
+
rollbackPartialMigration(basePath, backupDir, migratingPath, backupCreatedThisRun);
|
|
334
485
|
throw new Error("flat-phase migration verification failed: no artifacts rendered");
|
|
335
486
|
}
|
|
336
487
|
|
|
337
488
|
// 6. Verified — prune legacy artifact rows now that renderAllFromDb has
|
|
338
|
-
// re-inserted flat-phase rows for artifacts that still have files.
|
|
489
|
+
// re-inserted flat-phase rows for artifacts that still have files. Also
|
|
490
|
+
// prune flat-phase rows whose files the renderer intentionally no longer
|
|
491
|
+
// materializes, such as task PLAN files and empty-content artifacts.
|
|
339
492
|
try {
|
|
340
493
|
deleteArtifactsByPathPrefix("milestones/");
|
|
494
|
+
pruneStaleFlatPhaseArtifactRows(basePath);
|
|
341
495
|
} catch (err) {
|
|
342
496
|
logWarning("migration", `flat-phase migration could not prune legacy artifact rows: ${(err as Error).message}`);
|
|
343
|
-
rollbackPartialMigration(basePath, backupDir, migratingPath);
|
|
497
|
+
rollbackPartialMigration(basePath, backupDir, migratingPath, backupCreatedThisRun);
|
|
344
498
|
throw err;
|
|
345
499
|
}
|
|
346
500
|
|
|
@@ -353,4 +507,5 @@ export async function migrateToFlatPhase(basePath: string): Promise<void> {
|
|
|
353
507
|
`flat-phase migration succeeded but could not remove ${LEGACY_MIGRATING_SEGMENT}: ${(err as Error).message}`,
|
|
354
508
|
);
|
|
355
509
|
}
|
|
510
|
+
removeFlatProjectionBackup(backupDir);
|
|
356
511
|
}
|