@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
|
@@ -209,7 +209,8 @@ export function shouldRunDeepProjectSetup(state, prefs, basePath, options = {})
|
|
|
209
209
|
}
|
|
210
210
|
function resolveArtifactBasePath(basePath, mid, session) {
|
|
211
211
|
if (session?.basePath &&
|
|
212
|
-
session.currentMilestoneId
|
|
212
|
+
session.currentMilestoneId &&
|
|
213
|
+
milestoneIdsDispatchCompatible(session.currentMilestoneId, mid) &&
|
|
213
214
|
existsSync(session.basePath)) {
|
|
214
215
|
return session.basePath;
|
|
215
216
|
}
|
|
@@ -231,6 +232,24 @@ function normalizeMilestoneScope(value) {
|
|
|
231
232
|
return null;
|
|
232
233
|
return trimmed;
|
|
233
234
|
}
|
|
235
|
+
function dispatchMilestoneIdentity(value) {
|
|
236
|
+
const normalized = normalizeMilestoneScope(value);
|
|
237
|
+
const match = normalized?.match(/^(M\d{3})(?:-[a-z0-9]{6})?$/);
|
|
238
|
+
if (!match)
|
|
239
|
+
return null;
|
|
240
|
+
return { baseId: match[1], hasSuffix: normalized !== match[1] };
|
|
241
|
+
}
|
|
242
|
+
function isBareSuffixedMilestoneAlias(left, right) {
|
|
243
|
+
const leftId = dispatchMilestoneIdentity(left);
|
|
244
|
+
const rightId = dispatchMilestoneIdentity(right);
|
|
245
|
+
return Boolean(leftId &&
|
|
246
|
+
rightId &&
|
|
247
|
+
leftId.baseId === rightId.baseId &&
|
|
248
|
+
leftId.hasSuffix !== rightId.hasSuffix);
|
|
249
|
+
}
|
|
250
|
+
function milestoneIdsDispatchCompatible(left, right) {
|
|
251
|
+
return left === right || isBareSuffixedMilestoneAlias(left, right);
|
|
252
|
+
}
|
|
234
253
|
function resolveDispatchMilestoneScope(ctx) {
|
|
235
254
|
const sessionMilestone = normalizeMilestoneScope(ctx.session?.currentMilestoneId);
|
|
236
255
|
if (sessionMilestone)
|
|
@@ -243,6 +262,31 @@ function resolveDispatchMilestoneScope(ctx) {
|
|
|
243
262
|
return { id: baseWorktree, source: "basePath worktree" };
|
|
244
263
|
return null;
|
|
245
264
|
}
|
|
265
|
+
function resolveEffectiveDispatchMilestoneId(ctx, scopedMilestone) {
|
|
266
|
+
if (scopedMilestone && isBareSuffixedMilestoneAlias(ctx.mid, scopedMilestone.id)) {
|
|
267
|
+
return dispatchMilestoneIdentity(scopedMilestone.id)?.hasSuffix ? scopedMilestone.id : ctx.mid;
|
|
268
|
+
}
|
|
269
|
+
const activeMid = ctx.state.activeMilestone?.id;
|
|
270
|
+
if (activeMid && isBareSuffixedMilestoneAlias(ctx.mid, activeMid)) {
|
|
271
|
+
return dispatchMilestoneIdentity(activeMid)?.hasSuffix ? activeMid : ctx.mid;
|
|
272
|
+
}
|
|
273
|
+
return ctx.mid;
|
|
274
|
+
}
|
|
275
|
+
function withEffectiveDispatchMilestone(ctx, effectiveMid) {
|
|
276
|
+
if (effectiveMid === ctx.mid)
|
|
277
|
+
return ctx;
|
|
278
|
+
const activeMilestone = ctx.state.activeMilestone;
|
|
279
|
+
const state = activeMilestone && milestoneIdsDispatchCompatible(activeMilestone.id, effectiveMid)
|
|
280
|
+
? {
|
|
281
|
+
...ctx.state,
|
|
282
|
+
activeMilestone: {
|
|
283
|
+
...activeMilestone,
|
|
284
|
+
id: effectiveMid,
|
|
285
|
+
},
|
|
286
|
+
}
|
|
287
|
+
: ctx.state;
|
|
288
|
+
return { ...ctx, mid: effectiveMid, state };
|
|
289
|
+
}
|
|
246
290
|
function hasMilestonePassedDiscuss(basePath, mid) {
|
|
247
291
|
if (isDbAvailable()) {
|
|
248
292
|
try {
|
|
@@ -510,18 +554,25 @@ export const DISPATCH_RULES = [
|
|
|
510
554
|
// Fire BEFORE the execution-entry phase rules so we redispatch to
|
|
511
555
|
// `discuss-milestone` instead of hitting the plan-v2 gate.
|
|
512
556
|
name: "execution-entry phase (no context) → discuss-milestone",
|
|
513
|
-
match: async ({ state, mid, midTitle, basePath, prefs, structuredQuestionsAvailable }) => {
|
|
557
|
+
match: async ({ state, mid, midTitle, basePath, session, prefs, structuredQuestionsAvailable }) => {
|
|
514
558
|
if (!EXECUTION_ENTRY_PHASES.has(state.phase))
|
|
515
559
|
return null;
|
|
516
560
|
if (!MILESTONE_ID_RE.test(mid))
|
|
517
561
|
return null;
|
|
518
562
|
if (isRegistryMilestoneComplete(state, mid))
|
|
519
563
|
return null;
|
|
520
|
-
|
|
564
|
+
// Resolve discuss/context artifacts against the active session worktree,
|
|
565
|
+
// mirroring the executing rules below. For a suffixed-worktree milestone
|
|
566
|
+
// the CONTEXT and slice plans live under the worktree, not the project
|
|
567
|
+
// root; checking the raw project-root basePath misreads the milestone as
|
|
568
|
+
// "never discussed" and re-dispatches discuss-milestone after task
|
|
569
|
+
// closeout instead of continuing execution (#1317).
|
|
570
|
+
const artifactBasePath = resolveArtifactBasePath(basePath, mid, session);
|
|
571
|
+
if (hasMilestonePassedDiscuss(artifactBasePath, mid))
|
|
521
572
|
return null;
|
|
522
573
|
// Align with the plan-v2 gate's lookup semantics: whitespace-only counts
|
|
523
574
|
// as missing, and an auto worktree may fall back to GSD_PROJECT_ROOT.
|
|
524
|
-
if (hasFinalizedMilestoneContext(
|
|
575
|
+
if (hasFinalizedMilestoneContext(artifactBasePath, mid))
|
|
525
576
|
return null;
|
|
526
577
|
// H6 fix (#4973): non-deep auto-mode has no human to answer the
|
|
527
578
|
// depth-verification question, so pre-marking avoids a write-gate
|
|
@@ -854,12 +905,14 @@ export const DISPATCH_RULES = [
|
|
|
854
905
|
},
|
|
855
906
|
{
|
|
856
907
|
name: "pre-planning (no context) → discuss-milestone",
|
|
857
|
-
match: async ({ state, mid, midTitle, basePath, prefs, structuredQuestionsAvailable }) => {
|
|
908
|
+
match: async ({ state, mid, midTitle, basePath, prefs, session, structuredQuestionsAvailable }) => {
|
|
858
909
|
if (state.phase !== "pre-planning")
|
|
859
910
|
return null;
|
|
860
911
|
if (isRegistryMilestoneComplete(state, mid))
|
|
861
912
|
return null;
|
|
862
|
-
const
|
|
913
|
+
const contextBasePath = resolveWorktreeProjectRoot(basePath, session?.originalBasePath);
|
|
914
|
+
const contextFile = resolveMilestoneFile(basePath, mid, "CONTEXT") ??
|
|
915
|
+
(contextBasePath !== basePath ? resolveMilestoneFile(contextBasePath, mid, "CONTEXT") : null);
|
|
863
916
|
const hasContext = !!(contextFile && (await loadFile(contextFile)));
|
|
864
917
|
if (hasContext)
|
|
865
918
|
return null; // fall through to next rule
|
|
@@ -1550,6 +1603,8 @@ function applyLanguageDirectiveToDispatch(action, prefs) {
|
|
|
1550
1603
|
const directive = renderLanguageDirectiveForPrompt(prefs);
|
|
1551
1604
|
if (!directive)
|
|
1552
1605
|
return action;
|
|
1606
|
+
if (action.prompt.startsWith(directive))
|
|
1607
|
+
return action;
|
|
1553
1608
|
return { ...action, prompt: `${directive}\n\n${action.prompt}` };
|
|
1554
1609
|
}
|
|
1555
1610
|
// ─── Resolver ─────────────────────────────────────────────────────────────
|
|
@@ -1562,31 +1617,33 @@ function applyLanguageDirectiveToDispatch(action, prefs) {
|
|
|
1562
1617
|
* resolveDispatch directly without registry initialization).
|
|
1563
1618
|
*/
|
|
1564
1619
|
export async function resolveDispatch(ctx) {
|
|
1565
|
-
|
|
1566
|
-
|
|
1620
|
+
const scopedMilestone = resolveDispatchMilestoneScope(ctx);
|
|
1621
|
+
const effectiveMid = resolveEffectiveDispatchMilestoneId(ctx, scopedMilestone);
|
|
1622
|
+
const dispatchCtx = withEffectiveDispatchMilestone(ctx, effectiveMid);
|
|
1623
|
+
if (dispatchCtx.mid && isDbAvailable()) {
|
|
1624
|
+
const milestone = getMilestone(dispatchCtx.mid);
|
|
1567
1625
|
if (milestone && isClosedStatus(milestone.status)) {
|
|
1568
1626
|
return {
|
|
1569
1627
|
action: "stop",
|
|
1570
|
-
reason: `Milestone ${
|
|
1628
|
+
reason: `Milestone ${dispatchCtx.mid} is closed (status: ${milestone.status}); auto-mode will not reopen or recover it implicitly. ` +
|
|
1571
1629
|
"Use an explicit reopen command before planning or executing more work for this milestone.",
|
|
1572
1630
|
level: "warning",
|
|
1573
1631
|
};
|
|
1574
1632
|
}
|
|
1575
1633
|
}
|
|
1576
|
-
const activeMid =
|
|
1577
|
-
if (activeMid &&
|
|
1634
|
+
const activeMid = dispatchCtx.state.activeMilestone?.id;
|
|
1635
|
+
if (activeMid && !milestoneIdsDispatchCompatible(dispatchCtx.mid, activeMid)) {
|
|
1578
1636
|
return {
|
|
1579
1637
|
action: "stop",
|
|
1580
|
-
reason: `Dispatch milestone mismatch: context mid "${
|
|
1638
|
+
reason: `Dispatch milestone mismatch: context mid "${dispatchCtx.mid}" does not match active milestone "${activeMid}". ` +
|
|
1581
1639
|
"This usually means a project-level deep setup pseudo-id leaked into milestone dispatch; rerun /gsd auto after setup state is reconciled.",
|
|
1582
1640
|
level: "warning",
|
|
1583
1641
|
};
|
|
1584
1642
|
}
|
|
1585
|
-
|
|
1586
|
-
if (scopedMilestone && ctx.mid !== scopedMilestone.id) {
|
|
1643
|
+
if (scopedMilestone && !milestoneIdsDispatchCompatible(dispatchCtx.mid, scopedMilestone.id)) {
|
|
1587
1644
|
return {
|
|
1588
1645
|
action: "stop",
|
|
1589
|
-
reason: `Dispatch milestone mismatch: context mid "${
|
|
1646
|
+
reason: `Dispatch milestone mismatch: context mid "${dispatchCtx.mid}" does not match ${scopedMilestone.source} "${scopedMilestone.id}". ` +
|
|
1590
1647
|
"The active worktree/session and derived project state disagree; recover, park, or discard the stranded milestone before continuing.",
|
|
1591
1648
|
level: "warning",
|
|
1592
1649
|
};
|
|
@@ -1594,9 +1651,9 @@ export async function resolveDispatch(ctx) {
|
|
|
1594
1651
|
// Delegate to registry when available
|
|
1595
1652
|
try {
|
|
1596
1653
|
const registry = getRegistry();
|
|
1597
|
-
const action = annotateBackgroundable(await registry.evaluateDispatch(
|
|
1654
|
+
const action = annotateBackgroundable(await registry.evaluateDispatch(dispatchCtx));
|
|
1598
1655
|
if (action.action === "dispatch" &&
|
|
1599
|
-
|
|
1656
|
+
dispatchCtx.session?.exhaustedVerificationUnits?.has(`${action.unitType}:${action.unitId}`)) {
|
|
1600
1657
|
return {
|
|
1601
1658
|
action: "stop",
|
|
1602
1659
|
reason: `Unit ${action.unitId} exhausted verification retries this session.`,
|
|
@@ -1610,13 +1667,13 @@ export async function resolveDispatch(ctx) {
|
|
|
1610
1667
|
logWarning("dispatch", `registry dispatch failed, falling back to inline rules: ${err instanceof Error ? err.message : String(err)}`);
|
|
1611
1668
|
}
|
|
1612
1669
|
for (const rule of DISPATCH_RULES) {
|
|
1613
|
-
const result = await rule.match(
|
|
1670
|
+
const result = await rule.match(dispatchCtx);
|
|
1614
1671
|
if (result) {
|
|
1615
1672
|
if (result.action !== "skip")
|
|
1616
1673
|
result.matchedRule = rule.name;
|
|
1617
1674
|
const action = annotateBackgroundable(result);
|
|
1618
1675
|
if (action.action === "dispatch" &&
|
|
1619
|
-
|
|
1676
|
+
dispatchCtx.session?.exhaustedVerificationUnits?.has(`${action.unitType}:${action.unitId}`)) {
|
|
1620
1677
|
return {
|
|
1621
1678
|
action: "stop",
|
|
1622
1679
|
reason: `Unit ${action.unitId} exhausted verification retries this session.`,
|
|
@@ -1411,6 +1411,10 @@ export async function postUnitPreVerification(pctx, opts) {
|
|
|
1411
1411
|
const blockingMismatch = mismatches.find((mismatch) => mismatch.severity === "error");
|
|
1412
1412
|
if (blockingMismatch) {
|
|
1413
1413
|
ctx.ui.notify(`Safety: task ${sTid} claimed passing verification that failed in recorded execution`, "error");
|
|
1414
|
+
const gitActionResult = await runCloseoutGitAction(pctx, s.currentUnit);
|
|
1415
|
+
if (gitActionResult === "dispatched") {
|
|
1416
|
+
return "dispatched";
|
|
1417
|
+
}
|
|
1414
1418
|
await pauseAuto(ctx, pi);
|
|
1415
1419
|
return "dispatched";
|
|
1416
1420
|
}
|
|
@@ -10,15 +10,15 @@
|
|
|
10
10
|
import { loadFile, parseContinue, parseSummary, loadActiveOverrides, formatOverridesSection } from "./files.js";
|
|
11
11
|
import { extractVerdict } from "./verdict-parser.js";
|
|
12
12
|
import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
|
|
13
|
-
import { resolveMilestoneFile, resolveSliceFile, resolveSlicePath, resolveTasksDir, resolveTaskFiles, resolveTaskFile, relMilestoneFile, relSliceFile, relSlicePath, relMilestonePath, relTaskFile, resolveGsdRootFile, relGsdRootFile, resolveRuntimeFile, } from "./paths.js";
|
|
14
|
-
import { resolveInlineLevel, loadEffectiveGSDPreferences } from "./preferences.js";
|
|
13
|
+
import { resolveMilestoneFile, resolveSliceFile, resolveSlicePath, resolveTasksDir, resolveTaskFiles, resolveTaskFile, taskIdFromTaskFileName, relMilestoneFile, relSliceFile, relSlicePath, relMilestonePath, relTaskFile, resolveGsdRootFile, relGsdRootFile, resolveRuntimeFile, } from "./paths.js";
|
|
14
|
+
import { resolveInlineLevel, loadEffectiveGSDPreferences, renderLanguageDirectiveForPrompt } from "./preferences.js";
|
|
15
15
|
import { createRepositoryRegistryFromPreferences } from "./repository-registry.js";
|
|
16
16
|
import { isContextModeEnabled } from "./preferences-types.js";
|
|
17
17
|
import { parseRoadmap } from "./parsers-legacy.js";
|
|
18
|
-
import { join, relative, sep } from "node:path";
|
|
18
|
+
import { join, basename, relative, sep } from "node:path";
|
|
19
19
|
import { existsSync } from "node:fs";
|
|
20
20
|
import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary } from "./context-budget.js";
|
|
21
|
-
import { getGateResults, getPendingGatesForTurn } from "./gsd-db.js";
|
|
21
|
+
import { getBlockingReworkFindingsForTask, getGateResults, getPendingGatesForTurn } from "./gsd-db.js";
|
|
22
22
|
import { assertGateCoverage, getGatesForTurn, } from "./gate-registry.js";
|
|
23
23
|
import { formatDecisionsCompact, formatRequirementsCompact } from "./structured-data-formatter.js";
|
|
24
24
|
import { readPhaseAnchor, formatAnchorForPrompt } from "./phase-anchor.js";
|
|
@@ -47,6 +47,12 @@ export { buildSkillActivationBlock, buildSkillDiscoveryVars };
|
|
|
47
47
|
* from their configured executor window.
|
|
48
48
|
*/
|
|
49
49
|
const MAX_PREAMBLE_CHARS = 20_000;
|
|
50
|
+
function prependLanguageDirectiveForBase(base, prompt) {
|
|
51
|
+
const directive = renderLanguageDirectiveForPrompt(loadEffectiveGSDPreferences(base)?.preferences);
|
|
52
|
+
if (!directive || prompt.startsWith(directive))
|
|
53
|
+
return prompt;
|
|
54
|
+
return `${directive}\n\n${prompt}`;
|
|
55
|
+
}
|
|
50
56
|
/**
|
|
51
57
|
* Resolve prompt budgets from the configured executor context window.
|
|
52
58
|
*
|
|
@@ -62,13 +68,29 @@ function resolvePromptBudgets() {
|
|
|
62
68
|
const prefs = loadEffectiveGSDPreferences();
|
|
63
69
|
const sessionWindow = prefs?.preferences.context_window_override;
|
|
64
70
|
const windowTokens = resolveExecutorContextWindow(undefined, prefs?.preferences, sessionWindow);
|
|
65
|
-
return computeBudgets(windowTokens);
|
|
71
|
+
return computeBudgets(windowTokens, resolveExecutionProvider(prefs?.preferences));
|
|
66
72
|
}
|
|
67
73
|
catch (e) {
|
|
68
74
|
logWarning("prompt", `resolvePromptBudgets failed: ${e.message}`);
|
|
69
75
|
return computeBudgets(200_000);
|
|
70
76
|
}
|
|
71
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* Best-effort provider for the chars/token ratio: the executor's configured
|
|
80
|
+
* model profile is the only provider source reachable here (the runtime
|
|
81
|
+
* `sessionProvider` that reaches `formatExecutorConstraints` isn't threaded to
|
|
82
|
+
* `capPreamble`/summary callers). Undefined when no explicit provider is set —
|
|
83
|
+
* `computeBudgets` then uses the 4.0 default, i.e. today's behavior.
|
|
84
|
+
*/
|
|
85
|
+
function resolveExecutionProvider(prefs) {
|
|
86
|
+
const exec = prefs?.models?.execution;
|
|
87
|
+
if (exec && typeof exec === "object" && "provider" in exec) {
|
|
88
|
+
const provider = exec.provider;
|
|
89
|
+
if (typeof provider === "string" && provider)
|
|
90
|
+
return provider;
|
|
91
|
+
}
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
72
94
|
/**
|
|
73
95
|
* Character budget for dependency/prior slice summaries injected into dispatch
|
|
74
96
|
* prompts. Scales with the executor's configured context window (issue #4435).
|
|
@@ -76,6 +98,32 @@ function resolvePromptBudgets() {
|
|
|
76
98
|
function resolveSummaryBudgetChars() {
|
|
77
99
|
return resolvePromptBudgets().summaryBudgetChars;
|
|
78
100
|
}
|
|
101
|
+
function renderBlockingReworkFindingsBlock(mid, sid, tid) {
|
|
102
|
+
const findings = getBlockingReworkFindingsForTask(mid, sid, tid)
|
|
103
|
+
.filter((finding) => finding.status === "pending");
|
|
104
|
+
if (findings.length === 0)
|
|
105
|
+
return "";
|
|
106
|
+
const lines = [
|
|
107
|
+
"## Blocking Rework Findings (non-optional)",
|
|
108
|
+
"",
|
|
109
|
+
"This task has structured blocking rework findings. Address every finding before calling `gsd_task_complete`. Include `reworkResolution` entries with each `findingId`, `status: \"resolved\"`, and concrete evidence. If deferring a finding, use `status: \"deferred-with-override\"` with concrete evidence and `decisionRef`.",
|
|
110
|
+
"",
|
|
111
|
+
];
|
|
112
|
+
for (const finding of findings) {
|
|
113
|
+
lines.push(`### ${finding.finding_id} (${finding.severity})`);
|
|
114
|
+
lines.push(`- Status: ${finding.status}`);
|
|
115
|
+
lines.push(`- Finding: ${finding.description}`);
|
|
116
|
+
lines.push(`- Required fix: ${finding.required_fix}`);
|
|
117
|
+
if (finding.verification_commands.length > 0) {
|
|
118
|
+
lines.push("- Required verification:");
|
|
119
|
+
for (const command of finding.verification_commands) {
|
|
120
|
+
lines.push(` - \`${command}\``);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
lines.push("");
|
|
124
|
+
}
|
|
125
|
+
return lines.join("\n").trim();
|
|
126
|
+
}
|
|
79
127
|
function formatProjectClassificationForPlanning(classification) {
|
|
80
128
|
const sampleFiles = classification.contentFiles.slice(0, 8);
|
|
81
129
|
const sample = sampleFiles.length > 0 ? sampleFiles.map((file) => `\`${file}\``).join(", ") : "(none)";
|
|
@@ -174,7 +222,7 @@ function formatCloseoutReviewInstructions(validationContent, validationRel, curr
|
|
|
174
222
|
`No passing validation artifact was found at \`${validationRel}\`. Use the full closeout review path before completion.`,
|
|
175
223
|
].join("\n");
|
|
176
224
|
}
|
|
177
|
-
function capPreamble(preamble) {
|
|
225
|
+
export function capPreamble(preamble) {
|
|
178
226
|
// Cap inlined context at min(static ceiling, scaled inline budget).
|
|
179
227
|
// The ceiling bounds repeated auto prompt payloads; the scaled
|
|
180
228
|
// budget tightens the cap for small-window users whose true safe limit is
|
|
@@ -184,6 +232,35 @@ function capPreamble(preamble) {
|
|
|
184
232
|
return preamble;
|
|
185
233
|
return truncateAtSectionBoundary(preamble, budget).content;
|
|
186
234
|
}
|
|
235
|
+
/**
|
|
236
|
+
* Cap the execute-task inline blocks against one shared budget in priority
|
|
237
|
+
* order. Unlike `capPreamble` (single concatenated preamble), execute-task
|
|
238
|
+
* feeds these blocks into separate, non-contiguous template placeholders, so
|
|
239
|
+
* they can't be joined and re-split — the budget is spent block-by-block.
|
|
240
|
+
*
|
|
241
|
+
* The task plan is the authoritative execution contract: it is never truncated
|
|
242
|
+
* here (it consumes budget first, whole). Remaining budget flows to the slice
|
|
243
|
+
* excerpt, then templates, each truncated at section boundaries so the lowest-
|
|
244
|
+
* priority context drops whole trailing sections first. When the task plan
|
|
245
|
+
* alone meets or exceeds the budget, the trailing blocks are dropped rather
|
|
246
|
+
* than the task plan being cut.
|
|
247
|
+
*/
|
|
248
|
+
function capExecuteTaskInlineBlocks(taskPlan, slicePlan, templates, budgetChars) {
|
|
249
|
+
let remaining = budgetChars - taskPlan.length;
|
|
250
|
+
if (remaining <= 0) {
|
|
251
|
+
return { taskPlan, slicePlan: "", templates: "" };
|
|
252
|
+
}
|
|
253
|
+
const cappedSlice = slicePlan.length <= remaining
|
|
254
|
+
? slicePlan
|
|
255
|
+
: truncateAtSectionBoundary(slicePlan, remaining).content;
|
|
256
|
+
remaining -= cappedSlice.length;
|
|
257
|
+
const cappedTemplates = remaining <= 0
|
|
258
|
+
? ""
|
|
259
|
+
: templates.length <= remaining
|
|
260
|
+
? templates
|
|
261
|
+
: truncateAtSectionBoundary(templates, remaining).content;
|
|
262
|
+
return { taskPlan, slicePlan: cappedSlice, templates: cappedTemplates };
|
|
263
|
+
}
|
|
187
264
|
function trackPromptContext(entries, key, mode, body, reason) {
|
|
188
265
|
entries.push({
|
|
189
266
|
key,
|
|
@@ -227,7 +304,7 @@ function renderContextModeBlockForPrompt(unitType, base, renderMode = "standalon
|
|
|
227
304
|
return `${contextMode}\n\n## Context Snapshot\nSource: \`.gsd/last-snapshot.md\`\n\n${snapshot.trimEnd()}`;
|
|
228
305
|
}
|
|
229
306
|
function prependContextModeToBlock(unitType, base, block, renderMode = "standalone") {
|
|
230
|
-
const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode });
|
|
307
|
+
const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode, basePath: base });
|
|
231
308
|
const contextMode = renderContextModeBlockForPrompt(unitType, base, renderMode);
|
|
232
309
|
const guidance = [toolSurface, contextMode].filter(Boolean).join("\n\n");
|
|
233
310
|
if (!guidance)
|
|
@@ -284,7 +361,7 @@ function formatExecutorConstraints(sessionContextWindow, modelRegistry, sessionP
|
|
|
284
361
|
// so DEFAULT_CONTEXT_WINDOW stays the single source of truth.
|
|
285
362
|
windowTokens = resolveExecutorContextWindow(undefined, undefined, sessionContextWindow, sessionProvider);
|
|
286
363
|
}
|
|
287
|
-
const budgets = computeBudgets(windowTokens);
|
|
364
|
+
const budgets = computeBudgets(windowTokens, sessionProvider);
|
|
288
365
|
const { min, max } = budgets.taskCountRange;
|
|
289
366
|
const execWindowK = Math.round(windowTokens / 1000);
|
|
290
367
|
const perTaskBudgetK = Math.round(budgets.inlineContextBudgetChars / 1000);
|
|
@@ -1219,6 +1296,13 @@ function resolveTaskSummariesLocation(base, mid, sid) {
|
|
|
1219
1296
|
return { dir: tDir, relPrefix: `${sRel}/tasks` };
|
|
1220
1297
|
return { dir: slicePath, relPrefix: sRel };
|
|
1221
1298
|
}
|
|
1299
|
+
function summaryFileBelongsToSlice(fileName, base, mid, sid) {
|
|
1300
|
+
const tid = taskIdFromTaskFileName(fileName, "SUMMARY");
|
|
1301
|
+
if (!tid)
|
|
1302
|
+
return false;
|
|
1303
|
+
const resolved = resolveTaskFile(base, mid, sid, tid, "SUMMARY");
|
|
1304
|
+
return resolved !== null && basename(resolved) === fileName;
|
|
1305
|
+
}
|
|
1222
1306
|
export async function getPriorTaskSummaryPaths(mid, sid, currentTid, base) {
|
|
1223
1307
|
const loc = resolveTaskSummariesLocation(base, mid, sid);
|
|
1224
1308
|
if (!loc)
|
|
@@ -1227,7 +1311,12 @@ export async function getPriorTaskSummaryPaths(mid, sid, currentTid, base) {
|
|
|
1227
1311
|
const currentNum = parseInt(currentTid.replace(/^T/, ""), 10);
|
|
1228
1312
|
return summaryFiles
|
|
1229
1313
|
.filter(f => {
|
|
1230
|
-
|
|
1314
|
+
if (!summaryFileBelongsToSlice(f, base, mid, sid))
|
|
1315
|
+
return false;
|
|
1316
|
+
const tid = taskIdFromTaskFileName(f, "SUMMARY");
|
|
1317
|
+
if (!tid)
|
|
1318
|
+
return false;
|
|
1319
|
+
const num = parseInt(tid.replace(/^T/, ""), 10);
|
|
1231
1320
|
return num < currentNum;
|
|
1232
1321
|
})
|
|
1233
1322
|
.map(f => `${loc.relPrefix}/${f}`);
|
|
@@ -1254,8 +1343,11 @@ export async function getDependencyTaskSummaryPaths(mid, sid, currentTid, depend
|
|
|
1254
1343
|
const depSet = new Set(dependsOn.map((d) => d.toUpperCase()));
|
|
1255
1344
|
return summaryFiles
|
|
1256
1345
|
.filter((f) => {
|
|
1257
|
-
|
|
1258
|
-
|
|
1346
|
+
if (!summaryFileBelongsToSlice(f, base, mid, sid))
|
|
1347
|
+
return false;
|
|
1348
|
+
const tid = taskIdFromTaskFileName(f, "SUMMARY");
|
|
1349
|
+
if (!tid)
|
|
1350
|
+
return false;
|
|
1259
1351
|
return depSet.has(tid);
|
|
1260
1352
|
})
|
|
1261
1353
|
.map((f) => `${loc.relPrefix}/${f}`);
|
|
@@ -1377,7 +1469,7 @@ export async function buildDiscussMilestonePrompt(mid, midTitle, base, structure
|
|
|
1377
1469
|
if (headless) {
|
|
1378
1470
|
const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
1379
1471
|
const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
|
|
1380
|
-
|
|
1472
|
+
const prompt = loadPrompt("discuss-headless", {
|
|
1381
1473
|
seedContext: roadmapContent ?? "",
|
|
1382
1474
|
inlinedTemplates: contextTemplate,
|
|
1383
1475
|
workingDirectory: base,
|
|
@@ -1386,6 +1478,7 @@ export async function buildDiscussMilestonePrompt(mid, midTitle, base, structure
|
|
|
1386
1478
|
commitInstruction: "Do not commit planning artifacts — .gsd/ is managed externally.",
|
|
1387
1479
|
multiMilestoneCommitInstruction: "Do not commit planning artifacts — .gsd/ is managed externally.",
|
|
1388
1480
|
});
|
|
1481
|
+
return prependLanguageDirectiveForBase(base, prompt);
|
|
1389
1482
|
}
|
|
1390
1483
|
const rawInlinedContext = await buildDiscussMilestoneInlinedContext(mid, base);
|
|
1391
1484
|
const cappedInlinedContext = capPreamble(rawInlinedContext);
|
|
@@ -1412,9 +1505,10 @@ export async function buildDiscussMilestonePrompt(mid, midTitle, base, structure
|
|
|
1412
1505
|
const truncationNote = cappedDraftSeed !== draftSeed
|
|
1413
1506
|
? `\n\n_(Draft seed truncated; read the full draft at \`${draftRelPath}\` if needed.)_`
|
|
1414
1507
|
: "";
|
|
1415
|
-
|
|
1508
|
+
const promptWithDraftSeed = `${promptWithContextMode}\n\n## Prior Discussion (Draft Seed)\n\nThe following draft was captured from a prior multi-milestone discussion. Use it as seed material — the user has already provided this context. Start with a brief reflection on what the draft covers, then probe for any gaps or open questions before writing the full CONTEXT.md.\n\n${cappedDraftSeed}${truncationNote}`;
|
|
1509
|
+
return prependLanguageDirectiveForBase(base, promptWithDraftSeed);
|
|
1416
1510
|
}
|
|
1417
|
-
return promptWithContextMode;
|
|
1511
|
+
return prependLanguageDirectiveForBase(base, promptWithContextMode);
|
|
1418
1512
|
}
|
|
1419
1513
|
/**
|
|
1420
1514
|
* Build a prompt for the workflow-preferences unit type (deep mode).
|
|
@@ -2281,7 +2375,7 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
|
|
|
2281
2375
|
// Compute verification budget for the executor's context window (issue #707)
|
|
2282
2376
|
const prefs = loadEffectiveGSDPreferences();
|
|
2283
2377
|
const contextWindow = resolveExecutorContextWindow(opts.modelRegistry, prefs?.preferences, opts.sessionContextWindow, opts.sessionProvider);
|
|
2284
|
-
const budgets = computeBudgets(contextWindow);
|
|
2378
|
+
const budgets = computeBudgets(contextWindow, opts.sessionProvider);
|
|
2285
2379
|
const verificationBudget = `~${Math.round(budgets.verificationBudgetChars / 1000)}K chars`;
|
|
2286
2380
|
// Truncate carry-forward section when it exceeds 40% of inline context budget.
|
|
2287
2381
|
const carryForwardBudget = Math.floor(budgets.inlineContextBudgetChars * 0.4);
|
|
@@ -2319,6 +2413,14 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
|
|
|
2319
2413
|
catch (reopenErr) {
|
|
2320
2414
|
logWarning("prompt", `reopen reason injection failed: ${reopenErr.message}`);
|
|
2321
2415
|
}
|
|
2416
|
+
const reworkFindingsBlock = renderBlockingReworkFindingsBlock(mid, sid, tid);
|
|
2417
|
+
if (reworkFindingsBlock) {
|
|
2418
|
+
const block = reworkFindingsBlock + "\n\n---\n\n";
|
|
2419
|
+
phaseAnchorSection = phaseAnchorSection
|
|
2420
|
+
? `${block}${phaseAnchorSection}`
|
|
2421
|
+
: block;
|
|
2422
|
+
trackPromptContext(contextTelemetry, "rework-findings", "inline", reworkFindingsBlock);
|
|
2423
|
+
}
|
|
2322
2424
|
// ADR-011 Phase 2: inject any resolved-but-unapplied escalation override
|
|
2323
2425
|
// into this task's prompt. Claim is atomic via DB UPDATE WHERE IS NULL, so
|
|
2324
2426
|
// if a parallel build already injected it, we skip. Feature-gated by
|
|
@@ -2375,10 +2477,19 @@ export async function buildExecuteTaskPrompt(mid, sid, sTitle, tid, tTitle, base
|
|
|
2375
2477
|
}
|
|
2376
2478
|
},
|
|
2377
2479
|
});
|
|
2378
|
-
const
|
|
2379
|
-
const
|
|
2480
|
+
const rawTaskPlanInline = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "task-plan");
|
|
2481
|
+
const rawSlicePlanExcerpt = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "slice-plan");
|
|
2380
2482
|
const contractedCarryForward = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "prior-task-summaries");
|
|
2381
|
-
const
|
|
2483
|
+
const rawContractedTemplates = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "templates");
|
|
2484
|
+
// Cap the static inline blocks against one shared budget so a small-window
|
|
2485
|
+
// executor can't overflow (the sibling builders cap via `capPreamble`;
|
|
2486
|
+
// execute-task's blocks feed separate template slots, so they share a budget
|
|
2487
|
+
// block-by-block). Carry-forward already has its own truncation above.
|
|
2488
|
+
const inlineBudget = Math.min(MAX_PREAMBLE_CHARS, budgets.inlineContextBudgetChars);
|
|
2489
|
+
const { taskPlan: taskPlanInline, slicePlan: slicePlanExcerpt, templates: contractedTemplates } = capExecuteTaskInlineBlocks(rawTaskPlanInline, rawSlicePlanExcerpt, rawContractedTemplates, inlineBudget);
|
|
2490
|
+
const inlineDropped = (rawTaskPlanInline.length + rawSlicePlanExcerpt.length + rawContractedTemplates.length)
|
|
2491
|
+
- (taskPlanInline.length + slicePlanExcerpt.length + contractedTemplates.length);
|
|
2492
|
+
trackPromptContext(contextTelemetry, "inline-cap", inlineDropped > 0 ? "excerpt" : "skipped", null, inlineDropped > 0 ? `dropped ${inlineDropped} chars (budget ${inlineBudget})` : "within budget");
|
|
2382
2493
|
const onDemandResult = renderExecuteTaskOnDemandContext(base, mid, sid, contractedContext.onDemand);
|
|
2383
2494
|
const onDemandContext = onDemandResult.text;
|
|
2384
2495
|
trackPromptContext(contextTelemetry, "slice-research", onDemandContext ? "on-demand" : "skipped", onDemandContext, onDemandContext ? undefined : onDemandResult.skipReason ?? undefined);
|
|
@@ -2463,12 +2574,14 @@ export async function buildCompleteSlicePrompt(mid, midTitle, sid, sTitle, base,
|
|
|
2463
2574
|
trackPromptContext(contextTelemetry, "prior-task-summaries", "skipped", null, "missing tasks dir");
|
|
2464
2575
|
return null;
|
|
2465
2576
|
}
|
|
2466
|
-
const summaryFiles = resolveTaskFiles(loc.dir, "SUMMARY")
|
|
2577
|
+
const summaryFiles = resolveTaskFiles(loc.dir, "SUMMARY")
|
|
2578
|
+
.filter((file) => summaryFileBelongsToSlice(file, base, mid, sid))
|
|
2579
|
+
.sort();
|
|
2467
2580
|
const blocks = [];
|
|
2468
2581
|
for (const file of summaryFiles) {
|
|
2469
2582
|
const absPath = join(loc.dir, file);
|
|
2470
2583
|
const relPath = `${loc.relPrefix}/${file}`;
|
|
2471
|
-
const taskId = file.replace(/-SUMMARY\.md$/i, "");
|
|
2584
|
+
const taskId = taskIdFromTaskFileName(file, "SUMMARY") ?? file.replace(/-SUMMARY\.md$/i, "");
|
|
2472
2585
|
blocks.push(await buildTaskSummaryExcerpt(absPath, relPath, taskId));
|
|
2473
2586
|
}
|
|
2474
2587
|
const body = blocks.length > 0 ? blocks.join("\n\n---\n\n") : null;
|
|
@@ -3038,7 +3151,9 @@ export async function buildReplanSlicePrompt(mid, midTitle, sid, sTitle, base) {
|
|
|
3038
3151
|
let blockerTaskId = "";
|
|
3039
3152
|
const summaryLoc = resolveTaskSummariesLocation(base, mid, sid);
|
|
3040
3153
|
if (summaryLoc) {
|
|
3041
|
-
const summaryFiles = resolveTaskFiles(summaryLoc.dir, "SUMMARY")
|
|
3154
|
+
const summaryFiles = resolveTaskFiles(summaryLoc.dir, "SUMMARY")
|
|
3155
|
+
.filter((file) => summaryFileBelongsToSlice(file, base, mid, sid))
|
|
3156
|
+
.sort();
|
|
3042
3157
|
for (const file of summaryFiles) {
|
|
3043
3158
|
const absPath = join(summaryLoc.dir, file);
|
|
3044
3159
|
const content = await loadFile(absPath);
|
|
@@ -3047,7 +3162,7 @@ export async function buildReplanSlicePrompt(mid, midTitle, sid, sTitle, base) {
|
|
|
3047
3162
|
const summary = parseSummary(content);
|
|
3048
3163
|
const relPath = `${summaryLoc.relPrefix}/${file}`;
|
|
3049
3164
|
if (summary.frontmatter.blocker_discovered) {
|
|
3050
|
-
blockerTaskId = summary.frontmatter.id || file.replace(/-SUMMARY\.md$/i, "");
|
|
3165
|
+
blockerTaskId = summary.frontmatter.id || taskIdFromTaskFileName(file, "SUMMARY") || file.replace(/-SUMMARY\.md$/i, "");
|
|
3051
3166
|
inlined.push(await buildTaskSummaryExcerpt(absPath, relPath, blockerTaskId, { blocker: true }));
|
|
3052
3167
|
}
|
|
3053
3168
|
}
|
|
@@ -17,7 +17,7 @@ import { refreshWorkflowDatabaseFromDisk } from "./db-workspace.js";
|
|
|
17
17
|
import { getErrorMessage } from "./error-utils.js";
|
|
18
18
|
import { logWarning } from "./workflow-logger.js";
|
|
19
19
|
import { isClosedStatus, isInactiveStatus } from "./status-guards.js";
|
|
20
|
-
import { resolveSlicePath,
|
|
20
|
+
import { resolveSlicePath, resolveTaskFile, relMilestoneFile, relSliceFile, clearPathCache, } from "./paths.js";
|
|
21
21
|
import { existsSync, mkdirSync, readFileSync, writeFileSync, } from "node:fs";
|
|
22
22
|
import { dirname } from "node:path";
|
|
23
23
|
import { resolveExpectedArtifactPath, diagnoseExpectedArtifact, } from "./auto-artifact-paths.js";
|
|
@@ -227,10 +227,15 @@ export function writeReactiveExecuteBlocker(unitId, base, reason) {
|
|
|
227
227
|
const slicePath = resolveSlicePath(base, mid, sid);
|
|
228
228
|
if (!slicePath)
|
|
229
229
|
return null;
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
const
|
|
230
|
+
// Resolve each batch task's SUMMARY with slice-qualified paths so flat-phase
|
|
231
|
+
// slices that reuse a task id (e.g. two T03s in one phase) don't collide: a
|
|
232
|
+
// sibling slice's summary must never make this slice's task look complete.
|
|
233
|
+
const hasSummary = (tid) => {
|
|
234
|
+
const summaryPath = resolveTaskFile(base, mid, sid, tid, "SUMMARY");
|
|
235
|
+
return summaryPath !== null && existsSync(summaryPath);
|
|
236
|
+
};
|
|
237
|
+
const summaryPresent = batchIds.filter((tid) => hasSummary(tid));
|
|
238
|
+
const summaryMissing = batchIds.filter((tid) => !hasSummary(tid));
|
|
234
239
|
const completedTaskIds = [];
|
|
235
240
|
const skippedTaskIds = [];
|
|
236
241
|
const unchangedTaskIds = [];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// GSD auto-mode runtime state
|
|
2
2
|
import { AutoSession } from "./auto/session.js";
|
|
3
|
-
import {
|
|
3
|
+
import { markToolEnd as markTrackedToolEnd, markToolStart as markTrackedToolStart, shouldClearToolInvocationErrorAfterSuccess, updateToolInvocationError, } from "./auto-tool-tracking.js";
|
|
4
4
|
// Re-exported as a pure pass-through. Must stay UNGATED (no autoSession.active
|
|
5
5
|
// argument, unlike markToolStart at the bottom of this file) so it is true in
|
|
6
6
|
// foreground where the foreground approval-gate pause consults it.
|
|
@@ -61,13 +61,13 @@ export function markToolEnd(toolCallId) {
|
|
|
61
61
|
export function recordToolInvocationError(toolName, errorMsg) {
|
|
62
62
|
if (!autoSession.active)
|
|
63
63
|
return;
|
|
64
|
-
|
|
65
|
-
autoSession.lastToolInvocationError = `${toolName}: ${errorMsg}`;
|
|
66
|
-
}
|
|
64
|
+
autoSession.lastToolInvocationError = updateToolInvocationError(autoSession.lastToolInvocationError, toolName, errorMsg);
|
|
67
65
|
}
|
|
68
|
-
export function clearToolInvocationError() {
|
|
66
|
+
export function clearToolInvocationError(successfulToolName) {
|
|
69
67
|
if (!autoSession.active)
|
|
70
68
|
return;
|
|
69
|
+
if (!shouldClearToolInvocationErrorAfterSuccess(autoSession.lastToolInvocationError, successfulToolName))
|
|
70
|
+
return;
|
|
71
71
|
autoSession.lastToolInvocationError = null;
|
|
72
72
|
}
|
|
73
73
|
export function getSourceObservationStore() {
|
|
@@ -46,9 +46,10 @@ import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.
|
|
|
46
46
|
import { extractVerdict } from "./verdict-parser.js";
|
|
47
47
|
import { auditOrphanedPreflightStashes } from "./orphan-stash-audit.js";
|
|
48
48
|
import { parseProject } from "./schemas/parsers.js";
|
|
49
|
+
import { LAYOUT_SEGMENTS } from "./layout-policy.js";
|
|
49
50
|
import { debugLog, enableDebug, isDebugEnabled, getDebugLogPath, } from "./debug-logger.js";
|
|
50
51
|
import { logWarning, logError } from "./workflow-logger.js";
|
|
51
|
-
import { existsSync, mkdirSync, readFileSync, rmSync, } from "node:fs";
|
|
52
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, } from "node:fs";
|
|
52
53
|
import { join } from "node:path";
|
|
53
54
|
import { validateDirectory } from "./validate-directory.js";
|
|
54
55
|
import { isCustomProvider, resolveDefaultSessionModel, resolveDynamicRoutingConfig, } from "./preferences-models.js";
|
|
@@ -73,6 +74,30 @@ const MAX_CONSECUTIVE_COMPLETE_BOOTSTRAPS = 2;
|
|
|
73
74
|
export function hasGitIndexLockForTest(basePath) {
|
|
74
75
|
return existsSync(join(basePath, ".git", "index.lock"));
|
|
75
76
|
}
|
|
77
|
+
function isEmptyDirectory(dirPath) {
|
|
78
|
+
try {
|
|
79
|
+
return existsSync(dirPath) && readdirSync(dirPath).length === 0;
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
export function reconcileFlatPhaseBootstrapLayout(basePath) {
|
|
86
|
+
const gsdDir = join(basePath, ".gsd");
|
|
87
|
+
const phasesPath = join(gsdDir, LAYOUT_SEGMENTS.level1);
|
|
88
|
+
const milestonesPath = join(gsdDir, "milestones");
|
|
89
|
+
if (isEmptyDirectory(milestonesPath)) {
|
|
90
|
+
if (!existsSync(phasesPath))
|
|
91
|
+
mkdirSync(phasesPath, { recursive: true });
|
|
92
|
+
rmSync(milestonesPath, { recursive: true, force: true });
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
if (!existsSync(phasesPath) && !existsSync(milestonesPath)) {
|
|
96
|
+
mkdirSync(phasesPath, { recursive: true });
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
76
101
|
export function _shouldAbortBootstrapForUnavailableDbForTest(gsdDbPath, dbAvailable, pathExists = existsSync) {
|
|
77
102
|
return pathExists(gsdDbPath) && !dbAvailable;
|
|
78
103
|
}
|
|
@@ -868,20 +893,15 @@ export async function bootstrapAutoSession(s, ctx, pi, base, verboseMode, reques
|
|
|
868
893
|
ensureGitignore(base, { manageGitignore });
|
|
869
894
|
if (manageGitignore !== false)
|
|
870
895
|
untrackRuntimeFiles(base);
|
|
871
|
-
// Bootstrap
|
|
872
|
-
|
|
873
|
-
// so checking .gsd/ existence would be dead code (#2942).
|
|
874
|
-
const gsdDir = join(base, ".gsd");
|
|
875
|
-
const milestonesPath = join(gsdDir, "milestones");
|
|
876
|
-
if (!existsSync(milestonesPath)) {
|
|
877
|
-
mkdirSync(milestonesPath, { recursive: true });
|
|
896
|
+
// Bootstrap the flat-phase projection root and clean empty legacy scaffolds.
|
|
897
|
+
if (reconcileFlatPhaseBootstrapLayout(base)) {
|
|
878
898
|
try {
|
|
879
899
|
nativeAddAll(base);
|
|
880
900
|
nativeCommit(base, "chore: init gsd");
|
|
881
901
|
}
|
|
882
902
|
catch (err) {
|
|
883
903
|
/* nothing to commit */
|
|
884
|
-
logWarning("engine", `
|
|
904
|
+
logWarning("engine", `layout bootstrap commit failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
885
905
|
}
|
|
886
906
|
}
|
|
887
907
|
{
|