@opengsd/gsd-pi 1.8.1 → 1.9.0-dev.5c1a3ff2
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 +25 -2
- 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-artifact-paths.js +16 -10
- package/dist/resources/extensions/gsd/auto-dispatch.js +74 -19
- package/dist/resources/extensions/gsd/auto-post-unit.js +4 -0
- package/dist/resources/extensions/gsd/auto-prompts.js +125 -18
- package/dist/resources/extensions/gsd/auto-recovery.js +10 -5
- package/dist/resources/extensions/gsd/auto-worktree-cleanup.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree-teardown.js +1 -1
- package/dist/resources/extensions/gsd/auto.js +5 -1
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -4
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +31 -5
- 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/compat/compat-marker.js +19 -2
- 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 +51 -16
- 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 +3 -6
- package/dist/resources/extensions/gsd/flat-phase-migration.js +156 -21
- package/dist/resources/extensions/gsd/git-service.js +19 -7
- package/dist/resources/extensions/gsd/gsd-db.js +187 -45
- package/dist/resources/extensions/gsd/guided-flow.js +38 -13
- package/dist/resources/extensions/gsd/markdown-renderer.js +17 -13
- 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 +55 -11
- 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/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 +27 -13
- package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +13 -3
- package/dist/resources/extensions/gsd/stop-notice.js +15 -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 +6 -0
- package/dist/resources/extensions/mac-tools/index.js +31 -9
- 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 +8 -8
- 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 +8 -8
- package/dist/web/standalone/.next/server/chunks/2842.js +4 -4
- 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 +12 -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/dist/cli.d.ts +5 -0
- package/packages/gsd-cloud/dist/cli.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cli.js +160 -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 +231 -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 +35 -0
- package/packages/gsd-cloud/dist/cloud-runtime.d.ts.map +1 -0
- package/packages/gsd-cloud/dist/cloud-runtime.js +258 -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/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/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 +119 -0
- package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.generated.js +107 -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-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-artifact-paths.ts +16 -9
- package/src/resources/extensions/gsd/auto-dispatch.ts +86 -19
- package/src/resources/extensions/gsd/auto-post-unit.ts +4 -0
- package/src/resources/extensions/gsd/auto-prompts.ts +142 -16
- package/src/resources/extensions/gsd/auto-recovery.ts +10 -8
- package/src/resources/extensions/gsd/auto-worktree-cleanup.ts +4 -0
- package/src/resources/extensions/gsd/auto-worktree-teardown.ts +1 -1
- package/src/resources/extensions/gsd/auto.ts +5 -1
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +92 -4
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +39 -10
- 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/compat/compat-marker.ts +21 -4
- 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 +53 -17
- 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 +3 -5
- package/src/resources/extensions/gsd/flat-phase-migration.ts +160 -19
- package/src/resources/extensions/gsd/git-service.ts +19 -6
- package/src/resources/extensions/gsd/gsd-db.ts +255 -52
- package/src/resources/extensions/gsd/guided-flow.ts +48 -12
- package/src/resources/extensions/gsd/markdown-renderer.ts +25 -21
- 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 +62 -11
- 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/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 +30 -13
- package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +16 -3
- package/src/resources/extensions/gsd/state-reconciliation/types.ts +2 -2
- package/src/resources/extensions/gsd/stop-notice.ts +18 -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-recovery.test.ts +39 -0
- 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/compat-marker.test.ts +104 -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-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/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/external-edit-scoped-import.test.ts +262 -0
- package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +202 -0
- package/src/resources/extensions/gsd/tests/gate-storage.test.ts +29 -0
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +25 -0
- package/src/resources/extensions/gsd/tests/import-slice-milestone-completion-preserve.test.ts +116 -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 +66 -0
- 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/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/stop-notice.test.ts +17 -0
- 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/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/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/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 +12 -0
- 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/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 → 6YWV7VAPg-jqjfPswrKZb}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{UaXRrOYxBpG9QBINKhZkg → 6YWV7VAPg-jqjfPswrKZb}/_ssgManifest.js +0 -0
|
@@ -393,7 +393,8 @@ function resolveArtifactBasePath(
|
|
|
393
393
|
): string {
|
|
394
394
|
if (
|
|
395
395
|
session?.basePath &&
|
|
396
|
-
session.currentMilestoneId
|
|
396
|
+
session.currentMilestoneId &&
|
|
397
|
+
milestoneIdsDispatchCompatible(session.currentMilestoneId, mid) &&
|
|
397
398
|
existsSync(session.basePath)
|
|
398
399
|
) {
|
|
399
400
|
return session.basePath;
|
|
@@ -422,6 +423,28 @@ function normalizeMilestoneScope(value: string | null | undefined): string | nul
|
|
|
422
423
|
return trimmed;
|
|
423
424
|
}
|
|
424
425
|
|
|
426
|
+
function dispatchMilestoneIdentity(value: string | null | undefined): { baseId: string; hasSuffix: boolean } | null {
|
|
427
|
+
const normalized = normalizeMilestoneScope(value);
|
|
428
|
+
const match = normalized?.match(/^(M\d{3})(?:-[a-z0-9]{6})?$/);
|
|
429
|
+
if (!match) return null;
|
|
430
|
+
return { baseId: match[1]!, hasSuffix: normalized !== match[1] };
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
function isBareSuffixedMilestoneAlias(left: string, right: string): boolean {
|
|
434
|
+
const leftId = dispatchMilestoneIdentity(left);
|
|
435
|
+
const rightId = dispatchMilestoneIdentity(right);
|
|
436
|
+
return Boolean(
|
|
437
|
+
leftId &&
|
|
438
|
+
rightId &&
|
|
439
|
+
leftId.baseId === rightId.baseId &&
|
|
440
|
+
leftId.hasSuffix !== rightId.hasSuffix,
|
|
441
|
+
);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
function milestoneIdsDispatchCompatible(left: string, right: string): boolean {
|
|
445
|
+
return left === right || isBareSuffixedMilestoneAlias(left, right);
|
|
446
|
+
}
|
|
447
|
+
|
|
425
448
|
function resolveDispatchMilestoneScope(
|
|
426
449
|
ctx: DispatchContext,
|
|
427
450
|
): { id: string; source: string } | null {
|
|
@@ -439,6 +462,37 @@ function resolveDispatchMilestoneScope(
|
|
|
439
462
|
return null;
|
|
440
463
|
}
|
|
441
464
|
|
|
465
|
+
function resolveEffectiveDispatchMilestoneId(
|
|
466
|
+
ctx: DispatchContext,
|
|
467
|
+
scopedMilestone: { id: string; source: string } | null,
|
|
468
|
+
): string {
|
|
469
|
+
if (scopedMilestone && isBareSuffixedMilestoneAlias(ctx.mid, scopedMilestone.id)) {
|
|
470
|
+
return dispatchMilestoneIdentity(scopedMilestone.id)?.hasSuffix ? scopedMilestone.id : ctx.mid;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
const activeMid = ctx.state.activeMilestone?.id;
|
|
474
|
+
if (activeMid && isBareSuffixedMilestoneAlias(ctx.mid, activeMid)) {
|
|
475
|
+
return dispatchMilestoneIdentity(activeMid)?.hasSuffix ? activeMid : ctx.mid;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
return ctx.mid;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
function withEffectiveDispatchMilestone(ctx: DispatchContext, effectiveMid: string): DispatchContext {
|
|
482
|
+
if (effectiveMid === ctx.mid) return ctx;
|
|
483
|
+
const activeMilestone = ctx.state.activeMilestone;
|
|
484
|
+
const state = activeMilestone && milestoneIdsDispatchCompatible(activeMilestone.id, effectiveMid)
|
|
485
|
+
? {
|
|
486
|
+
...ctx.state,
|
|
487
|
+
activeMilestone: {
|
|
488
|
+
...activeMilestone,
|
|
489
|
+
id: effectiveMid,
|
|
490
|
+
},
|
|
491
|
+
}
|
|
492
|
+
: ctx.state;
|
|
493
|
+
return { ...ctx, mid: effectiveMid, state };
|
|
494
|
+
}
|
|
495
|
+
|
|
442
496
|
function hasMilestonePassedDiscuss(basePath: string, mid: string): boolean {
|
|
443
497
|
if (isDbAvailable()) {
|
|
444
498
|
try {
|
|
@@ -732,14 +786,21 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
732
786
|
// Fire BEFORE the execution-entry phase rules so we redispatch to
|
|
733
787
|
// `discuss-milestone` instead of hitting the plan-v2 gate.
|
|
734
788
|
name: "execution-entry phase (no context) → discuss-milestone",
|
|
735
|
-
match: async ({ state, mid, midTitle, basePath, prefs, structuredQuestionsAvailable }) => {
|
|
789
|
+
match: async ({ state, mid, midTitle, basePath, session, prefs, structuredQuestionsAvailable }) => {
|
|
736
790
|
if (!EXECUTION_ENTRY_PHASES.has(state.phase)) return null;
|
|
737
791
|
if (!MILESTONE_ID_RE.test(mid)) return null;
|
|
738
792
|
if (isRegistryMilestoneComplete(state, mid)) return null;
|
|
739
|
-
|
|
793
|
+
// Resolve discuss/context artifacts against the active session worktree,
|
|
794
|
+
// mirroring the executing rules below. For a suffixed-worktree milestone
|
|
795
|
+
// the CONTEXT and slice plans live under the worktree, not the project
|
|
796
|
+
// root; checking the raw project-root basePath misreads the milestone as
|
|
797
|
+
// "never discussed" and re-dispatches discuss-milestone after task
|
|
798
|
+
// closeout instead of continuing execution (#1317).
|
|
799
|
+
const artifactBasePath = resolveArtifactBasePath(basePath, mid, session);
|
|
800
|
+
if (hasMilestonePassedDiscuss(artifactBasePath, mid)) return null;
|
|
740
801
|
// Align with the plan-v2 gate's lookup semantics: whitespace-only counts
|
|
741
802
|
// as missing, and an auto worktree may fall back to GSD_PROJECT_ROOT.
|
|
742
|
-
if (hasFinalizedMilestoneContext(
|
|
803
|
+
if (hasFinalizedMilestoneContext(artifactBasePath, mid)) return null;
|
|
743
804
|
// H6 fix (#4973): non-deep auto-mode has no human to answer the
|
|
744
805
|
// depth-verification question, so pre-marking avoids a write-gate
|
|
745
806
|
// deadlock. Deep planning is still user-driven even inside auto-mode,
|
|
@@ -1095,10 +1156,13 @@ export const DISPATCH_RULES: DispatchRule[] = [
|
|
|
1095
1156
|
},
|
|
1096
1157
|
{
|
|
1097
1158
|
name: "pre-planning (no context) → discuss-milestone",
|
|
1098
|
-
match: async ({ state, mid, midTitle, basePath, prefs, structuredQuestionsAvailable }) => {
|
|
1159
|
+
match: async ({ state, mid, midTitle, basePath, prefs, session, structuredQuestionsAvailable }) => {
|
|
1099
1160
|
if (state.phase !== "pre-planning") return null;
|
|
1100
1161
|
if (isRegistryMilestoneComplete(state, mid)) return null;
|
|
1101
|
-
const
|
|
1162
|
+
const contextBasePath = resolveWorktreeProjectRoot(basePath, session?.originalBasePath);
|
|
1163
|
+
const contextFile =
|
|
1164
|
+
resolveMilestoneFile(basePath, mid, "CONTEXT") ??
|
|
1165
|
+
(contextBasePath !== basePath ? resolveMilestoneFile(contextBasePath, mid, "CONTEXT") : null);
|
|
1102
1166
|
const hasContext = !!(contextFile && (await loadFile(contextFile)));
|
|
1103
1167
|
if (hasContext) return null; // fall through to next rule
|
|
1104
1168
|
if (prefs?.planning_depth === "deep") return null;
|
|
@@ -1908,36 +1972,39 @@ function applyLanguageDirectiveToDispatch(
|
|
|
1908
1972
|
export async function resolveDispatch(
|
|
1909
1973
|
ctx: DispatchContext,
|
|
1910
1974
|
): Promise<DispatchAction> {
|
|
1911
|
-
|
|
1912
|
-
|
|
1975
|
+
const scopedMilestone = resolveDispatchMilestoneScope(ctx);
|
|
1976
|
+
const effectiveMid = resolveEffectiveDispatchMilestoneId(ctx, scopedMilestone);
|
|
1977
|
+
const dispatchCtx = withEffectiveDispatchMilestone(ctx, effectiveMid);
|
|
1978
|
+
|
|
1979
|
+
if (dispatchCtx.mid && isDbAvailable()) {
|
|
1980
|
+
const milestone = getMilestone(dispatchCtx.mid);
|
|
1913
1981
|
if (milestone && isClosedStatus(milestone.status)) {
|
|
1914
1982
|
return {
|
|
1915
1983
|
action: "stop",
|
|
1916
1984
|
reason:
|
|
1917
|
-
`Milestone ${
|
|
1985
|
+
`Milestone ${dispatchCtx.mid} is closed (status: ${milestone.status}); auto-mode will not reopen or recover it implicitly. ` +
|
|
1918
1986
|
"Use an explicit reopen command before planning or executing more work for this milestone.",
|
|
1919
1987
|
level: "warning",
|
|
1920
1988
|
};
|
|
1921
1989
|
}
|
|
1922
1990
|
}
|
|
1923
1991
|
|
|
1924
|
-
const activeMid =
|
|
1925
|
-
if (activeMid &&
|
|
1992
|
+
const activeMid = dispatchCtx.state.activeMilestone?.id;
|
|
1993
|
+
if (activeMid && !milestoneIdsDispatchCompatible(dispatchCtx.mid, activeMid)) {
|
|
1926
1994
|
return {
|
|
1927
1995
|
action: "stop",
|
|
1928
1996
|
reason:
|
|
1929
|
-
`Dispatch milestone mismatch: context mid "${
|
|
1997
|
+
`Dispatch milestone mismatch: context mid "${dispatchCtx.mid}" does not match active milestone "${activeMid}". ` +
|
|
1930
1998
|
"This usually means a project-level deep setup pseudo-id leaked into milestone dispatch; rerun /gsd auto after setup state is reconciled.",
|
|
1931
1999
|
level: "warning",
|
|
1932
2000
|
};
|
|
1933
2001
|
}
|
|
1934
2002
|
|
|
1935
|
-
|
|
1936
|
-
if (scopedMilestone && ctx.mid !== scopedMilestone.id) {
|
|
2003
|
+
if (scopedMilestone && !milestoneIdsDispatchCompatible(dispatchCtx.mid, scopedMilestone.id)) {
|
|
1937
2004
|
return {
|
|
1938
2005
|
action: "stop",
|
|
1939
2006
|
reason:
|
|
1940
|
-
`Dispatch milestone mismatch: context mid "${
|
|
2007
|
+
`Dispatch milestone mismatch: context mid "${dispatchCtx.mid}" does not match ${scopedMilestone.source} "${scopedMilestone.id}". ` +
|
|
1941
2008
|
"The active worktree/session and derived project state disagree; recover, park, or discard the stranded milestone before continuing.",
|
|
1942
2009
|
level: "warning",
|
|
1943
2010
|
};
|
|
@@ -1946,10 +2013,10 @@ export async function resolveDispatch(
|
|
|
1946
2013
|
// Delegate to registry when available
|
|
1947
2014
|
try {
|
|
1948
2015
|
const registry = getRegistry();
|
|
1949
|
-
const action = annotateBackgroundable(await registry.evaluateDispatch(
|
|
2016
|
+
const action = annotateBackgroundable(await registry.evaluateDispatch(dispatchCtx));
|
|
1950
2017
|
if (
|
|
1951
2018
|
action.action === "dispatch" &&
|
|
1952
|
-
|
|
2019
|
+
dispatchCtx.session?.exhaustedVerificationUnits?.has(`${action.unitType}:${action.unitId}`)
|
|
1953
2020
|
) {
|
|
1954
2021
|
return {
|
|
1955
2022
|
action: "stop",
|
|
@@ -1964,13 +2031,13 @@ export async function resolveDispatch(
|
|
|
1964
2031
|
}
|
|
1965
2032
|
|
|
1966
2033
|
for (const rule of DISPATCH_RULES) {
|
|
1967
|
-
const result = await rule.match(
|
|
2034
|
+
const result = await rule.match(dispatchCtx);
|
|
1968
2035
|
if (result) {
|
|
1969
2036
|
if (result.action !== "skip") result.matchedRule = rule.name;
|
|
1970
2037
|
const action = annotateBackgroundable(result);
|
|
1971
2038
|
if (
|
|
1972
2039
|
action.action === "dispatch" &&
|
|
1973
|
-
|
|
2040
|
+
dispatchCtx.session?.exhaustedVerificationUnits?.has(`${action.unitType}:${action.unitId}`)
|
|
1974
2041
|
) {
|
|
1975
2042
|
return {
|
|
1976
2043
|
action: "stop",
|
|
@@ -1698,6 +1698,10 @@ export async function postUnitPreVerification(pctx: PostUnitContext, opts?: PreV
|
|
|
1698
1698
|
`Safety: task ${sTid} claimed passing verification that failed in recorded execution`,
|
|
1699
1699
|
"error",
|
|
1700
1700
|
);
|
|
1701
|
+
const gitActionResult = await runCloseoutGitAction(pctx, s.currentUnit);
|
|
1702
|
+
if (gitActionResult === "dispatched") {
|
|
1703
|
+
return "dispatched";
|
|
1704
|
+
}
|
|
1701
1705
|
await pauseAuto(ctx, pi);
|
|
1702
1706
|
return "dispatched";
|
|
1703
1707
|
}
|
|
@@ -16,6 +16,7 @@ import { loadPrompt, inlineTemplate } from "./prompt-loader.js";
|
|
|
16
16
|
import {
|
|
17
17
|
resolveMilestoneFile, resolveSliceFile, resolveSlicePath,
|
|
18
18
|
resolveTasksDir, resolveTaskFiles, resolveTaskFile,
|
|
19
|
+
taskIdFromTaskFileName,
|
|
19
20
|
relMilestoneFile, relSliceFile, relSlicePath, relMilestonePath,
|
|
20
21
|
relTaskFile, resolveGsdRootFile, relGsdRootFile, resolveRuntimeFile,
|
|
21
22
|
} from "./paths.js";
|
|
@@ -28,7 +29,8 @@ import type { GSDPreferences } from "./preferences.js";
|
|
|
28
29
|
import { join, basename, relative, sep } from "node:path";
|
|
29
30
|
import { existsSync } from "node:fs";
|
|
30
31
|
import { computeBudgets, resolveExecutorContextWindow, truncateAtSectionBoundary, type MinimalModelRegistry } from "./context-budget.js";
|
|
31
|
-
import {
|
|
32
|
+
import type { TokenProvider } from "./token-counter.js";
|
|
33
|
+
import { getBlockingReworkFindingsForTask, getGateResults, getPendingGates, getPendingGatesForTurn } from "./gsd-db.js";
|
|
32
34
|
import {
|
|
33
35
|
GATE_REGISTRY,
|
|
34
36
|
assertGateCoverage,
|
|
@@ -91,13 +93,29 @@ function resolvePromptBudgets(): ReturnType<typeof computeBudgets> {
|
|
|
91
93
|
const prefs = loadEffectiveGSDPreferences();
|
|
92
94
|
const sessionWindow = prefs?.preferences.context_window_override;
|
|
93
95
|
const windowTokens = resolveExecutorContextWindow(undefined, prefs?.preferences, sessionWindow);
|
|
94
|
-
return computeBudgets(windowTokens);
|
|
96
|
+
return computeBudgets(windowTokens, resolveExecutionProvider(prefs?.preferences));
|
|
95
97
|
} catch (e) {
|
|
96
98
|
logWarning("prompt", `resolvePromptBudgets failed: ${(e as Error).message}`);
|
|
97
99
|
return computeBudgets(200_000);
|
|
98
100
|
}
|
|
99
101
|
}
|
|
100
102
|
|
|
103
|
+
/**
|
|
104
|
+
* Best-effort provider for the chars/token ratio: the executor's configured
|
|
105
|
+
* model profile is the only provider source reachable here (the runtime
|
|
106
|
+
* `sessionProvider` that reaches `formatExecutorConstraints` isn't threaded to
|
|
107
|
+
* `capPreamble`/summary callers). Undefined when no explicit provider is set —
|
|
108
|
+
* `computeBudgets` then uses the 4.0 default, i.e. today's behavior.
|
|
109
|
+
*/
|
|
110
|
+
function resolveExecutionProvider(prefs?: { models?: { execution?: unknown } }): TokenProvider | undefined {
|
|
111
|
+
const exec = prefs?.models?.execution;
|
|
112
|
+
if (exec && typeof exec === "object" && "provider" in exec) {
|
|
113
|
+
const provider = (exec as { provider?: unknown }).provider;
|
|
114
|
+
if (typeof provider === "string" && provider) return provider as TokenProvider;
|
|
115
|
+
}
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
|
|
101
119
|
/**
|
|
102
120
|
* Character budget for dependency/prior slice summaries injected into dispatch
|
|
103
121
|
* prompts. Scales with the executor's configured context window (issue #4435).
|
|
@@ -106,6 +124,34 @@ function resolveSummaryBudgetChars(): number {
|
|
|
106
124
|
return resolvePromptBudgets().summaryBudgetChars;
|
|
107
125
|
}
|
|
108
126
|
|
|
127
|
+
|
|
128
|
+
function renderBlockingReworkFindingsBlock(mid: string, sid: string, tid: string): string {
|
|
129
|
+
const findings = getBlockingReworkFindingsForTask(mid, sid, tid)
|
|
130
|
+
.filter((finding) => finding.status === "pending");
|
|
131
|
+
if (findings.length === 0) return "";
|
|
132
|
+
|
|
133
|
+
const lines = [
|
|
134
|
+
"## Blocking Rework Findings (non-optional)",
|
|
135
|
+
"",
|
|
136
|
+
"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`.",
|
|
137
|
+
"",
|
|
138
|
+
];
|
|
139
|
+
for (const finding of findings) {
|
|
140
|
+
lines.push(`### ${finding.finding_id} (${finding.severity})`);
|
|
141
|
+
lines.push(`- Status: ${finding.status}`);
|
|
142
|
+
lines.push(`- Finding: ${finding.description}`);
|
|
143
|
+
lines.push(`- Required fix: ${finding.required_fix}`);
|
|
144
|
+
if (finding.verification_commands.length > 0) {
|
|
145
|
+
lines.push("- Required verification:");
|
|
146
|
+
for (const command of finding.verification_commands) {
|
|
147
|
+
lines.push(` - \`${command}\``);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
lines.push("");
|
|
151
|
+
}
|
|
152
|
+
return lines.join("\n").trim();
|
|
153
|
+
}
|
|
154
|
+
|
|
109
155
|
function formatProjectClassificationForPlanning(classification: ProjectClassification): string {
|
|
110
156
|
const sampleFiles = classification.contentFiles.slice(0, 8);
|
|
111
157
|
const sample = sampleFiles.length > 0 ? sampleFiles.map((file) => `\`${file}\``).join(", ") : "(none)";
|
|
@@ -208,7 +254,7 @@ function formatCloseoutReviewInstructions(validationContent: string | null, vali
|
|
|
208
254
|
].join("\n");
|
|
209
255
|
}
|
|
210
256
|
|
|
211
|
-
function capPreamble(preamble: string): string {
|
|
257
|
+
export function capPreamble(preamble: string): string {
|
|
212
258
|
// Cap inlined context at min(static ceiling, scaled inline budget).
|
|
213
259
|
// The ceiling bounds repeated auto prompt payloads; the scaled
|
|
214
260
|
// budget tightens the cap for small-window users whose true safe limit is
|
|
@@ -218,6 +264,41 @@ function capPreamble(preamble: string): string {
|
|
|
218
264
|
return truncateAtSectionBoundary(preamble, budget).content;
|
|
219
265
|
}
|
|
220
266
|
|
|
267
|
+
/**
|
|
268
|
+
* Cap the execute-task inline blocks against one shared budget in priority
|
|
269
|
+
* order. Unlike `capPreamble` (single concatenated preamble), execute-task
|
|
270
|
+
* feeds these blocks into separate, non-contiguous template placeholders, so
|
|
271
|
+
* they can't be joined and re-split — the budget is spent block-by-block.
|
|
272
|
+
*
|
|
273
|
+
* The task plan is the authoritative execution contract: it is never truncated
|
|
274
|
+
* here (it consumes budget first, whole). Remaining budget flows to the slice
|
|
275
|
+
* excerpt, then templates, each truncated at section boundaries so the lowest-
|
|
276
|
+
* priority context drops whole trailing sections first. When the task plan
|
|
277
|
+
* alone meets or exceeds the budget, the trailing blocks are dropped rather
|
|
278
|
+
* than the task plan being cut.
|
|
279
|
+
*/
|
|
280
|
+
function capExecuteTaskInlineBlocks(
|
|
281
|
+
taskPlan: string,
|
|
282
|
+
slicePlan: string,
|
|
283
|
+
templates: string,
|
|
284
|
+
budgetChars: number,
|
|
285
|
+
): { taskPlan: string; slicePlan: string; templates: string } {
|
|
286
|
+
let remaining = budgetChars - taskPlan.length;
|
|
287
|
+
if (remaining <= 0) {
|
|
288
|
+
return { taskPlan, slicePlan: "", templates: "" };
|
|
289
|
+
}
|
|
290
|
+
const cappedSlice = slicePlan.length <= remaining
|
|
291
|
+
? slicePlan
|
|
292
|
+
: truncateAtSectionBoundary(slicePlan, remaining).content;
|
|
293
|
+
remaining -= cappedSlice.length;
|
|
294
|
+
const cappedTemplates = remaining <= 0
|
|
295
|
+
? ""
|
|
296
|
+
: templates.length <= remaining
|
|
297
|
+
? templates
|
|
298
|
+
: truncateAtSectionBoundary(templates, remaining).content;
|
|
299
|
+
return { taskPlan, slicePlan: cappedSlice, templates: cappedTemplates };
|
|
300
|
+
}
|
|
301
|
+
|
|
221
302
|
type PromptContextMode = "inline" | "excerpt" | "on-demand" | "skipped";
|
|
222
303
|
|
|
223
304
|
interface PromptContextTelemetryEntry {
|
|
@@ -296,7 +377,7 @@ function prependContextModeToBlock(
|
|
|
296
377
|
block: string,
|
|
297
378
|
renderMode: ContextModeRenderMode = "standalone",
|
|
298
379
|
): string {
|
|
299
|
-
const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode });
|
|
380
|
+
const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode, basePath: base });
|
|
300
381
|
const contextMode = renderContextModeBlockForPrompt(unitType, base, renderMode);
|
|
301
382
|
const guidance = [toolSurface, contextMode].filter(Boolean).join("\n\n");
|
|
302
383
|
if (!guidance) return block;
|
|
@@ -377,7 +458,7 @@ function formatExecutorConstraints(
|
|
|
377
458
|
// so DEFAULT_CONTEXT_WINDOW stays the single source of truth.
|
|
378
459
|
windowTokens = resolveExecutorContextWindow(undefined, undefined, sessionContextWindow, sessionProvider);
|
|
379
460
|
}
|
|
380
|
-
const budgets = computeBudgets(windowTokens);
|
|
461
|
+
const budgets = computeBudgets(windowTokens, sessionProvider as TokenProvider | undefined);
|
|
381
462
|
const { min, max } = budgets.taskCountRange;
|
|
382
463
|
const execWindowK = Math.round(windowTokens / 1000);
|
|
383
464
|
const perTaskBudgetK = Math.round(budgets.inlineContextBudgetChars / 1000);
|
|
@@ -1403,6 +1484,18 @@ function resolveTaskSummariesLocation(
|
|
|
1403
1484
|
return { dir: slicePath, relPrefix: sRel };
|
|
1404
1485
|
}
|
|
1405
1486
|
|
|
1487
|
+
function summaryFileBelongsToSlice(
|
|
1488
|
+
fileName: string,
|
|
1489
|
+
base: string,
|
|
1490
|
+
mid: string,
|
|
1491
|
+
sid: string,
|
|
1492
|
+
): boolean {
|
|
1493
|
+
const tid = taskIdFromTaskFileName(fileName, "SUMMARY");
|
|
1494
|
+
if (!tid) return false;
|
|
1495
|
+
const resolved = resolveTaskFile(base, mid, sid, tid, "SUMMARY");
|
|
1496
|
+
return resolved !== null && basename(resolved) === fileName;
|
|
1497
|
+
}
|
|
1498
|
+
|
|
1406
1499
|
export async function getPriorTaskSummaryPaths(
|
|
1407
1500
|
mid: string, sid: string, currentTid: string, base: string,
|
|
1408
1501
|
): Promise<string[]> {
|
|
@@ -1414,7 +1507,10 @@ export async function getPriorTaskSummaryPaths(
|
|
|
1414
1507
|
|
|
1415
1508
|
return summaryFiles
|
|
1416
1509
|
.filter(f => {
|
|
1417
|
-
|
|
1510
|
+
if (!summaryFileBelongsToSlice(f, base, mid, sid)) return false;
|
|
1511
|
+
const tid = taskIdFromTaskFileName(f, "SUMMARY");
|
|
1512
|
+
if (!tid) return false;
|
|
1513
|
+
const num = parseInt(tid.replace(/^T/, ""), 10);
|
|
1418
1514
|
return num < currentNum;
|
|
1419
1515
|
})
|
|
1420
1516
|
.map(f => `${loc.relPrefix}/${f}`);
|
|
@@ -1447,8 +1543,9 @@ export async function getDependencyTaskSummaryPaths(
|
|
|
1447
1543
|
|
|
1448
1544
|
return summaryFiles
|
|
1449
1545
|
.filter((f) => {
|
|
1450
|
-
|
|
1451
|
-
const tid = f
|
|
1546
|
+
if (!summaryFileBelongsToSlice(f, base, mid, sid)) return false;
|
|
1547
|
+
const tid = taskIdFromTaskFileName(f, "SUMMARY");
|
|
1548
|
+
if (!tid) return false;
|
|
1452
1549
|
return depSet.has(tid);
|
|
1453
1550
|
})
|
|
1454
1551
|
.map((f) => `${loc.relPrefix}/${f}`);
|
|
@@ -2697,7 +2794,7 @@ export async function buildExecuteTaskPrompt(
|
|
|
2697
2794
|
// Compute verification budget for the executor's context window (issue #707)
|
|
2698
2795
|
const prefs = loadEffectiveGSDPreferences();
|
|
2699
2796
|
const contextWindow = resolveExecutorContextWindow(opts.modelRegistry, prefs?.preferences, opts.sessionContextWindow, opts.sessionProvider);
|
|
2700
|
-
const budgets = computeBudgets(contextWindow);
|
|
2797
|
+
const budgets = computeBudgets(contextWindow, opts.sessionProvider as TokenProvider | undefined);
|
|
2701
2798
|
const verificationBudget = `~${Math.round(budgets.verificationBudgetChars / 1000)}K chars`;
|
|
2702
2799
|
|
|
2703
2800
|
// Truncate carry-forward section when it exceeds 40% of inline context budget.
|
|
@@ -2745,6 +2842,15 @@ export async function buildExecuteTaskPrompt(
|
|
|
2745
2842
|
logWarning("prompt", `reopen reason injection failed: ${(reopenErr as Error).message}`);
|
|
2746
2843
|
}
|
|
2747
2844
|
|
|
2845
|
+
const reworkFindingsBlock = renderBlockingReworkFindingsBlock(mid, sid, tid);
|
|
2846
|
+
if (reworkFindingsBlock) {
|
|
2847
|
+
const block = reworkFindingsBlock + "\n\n---\n\n";
|
|
2848
|
+
phaseAnchorSection = phaseAnchorSection
|
|
2849
|
+
? `${block}${phaseAnchorSection}`
|
|
2850
|
+
: block;
|
|
2851
|
+
trackPromptContext(contextTelemetry, "rework-findings", "inline", reworkFindingsBlock);
|
|
2852
|
+
}
|
|
2853
|
+
|
|
2748
2854
|
// ADR-011 Phase 2: inject any resolved-but-unapplied escalation override
|
|
2749
2855
|
// into this task's prompt. Claim is atomic via DB UPDATE WHERE IS NULL, so
|
|
2750
2856
|
// if a parallel build already injected it, we skip. Feature-gated by
|
|
@@ -2805,10 +2911,26 @@ export async function buildExecuteTaskPrompt(
|
|
|
2805
2911
|
}
|
|
2806
2912
|
},
|
|
2807
2913
|
});
|
|
2808
|
-
const
|
|
2809
|
-
const
|
|
2914
|
+
const rawTaskPlanInline = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "task-plan");
|
|
2915
|
+
const rawSlicePlanExcerpt = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "slice-plan");
|
|
2810
2916
|
const contractedCarryForward = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "prior-task-summaries");
|
|
2811
|
-
const
|
|
2917
|
+
const rawContractedTemplates = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "templates");
|
|
2918
|
+
// Cap the static inline blocks against one shared budget so a small-window
|
|
2919
|
+
// executor can't overflow (the sibling builders cap via `capPreamble`;
|
|
2920
|
+
// execute-task's blocks feed separate template slots, so they share a budget
|
|
2921
|
+
// block-by-block). Carry-forward already has its own truncation above.
|
|
2922
|
+
const inlineBudget = Math.min(MAX_PREAMBLE_CHARS, budgets.inlineContextBudgetChars);
|
|
2923
|
+
const { taskPlan: taskPlanInline, slicePlan: slicePlanExcerpt, templates: contractedTemplates } =
|
|
2924
|
+
capExecuteTaskInlineBlocks(rawTaskPlanInline, rawSlicePlanExcerpt, rawContractedTemplates, inlineBudget);
|
|
2925
|
+
const inlineDropped = (rawTaskPlanInline.length + rawSlicePlanExcerpt.length + rawContractedTemplates.length)
|
|
2926
|
+
- (taskPlanInline.length + slicePlanExcerpt.length + contractedTemplates.length);
|
|
2927
|
+
trackPromptContext(
|
|
2928
|
+
contextTelemetry,
|
|
2929
|
+
"inline-cap",
|
|
2930
|
+
inlineDropped > 0 ? "excerpt" : "skipped",
|
|
2931
|
+
null,
|
|
2932
|
+
inlineDropped > 0 ? `dropped ${inlineDropped} chars (budget ${inlineBudget})` : "within budget",
|
|
2933
|
+
);
|
|
2812
2934
|
const onDemandResult = renderExecuteTaskOnDemandContext(base, mid, sid, contractedContext.onDemand);
|
|
2813
2935
|
const onDemandContext = onDemandResult.text;
|
|
2814
2936
|
trackPromptContext(
|
|
@@ -2904,12 +3026,14 @@ export async function buildCompleteSlicePrompt(
|
|
|
2904
3026
|
trackPromptContext(contextTelemetry, "prior-task-summaries", "skipped", null, "missing tasks dir");
|
|
2905
3027
|
return null;
|
|
2906
3028
|
}
|
|
2907
|
-
const summaryFiles = resolveTaskFiles(loc.dir, "SUMMARY")
|
|
3029
|
+
const summaryFiles = resolveTaskFiles(loc.dir, "SUMMARY")
|
|
3030
|
+
.filter((file) => summaryFileBelongsToSlice(file, base, mid, sid))
|
|
3031
|
+
.sort();
|
|
2908
3032
|
const blocks: string[] = [];
|
|
2909
3033
|
for (const file of summaryFiles) {
|
|
2910
3034
|
const absPath = join(loc.dir, file);
|
|
2911
3035
|
const relPath = `${loc.relPrefix}/${file}`;
|
|
2912
|
-
const taskId = file.replace(/-SUMMARY\.md$/i, "");
|
|
3036
|
+
const taskId = taskIdFromTaskFileName(file, "SUMMARY") ?? file.replace(/-SUMMARY\.md$/i, "");
|
|
2913
3037
|
blocks.push(await buildTaskSummaryExcerpt(absPath, relPath, taskId));
|
|
2914
3038
|
}
|
|
2915
3039
|
const body = blocks.length > 0 ? blocks.join("\n\n---\n\n") : null;
|
|
@@ -3522,7 +3646,9 @@ export async function buildReplanSlicePrompt(
|
|
|
3522
3646
|
let blockerTaskId = "";
|
|
3523
3647
|
const summaryLoc = resolveTaskSummariesLocation(base, mid, sid);
|
|
3524
3648
|
if (summaryLoc) {
|
|
3525
|
-
const summaryFiles = resolveTaskFiles(summaryLoc.dir, "SUMMARY")
|
|
3649
|
+
const summaryFiles = resolveTaskFiles(summaryLoc.dir, "SUMMARY")
|
|
3650
|
+
.filter((file) => summaryFileBelongsToSlice(file, base, mid, sid))
|
|
3651
|
+
.sort();
|
|
3526
3652
|
for (const file of summaryFiles) {
|
|
3527
3653
|
const absPath = join(summaryLoc.dir, file);
|
|
3528
3654
|
const content = await loadFile(absPath);
|
|
@@ -3530,7 +3656,7 @@ export async function buildReplanSlicePrompt(
|
|
|
3530
3656
|
const summary = parseSummary(content);
|
|
3531
3657
|
const relPath = `${summaryLoc.relPrefix}/${file}`;
|
|
3532
3658
|
if (summary.frontmatter.blocker_discovered) {
|
|
3533
|
-
blockerTaskId = summary.frontmatter.id || file.replace(/-SUMMARY\.md$/i, "");
|
|
3659
|
+
blockerTaskId = summary.frontmatter.id || taskIdFromTaskFileName(file, "SUMMARY") || file.replace(/-SUMMARY\.md$/i, "");
|
|
3534
3660
|
inlined.push(await buildTaskSummaryExcerpt(absPath, relPath, blockerTaskId, { blocker: true }));
|
|
3535
3661
|
}
|
|
3536
3662
|
}
|
|
@@ -39,8 +39,7 @@ import { isClosedStatus, isInactiveStatus } from "./status-guards.js";
|
|
|
39
39
|
import {
|
|
40
40
|
resolveSlicePath,
|
|
41
41
|
resolveSliceFile,
|
|
42
|
-
|
|
43
|
-
resolveTaskFiles,
|
|
42
|
+
resolveTaskFile,
|
|
44
43
|
relMilestoneFile,
|
|
45
44
|
relSliceFile,
|
|
46
45
|
buildSliceFileName,
|
|
@@ -324,13 +323,16 @@ export function writeReactiveExecuteBlocker(
|
|
|
324
323
|
const slicePath = resolveSlicePath(base, mid, sid);
|
|
325
324
|
if (!slicePath) return null;
|
|
326
325
|
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
)
|
|
326
|
+
// Resolve each batch task's SUMMARY with slice-qualified paths so flat-phase
|
|
327
|
+
// slices that reuse a task id (e.g. two T03s in one phase) don't collide: a
|
|
328
|
+
// sibling slice's summary must never make this slice's task look complete.
|
|
329
|
+
const hasSummary = (tid: string): boolean => {
|
|
330
|
+
const summaryPath = resolveTaskFile(base, mid, sid, tid, "SUMMARY");
|
|
331
|
+
return summaryPath !== null && existsSync(summaryPath);
|
|
332
|
+
};
|
|
331
333
|
|
|
332
|
-
const summaryPresent = batchIds.filter((tid) =>
|
|
333
|
-
const summaryMissing = batchIds.filter((tid) => !
|
|
334
|
+
const summaryPresent = batchIds.filter((tid) => hasSummary(tid));
|
|
335
|
+
const summaryMissing = batchIds.filter((tid) => !hasSummary(tid));
|
|
334
336
|
const completedTaskIds: string[] = [];
|
|
335
337
|
const skippedTaskIds: string[] = [];
|
|
336
338
|
const unchangedTaskIds: string[] = [];
|
|
@@ -10,6 +10,7 @@ import { existsSync, realpathSync, unlinkSync } from "node:fs";
|
|
|
10
10
|
import { isAbsolute, join, relative } from "node:path";
|
|
11
11
|
|
|
12
12
|
import { gsdRoot } from "./paths.js";
|
|
13
|
+
import { milestoneMetaPath } from "./git-service.js";
|
|
13
14
|
import { logWarning } from "./workflow-logger.js";
|
|
14
15
|
|
|
15
16
|
function isSamePath(a: string, b: string): boolean {
|
|
@@ -93,6 +94,9 @@ export function clearProjectRootStateFiles(
|
|
|
93
94
|
// worth removing on teardown.
|
|
94
95
|
const transientFiles = [
|
|
95
96
|
join(gsdDir, "STATE.md"),
|
|
97
|
+
// Integration-branch META now lives flat at .gsd/<MID>-META.json (ADR-045).
|
|
98
|
+
milestoneMetaPath(basePath, milestoneId),
|
|
99
|
+
// Legacy location — still cleaned for pre-migration trees.
|
|
96
100
|
join(gsdDir, "milestones", milestoneId, `${milestoneId}-META.json`),
|
|
97
101
|
];
|
|
98
102
|
|
|
@@ -65,7 +65,7 @@ export function teardownAutoWorktree(
|
|
|
65
65
|
|
|
66
66
|
// Mirror cleanup steps from mergeMilestoneToMain abort path:
|
|
67
67
|
|
|
68
|
-
// 1. Remove transient state files (STATE.md, auto.lock, {MID}-META.json).
|
|
68
|
+
// 1. Remove transient state files (STATE.md, auto.lock, .gsd/{MID}-META.json).
|
|
69
69
|
// Non-fatal — must not block teardown.
|
|
70
70
|
try {
|
|
71
71
|
clearProjectRootStateFiles(originalBasePath, milestoneId);
|
|
@@ -19,7 +19,7 @@ import type {
|
|
|
19
19
|
SessionMessageEntry,
|
|
20
20
|
} from "@gsd/pi-coding-agent";
|
|
21
21
|
|
|
22
|
-
import { deriveState } from "./state.js";
|
|
22
|
+
import { deriveState, invalidateStateCache } from "./state.js";
|
|
23
23
|
import {
|
|
24
24
|
buildRequirementsBacklogSummaryLines,
|
|
25
25
|
countUnmappedActiveRequirements,
|
|
@@ -443,6 +443,9 @@ function captureMilestoneLockEnv(milestoneId: string | null): void {
|
|
|
443
443
|
} else {
|
|
444
444
|
delete process.env.GSD_MILESTONE_LOCK;
|
|
445
445
|
}
|
|
446
|
+
// The derive cache is keyed on basePath only; GSD_MILESTONE_LOCK changes
|
|
447
|
+
// what deriveState computes, so a lock flip must not serve a cached result.
|
|
448
|
+
invalidateStateCache();
|
|
446
449
|
}
|
|
447
450
|
|
|
448
451
|
function restoreMilestoneLockEnv(): void {
|
|
@@ -457,6 +460,7 @@ function restoreMilestoneLockEnv(): void {
|
|
|
457
460
|
s.previousMilestoneLockEnv = null;
|
|
458
461
|
s.hadMilestoneLockEnv = false;
|
|
459
462
|
s.milestoneLockEnvCaptured = false;
|
|
463
|
+
invalidateStateCache();
|
|
460
464
|
}
|
|
461
465
|
|
|
462
466
|
/**
|