@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
|
@@ -16,10 +16,11 @@ 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";
|
|
22
|
-
import { resolveInlineLevel, loadEffectiveGSDPreferences } from "./preferences.js";
|
|
23
|
+
import { resolveInlineLevel, loadEffectiveGSDPreferences, renderLanguageDirectiveForPrompt } from "./preferences.js";
|
|
23
24
|
import { createRepositoryRegistryFromPreferences } from "./repository-registry.js";
|
|
24
25
|
import { isContextModeEnabled } from "./preferences-types.js";
|
|
25
26
|
import { parseRoadmap } from "./parsers-legacy.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,
|
|
@@ -76,6 +78,14 @@ export { buildSkillActivationBlock, buildSkillDiscoveryVars };
|
|
|
76
78
|
*/
|
|
77
79
|
const MAX_PREAMBLE_CHARS = 20_000;
|
|
78
80
|
|
|
81
|
+
function prependLanguageDirectiveForBase(base: string, prompt: string): string {
|
|
82
|
+
const directive = renderLanguageDirectiveForPrompt(
|
|
83
|
+
loadEffectiveGSDPreferences(base)?.preferences,
|
|
84
|
+
);
|
|
85
|
+
if (!directive || prompt.startsWith(directive)) return prompt;
|
|
86
|
+
return `${directive}\n\n${prompt}`;
|
|
87
|
+
}
|
|
88
|
+
|
|
79
89
|
/**
|
|
80
90
|
* Resolve prompt budgets from the configured executor context window.
|
|
81
91
|
*
|
|
@@ -91,13 +101,29 @@ function resolvePromptBudgets(): ReturnType<typeof computeBudgets> {
|
|
|
91
101
|
const prefs = loadEffectiveGSDPreferences();
|
|
92
102
|
const sessionWindow = prefs?.preferences.context_window_override;
|
|
93
103
|
const windowTokens = resolveExecutorContextWindow(undefined, prefs?.preferences, sessionWindow);
|
|
94
|
-
return computeBudgets(windowTokens);
|
|
104
|
+
return computeBudgets(windowTokens, resolveExecutionProvider(prefs?.preferences));
|
|
95
105
|
} catch (e) {
|
|
96
106
|
logWarning("prompt", `resolvePromptBudgets failed: ${(e as Error).message}`);
|
|
97
107
|
return computeBudgets(200_000);
|
|
98
108
|
}
|
|
99
109
|
}
|
|
100
110
|
|
|
111
|
+
/**
|
|
112
|
+
* Best-effort provider for the chars/token ratio: the executor's configured
|
|
113
|
+
* model profile is the only provider source reachable here (the runtime
|
|
114
|
+
* `sessionProvider` that reaches `formatExecutorConstraints` isn't threaded to
|
|
115
|
+
* `capPreamble`/summary callers). Undefined when no explicit provider is set —
|
|
116
|
+
* `computeBudgets` then uses the 4.0 default, i.e. today's behavior.
|
|
117
|
+
*/
|
|
118
|
+
function resolveExecutionProvider(prefs?: { models?: { execution?: unknown } }): TokenProvider | undefined {
|
|
119
|
+
const exec = prefs?.models?.execution;
|
|
120
|
+
if (exec && typeof exec === "object" && "provider" in exec) {
|
|
121
|
+
const provider = (exec as { provider?: unknown }).provider;
|
|
122
|
+
if (typeof provider === "string" && provider) return provider as TokenProvider;
|
|
123
|
+
}
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
|
|
101
127
|
/**
|
|
102
128
|
* Character budget for dependency/prior slice summaries injected into dispatch
|
|
103
129
|
* prompts. Scales with the executor's configured context window (issue #4435).
|
|
@@ -106,6 +132,34 @@ function resolveSummaryBudgetChars(): number {
|
|
|
106
132
|
return resolvePromptBudgets().summaryBudgetChars;
|
|
107
133
|
}
|
|
108
134
|
|
|
135
|
+
|
|
136
|
+
function renderBlockingReworkFindingsBlock(mid: string, sid: string, tid: string): string {
|
|
137
|
+
const findings = getBlockingReworkFindingsForTask(mid, sid, tid)
|
|
138
|
+
.filter((finding) => finding.status === "pending");
|
|
139
|
+
if (findings.length === 0) return "";
|
|
140
|
+
|
|
141
|
+
const lines = [
|
|
142
|
+
"## Blocking Rework Findings (non-optional)",
|
|
143
|
+
"",
|
|
144
|
+
"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`.",
|
|
145
|
+
"",
|
|
146
|
+
];
|
|
147
|
+
for (const finding of findings) {
|
|
148
|
+
lines.push(`### ${finding.finding_id} (${finding.severity})`);
|
|
149
|
+
lines.push(`- Status: ${finding.status}`);
|
|
150
|
+
lines.push(`- Finding: ${finding.description}`);
|
|
151
|
+
lines.push(`- Required fix: ${finding.required_fix}`);
|
|
152
|
+
if (finding.verification_commands.length > 0) {
|
|
153
|
+
lines.push("- Required verification:");
|
|
154
|
+
for (const command of finding.verification_commands) {
|
|
155
|
+
lines.push(` - \`${command}\``);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
lines.push("");
|
|
159
|
+
}
|
|
160
|
+
return lines.join("\n").trim();
|
|
161
|
+
}
|
|
162
|
+
|
|
109
163
|
function formatProjectClassificationForPlanning(classification: ProjectClassification): string {
|
|
110
164
|
const sampleFiles = classification.contentFiles.slice(0, 8);
|
|
111
165
|
const sample = sampleFiles.length > 0 ? sampleFiles.map((file) => `\`${file}\``).join(", ") : "(none)";
|
|
@@ -208,7 +262,7 @@ function formatCloseoutReviewInstructions(validationContent: string | null, vali
|
|
|
208
262
|
].join("\n");
|
|
209
263
|
}
|
|
210
264
|
|
|
211
|
-
function capPreamble(preamble: string): string {
|
|
265
|
+
export function capPreamble(preamble: string): string {
|
|
212
266
|
// Cap inlined context at min(static ceiling, scaled inline budget).
|
|
213
267
|
// The ceiling bounds repeated auto prompt payloads; the scaled
|
|
214
268
|
// budget tightens the cap for small-window users whose true safe limit is
|
|
@@ -218,6 +272,41 @@ function capPreamble(preamble: string): string {
|
|
|
218
272
|
return truncateAtSectionBoundary(preamble, budget).content;
|
|
219
273
|
}
|
|
220
274
|
|
|
275
|
+
/**
|
|
276
|
+
* Cap the execute-task inline blocks against one shared budget in priority
|
|
277
|
+
* order. Unlike `capPreamble` (single concatenated preamble), execute-task
|
|
278
|
+
* feeds these blocks into separate, non-contiguous template placeholders, so
|
|
279
|
+
* they can't be joined and re-split — the budget is spent block-by-block.
|
|
280
|
+
*
|
|
281
|
+
* The task plan is the authoritative execution contract: it is never truncated
|
|
282
|
+
* here (it consumes budget first, whole). Remaining budget flows to the slice
|
|
283
|
+
* excerpt, then templates, each truncated at section boundaries so the lowest-
|
|
284
|
+
* priority context drops whole trailing sections first. When the task plan
|
|
285
|
+
* alone meets or exceeds the budget, the trailing blocks are dropped rather
|
|
286
|
+
* than the task plan being cut.
|
|
287
|
+
*/
|
|
288
|
+
function capExecuteTaskInlineBlocks(
|
|
289
|
+
taskPlan: string,
|
|
290
|
+
slicePlan: string,
|
|
291
|
+
templates: string,
|
|
292
|
+
budgetChars: number,
|
|
293
|
+
): { taskPlan: string; slicePlan: string; templates: string } {
|
|
294
|
+
let remaining = budgetChars - taskPlan.length;
|
|
295
|
+
if (remaining <= 0) {
|
|
296
|
+
return { taskPlan, slicePlan: "", templates: "" };
|
|
297
|
+
}
|
|
298
|
+
const cappedSlice = slicePlan.length <= remaining
|
|
299
|
+
? slicePlan
|
|
300
|
+
: truncateAtSectionBoundary(slicePlan, remaining).content;
|
|
301
|
+
remaining -= cappedSlice.length;
|
|
302
|
+
const cappedTemplates = remaining <= 0
|
|
303
|
+
? ""
|
|
304
|
+
: templates.length <= remaining
|
|
305
|
+
? templates
|
|
306
|
+
: truncateAtSectionBoundary(templates, remaining).content;
|
|
307
|
+
return { taskPlan, slicePlan: cappedSlice, templates: cappedTemplates };
|
|
308
|
+
}
|
|
309
|
+
|
|
221
310
|
type PromptContextMode = "inline" | "excerpt" | "on-demand" | "skipped";
|
|
222
311
|
|
|
223
312
|
interface PromptContextTelemetryEntry {
|
|
@@ -296,7 +385,7 @@ function prependContextModeToBlock(
|
|
|
296
385
|
block: string,
|
|
297
386
|
renderMode: ContextModeRenderMode = "standalone",
|
|
298
387
|
): string {
|
|
299
|
-
const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode });
|
|
388
|
+
const toolSurface = composeToolSurfaceInstructions(unitType, { renderMode, basePath: base });
|
|
300
389
|
const contextMode = renderContextModeBlockForPrompt(unitType, base, renderMode);
|
|
301
390
|
const guidance = [toolSurface, contextMode].filter(Boolean).join("\n\n");
|
|
302
391
|
if (!guidance) return block;
|
|
@@ -377,7 +466,7 @@ function formatExecutorConstraints(
|
|
|
377
466
|
// so DEFAULT_CONTEXT_WINDOW stays the single source of truth.
|
|
378
467
|
windowTokens = resolveExecutorContextWindow(undefined, undefined, sessionContextWindow, sessionProvider);
|
|
379
468
|
}
|
|
380
|
-
const budgets = computeBudgets(windowTokens);
|
|
469
|
+
const budgets = computeBudgets(windowTokens, sessionProvider as TokenProvider | undefined);
|
|
381
470
|
const { min, max } = budgets.taskCountRange;
|
|
382
471
|
const execWindowK = Math.round(windowTokens / 1000);
|
|
383
472
|
const perTaskBudgetK = Math.round(budgets.inlineContextBudgetChars / 1000);
|
|
@@ -1403,6 +1492,18 @@ function resolveTaskSummariesLocation(
|
|
|
1403
1492
|
return { dir: slicePath, relPrefix: sRel };
|
|
1404
1493
|
}
|
|
1405
1494
|
|
|
1495
|
+
function summaryFileBelongsToSlice(
|
|
1496
|
+
fileName: string,
|
|
1497
|
+
base: string,
|
|
1498
|
+
mid: string,
|
|
1499
|
+
sid: string,
|
|
1500
|
+
): boolean {
|
|
1501
|
+
const tid = taskIdFromTaskFileName(fileName, "SUMMARY");
|
|
1502
|
+
if (!tid) return false;
|
|
1503
|
+
const resolved = resolveTaskFile(base, mid, sid, tid, "SUMMARY");
|
|
1504
|
+
return resolved !== null && basename(resolved) === fileName;
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1406
1507
|
export async function getPriorTaskSummaryPaths(
|
|
1407
1508
|
mid: string, sid: string, currentTid: string, base: string,
|
|
1408
1509
|
): Promise<string[]> {
|
|
@@ -1414,7 +1515,10 @@ export async function getPriorTaskSummaryPaths(
|
|
|
1414
1515
|
|
|
1415
1516
|
return summaryFiles
|
|
1416
1517
|
.filter(f => {
|
|
1417
|
-
|
|
1518
|
+
if (!summaryFileBelongsToSlice(f, base, mid, sid)) return false;
|
|
1519
|
+
const tid = taskIdFromTaskFileName(f, "SUMMARY");
|
|
1520
|
+
if (!tid) return false;
|
|
1521
|
+
const num = parseInt(tid.replace(/^T/, ""), 10);
|
|
1418
1522
|
return num < currentNum;
|
|
1419
1523
|
})
|
|
1420
1524
|
.map(f => `${loc.relPrefix}/${f}`);
|
|
@@ -1447,8 +1551,9 @@ export async function getDependencyTaskSummaryPaths(
|
|
|
1447
1551
|
|
|
1448
1552
|
return summaryFiles
|
|
1449
1553
|
.filter((f) => {
|
|
1450
|
-
|
|
1451
|
-
const tid = f
|
|
1554
|
+
if (!summaryFileBelongsToSlice(f, base, mid, sid)) return false;
|
|
1555
|
+
const tid = taskIdFromTaskFileName(f, "SUMMARY");
|
|
1556
|
+
if (!tid) return false;
|
|
1452
1557
|
return depSet.has(tid);
|
|
1453
1558
|
})
|
|
1454
1559
|
.map((f) => `${loc.relPrefix}/${f}`);
|
|
@@ -1633,7 +1738,7 @@ export async function buildDiscussMilestonePrompt(
|
|
|
1633
1738
|
if (headless) {
|
|
1634
1739
|
const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
1635
1740
|
const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
|
|
1636
|
-
|
|
1741
|
+
const prompt = loadPrompt("discuss-headless", {
|
|
1637
1742
|
seedContext: roadmapContent ?? "",
|
|
1638
1743
|
inlinedTemplates: contextTemplate,
|
|
1639
1744
|
workingDirectory: base,
|
|
@@ -1642,6 +1747,7 @@ export async function buildDiscussMilestonePrompt(
|
|
|
1642
1747
|
commitInstruction: "Do not commit planning artifacts — .gsd/ is managed externally.",
|
|
1643
1748
|
multiMilestoneCommitInstruction: "Do not commit planning artifacts — .gsd/ is managed externally.",
|
|
1644
1749
|
});
|
|
1750
|
+
return prependLanguageDirectiveForBase(base, prompt);
|
|
1645
1751
|
}
|
|
1646
1752
|
|
|
1647
1753
|
const rawInlinedContext = await buildDiscussMilestoneInlinedContext(mid, base);
|
|
@@ -1672,10 +1778,11 @@ export async function buildDiscussMilestonePrompt(
|
|
|
1672
1778
|
const truncationNote = cappedDraftSeed !== draftSeed
|
|
1673
1779
|
? `\n\n_(Draft seed truncated; read the full draft at \`${draftRelPath}\` if needed.)_`
|
|
1674
1780
|
: "";
|
|
1675
|
-
|
|
1781
|
+
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}`;
|
|
1782
|
+
return prependLanguageDirectiveForBase(base, promptWithDraftSeed);
|
|
1676
1783
|
}
|
|
1677
1784
|
|
|
1678
|
-
return promptWithContextMode;
|
|
1785
|
+
return prependLanguageDirectiveForBase(base, promptWithContextMode);
|
|
1679
1786
|
}
|
|
1680
1787
|
|
|
1681
1788
|
/**
|
|
@@ -2697,7 +2804,7 @@ export async function buildExecuteTaskPrompt(
|
|
|
2697
2804
|
// Compute verification budget for the executor's context window (issue #707)
|
|
2698
2805
|
const prefs = loadEffectiveGSDPreferences();
|
|
2699
2806
|
const contextWindow = resolveExecutorContextWindow(opts.modelRegistry, prefs?.preferences, opts.sessionContextWindow, opts.sessionProvider);
|
|
2700
|
-
const budgets = computeBudgets(contextWindow);
|
|
2807
|
+
const budgets = computeBudgets(contextWindow, opts.sessionProvider as TokenProvider | undefined);
|
|
2701
2808
|
const verificationBudget = `~${Math.round(budgets.verificationBudgetChars / 1000)}K chars`;
|
|
2702
2809
|
|
|
2703
2810
|
// Truncate carry-forward section when it exceeds 40% of inline context budget.
|
|
@@ -2745,6 +2852,15 @@ export async function buildExecuteTaskPrompt(
|
|
|
2745
2852
|
logWarning("prompt", `reopen reason injection failed: ${(reopenErr as Error).message}`);
|
|
2746
2853
|
}
|
|
2747
2854
|
|
|
2855
|
+
const reworkFindingsBlock = renderBlockingReworkFindingsBlock(mid, sid, tid);
|
|
2856
|
+
if (reworkFindingsBlock) {
|
|
2857
|
+
const block = reworkFindingsBlock + "\n\n---\n\n";
|
|
2858
|
+
phaseAnchorSection = phaseAnchorSection
|
|
2859
|
+
? `${block}${phaseAnchorSection}`
|
|
2860
|
+
: block;
|
|
2861
|
+
trackPromptContext(contextTelemetry, "rework-findings", "inline", reworkFindingsBlock);
|
|
2862
|
+
}
|
|
2863
|
+
|
|
2748
2864
|
// ADR-011 Phase 2: inject any resolved-but-unapplied escalation override
|
|
2749
2865
|
// into this task's prompt. Claim is atomic via DB UPDATE WHERE IS NULL, so
|
|
2750
2866
|
// if a parallel build already injected it, we skip. Feature-gated by
|
|
@@ -2805,10 +2921,26 @@ export async function buildExecuteTaskPrompt(
|
|
|
2805
2921
|
}
|
|
2806
2922
|
},
|
|
2807
2923
|
});
|
|
2808
|
-
const
|
|
2809
|
-
const
|
|
2924
|
+
const rawTaskPlanInline = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "task-plan");
|
|
2925
|
+
const rawSlicePlanExcerpt = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "slice-plan");
|
|
2810
2926
|
const contractedCarryForward = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "prior-task-summaries");
|
|
2811
|
-
const
|
|
2927
|
+
const rawContractedTemplates = requireComposedArtifactBlock(contractedContext.blocks, "execute-task", "templates");
|
|
2928
|
+
// Cap the static inline blocks against one shared budget so a small-window
|
|
2929
|
+
// executor can't overflow (the sibling builders cap via `capPreamble`;
|
|
2930
|
+
// execute-task's blocks feed separate template slots, so they share a budget
|
|
2931
|
+
// block-by-block). Carry-forward already has its own truncation above.
|
|
2932
|
+
const inlineBudget = Math.min(MAX_PREAMBLE_CHARS, budgets.inlineContextBudgetChars);
|
|
2933
|
+
const { taskPlan: taskPlanInline, slicePlan: slicePlanExcerpt, templates: contractedTemplates } =
|
|
2934
|
+
capExecuteTaskInlineBlocks(rawTaskPlanInline, rawSlicePlanExcerpt, rawContractedTemplates, inlineBudget);
|
|
2935
|
+
const inlineDropped = (rawTaskPlanInline.length + rawSlicePlanExcerpt.length + rawContractedTemplates.length)
|
|
2936
|
+
- (taskPlanInline.length + slicePlanExcerpt.length + contractedTemplates.length);
|
|
2937
|
+
trackPromptContext(
|
|
2938
|
+
contextTelemetry,
|
|
2939
|
+
"inline-cap",
|
|
2940
|
+
inlineDropped > 0 ? "excerpt" : "skipped",
|
|
2941
|
+
null,
|
|
2942
|
+
inlineDropped > 0 ? `dropped ${inlineDropped} chars (budget ${inlineBudget})` : "within budget",
|
|
2943
|
+
);
|
|
2812
2944
|
const onDemandResult = renderExecuteTaskOnDemandContext(base, mid, sid, contractedContext.onDemand);
|
|
2813
2945
|
const onDemandContext = onDemandResult.text;
|
|
2814
2946
|
trackPromptContext(
|
|
@@ -2904,12 +3036,14 @@ export async function buildCompleteSlicePrompt(
|
|
|
2904
3036
|
trackPromptContext(contextTelemetry, "prior-task-summaries", "skipped", null, "missing tasks dir");
|
|
2905
3037
|
return null;
|
|
2906
3038
|
}
|
|
2907
|
-
const summaryFiles = resolveTaskFiles(loc.dir, "SUMMARY")
|
|
3039
|
+
const summaryFiles = resolveTaskFiles(loc.dir, "SUMMARY")
|
|
3040
|
+
.filter((file) => summaryFileBelongsToSlice(file, base, mid, sid))
|
|
3041
|
+
.sort();
|
|
2908
3042
|
const blocks: string[] = [];
|
|
2909
3043
|
for (const file of summaryFiles) {
|
|
2910
3044
|
const absPath = join(loc.dir, file);
|
|
2911
3045
|
const relPath = `${loc.relPrefix}/${file}`;
|
|
2912
|
-
const taskId = file.replace(/-SUMMARY\.md$/i, "");
|
|
3046
|
+
const taskId = taskIdFromTaskFileName(file, "SUMMARY") ?? file.replace(/-SUMMARY\.md$/i, "");
|
|
2913
3047
|
blocks.push(await buildTaskSummaryExcerpt(absPath, relPath, taskId));
|
|
2914
3048
|
}
|
|
2915
3049
|
const body = blocks.length > 0 ? blocks.join("\n\n---\n\n") : null;
|
|
@@ -3522,7 +3656,9 @@ export async function buildReplanSlicePrompt(
|
|
|
3522
3656
|
let blockerTaskId = "";
|
|
3523
3657
|
const summaryLoc = resolveTaskSummariesLocation(base, mid, sid);
|
|
3524
3658
|
if (summaryLoc) {
|
|
3525
|
-
const summaryFiles = resolveTaskFiles(summaryLoc.dir, "SUMMARY")
|
|
3659
|
+
const summaryFiles = resolveTaskFiles(summaryLoc.dir, "SUMMARY")
|
|
3660
|
+
.filter((file) => summaryFileBelongsToSlice(file, base, mid, sid))
|
|
3661
|
+
.sort();
|
|
3526
3662
|
for (const file of summaryFiles) {
|
|
3527
3663
|
const absPath = join(summaryLoc.dir, file);
|
|
3528
3664
|
const content = await loadFile(absPath);
|
|
@@ -3530,7 +3666,7 @@ export async function buildReplanSlicePrompt(
|
|
|
3530
3666
|
const summary = parseSummary(content);
|
|
3531
3667
|
const relPath = `${summaryLoc.relPrefix}/${file}`;
|
|
3532
3668
|
if (summary.frontmatter.blocker_discovered) {
|
|
3533
|
-
blockerTaskId = summary.frontmatter.id || file.replace(/-SUMMARY\.md$/i, "");
|
|
3669
|
+
blockerTaskId = summary.frontmatter.id || taskIdFromTaskFileName(file, "SUMMARY") || file.replace(/-SUMMARY\.md$/i, "");
|
|
3534
3670
|
inlined.push(await buildTaskSummaryExcerpt(absPath, relPath, blockerTaskId, { blocker: true }));
|
|
3535
3671
|
}
|
|
3536
3672
|
}
|
|
@@ -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[] = [];
|
|
@@ -3,11 +3,10 @@ import { AutoSession } from "./auto/session.js";
|
|
|
3
3
|
import type { CurrentUnit } from "./auto/session.js";
|
|
4
4
|
import type { SourceObservationStore } from "./source-observations.js";
|
|
5
5
|
import {
|
|
6
|
-
isDeterministicPolicyError,
|
|
7
|
-
isQueuedUserMessageSkip,
|
|
8
|
-
isToolInvocationError,
|
|
9
6
|
markToolEnd as markTrackedToolEnd,
|
|
10
7
|
markToolStart as markTrackedToolStart,
|
|
8
|
+
shouldClearToolInvocationErrorAfterSuccess,
|
|
9
|
+
updateToolInvocationError,
|
|
11
10
|
} from "./auto-tool-tracking.js";
|
|
12
11
|
// Re-exported as a pure pass-through. Must stay UNGATED (no autoSession.active
|
|
13
12
|
// argument, unlike markToolStart at the bottom of this file) so it is true in
|
|
@@ -99,13 +98,19 @@ export function markToolEnd(toolCallId: string): void {
|
|
|
99
98
|
|
|
100
99
|
export function recordToolInvocationError(toolName: string, errorMsg: string): void {
|
|
101
100
|
if (!autoSession.active) return;
|
|
102
|
-
|
|
103
|
-
autoSession.lastToolInvocationError
|
|
104
|
-
|
|
101
|
+
autoSession.lastToolInvocationError = updateToolInvocationError(
|
|
102
|
+
autoSession.lastToolInvocationError,
|
|
103
|
+
toolName,
|
|
104
|
+
errorMsg,
|
|
105
|
+
);
|
|
105
106
|
}
|
|
106
107
|
|
|
107
|
-
export function clearToolInvocationError(): void {
|
|
108
|
+
export function clearToolInvocationError(successfulToolName?: string): void {
|
|
108
109
|
if (!autoSession.active) return;
|
|
110
|
+
if (!shouldClearToolInvocationErrorAfterSuccess(
|
|
111
|
+
autoSession.lastToolInvocationError,
|
|
112
|
+
successfulToolName,
|
|
113
|
+
)) return;
|
|
109
114
|
autoSession.lastToolInvocationError = null;
|
|
110
115
|
}
|
|
111
116
|
|
|
@@ -88,6 +88,7 @@ import { classifyMilestoneSummaryContent } from "./milestone-summary-classifier.
|
|
|
88
88
|
import { extractVerdict } from "./verdict-parser.js";
|
|
89
89
|
import { auditOrphanedPreflightStashes } from "./orphan-stash-audit.js";
|
|
90
90
|
import { parseProject } from "./schemas/parsers.js";
|
|
91
|
+
import { LAYOUT_SEGMENTS } from "./layout-policy.js";
|
|
91
92
|
|
|
92
93
|
import {
|
|
93
94
|
debugLog,
|
|
@@ -152,6 +153,33 @@ export function hasGitIndexLockForTest(basePath: string): boolean {
|
|
|
152
153
|
return existsSync(join(basePath, ".git", "index.lock"));
|
|
153
154
|
}
|
|
154
155
|
|
|
156
|
+
function isEmptyDirectory(dirPath: string): boolean {
|
|
157
|
+
try {
|
|
158
|
+
return existsSync(dirPath) && readdirSync(dirPath).length === 0;
|
|
159
|
+
} catch {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function reconcileFlatPhaseBootstrapLayout(basePath: string): boolean {
|
|
165
|
+
const gsdDir = join(basePath, ".gsd");
|
|
166
|
+
const phasesPath = join(gsdDir, LAYOUT_SEGMENTS.level1);
|
|
167
|
+
const milestonesPath = join(gsdDir, "milestones");
|
|
168
|
+
|
|
169
|
+
if (isEmptyDirectory(milestonesPath)) {
|
|
170
|
+
if (!existsSync(phasesPath)) mkdirSync(phasesPath, { recursive: true });
|
|
171
|
+
rmSync(milestonesPath, { recursive: true, force: true });
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (!existsSync(phasesPath) && !existsSync(milestonesPath)) {
|
|
176
|
+
mkdirSync(phasesPath, { recursive: true });
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
|
|
155
183
|
export function _shouldAbortBootstrapForUnavailableDbForTest(
|
|
156
184
|
gsdDbPath: string,
|
|
157
185
|
dbAvailable: boolean,
|
|
@@ -1152,19 +1180,14 @@ export async function bootstrapAutoSession(
|
|
|
1152
1180
|
ensureGitignore(base, { manageGitignore });
|
|
1153
1181
|
if (manageGitignore !== false) untrackRuntimeFiles(base);
|
|
1154
1182
|
|
|
1155
|
-
// Bootstrap
|
|
1156
|
-
|
|
1157
|
-
// so checking .gsd/ existence would be dead code (#2942).
|
|
1158
|
-
const gsdDir = join(base, ".gsd");
|
|
1159
|
-
const milestonesPath = join(gsdDir, "milestones");
|
|
1160
|
-
if (!existsSync(milestonesPath)) {
|
|
1161
|
-
mkdirSync(milestonesPath, { recursive: true });
|
|
1183
|
+
// Bootstrap the flat-phase projection root and clean empty legacy scaffolds.
|
|
1184
|
+
if (reconcileFlatPhaseBootstrapLayout(base)) {
|
|
1162
1185
|
try {
|
|
1163
1186
|
nativeAddAll(base);
|
|
1164
1187
|
nativeCommit(base, "chore: init gsd");
|
|
1165
1188
|
} catch (err) {
|
|
1166
1189
|
/* nothing to commit */
|
|
1167
|
-
logWarning("engine", `
|
|
1190
|
+
logWarning("engine", `layout bootstrap commit failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
1168
1191
|
}
|
|
1169
1192
|
}
|
|
1170
1193
|
|
|
@@ -132,6 +132,8 @@ export function clearInFlightTools(): void {
|
|
|
132
132
|
*/
|
|
133
133
|
const TOOL_INVOCATION_ERROR_RE = /Validation failed for tool|Input validation error|Invalid arguments for tool|MCP error -32602|No such tool available|Expected ',' or '\}'(?: after property value)?(?: in JSON)?|Unexpected end of JSON|Unexpected token.*in JSON|does not provide an export named|Named export .* not found|Cannot find module|ERR_MODULE_NOT_FOUND|ERR_MODULE_NOT_EXPORTED|ERR_PACKAGE_PATH_NOT_EXPORTED/i;
|
|
134
134
|
const DETERMINISTIC_POLICY_ERROR_RE = /(?:^|\b)(?:HARD BLOCK:|Blocked: \/gsd queue is a planning tool|Direct writes to \.gsd\/STATE\.md and \.gsd\/gsd\.db are blocked|This is a mechanical gate)/i;
|
|
135
|
+
const SCHEDULE_WAKEUP_TOOL_NAME = "ScheduleWakeup";
|
|
136
|
+
const SCHEDULE_WAKEUP_CONTINUATION_ERROR = "`prompt` is required when `stop` is not true";
|
|
135
137
|
|
|
136
138
|
/**
|
|
137
139
|
* Matches the runtime's "tool not registered" error. Unlike the deterministic
|
|
@@ -151,6 +153,60 @@ export function isToolInvocationError(errorMsg: string): boolean {
|
|
|
151
153
|
return TOOL_INVOCATION_ERROR_RE.test(errorMsg) || isDeterministicPolicyError(errorMsg);
|
|
152
154
|
}
|
|
153
155
|
|
|
156
|
+
/**
|
|
157
|
+
* Claude Code validates its native ScheduleWakeup tool outside GSD's schema.
|
|
158
|
+
* Keep this exact and tool-scoped so similarly worded business validation from
|
|
159
|
+
* unrelated tools does not pause auto-mode.
|
|
160
|
+
*/
|
|
161
|
+
export function isScheduleWakeupContinuationError(toolName: string, errorMsg: string): boolean {
|
|
162
|
+
return stripMcpToolPrefix(toolName) === SCHEDULE_WAKEUP_TOOL_NAME
|
|
163
|
+
&& errorMsg.trim() === SCHEDULE_WAKEUP_CONTINUATION_ERROR;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function shouldRecordToolInvocationError(toolName: string, errorMsg: string): boolean {
|
|
167
|
+
return isScheduleWakeupContinuationError(toolName, errorMsg)
|
|
168
|
+
|| isToolInvocationError(errorMsg)
|
|
169
|
+
|| isQueuedUserMessageSkip(errorMsg);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function isRecordedScheduleWakeupContinuationError(recordedError: string | null): boolean {
|
|
173
|
+
if (!recordedError) return false;
|
|
174
|
+
|
|
175
|
+
const separator = recordedError.indexOf(": ");
|
|
176
|
+
return separator >= 0 && isScheduleWakeupContinuationError(
|
|
177
|
+
recordedError.slice(0, separator),
|
|
178
|
+
recordedError.slice(separator + 2),
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export function updateToolInvocationError(
|
|
183
|
+
recordedError: string | null,
|
|
184
|
+
toolName: string,
|
|
185
|
+
errorMsg: string,
|
|
186
|
+
): string | null {
|
|
187
|
+
if (!shouldRecordToolInvocationError(toolName, errorMsg)) return recordedError;
|
|
188
|
+
if (
|
|
189
|
+
isRecordedScheduleWakeupContinuationError(recordedError)
|
|
190
|
+
&& !isScheduleWakeupContinuationError(toolName, errorMsg)
|
|
191
|
+
) return recordedError;
|
|
192
|
+
|
|
193
|
+
return `${toolName}: ${errorMsg}`;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* A failed continuation must survive successful diagnostic/read calls in the
|
|
198
|
+
* same turn. Only a later successful ScheduleWakeup proves the continuation
|
|
199
|
+
* was armed; all other invocation errors retain their existing clear-on-success
|
|
200
|
+
* behavior.
|
|
201
|
+
*/
|
|
202
|
+
export function shouldClearToolInvocationErrorAfterSuccess(
|
|
203
|
+
recordedError: string | null,
|
|
204
|
+
successfulToolName?: string,
|
|
205
|
+
): boolean {
|
|
206
|
+
return !isRecordedScheduleWakeupContinuationError(recordedError)
|
|
207
|
+
|| stripMcpToolPrefix(successfulToolName ?? "") === SCHEDULE_WAKEUP_TOOL_NAME;
|
|
208
|
+
}
|
|
209
|
+
|
|
154
210
|
/**
|
|
155
211
|
* Returns true if the error message indicates the called tool was not on the
|
|
156
212
|
* session's tool surface (MCP startup race — see TOOL_UNAVAILABLE_ERROR_RE).
|
|
@@ -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
|
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
_isSamePath as isSamePath,
|
|
17
17
|
_shouldReconcileWorktreeDb,
|
|
18
18
|
} from "./auto-worktree-cleanup.js";
|
|
19
|
-
import { resolveGsdPathContract } from "./paths.js";
|
|
19
|
+
import { dirIsContentBearingLegacyMilestone, resolveGsdPathContract } from "./paths.js";
|
|
20
20
|
import type { MilestoneScope } from "./workspace.js";
|
|
21
21
|
import { WorktreeStateProjection } from "./worktree-state-projection.js";
|
|
22
22
|
import { logWarning } from "./workflow-logger.js";
|
|
@@ -211,10 +211,17 @@ function syncMilestoneLayout(
|
|
|
211
211
|
if (!existsSync(mainMilestonesDir)) return;
|
|
212
212
|
|
|
213
213
|
try {
|
|
214
|
-
mkdirSync(wtMilestonesDir, { recursive: true });
|
|
215
214
|
const mainMilestones = readdirSync(mainMilestonesDir, { withFileTypes: true })
|
|
216
215
|
.filter((entry) => entry.isDirectory())
|
|
217
|
-
.map((entry) => entry.name)
|
|
216
|
+
.map((entry) => entry.name)
|
|
217
|
+
.filter((name) =>
|
|
218
|
+
layoutSegment !== "milestones" ||
|
|
219
|
+
dirIsContentBearingLegacyMilestone(join(mainMilestonesDir, name)),
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
if (mainMilestones.length === 0) return;
|
|
223
|
+
|
|
224
|
+
mkdirSync(wtMilestonesDir, { recursive: true });
|
|
218
225
|
|
|
219
226
|
for (const milestoneId of mainMilestones) {
|
|
220
227
|
syncMilestoneDirectory(
|
|
@@ -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);
|