@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
|
@@ -29,6 +29,14 @@ export function formatStopNoticePrefix(reason?: string | null): string {
|
|
|
29
29
|
return displayReason ? `${prefix} — ${displayReason}` : prefix;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
export function formatVerdictRecordedNotice(message: string): string {
|
|
33
|
+
return `Verdict recorded: ${message}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function formatVerdictRejectedNotice(message: string): string {
|
|
37
|
+
return `Verdict rejected: ${message}`;
|
|
38
|
+
}
|
|
39
|
+
|
|
32
40
|
// ─── Classification (headless host side) ────────────────────────────────
|
|
33
41
|
// The canonical lowercase prefixes the headless event loop recognizes in
|
|
34
42
|
// notify messages. Emitters above and ad-hoc emitters elsewhere must start
|
|
@@ -42,6 +50,8 @@ export const TERMINAL_NOTICE_PREFIXES = [
|
|
|
42
50
|
"auto-mode complete",
|
|
43
51
|
"no active milestone",
|
|
44
52
|
"auto-mode idle",
|
|
53
|
+
"verdict recorded",
|
|
54
|
+
"verdict rejected",
|
|
45
55
|
] as const;
|
|
46
56
|
|
|
47
57
|
/** Manual-resolution notices emitted before auto-mode can formally pause/stop. */
|
|
@@ -66,10 +76,28 @@ export function isNonBlockingPauseNotice(message: string): boolean {
|
|
|
66
76
|
return message.includes("idempotent advance: unit already active");
|
|
67
77
|
}
|
|
68
78
|
|
|
79
|
+
/**
|
|
80
|
+
* A picker / next-action menu that could not render in a non-interactive
|
|
81
|
+
* (headless / RPC) session. Both wordings originate from the menu-unavailable
|
|
82
|
+
* helpers (`notifyCommandMenuUnavailable` and `notifyPickerCommandNeedsInteractiveMenu`
|
|
83
|
+
* in next-action-ui.ts / command-feedback.ts). Headless `auto`/`next` cannot
|
|
84
|
+
* answer such a menu, so the run has dead-ended and needs operator intervention.
|
|
85
|
+
* Classify it as blocked so the headless host exits 10 instead of idling
|
|
86
|
+
* forever waiting for a completion signal that never comes. (#1294)
|
|
87
|
+
*/
|
|
88
|
+
export function isInteractiveMenuUnavailableNotice(message: string): boolean {
|
|
89
|
+
return (
|
|
90
|
+
message.includes("menu could not be shown in this session") ||
|
|
91
|
+
message.includes("did not start:")
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
69
95
|
export function isBlockedNoticeMessage(message: string): boolean {
|
|
70
96
|
return (
|
|
71
97
|
message.includes("blocked:") ||
|
|
98
|
+
message.startsWith("verdict rejected") ||
|
|
72
99
|
(isPauseNotice(message) && !isNonBlockingPauseNotice(message)) ||
|
|
73
|
-
isManualResolutionNotice(message)
|
|
100
|
+
isManualResolutionNotice(message) ||
|
|
101
|
+
isInteractiveMenuUnavailableNotice(message)
|
|
74
102
|
);
|
|
75
103
|
}
|
|
@@ -9,8 +9,10 @@ import { dirname, join } from "node:path";
|
|
|
9
9
|
const STALE_THRESHOLD_MS = 60_000; // 60 seconds
|
|
10
10
|
const DEFAULT_TIMEOUT_MS = 0; // fail fast; sync waits block the JS event loop
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
const DEFAULT_LOCK_NAME = "sync.lock";
|
|
13
|
+
|
|
14
|
+
function lockFilePath(basePath: string, lockName: string = DEFAULT_LOCK_NAME): string {
|
|
15
|
+
return join(basePath, ".gsd", lockName);
|
|
14
16
|
}
|
|
15
17
|
|
|
16
18
|
/** True if the given PID is alive in the current process namespace. */
|
|
@@ -74,8 +76,9 @@ function tryCreateLockFile(lp: string, payload: string): boolean {
|
|
|
74
76
|
export function acquireSyncLock(
|
|
75
77
|
basePath: string,
|
|
76
78
|
_timeoutMs: number = DEFAULT_TIMEOUT_MS,
|
|
79
|
+
lockName: string = DEFAULT_LOCK_NAME,
|
|
77
80
|
): { acquired: boolean } {
|
|
78
|
-
const lp = lockFilePath(basePath);
|
|
81
|
+
const lp = lockFilePath(basePath, lockName);
|
|
79
82
|
const lockData = JSON.stringify(
|
|
80
83
|
{ pid: process.pid, acquired_at: new Date().toISOString() },
|
|
81
84
|
null,
|
|
@@ -89,7 +92,12 @@ export function acquireSyncLock(
|
|
|
89
92
|
return { acquired: true };
|
|
90
93
|
}
|
|
91
94
|
} catch {
|
|
92
|
-
|
|
95
|
+
// tryCreateLockFile only throws for non-EEXIST errors — a persistently
|
|
96
|
+
// uncreatable lock path (dangling-symlink parent, ENOTDIR, read-only FS).
|
|
97
|
+
// Retrying would spin the loop forever with no progress condition,
|
|
98
|
+
// blocking the JS event loop. Fail open like a contended lock so callers
|
|
99
|
+
// proceed (racy but functional) instead of hanging.
|
|
100
|
+
return { acquired: false };
|
|
93
101
|
}
|
|
94
102
|
|
|
95
103
|
// File exists. Decide whether to steal (stale + owner dead) or skip.
|
|
@@ -131,8 +139,8 @@ export function acquireSyncLock(
|
|
|
131
139
|
/**
|
|
132
140
|
* Release the advisory sync lock. No-op if lock file does not exist.
|
|
133
141
|
*/
|
|
134
|
-
export function releaseSyncLock(basePath: string): void {
|
|
135
|
-
const lp = lockFilePath(basePath);
|
|
142
|
+
export function releaseSyncLock(basePath: string, lockName: string = DEFAULT_LOCK_NAME): void {
|
|
143
|
+
const lp = lockFilePath(basePath, lockName);
|
|
136
144
|
try {
|
|
137
145
|
if (existsSync(lp)) {
|
|
138
146
|
unlinkSync(lp);
|
|
@@ -92,6 +92,11 @@ remote_questions:
|
|
|
92
92
|
uat_dispatch:
|
|
93
93
|
post_unit_hooks: []
|
|
94
94
|
pre_dispatch_hooks: []
|
|
95
|
+
# planning_subagents:
|
|
96
|
+
# plan-milestone:
|
|
97
|
+
# allowed: [scout, planner, security]
|
|
98
|
+
# plan-slice:
|
|
99
|
+
# allowed: [scout, planner, reviewer, security]
|
|
95
100
|
# language:
|
|
96
101
|
# experimental:
|
|
97
102
|
# rtk: false
|
|
@@ -442,11 +442,11 @@ test("bare milestone id still falls back to a lone team-suffix projection (#1195
|
|
|
442
442
|
// ── #1208: flat-phase execute-task summaries resolve at the phase root ────────
|
|
443
443
|
//
|
|
444
444
|
// In flat-phase layout task summaries are written beside the plan files
|
|
445
|
-
// (phases/<phase>/T##-SUMMARY.md), NOT under a tasks/ subdir. A tasks/ dir
|
|
446
|
-
// still exist to hold auxiliary task-scoped gate artifacts (e.g. T01-VERIFY.json).
|
|
445
|
+
// (phases/<phase>/S##-T##-SUMMARY.md), NOT under a tasks/ subdir. A tasks/ dir
|
|
446
|
+
// may still exist to hold auxiliary task-scoped gate artifacts (e.g. T01-VERIFY.json).
|
|
447
447
|
// Before the fix, the mere existence of that tasks/ dir redirected summary
|
|
448
|
-
// verification into tasks/T##-SUMMARY.md — which never exists — trapping
|
|
449
|
-
// in a false verification retry
|
|
448
|
+
// verification into tasks/S##-T##-SUMMARY.md — which never exists — trapping
|
|
449
|
+
// auto-mode in a false verification retry after a successful task.
|
|
450
450
|
|
|
451
451
|
test("flat-phase execute-task summary resolves at phase root when no tasks/ dir exists (#1208)", () => {
|
|
452
452
|
const root = realpathSync(mkdtempSync(join(tmpdir(), "gsd-flat-task-summary-")));
|
|
@@ -461,7 +461,7 @@ test("flat-phase execute-task summary resolves at phase root when no tasks/ dir
|
|
|
461
461
|
|
|
462
462
|
assert.equal(
|
|
463
463
|
resolveExpectedArtifactPath("execute-task", "M049/S03/T02", root),
|
|
464
|
-
join(phaseDir, "T02-SUMMARY.md"),
|
|
464
|
+
join(phaseDir, "S03-T02-SUMMARY.md"),
|
|
465
465
|
);
|
|
466
466
|
} finally {
|
|
467
467
|
_clearGsdRootCache();
|
|
@@ -489,12 +489,12 @@ test("flat-phase execute-task summary resolves at phase root even when tasks/ di
|
|
|
489
489
|
const resolved = resolveExpectedArtifactPath("execute-task", "M049/S03/T02", root);
|
|
490
490
|
assert.equal(
|
|
491
491
|
resolved,
|
|
492
|
-
join(phaseDir, "T02-SUMMARY.md"),
|
|
492
|
+
join(phaseDir, "S03-T02-SUMMARY.md"),
|
|
493
493
|
"flat-phase task summary must resolve at the phase root, not tasks/",
|
|
494
494
|
);
|
|
495
495
|
assert.notEqual(
|
|
496
496
|
resolved,
|
|
497
|
-
join(tasksDir, "T02-SUMMARY.md"),
|
|
497
|
+
join(tasksDir, "S03-T02-SUMMARY.md"),
|
|
498
498
|
"a tasks/ dir with gate artifacts must NOT redirect summary resolution into tasks/",
|
|
499
499
|
);
|
|
500
500
|
} finally {
|
|
@@ -41,6 +41,7 @@ import { claimMilestoneLease } from "../db/milestone-leases.js";
|
|
|
41
41
|
import { recordDispatchClaim, markCanceled } from "../db/unit-dispatches.js";
|
|
42
42
|
import { setRuntimeKv, getRuntimeKv } from "../db/runtime-kv.js";
|
|
43
43
|
import { SourceObservationStore } from "../source-observations.js";
|
|
44
|
+
import { autoCommitCurrentBranch } from "../worktree.js";
|
|
44
45
|
|
|
45
46
|
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
46
47
|
|
|
@@ -832,6 +833,37 @@ test("runUnit returns cancelled when session creation fails", async () => {
|
|
|
832
833
|
assert.equal(pi.calls.length, 0);
|
|
833
834
|
});
|
|
834
835
|
|
|
836
|
+
test("runUnit returns cancelled when command context lacks newSession", async () => {
|
|
837
|
+
_resetPendingResolve();
|
|
838
|
+
|
|
839
|
+
const ctx = {
|
|
840
|
+
...makeMockCtx(),
|
|
841
|
+
ui: {
|
|
842
|
+
notify: () => {},
|
|
843
|
+
setStatus: () => {},
|
|
844
|
+
setWorkingMessage: () => {},
|
|
845
|
+
},
|
|
846
|
+
sessionManager: {
|
|
847
|
+
getEntries: () => [],
|
|
848
|
+
},
|
|
849
|
+
modelRegistry: {
|
|
850
|
+
getProviderAuthMode: () => undefined,
|
|
851
|
+
isProviderRequestReady: () => true,
|
|
852
|
+
},
|
|
853
|
+
} as any;
|
|
854
|
+
const pi = makeMockPi();
|
|
855
|
+
const s = makeMockSession();
|
|
856
|
+
s.cmdCtx = {} as any;
|
|
857
|
+
|
|
858
|
+
const result = await runUnit(ctx, pi, s, "task", "T01", "prompt");
|
|
859
|
+
|
|
860
|
+
assert.equal(result.status, "cancelled");
|
|
861
|
+
assert.equal(result.errorContext?.category, "session-failed");
|
|
862
|
+
assert.equal(result.errorContext?.isTransient, false);
|
|
863
|
+
assert.match(result.errorContext?.message ?? "", /missing newSession/);
|
|
864
|
+
assert.equal(pi.calls.length, 0);
|
|
865
|
+
});
|
|
866
|
+
|
|
835
867
|
test("runUnit: TypeError from newSession is classified as structural (isTransient: false)", async () => {
|
|
836
868
|
// Regression for #572: a TypeError thrown from newSession (e.g. "something is
|
|
837
869
|
// not a function") indicates a programming error, not a transient provider
|
|
@@ -1582,6 +1614,130 @@ test("autoLoop exits when s.active is set to false", async (t) => {
|
|
|
1582
1614
|
);
|
|
1583
1615
|
});
|
|
1584
1616
|
|
|
1617
|
+
test("autoLoop stops before dispatch when command context lacks newSession", async () => {
|
|
1618
|
+
_resetPendingResolve();
|
|
1619
|
+
|
|
1620
|
+
const ctx = makeMockCtx();
|
|
1621
|
+
ctx.ui.setStatus = () => {};
|
|
1622
|
+
const pi = makeMockPi();
|
|
1623
|
+
const s = makeLoopSession({
|
|
1624
|
+
cmdCtx: {
|
|
1625
|
+
getContextUsage: () => ({ percent: 10, tokens: 1000, limit: 10000 }),
|
|
1626
|
+
},
|
|
1627
|
+
});
|
|
1628
|
+
let stopReason: string | undefined;
|
|
1629
|
+
let preserveWorktree: boolean | undefined;
|
|
1630
|
+
let deriveCalled = false;
|
|
1631
|
+
|
|
1632
|
+
try {
|
|
1633
|
+
const deps = makeMockDeps({
|
|
1634
|
+
stopAuto: async (_ctx, _pi, reason, options) => {
|
|
1635
|
+
stopReason = reason;
|
|
1636
|
+
preserveWorktree = options?.preserveWorktree;
|
|
1637
|
+
s.active = false;
|
|
1638
|
+
},
|
|
1639
|
+
deriveState: async () => {
|
|
1640
|
+
deriveCalled = true;
|
|
1641
|
+
throw new Error("deriveState should not run without command session support");
|
|
1642
|
+
},
|
|
1643
|
+
});
|
|
1644
|
+
|
|
1645
|
+
await autoLoop(ctx, pi, s, deps);
|
|
1646
|
+
|
|
1647
|
+
assert.equal(stopReason, "Auto-mode has no command context for dispatch.");
|
|
1648
|
+
assert.equal(preserveWorktree, true);
|
|
1649
|
+
assert.equal(deriveCalled, false);
|
|
1650
|
+
assert.equal(pi.calls.length, 0);
|
|
1651
|
+
} finally {
|
|
1652
|
+
rmSync(s.basePath, { recursive: true, force: true });
|
|
1653
|
+
}
|
|
1654
|
+
});
|
|
1655
|
+
|
|
1656
|
+
test("autoLoop commits open unit work when command context lacks newSession", async () => {
|
|
1657
|
+
_resetPendingResolve();
|
|
1658
|
+
|
|
1659
|
+
const ctx = makeMockCtx();
|
|
1660
|
+
ctx.ui.setStatus = () => {};
|
|
1661
|
+
const pi = makeMockPi();
|
|
1662
|
+
const s = makeLoopSession({
|
|
1663
|
+
cmdCtx: {
|
|
1664
|
+
getContextUsage: () => ({ percent: 10, tokens: 1000, limit: 10000 }),
|
|
1665
|
+
},
|
|
1666
|
+
currentUnit: { type: "execute-task", id: "T01", startedAt: Date.now() },
|
|
1667
|
+
});
|
|
1668
|
+
const outputPath = join(s.basePath, "executor-output.txt");
|
|
1669
|
+
let autoCommitArgs: { unitType: string; unitId: string } | undefined;
|
|
1670
|
+
let preserveWorktree: boolean | undefined;
|
|
1671
|
+
|
|
1672
|
+
try {
|
|
1673
|
+
const deps = makeMockDeps({
|
|
1674
|
+
autoCommitUnit: async (basePath, unitType, unitId) => {
|
|
1675
|
+
autoCommitArgs = { unitType, unitId };
|
|
1676
|
+
return autoCommitCurrentBranch(basePath, unitType, unitId);
|
|
1677
|
+
},
|
|
1678
|
+
stopAuto: async (_ctx, _pi, _reason, options) => {
|
|
1679
|
+
preserveWorktree = options?.preserveWorktree;
|
|
1680
|
+
s.active = false;
|
|
1681
|
+
},
|
|
1682
|
+
deriveState: async () => {
|
|
1683
|
+
throw new Error("deriveState should not run without command session support");
|
|
1684
|
+
},
|
|
1685
|
+
});
|
|
1686
|
+
|
|
1687
|
+
writeFileSync(outputPath, "open unit work before stop\n", "utf-8");
|
|
1688
|
+
|
|
1689
|
+
await autoLoop(ctx, pi, s, deps);
|
|
1690
|
+
|
|
1691
|
+
assert.deepEqual(autoCommitArgs, { unitType: "execute-task", unitId: "T01" });
|
|
1692
|
+
assert.equal(preserveWorktree, true);
|
|
1693
|
+
const committed = execSync("git show HEAD:executor-output.txt", {
|
|
1694
|
+
cwd: s.basePath,
|
|
1695
|
+
encoding: "utf-8",
|
|
1696
|
+
});
|
|
1697
|
+
assert.equal(committed, "open unit work before stop\n");
|
|
1698
|
+
assert.equal(pi.calls.length, 0);
|
|
1699
|
+
} finally {
|
|
1700
|
+
rmSync(s.basePath, { recursive: true, force: true });
|
|
1701
|
+
}
|
|
1702
|
+
});
|
|
1703
|
+
|
|
1704
|
+
test("autoLoop snapshots dirty work when unit dispatch crashes", async () => {
|
|
1705
|
+
_resetPendingResolve();
|
|
1706
|
+
|
|
1707
|
+
const ctx = makeMockCtx();
|
|
1708
|
+
ctx.ui.setStatus = () => {};
|
|
1709
|
+
const pi = makeMockPi();
|
|
1710
|
+
const s = makeLoopSession();
|
|
1711
|
+
const outputPath = join(s.basePath, "executor-output.txt");
|
|
1712
|
+
let autoCommitCalls = 0;
|
|
1713
|
+
|
|
1714
|
+
try {
|
|
1715
|
+
const deps = makeMockDeps({
|
|
1716
|
+
ensurePreconditions: () => {
|
|
1717
|
+
writeFileSync(outputPath, "saved before crash\n", "utf-8");
|
|
1718
|
+
throw new Error("dispatch crash after file write");
|
|
1719
|
+
},
|
|
1720
|
+
autoCommitUnit: async (basePath, unitType, unitId) => {
|
|
1721
|
+
autoCommitCalls++;
|
|
1722
|
+
const commitMsg = autoCommitCurrentBranch(basePath, unitType, unitId);
|
|
1723
|
+
s.active = false;
|
|
1724
|
+
return commitMsg;
|
|
1725
|
+
},
|
|
1726
|
+
});
|
|
1727
|
+
|
|
1728
|
+
await autoLoop(ctx, pi, s, deps);
|
|
1729
|
+
|
|
1730
|
+
assert.equal(autoCommitCalls, 1);
|
|
1731
|
+
const committed = execSync("git show HEAD:executor-output.txt", {
|
|
1732
|
+
cwd: s.basePath,
|
|
1733
|
+
encoding: "utf-8",
|
|
1734
|
+
});
|
|
1735
|
+
assert.equal(committed, "saved before crash\n");
|
|
1736
|
+
} finally {
|
|
1737
|
+
rmSync(s.basePath, { recursive: true, force: true });
|
|
1738
|
+
}
|
|
1739
|
+
});
|
|
1740
|
+
|
|
1585
1741
|
test("autoLoop pauses visibly when Auto Orchestration Module is not wired", async () => {
|
|
1586
1742
|
_resetPendingResolve();
|
|
1587
1743
|
|
|
@@ -5421,6 +5577,114 @@ test("runUnitPhase retries 0-tool units with ordinary network-related assistant
|
|
|
5421
5577
|
assert.equal(deps.callLog.includes("pauseAuto"), false);
|
|
5422
5578
|
});
|
|
5423
5579
|
|
|
5580
|
+
test("runUnitPhase pauses 0-tool units with pseudo tool-call text as serialization drift", async (t) => {
|
|
5581
|
+
_resetPendingResolve();
|
|
5582
|
+
|
|
5583
|
+
const basePath = makeLoopTestBase("gsd-zero-tool-pseudo-tool-");
|
|
5584
|
+
t.after(() => {
|
|
5585
|
+
rmSync(basePath, { recursive: true, force: true });
|
|
5586
|
+
});
|
|
5587
|
+
|
|
5588
|
+
const notifications: string[] = [];
|
|
5589
|
+
const ctx = {
|
|
5590
|
+
...makeMockCtx(),
|
|
5591
|
+
ui: {
|
|
5592
|
+
notify: (msg: string) => { notifications.push(msg); },
|
|
5593
|
+
setStatus: () => {},
|
|
5594
|
+
setWorkingMessage: () => {},
|
|
5595
|
+
},
|
|
5596
|
+
sessionManager: {
|
|
5597
|
+
getEntries: () => [],
|
|
5598
|
+
},
|
|
5599
|
+
modelRegistry: {
|
|
5600
|
+
getProviderAuthMode: () => undefined,
|
|
5601
|
+
isProviderRequestReady: () => true,
|
|
5602
|
+
},
|
|
5603
|
+
} as any;
|
|
5604
|
+
const pi = {
|
|
5605
|
+
...makeMockPi(),
|
|
5606
|
+
sendMessage: () => {
|
|
5607
|
+
queueMicrotask(() => resolveAgentEnd(makeEvent([
|
|
5608
|
+
{
|
|
5609
|
+
role: "assistant",
|
|
5610
|
+
content: [
|
|
5611
|
+
{
|
|
5612
|
+
type: "text",
|
|
5613
|
+
text: 'bash<arg_key>command</arg_key><arg_value>ls -la /tmp && echo "---SRC---"</arg_value></tool_call>',
|
|
5614
|
+
},
|
|
5615
|
+
],
|
|
5616
|
+
},
|
|
5617
|
+
])));
|
|
5618
|
+
},
|
|
5619
|
+
} as any;
|
|
5620
|
+
const s = makeLoopSession({
|
|
5621
|
+
basePath,
|
|
5622
|
+
canonicalProjectRoot: basePath,
|
|
5623
|
+
originalBasePath: basePath,
|
|
5624
|
+
});
|
|
5625
|
+
const mockLedger = {
|
|
5626
|
+
version: 1,
|
|
5627
|
+
projectStartedAt: Date.now(),
|
|
5628
|
+
units: [] as any[],
|
|
5629
|
+
};
|
|
5630
|
+
const deps = makeMockDeps({
|
|
5631
|
+
closeoutUnit: async () => {
|
|
5632
|
+
mockLedger.units.push({
|
|
5633
|
+
type: "execute-task",
|
|
5634
|
+
id: "M001/S01/T01",
|
|
5635
|
+
startedAt: s.currentUnit?.startedAt ?? Date.now(),
|
|
5636
|
+
toolCalls: 0,
|
|
5637
|
+
assistantMessages: 1,
|
|
5638
|
+
tokens: { input: 100, output: 20, total: 120, cacheRead: 0, cacheWrite: 0 },
|
|
5639
|
+
cost: 0.01,
|
|
5640
|
+
});
|
|
5641
|
+
},
|
|
5642
|
+
getLedger: () => mockLedger,
|
|
5643
|
+
});
|
|
5644
|
+
let seq = 0;
|
|
5645
|
+
|
|
5646
|
+
const result = await runUnitPhase(
|
|
5647
|
+
{ ctx, pi, s, deps, prefs: undefined, iteration: 1, flowId: "flow-zero-tool-pseudo-tool", nextSeq: () => ++seq },
|
|
5648
|
+
{
|
|
5649
|
+
unitType: "execute-task",
|
|
5650
|
+
unitId: "M001/S01/T01",
|
|
5651
|
+
prompt: "do work",
|
|
5652
|
+
finalPrompt: "do work",
|
|
5653
|
+
pauseAfterUatDispatch: false,
|
|
5654
|
+
state: {
|
|
5655
|
+
phase: "executing",
|
|
5656
|
+
activeMilestone: { id: "M001", title: "Milestone" },
|
|
5657
|
+
activeSlice: { id: "S01", title: "Slice" },
|
|
5658
|
+
activeTask: { id: "T01", title: "Task" },
|
|
5659
|
+
registry: [{ id: "M001", title: "Milestone", status: "active" }],
|
|
5660
|
+
recentDecisions: [],
|
|
5661
|
+
blockers: [],
|
|
5662
|
+
nextAction: "",
|
|
5663
|
+
progress: { milestones: { done: 0, total: 1 } },
|
|
5664
|
+
requirements: { active: 0, validated: 0, deferred: 0, outOfScope: 0, blocked: 0, total: 0 },
|
|
5665
|
+
} as any,
|
|
5666
|
+
mid: "M001",
|
|
5667
|
+
midTitle: "Milestone",
|
|
5668
|
+
isRetry: false,
|
|
5669
|
+
previousTier: undefined,
|
|
5670
|
+
},
|
|
5671
|
+
{ recentUnits: [{ key: "execute-task/M001/S01/T01" }], stuckRecoveryAttempts: 0, consecutiveFinalizeTimeouts: 0 },
|
|
5672
|
+
);
|
|
5673
|
+
|
|
5674
|
+
assert.equal(result.action, "break");
|
|
5675
|
+
assert.equal((result as any).reason, "zero-tool-serialization-drift");
|
|
5676
|
+
assert.equal(deps.callLog.includes("pauseAuto"), true);
|
|
5677
|
+
assert.equal(s.zeroToolRetryCount.has("execute-task/M001/S01/T01"), false);
|
|
5678
|
+
assert.ok(
|
|
5679
|
+
notifications.some((msg) => msg.includes("serialization drift") && msg.includes("bash<arg_key>command")),
|
|
5680
|
+
"serialization drift notification should include a snippet of the pseudo tool-call text",
|
|
5681
|
+
);
|
|
5682
|
+
assert.ok(
|
|
5683
|
+
!notifications.some((msg) => msg.includes("context exhaustion")),
|
|
5684
|
+
"pseudo tool-call text should not be labeled as context exhaustion",
|
|
5685
|
+
);
|
|
5686
|
+
});
|
|
5687
|
+
|
|
5424
5688
|
test("runUnitPhase pauses auto-mode when zero-tool-call retry is exhausted", async (t) => {
|
|
5425
5689
|
_resetPendingResolve();
|
|
5426
5690
|
|
|
@@ -1218,6 +1218,10 @@ test("hasImplementationArtifacts finds integration implementation-only commits w
|
|
|
1218
1218
|
|
|
1219
1219
|
execFileSync("git", ["checkout", "-b", "milestone/M001"], { cwd: base, stdio: "ignore" });
|
|
1220
1220
|
writeIntegrationBranch(base, "M001", "main");
|
|
1221
|
+
// ADR-045: writeIntegrationBranch no longer creates milestones/<MID>/ as a
|
|
1222
|
+
// side effect (META is now flat at .gsd/<MID>-META.json), so scaffold the
|
|
1223
|
+
// legacy summary dir explicitly.
|
|
1224
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
1221
1225
|
writeFileSync(join(base, ".gsd", "milestones", "M001", "M001-SUMMARY.md"), "# Milestone Summary\nDone.");
|
|
1222
1226
|
execFileSync("git", ["add", "."], { cwd: base, stdio: "ignore" });
|
|
1223
1227
|
execFileSync("git", ["commit", "-m", "chore: auto-commit after complete-milestone\n\nGSD-Unit: M001"], { cwd: base, stdio: "ignore" });
|
|
@@ -2063,6 +2067,41 @@ test("#1088: writeReactiveExecuteBlocker preserves deferred batch task statuses"
|
|
|
2063
2067
|
}
|
|
2064
2068
|
});
|
|
2065
2069
|
|
|
2070
|
+
test("#1343: writeReactiveExecuteBlocker uses slice-qualified summaries in flat-phase (no cross-slice collision)", () => {
|
|
2071
|
+
const base = join(tmpdir(), `gsd-test-${randomUUID()}`);
|
|
2072
|
+
try {
|
|
2073
|
+
// Flat-phase layout: slices S01 and S02 share the phase dir and reuse task
|
|
2074
|
+
// id T03. Only the sibling slice S01 produced a summary.
|
|
2075
|
+
const phaseDir = join(base, ".gsd", "phases", "01-test");
|
|
2076
|
+
mkdirSync(phaseDir, { recursive: true });
|
|
2077
|
+
writeFileSync(join(phaseDir, "01-01-PLAN.md"), "# S01: First\n", "utf-8");
|
|
2078
|
+
writeFileSync(join(phaseDir, "01-02-PLAN.md"), "# S02: Second\n", "utf-8");
|
|
2079
|
+
writeFileSync(join(phaseDir, "S01-T03-SUMMARY.md"), "# S01 T03 Summary\n", "utf-8");
|
|
2080
|
+
|
|
2081
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
2082
|
+
insertMilestone({ id: "M001", title: "Milestone", status: "active" });
|
|
2083
|
+
insertSlice({ id: "S01", milestoneId: "M001", title: "First", status: "pending" });
|
|
2084
|
+
insertSlice({ id: "S02", milestoneId: "M001", title: "Second", status: "pending" });
|
|
2085
|
+
insertTask({ id: "T03", milestoneId: "M001", sliceId: "S02", title: "Shared id", status: "pending" });
|
|
2086
|
+
|
|
2087
|
+
const recovery = writeReactiveExecuteBlocker(
|
|
2088
|
+
"M001/S02/reactive+T03",
|
|
2089
|
+
base,
|
|
2090
|
+
"verification retries exhausted",
|
|
2091
|
+
);
|
|
2092
|
+
|
|
2093
|
+
assert.ok(recovery, "recovery should run with DB available");
|
|
2094
|
+
// S02 never wrote S02-T03-SUMMARY.md; the sibling S01-T03-SUMMARY.md must
|
|
2095
|
+
// NOT make S02/T03 look complete. It has to be skipped.
|
|
2096
|
+
assert.deepEqual(recovery!.completedTaskIds, []);
|
|
2097
|
+
assert.deepEqual(recovery!.skippedTaskIds, ["T03"]);
|
|
2098
|
+
assert.equal(getTask("M001", "S02", "T03")?.status, "skipped");
|
|
2099
|
+
} finally {
|
|
2100
|
+
closeDatabase();
|
|
2101
|
+
cleanup(base);
|
|
2102
|
+
}
|
|
2103
|
+
});
|
|
2104
|
+
|
|
2066
2105
|
test("#4414: verifyExpectedArtifact parallel-research succeeds when all research-ready slices have RESEARCH", () => {
|
|
2067
2106
|
const base = makeTmpBase();
|
|
2068
2107
|
try {
|
|
@@ -4,7 +4,7 @@ import { existsSync, mkdtempSync, mkdirSync, rmSync, writeFileSync } from "node:
|
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
|
|
7
|
-
import { hasGitIndexLockForTest } from "../auto-start.ts";
|
|
7
|
+
import { hasGitIndexLockForTest, reconcileFlatPhaseBootstrapLayout } from "../auto-start.ts";
|
|
8
8
|
|
|
9
9
|
test("bootstrapAutoSession detects .git/index.lock without deleting it", (t) => {
|
|
10
10
|
const base = mkdtempSync(join(tmpdir(), "gsd-index-lock-"));
|
|
@@ -24,3 +24,23 @@ test("bootstrapAutoSession reports no index lock when the lock file is absent",
|
|
|
24
24
|
|
|
25
25
|
assert.equal(hasGitIndexLockForTest(base), false);
|
|
26
26
|
});
|
|
27
|
+
|
|
28
|
+
test("bootstrapAutoSession removes empty legacy milestones dir in flat-phase projects", (t) => {
|
|
29
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-flat-bootstrap-clean-"));
|
|
30
|
+
t.after(() => rmSync(base, { recursive: true, force: true }));
|
|
31
|
+
mkdirSync(join(base, ".gsd", "phases"), { recursive: true });
|
|
32
|
+
mkdirSync(join(base, ".gsd", "milestones"), { recursive: true });
|
|
33
|
+
|
|
34
|
+
assert.equal(reconcileFlatPhaseBootstrapLayout(base), true);
|
|
35
|
+
assert.equal(existsSync(join(base, ".gsd", "phases")), true);
|
|
36
|
+
assert.equal(existsSync(join(base, ".gsd", "milestones")), false);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("bootstrapAutoSession creates phases instead of milestones for empty GSD state", (t) => {
|
|
40
|
+
const base = mkdtempSync(join(tmpdir(), "gsd-flat-bootstrap-init-"));
|
|
41
|
+
t.after(() => rmSync(base, { recursive: true, force: true }));
|
|
42
|
+
|
|
43
|
+
assert.equal(reconcileFlatPhaseBootstrapLayout(base), true);
|
|
44
|
+
assert.equal(existsSync(join(base, ".gsd", "phases")), true);
|
|
45
|
+
assert.equal(existsSync(join(base, ".gsd", "milestones")), false);
|
|
46
|
+
});
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
import { describe, test } from "node:test";
|
|
5
5
|
import assert from "node:assert/strict";
|
|
6
|
-
import { mkdtempSync, mkdirSync, realpathSync, rmSync } from "node:fs";
|
|
6
|
+
import { mkdtempSync, mkdirSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { execSync } from "node:child_process";
|
|
7
8
|
import { join } from "node:path";
|
|
8
9
|
import { tmpdir } from "node:os";
|
|
9
10
|
|
|
@@ -96,6 +97,78 @@ describe("hook dispatch session workspace root", () => {
|
|
|
96
97
|
assert.equal(dispatched, true);
|
|
97
98
|
assert.deepEqual(newSessionOptions, { workspaceRoot: basePath });
|
|
98
99
|
});
|
|
100
|
+
|
|
101
|
+
test("dispatchHookUnit commits in-flight work when command context lacks newSession", async (t) => {
|
|
102
|
+
const originalCwd = process.cwd();
|
|
103
|
+
const basePath = realpathSync(mkdtempSync(join(tmpdir(), "gsd-hook-nosnap-")));
|
|
104
|
+
mkdirSync(join(basePath, ".gsd"), { recursive: true });
|
|
105
|
+
execSync("git init --initial-branch=main", { cwd: basePath, stdio: "ignore" });
|
|
106
|
+
execSync("git config user.email test@test.com", { cwd: basePath, stdio: "ignore" });
|
|
107
|
+
execSync("git config user.name Test", { cwd: basePath, stdio: "ignore" });
|
|
108
|
+
execSync("git commit --allow-empty -m init", { cwd: basePath, stdio: "ignore" });
|
|
109
|
+
|
|
110
|
+
autoSession.reset();
|
|
111
|
+
autoSession.active = true;
|
|
112
|
+
autoSession.basePath = basePath;
|
|
113
|
+
autoSession.originalBasePath = basePath;
|
|
114
|
+
// Simulate an in-flight unit whose executor already wrote files, then a hook
|
|
115
|
+
// fires with a command context missing newSession.
|
|
116
|
+
autoSession.currentUnit = {
|
|
117
|
+
type: "execute-task",
|
|
118
|
+
id: "M001/S01/T01",
|
|
119
|
+
startedAt: Date.now(),
|
|
120
|
+
};
|
|
121
|
+
t.after(() => {
|
|
122
|
+
try {
|
|
123
|
+
process.chdir(originalCwd);
|
|
124
|
+
} catch {
|
|
125
|
+
// best effort cleanup after cwd-sensitive dispatch tests
|
|
126
|
+
}
|
|
127
|
+
autoSession.reset();
|
|
128
|
+
rmSync(basePath, { recursive: true, force: true });
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
const outputPath = join(basePath, "executor-output.txt");
|
|
132
|
+
writeFileSync(outputPath, "in-flight executor work\n", "utf-8");
|
|
133
|
+
|
|
134
|
+
// Command context intentionally lacks newSession — the guard must snapshot
|
|
135
|
+
// the dirty work before stopping instead of discarding it.
|
|
136
|
+
const ctx = {
|
|
137
|
+
ui: {
|
|
138
|
+
notify: () => {},
|
|
139
|
+
setStatus: () => {},
|
|
140
|
+
setWidget: () => {},
|
|
141
|
+
},
|
|
142
|
+
modelRegistry: {
|
|
143
|
+
getAvailable: () => [],
|
|
144
|
+
},
|
|
145
|
+
sessionManager: {
|
|
146
|
+
getSessionFile: () => join(basePath, "session.jsonl"),
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
const pi = {
|
|
150
|
+
sendMessage: () => {},
|
|
151
|
+
setModel: async () => true,
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
const dispatched = await dispatchHookUnit(
|
|
155
|
+
ctx as any,
|
|
156
|
+
pi as any,
|
|
157
|
+
"review",
|
|
158
|
+
"execute-task",
|
|
159
|
+
"M001/S01/T01",
|
|
160
|
+
"review the completed unit",
|
|
161
|
+
undefined,
|
|
162
|
+
basePath,
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
assert.equal(dispatched, false);
|
|
166
|
+
const committed = execSync("git show HEAD:executor-output.txt", {
|
|
167
|
+
cwd: basePath,
|
|
168
|
+
encoding: "utf-8",
|
|
169
|
+
});
|
|
170
|
+
assert.equal(committed, "in-flight executor work\n");
|
|
171
|
+
});
|
|
99
172
|
});
|
|
100
173
|
|
|
101
174
|
describe("deep setup approval questions pause immediately", () => {
|
|
@@ -143,3 +143,58 @@ test("successful shell result clears source context before provider injection",
|
|
|
143
143
|
assert.equal(payload.messages.length, 1);
|
|
144
144
|
assert.doesNotMatch(payload.messages[0].content[0].text, /Source Context Block/);
|
|
145
145
|
});
|
|
146
|
+
|
|
147
|
+
test("before_provider_request keeps only the latest GSD context injection across a 5-turn session", async (t) => {
|
|
148
|
+
const dir = mkdtempSync(join(tmpdir(), "gsd-before-provider-injections-"));
|
|
149
|
+
const gsdHome = join(dir, "home");
|
|
150
|
+
const project = join(dir, "project");
|
|
151
|
+
const previousCwd = process.cwd();
|
|
152
|
+
const previousGsdHome = process.env.GSD_HOME;
|
|
153
|
+
|
|
154
|
+
mkdirSync(join(project, ".gsd"), { recursive: true });
|
|
155
|
+
mkdirSync(gsdHome, { recursive: true });
|
|
156
|
+
process.env.GSD_HOME = gsdHome;
|
|
157
|
+
process.chdir(project);
|
|
158
|
+
_setAutoActiveForTest(false);
|
|
159
|
+
|
|
160
|
+
t.after(() => {
|
|
161
|
+
_setAutoActiveForTest(false);
|
|
162
|
+
process.chdir(previousCwd);
|
|
163
|
+
if (previousGsdHome === undefined) delete process.env.GSD_HOME;
|
|
164
|
+
else process.env.GSD_HOME = previousGsdHome;
|
|
165
|
+
rmSync(dir, { recursive: true, force: true });
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
const beforeProviderRequest = requireHook(createHookHandlers(), "before_provider_request");
|
|
169
|
+
|
|
170
|
+
const sentinel = "[GSD Context Injection]";
|
|
171
|
+
const contextInjection = (turn: number) => ({
|
|
172
|
+
role: "user",
|
|
173
|
+
content: [{ type: "text", text: `${sentinel}\n[MEMORY] turn=${turn}` }],
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
const payload = {
|
|
177
|
+
messages: [
|
|
178
|
+
{ role: "user", content: [{ type: "text", text: "turn 1" }] },
|
|
179
|
+
contextInjection(1),
|
|
180
|
+
{ role: "assistant", content: [{ type: "text", text: "r1" }] },
|
|
181
|
+
{ role: "user", content: [{ type: "text", text: "turn 2" }] },
|
|
182
|
+
contextInjection(2),
|
|
183
|
+
{ role: "assistant", content: [{ type: "text", text: "r2" }] },
|
|
184
|
+
{ role: "user", content: [{ type: "text", text: "turn 3" }] },
|
|
185
|
+
contextInjection(3),
|
|
186
|
+
{ role: "assistant", content: [{ type: "text", text: "r3" }] },
|
|
187
|
+
{ role: "user", content: [{ type: "text", text: "turn 4" }] },
|
|
188
|
+
contextInjection(4),
|
|
189
|
+
{ role: "assistant", content: [{ type: "text", text: "r4" }] },
|
|
190
|
+
{ role: "user", content: [{ type: "text", text: "turn 5" }] },
|
|
191
|
+
contextInjection(5),
|
|
192
|
+
],
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
await beforeProviderRequest({ payload });
|
|
196
|
+
|
|
197
|
+
const survivors = (payload.messages as any[]).filter((m) => (m.content?.[0]?.text ?? "").startsWith(sentinel));
|
|
198
|
+
assert.equal(survivors.length, 1);
|
|
199
|
+
assert.match(survivors[0].content[0].text, /turn=5/);
|
|
200
|
+
});
|