@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
|
@@ -111,10 +111,12 @@ export const MODEL_CAPABILITY_TIER: Record<string, ComplexityTier> = {
|
|
|
111
111
|
"gpt-5.3-codex": "heavy",
|
|
112
112
|
"gpt-5.4": "heavy",
|
|
113
113
|
"gpt-5.5": "heavy",
|
|
114
|
+
"gpt-5.6": "heavy",
|
|
114
115
|
"o1": "heavy",
|
|
115
116
|
"o3": "heavy",
|
|
116
117
|
"o4-mini": "heavy",
|
|
117
118
|
"o4-mini-deep-research": "heavy",
|
|
119
|
+
"grok-4.5": "heavy",
|
|
118
120
|
};
|
|
119
121
|
|
|
120
122
|
// ─── Cost Table (per 1K input tokens, approximate USD) ───────────────────────
|
|
@@ -149,11 +151,13 @@ const MODEL_COST_PER_1K_INPUT: Record<string, number> = {
|
|
|
149
151
|
"gpt-5.3-codex-spark": 0.0003,
|
|
150
152
|
"gpt-5.4": 0.005,
|
|
151
153
|
"gpt-5.5": 0.005,
|
|
154
|
+
"gpt-5.6": 0.005,
|
|
152
155
|
"o4-mini": 0.005,
|
|
153
156
|
"o4-mini-deep-research": 0.005,
|
|
154
157
|
"gemini-2.0-flash": 0.0001,
|
|
155
158
|
"gemini-2.5-pro": 0.00125,
|
|
156
159
|
"deepseek-chat": 0.00014,
|
|
160
|
+
"grok-4.5": 0.002,
|
|
157
161
|
};
|
|
158
162
|
|
|
159
163
|
// ─── Capability Profiles Data Table ──────────────────────────────────────────
|
|
@@ -198,6 +202,9 @@ export const MODEL_CAPABILITY_PROFILES: Record<string, ModelCapabilities> = {
|
|
|
198
202
|
// OpenAI's 2026-04-23 published eval deltas across coding, tool use, and long context.
|
|
199
203
|
// Source: https://openai.com/index/introducing-gpt-5-5/
|
|
200
204
|
"gpt-5.5": { coding: 96, debugging: 93, research: 89, reasoning: 95, speed: 42, longContext: 90, instruction: 93 },
|
|
205
|
+
// GPT-5.6 profile is provisional: a small uniform step over gpt-5.5, to be
|
|
206
|
+
// recalibrated once OpenAI publishes official eval results.
|
|
207
|
+
"gpt-5.6": { coding: 97, debugging: 94, research: 90, reasoning: 96, speed: 42, longContext: 91, instruction: 94 },
|
|
201
208
|
|
|
202
209
|
// ── OpenAI o-series (reasoning-first) ──────────────────────────────────────
|
|
203
210
|
"o1": { coding: 78, debugging: 82, research: 78, reasoning: 90, speed: 20, longContext: 65, instruction: 82 },
|
|
@@ -212,6 +219,11 @@ export const MODEL_CAPABILITY_PROFILES: Record<string, ModelCapabilities> = {
|
|
|
212
219
|
|
|
213
220
|
// ── DeepSeek ───────────────────────────────────────────────────────────────
|
|
214
221
|
"deepseek-chat": { coding: 75, debugging: 65, research: 55, reasoning: 70, speed: 70, longContext: 55, instruction: 65 },
|
|
222
|
+
|
|
223
|
+
// ── xAI ────────────────────────────────────────────────────────────────────
|
|
224
|
+
// Grok 4.5 (2026-07): Opus-class frontier model tuned for coding and agentic
|
|
225
|
+
// work; notably faster and more token-efficient than peer heavy models.
|
|
226
|
+
"grok-4.5": { coding: 95, debugging: 90, research: 82, reasoning: 93, speed: 55, longContext: 80, instruction: 90 },
|
|
215
227
|
};
|
|
216
228
|
|
|
217
229
|
// ─── Base Task Requirements Data Table ───────────────────────────────────────
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import { deriveState } from "./state.js";
|
|
9
9
|
import { resolveMilestoneFile, resolveSliceFile } from "./paths.js";
|
|
10
10
|
import { findMilestoneIds } from "./guided-flow.js";
|
|
11
|
-
import { isDbAvailable, getMilestoneSlices,
|
|
11
|
+
import { isDbAvailable, getMilestoneSlices, getTasksBySliceIds } from "./gsd-db.js";
|
|
12
12
|
import { openExistingWorkflowDatabase } from "./db-workspace.js";
|
|
13
13
|
import type { MilestoneRegistryEntry } from "./types.js";
|
|
14
14
|
|
|
@@ -40,10 +40,11 @@ async function collectTouchedFiles(
|
|
|
40
40
|
const files = new Set<string>();
|
|
41
41
|
|
|
42
42
|
if (isDbAvailable()) {
|
|
43
|
-
// DB path: query slices and their tasks for file lists
|
|
43
|
+
// DB path: query slices and their tasks for file lists (one batched task
|
|
44
|
+
// query instead of one per slice; file order is irrelevant here — Set dedup)
|
|
44
45
|
const slices = getMilestoneSlices(milestoneId);
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
const tasksBySlice = getTasksBySliceIds(slices.map((slice) => ({ milestoneId, sliceId: slice.id })));
|
|
47
|
+
for (const tasks of tasksBySlice.values()) {
|
|
47
48
|
for (const task of tasks) {
|
|
48
49
|
if (Array.isArray(task.files)) {
|
|
49
50
|
for (const f of task.files) {
|
|
@@ -72,6 +72,7 @@ interface WorkerView {
|
|
|
72
72
|
totalSlices: number;
|
|
73
73
|
doneSlices: number;
|
|
74
74
|
slices: SliceProgress[];
|
|
75
|
+
completions: string[];
|
|
75
76
|
errors: string[];
|
|
76
77
|
}
|
|
77
78
|
|
|
@@ -143,14 +144,21 @@ function discoverWorkers(basePath: string): string[] {
|
|
|
143
144
|
return [...mids].sort();
|
|
144
145
|
}
|
|
145
146
|
|
|
146
|
-
|
|
147
|
+
// Slice progress + recent completions share one DB connection per worker per
|
|
148
|
+
// tick. Opening the isolated worker DB twice per refresh (once for each) was
|
|
149
|
+
// pure churn on the 5s interval.
|
|
150
|
+
function queryWorkerProgress(
|
|
151
|
+
basePath: string,
|
|
152
|
+
mid: string,
|
|
153
|
+
workRoot: string = worktreePathFor(basePath, mid),
|
|
154
|
+
): { slices: SliceProgress[]; completions: string[] } {
|
|
147
155
|
const dbPath = resolveGsdPathContract(workRoot, basePath).projectDb;
|
|
148
|
-
if (!existsSync(dbPath)) return [];
|
|
156
|
+
if (!existsSync(dbPath)) return { slices: [], completions: [] };
|
|
149
157
|
|
|
150
158
|
const db = openWorkflowDatabaseIsolated(dbPath);
|
|
151
|
-
if (!db) return [];
|
|
159
|
+
if (!db) return { slices: [], completions: [] };
|
|
152
160
|
try {
|
|
153
|
-
const
|
|
161
|
+
const sliceRows = db.prepare(
|
|
154
162
|
`SELECT
|
|
155
163
|
s.id AS id,
|
|
156
164
|
s.status AS status,
|
|
@@ -162,14 +170,32 @@ function querySliceProgress(basePath: string, mid: string, workRoot: string = wo
|
|
|
162
170
|
GROUP BY s.id
|
|
163
171
|
ORDER BY s.id`,
|
|
164
172
|
).all({ ":mid": mid });
|
|
165
|
-
|
|
173
|
+
const slices = sliceRows.map((row) => ({
|
|
166
174
|
id: String(row["id"] ?? ""),
|
|
167
175
|
status: String(row["status"] ?? ""),
|
|
168
176
|
total: Number(row["total"] ?? 0),
|
|
169
177
|
done: Number(row["done"] ?? 0),
|
|
170
178
|
}));
|
|
179
|
+
|
|
180
|
+
const completionRows = db.prepare(
|
|
181
|
+
`SELECT id, slice_id, one_liner
|
|
182
|
+
FROM tasks
|
|
183
|
+
WHERE milestone_id=:mid
|
|
184
|
+
AND status='complete'
|
|
185
|
+
AND completed_at IS NOT NULL
|
|
186
|
+
ORDER BY completed_at DESC
|
|
187
|
+
LIMIT 5`,
|
|
188
|
+
).all({ ":mid": mid });
|
|
189
|
+
const completions = completionRows.map((row) => {
|
|
190
|
+
const taskId = String(row["id"] ?? "");
|
|
191
|
+
const sliceId = String(row["slice_id"] ?? "");
|
|
192
|
+
const oneLiner = String(row["one_liner"] ?? "");
|
|
193
|
+
return `✓ ${mid}/${sliceId}/${taskId}${oneLiner ? ": " + oneLiner : ""}`;
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
return { slices, completions };
|
|
171
197
|
} catch {
|
|
172
|
-
return [];
|
|
198
|
+
return { slices: [], completions: [] };
|
|
173
199
|
} finally {
|
|
174
200
|
try { db.close(); } catch { /* ignore */ }
|
|
175
201
|
}
|
|
@@ -276,36 +302,6 @@ function extractCostFromNdjson(basePath: string, mid: string): number {
|
|
|
276
302
|
}
|
|
277
303
|
}
|
|
278
304
|
|
|
279
|
-
function queryRecentCompletions(basePath: string, mid: string): string[] {
|
|
280
|
-
const workRoot = worktreePathFor(basePath, mid);
|
|
281
|
-
const dbPath = resolveGsdPathContract(workRoot, basePath).projectDb;
|
|
282
|
-
if (!existsSync(dbPath)) return [];
|
|
283
|
-
|
|
284
|
-
const db = openWorkflowDatabaseIsolated(dbPath);
|
|
285
|
-
if (!db) return [];
|
|
286
|
-
try {
|
|
287
|
-
const rows = db.prepare(
|
|
288
|
-
`SELECT id, slice_id, one_liner
|
|
289
|
-
FROM tasks
|
|
290
|
-
WHERE milestone_id=:mid
|
|
291
|
-
AND status='complete'
|
|
292
|
-
AND completed_at IS NOT NULL
|
|
293
|
-
ORDER BY completed_at DESC
|
|
294
|
-
LIMIT 5`,
|
|
295
|
-
).all({ ":mid": mid });
|
|
296
|
-
return rows.map((row) => {
|
|
297
|
-
const taskId = String(row["id"] ?? "");
|
|
298
|
-
const sliceId = String(row["slice_id"] ?? "");
|
|
299
|
-
const oneLiner = String(row["one_liner"] ?? "");
|
|
300
|
-
return `✓ ${mid}/${sliceId}/${taskId}${oneLiner ? ": " + oneLiner : ""}`;
|
|
301
|
-
});
|
|
302
|
-
} catch {
|
|
303
|
-
return [];
|
|
304
|
-
} finally {
|
|
305
|
-
try { db.close(); } catch { /* ignore */ }
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
|
|
309
305
|
function collectWorkerData(basePath: string): WorkerView[] {
|
|
310
306
|
const mids = discoverWorkers(basePath);
|
|
311
307
|
const parallelDir = join(basePath, ".gsd", "parallel");
|
|
@@ -317,7 +313,7 @@ function collectWorkerData(basePath: string): WorkerView[] {
|
|
|
317
313
|
const workRoot = worktreePathFor(basePath, mid);
|
|
318
314
|
const status = readJsonSafe<StatusJson>(join(parallelDir, `${mid}.status.json`));
|
|
319
315
|
const lock = readJsonSafe<AutoLock>(join(workRoot, ".gsd", "auto.lock"));
|
|
320
|
-
const slices =
|
|
316
|
+
const { slices, completions } = queryWorkerProgress(basePath, mid, workRoot);
|
|
321
317
|
|
|
322
318
|
const pid = lock?.pid || status?.pid || 0;
|
|
323
319
|
const alive = pid ? isPidAlive(pid) : false;
|
|
@@ -378,6 +374,7 @@ function collectWorkerData(basePath: string): WorkerView[] {
|
|
|
378
374
|
totalSlices: slices.length,
|
|
379
375
|
doneSlices,
|
|
380
376
|
slices,
|
|
377
|
+
completions,
|
|
381
378
|
errors,
|
|
382
379
|
});
|
|
383
380
|
}
|
|
@@ -443,10 +440,10 @@ export class ParallelMonitorOverlay {
|
|
|
443
440
|
if (this.disposed) return;
|
|
444
441
|
this.workers = collectWorkerData(this.basePath);
|
|
445
442
|
|
|
446
|
-
// Collect completion events
|
|
443
|
+
// Collect completion events (already read during collectWorkerData's single
|
|
444
|
+
// DB open per worker — no second connection here).
|
|
447
445
|
for (const wk of this.workers) {
|
|
448
|
-
const
|
|
449
|
-
for (const evt of completions) {
|
|
446
|
+
for (const evt of wk.completions) {
|
|
450
447
|
if (!this.events.includes(evt)) this.events.push(evt);
|
|
451
448
|
}
|
|
452
449
|
}
|
|
@@ -136,6 +136,14 @@ function cachedReaddir(dirPath: string): string[] {
|
|
|
136
136
|
return entries;
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
+
function isExistingFile(path: string): boolean {
|
|
140
|
+
try {
|
|
141
|
+
return statSync(path).isFile();
|
|
142
|
+
} catch {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
139
147
|
/**
|
|
140
148
|
* Clear the volatile directory listing caches.
|
|
141
149
|
* Call after milestone transitions, file creation in planning directories,
|
|
@@ -223,6 +231,26 @@ export function buildTaskFileName(taskId: string, suffix: string): string {
|
|
|
223
231
|
return `${taskId}-${suffix}.md`;
|
|
224
232
|
}
|
|
225
233
|
|
|
234
|
+
/**
|
|
235
|
+
* Build a flat-phase task artifact file name.
|
|
236
|
+
* ("S06", "T03", "SUMMARY") → "S06-T03-SUMMARY.md"
|
|
237
|
+
*/
|
|
238
|
+
export function buildFlatTaskFileName(sliceId: string, taskId: string, suffix: string): string {
|
|
239
|
+
return `${sliceId}-${taskId}-${suffix}.md`;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Extract the task ID from a task artifact filename.
|
|
244
|
+
* Supports flat-phase S##-T##-SUFFIX.md plus legacy T##-SUFFIX.md and
|
|
245
|
+
* T##-DESCRIPTOR-SUFFIX.md names.
|
|
246
|
+
*/
|
|
247
|
+
export function taskIdFromTaskFileName(fileName: string, suffix: string): string | null {
|
|
248
|
+
const flat = new RegExp(`^S\\d+-(T\\d+)-${suffix}\\.md$`, "i").exec(fileName);
|
|
249
|
+
if (flat?.[1]) return flat[1].toUpperCase();
|
|
250
|
+
const legacy = new RegExp(`^(T\\d+)(?:-.*)?-${suffix}\\.md$`, "i").exec(fileName);
|
|
251
|
+
return legacy?.[1]?.toUpperCase() ?? null;
|
|
252
|
+
}
|
|
253
|
+
|
|
226
254
|
// ─── Resolvers ─────────────────────────────────────────────────────────────
|
|
227
255
|
|
|
228
256
|
/**
|
|
@@ -264,7 +292,7 @@ export function resolveFile(dir: string, idPrefix: string, suffix: string): stri
|
|
|
264
292
|
if (!existsSync(dir)) return null;
|
|
265
293
|
const target = `${idPrefix}-${suffix}.md`.toUpperCase();
|
|
266
294
|
try {
|
|
267
|
-
const entries =
|
|
295
|
+
const entries = cachedReaddirWithTypes(dir).filter(e => e.isFile()).map(e => e.name);
|
|
268
296
|
// Direct match: ID-SUFFIX.md
|
|
269
297
|
const direct = entries.find(e => e.toUpperCase() === target);
|
|
270
298
|
if (direct) return direct;
|
|
@@ -284,18 +312,17 @@ export function resolveFile(dir: string, idPrefix: string, suffix: string): stri
|
|
|
284
312
|
}
|
|
285
313
|
|
|
286
314
|
/**
|
|
287
|
-
* Find all task files matching a pattern in a tasks directory.
|
|
288
|
-
* Returns sorted file names matching T##-SUFFIX.md
|
|
315
|
+
* Find all task files matching a pattern in a tasks directory or flat phase dir.
|
|
316
|
+
* Returns sorted file names matching S##-T##-SUFFIX.md, T##-SUFFIX.md,
|
|
317
|
+
* or legacy T##-*-SUFFIX.md.
|
|
289
318
|
*/
|
|
290
319
|
export function resolveTaskFiles(tasksDir: string, suffix: string): string[] {
|
|
291
320
|
if (!existsSync(tasksDir)) return [];
|
|
292
321
|
try {
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
return cachedReaddir(tasksDir)
|
|
298
|
-
.filter(f => currentPattern.test(f) || legacyPattern.test(f))
|
|
322
|
+
return cachedReaddirWithTypes(tasksDir)
|
|
323
|
+
.filter(e => e.isFile())
|
|
324
|
+
.map(e => e.name)
|
|
325
|
+
.filter(f => taskIdFromTaskFileName(f, suffix) !== null)
|
|
299
326
|
.sort();
|
|
300
327
|
} catch {
|
|
301
328
|
return [];
|
|
@@ -618,17 +645,20 @@ function legacyMilestonesHasSubdirs(basePath: string): boolean {
|
|
|
618
645
|
* See the matching TODO in markdown-renderer.ts detectStaleRenders, which
|
|
619
646
|
* disabled stale-render detection for the same reason.
|
|
620
647
|
*/
|
|
648
|
+
const LEGACY_MILESTONE_RUNTIME_DIRS = new Set(["anchors"]);
|
|
649
|
+
|
|
621
650
|
export function dirIsContentBearingLegacyMilestone(dir: string): boolean {
|
|
622
651
|
try {
|
|
623
652
|
const entries = readdirSync(dir, { withFileTypes: true });
|
|
624
653
|
// 1. Any non-META regular file → real legacy content.
|
|
625
654
|
if (entries.some(e => e.isFile() && !e.name.endsWith("-META.json"))) return true;
|
|
626
|
-
// 2. A non-empty subdirectory → real legacy content (e.g. slices/ with slice dirs).
|
|
655
|
+
// 2. A non-empty non-runtime subdirectory → real legacy content (e.g. slices/ with slice dirs).
|
|
627
656
|
// An *empty* subdir is treated as scaffolding (e.g. git-service.ts may create
|
|
628
657
|
// an empty slices/ alongside the integration META file) and must NOT flip the
|
|
629
658
|
// layout — that is the Bugbot finding this guard addresses.
|
|
630
659
|
return entries.some(e => {
|
|
631
660
|
if (!e.isDirectory()) return false;
|
|
661
|
+
if (LEGACY_MILESTONE_RUNTIME_DIRS.has(e.name)) return false;
|
|
632
662
|
try { return readdirSync(join(dir, e.name)).length > 0; } catch { return false; }
|
|
633
663
|
});
|
|
634
664
|
} catch {
|
|
@@ -840,7 +870,7 @@ export function resolveMilestoneFile(
|
|
|
840
870
|
const prefix = `${String(phaseNum).padStart(2, "0")}`;
|
|
841
871
|
const flatName = `${prefix}-${suffix}.md`;
|
|
842
872
|
const flatPath = join(mDir, flatName);
|
|
843
|
-
if (
|
|
873
|
+
if (isExistingFile(flatPath)) return flatPath;
|
|
844
874
|
// Legacy fallback: M001-SUFFIX.md
|
|
845
875
|
const file = resolveFile(mDir, milestoneId, suffix);
|
|
846
876
|
return file ? join(mDir, file) : null;
|
|
@@ -875,11 +905,11 @@ export function resolveSliceFile(
|
|
|
875
905
|
const planNum = sliceIdToPlanNum(sliceId);
|
|
876
906
|
const flatName = planFileName(phaseNum, planNum, suffix);
|
|
877
907
|
const flatPath = join(phaseDir, flatName);
|
|
878
|
-
if (
|
|
908
|
+
if (isExistingFile(flatPath)) return flatPath;
|
|
879
909
|
// Also check plan-number-only format MM-SUFFIX.md (written by buildSliceFileName)
|
|
880
910
|
const planOnlyName = `${String(planNum).padStart(2, "0")}-${suffix}.md`;
|
|
881
911
|
const planOnlyPath = join(phaseDir, planOnlyName);
|
|
882
|
-
if (
|
|
912
|
+
if (isExistingFile(planOnlyPath)) return planOnlyPath;
|
|
883
913
|
// Try prefix match for the phase+plan number (handles suffix variations)
|
|
884
914
|
const planPrefix = `${String(phaseNum).padStart(2, "0")}-${String(planNum).padStart(2, "0")}-`;
|
|
885
915
|
try {
|
|
@@ -928,8 +958,10 @@ export function resolveTaskFile(
|
|
|
928
958
|
const isLegacy = phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\");
|
|
929
959
|
|
|
930
960
|
if (suffix !== "PLAN" && !isLegacy) {
|
|
931
|
-
const flatPath = join(phaseDir,
|
|
932
|
-
|
|
961
|
+
const flatPath = join(phaseDir, buildFlatTaskFileName(sliceId, taskId, suffix));
|
|
962
|
+
if (isExistingFile(flatPath)) return flatPath;
|
|
963
|
+
const legacyFlatPath = join(phaseDir, buildTaskFileName(taskId, suffix));
|
|
964
|
+
return isExistingFile(legacyFlatPath) ? legacyFlatPath : null;
|
|
933
965
|
}
|
|
934
966
|
|
|
935
967
|
const tDir = resolveTasksDir(basePath, milestoneId, sliceId);
|
|
@@ -1063,6 +1095,35 @@ export function targetSliceFile(
|
|
|
1063
1095
|
return join(dir, fileName);
|
|
1064
1096
|
}
|
|
1065
1097
|
|
|
1098
|
+
/**
|
|
1099
|
+
* Build the canonical absolute write target for a task file.
|
|
1100
|
+
* Readers that need legacy flat-phase fallback should call resolveTaskFile.
|
|
1101
|
+
*/
|
|
1102
|
+
export function targetTaskFile(
|
|
1103
|
+
basePath: string, milestoneId: string, sliceId: string,
|
|
1104
|
+
taskId: string, suffix: string, milestoneTitle?: string
|
|
1105
|
+
): string {
|
|
1106
|
+
if (suffix === "PLAN") {
|
|
1107
|
+
return targetSliceFile(basePath, milestoneId, sliceId, "PLAN", milestoneTitle);
|
|
1108
|
+
}
|
|
1109
|
+
|
|
1110
|
+
const mDir = resolveMilestonePath(basePath, milestoneId);
|
|
1111
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
1112
|
+
const isLegacy = mDir
|
|
1113
|
+
? mDir.startsWith(legacyBase + "/") || mDir.startsWith(legacyBase + "\\")
|
|
1114
|
+
: isLegacyMilestonesLayout(basePath);
|
|
1115
|
+
const milestoneDir = mDir
|
|
1116
|
+
?? dirname(targetMilestoneFile(basePath, milestoneId, "ROADMAP", milestoneTitle));
|
|
1117
|
+
|
|
1118
|
+
if (isLegacy) {
|
|
1119
|
+
const slicesDir = join(milestoneDir, "slices");
|
|
1120
|
+
const sliceDir = join(slicesDir, resolveDir(slicesDir, sliceId) ?? sliceId);
|
|
1121
|
+
return join(sliceDir, "tasks", buildTaskFileName(taskId, suffix));
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
return join(milestoneDir, buildFlatTaskFileName(sliceId, taskId, suffix));
|
|
1125
|
+
}
|
|
1126
|
+
|
|
1066
1127
|
/**
|
|
1067
1128
|
* Build relative .gsd/ path to a slice file.
|
|
1068
1129
|
* Preserves an existing compatibility filename when present; otherwise falls
|
|
@@ -1102,5 +1163,5 @@ export function relTaskFile(
|
|
|
1102
1163
|
return relSliceFile(basePath, milestoneId, sliceId, "PLAN");
|
|
1103
1164
|
}
|
|
1104
1165
|
const relS = relSlicePath(basePath, milestoneId, sliceId, milestoneTitle);
|
|
1105
|
-
return `${relS}/${
|
|
1166
|
+
return `${relS}/${buildFlatTaskFileName(sliceId, taskId, suffix)}`;
|
|
1106
1167
|
}
|
|
@@ -19,13 +19,17 @@ export interface PhaseAnchor {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
function anchorsDir(basePath: string, milestoneId: string): string {
|
|
22
|
-
return join(gsdRoot(basePath), "
|
|
22
|
+
return join(gsdRoot(basePath), "runtime", "anchors", milestoneId);
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
function anchorPath(basePath: string, milestoneId: string, phase: string): string {
|
|
26
26
|
return join(anchorsDir(basePath, milestoneId), `${phase}.json`);
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
function legacyAnchorPath(basePath: string, milestoneId: string, phase: string): string {
|
|
30
|
+
return join(gsdRoot(basePath), "milestones", milestoneId, "anchors", `${phase}.json`);
|
|
31
|
+
}
|
|
32
|
+
|
|
29
33
|
export function writePhaseAnchor(basePath: string, milestoneId: string, anchor: PhaseAnchor): void {
|
|
30
34
|
const dir = anchorsDir(basePath, milestoneId);
|
|
31
35
|
if (!existsSync(dir)) {
|
|
@@ -35,7 +39,9 @@ export function writePhaseAnchor(basePath: string, milestoneId: string, anchor:
|
|
|
35
39
|
}
|
|
36
40
|
|
|
37
41
|
export function readPhaseAnchor(basePath: string, milestoneId: string, phase: string): PhaseAnchor | null {
|
|
38
|
-
const path = anchorPath(basePath, milestoneId, phase)
|
|
42
|
+
const path = existsSync(anchorPath(basePath, milestoneId, phase))
|
|
43
|
+
? anchorPath(basePath, milestoneId, phase)
|
|
44
|
+
: legacyAnchorPath(basePath, milestoneId, phase);
|
|
39
45
|
if (!existsSync(path)) return null;
|
|
40
46
|
try {
|
|
41
47
|
return JSON.parse(readFileSync(path, "utf-8")) as PhaseAnchor;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { CONFIGURABLE_PLANNING_SUBAGENT_UNITS, type GSDPreferences } from "./preferences-types.js";
|
|
2
|
+
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
3
|
+
import type { ToolsPolicy } from "./unit-context-manifest.js";
|
|
4
|
+
|
|
5
|
+
const CONFIGURABLE_UNITS = new Set<string>(CONFIGURABLE_PLANNING_SUBAGENT_UNITS);
|
|
6
|
+
|
|
7
|
+
function configuredAllowedSubagents(
|
|
8
|
+
unitType: string,
|
|
9
|
+
preferences: GSDPreferences | null | undefined,
|
|
10
|
+
): readonly string[] {
|
|
11
|
+
if (!CONFIGURABLE_UNITS.has(unitType)) return [];
|
|
12
|
+
return preferences?.planning_subagents?.[
|
|
13
|
+
unitType as keyof NonNullable<GSDPreferences["planning_subagents"]>
|
|
14
|
+
]?.allowed ?? [];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function mergeAllowedSubagents(
|
|
18
|
+
current: readonly string[],
|
|
19
|
+
configured: readonly string[],
|
|
20
|
+
): readonly string[] {
|
|
21
|
+
return Array.from(new Set([...current, ...configured]));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function applyPlanningSubagentPreferences(
|
|
25
|
+
unitType: string,
|
|
26
|
+
policy: ToolsPolicy | null | undefined,
|
|
27
|
+
preferences: GSDPreferences | null | undefined,
|
|
28
|
+
): ToolsPolicy | null | undefined {
|
|
29
|
+
if (!policy) return policy;
|
|
30
|
+
const configured = configuredAllowedSubagents(unitType, preferences);
|
|
31
|
+
if (configured.length === 0) return policy;
|
|
32
|
+
|
|
33
|
+
if (policy.mode === "planning") {
|
|
34
|
+
return {
|
|
35
|
+
mode: "planning-dispatch",
|
|
36
|
+
allowedSubagents: mergeAllowedSubagents([], configured),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (policy.mode === "planning-dispatch") {
|
|
41
|
+
return {
|
|
42
|
+
...policy,
|
|
43
|
+
allowedSubagents: mergeAllowedSubagents(policy.allowedSubagents, configured),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return policy;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function resolveEffectivePlanningToolsPolicy(
|
|
51
|
+
unitType: string,
|
|
52
|
+
policy: ToolsPolicy | null | undefined,
|
|
53
|
+
basePath?: string,
|
|
54
|
+
): ToolsPolicy | null | undefined {
|
|
55
|
+
if (!basePath) return policy;
|
|
56
|
+
const preferences = loadEffectiveGSDPreferences(basePath)?.preferences;
|
|
57
|
+
return applyPlanningSubagentPreferences(unitType, policy, preferences);
|
|
58
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Read-only planning specialists that controlled planning dispatch may use.
|
|
3
|
+
*
|
|
4
|
+
* Unit manifests and project preferences still declare per-unit subsets. This
|
|
5
|
+
* registry is the global safety classification checked by the write gate and
|
|
6
|
+
* preference validation before any configured planning allowlist takes effect.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const PLANNING_DISPATCH_AGENT_REGISTRY = {
|
|
10
|
+
mnemo: { readOnlySpecialist: true },
|
|
11
|
+
scout: { readOnlySpecialist: true },
|
|
12
|
+
planner: { readOnlySpecialist: true },
|
|
13
|
+
reviewer: { readOnlySpecialist: true },
|
|
14
|
+
security: { readOnlySpecialist: true },
|
|
15
|
+
tester: { readOnlySpecialist: true },
|
|
16
|
+
} as const satisfies Record<string, { readonly readOnlySpecialist: boolean }>;
|
|
17
|
+
|
|
18
|
+
export const ALLOWED_PLANNING_DISPATCH_AGENTS = new Set<string>(
|
|
19
|
+
Object.entries(PLANNING_DISPATCH_AGENT_REGISTRY)
|
|
20
|
+
.filter(([, metadata]) => metadata.readOnlySpecialist)
|
|
21
|
+
.map(([agentId]) => agentId),
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
export function isReadOnlyPlanningDispatchAgent(agentId: string): boolean {
|
|
25
|
+
const metadata = PLANNING_DISPATCH_AGENT_REGISTRY[agentId as keyof typeof PLANNING_DISPATCH_AGENT_REGISTRY];
|
|
26
|
+
return metadata?.readOnlySpecialist === true;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function allowedPlanningDispatchAgentsList(): string {
|
|
30
|
+
return [...ALLOWED_PLANNING_DISPATCH_AGENTS].join(", ");
|
|
31
|
+
}
|
|
@@ -318,12 +318,12 @@ export function checkImportResolution(
|
|
|
318
318
|
const imports = extractRelativeImports(source);
|
|
319
319
|
|
|
320
320
|
for (const { importPath, lineNum } of imports) {
|
|
321
|
-
// Framework-generated
|
|
322
|
-
// checks
|
|
323
|
-
// block task completion on these imports.
|
|
321
|
+
// Framework/codegen-generated modules may not exist on disk during
|
|
322
|
+
// post-exec checks. Don't block task completion on these imports.
|
|
324
323
|
if (
|
|
325
324
|
/^\.{1,2}\/\+types\//.test(importPath) ||
|
|
326
|
-
/^(?:\.{1,2}\/)+(?:[^/]+\/)*\$types(?:$|\/)/.test(importPath)
|
|
325
|
+
/^(?:\.{1,2}\/)+(?:[^/]+\/)*\$types(?:$|\/)/.test(importPath) ||
|
|
326
|
+
/^(?:\.{1,2}\/)+(?:[^/]+\/)*_generated(?:$|\/)/.test(importPath)
|
|
327
327
|
) {
|
|
328
328
|
continue;
|
|
329
329
|
}
|
|
@@ -141,6 +141,7 @@ export const KNOWN_PREFERENCE_KEYS = new Set<string>([
|
|
|
141
141
|
"git",
|
|
142
142
|
"post_unit_hooks",
|
|
143
143
|
"pre_dispatch_hooks",
|
|
144
|
+
"planning_subagents",
|
|
144
145
|
"dynamic_routing",
|
|
145
146
|
"disabled_model_providers",
|
|
146
147
|
"uok",
|
|
@@ -217,6 +218,20 @@ export const KNOWN_UNIT_LABELS = [
|
|
|
217
218
|
] as const;
|
|
218
219
|
export type UnitLabel = (typeof KNOWN_UNIT_LABELS)[number];
|
|
219
220
|
|
|
221
|
+
export const CONFIGURABLE_PLANNING_SUBAGENT_UNITS = [
|
|
222
|
+
"plan-milestone",
|
|
223
|
+
"plan-slice",
|
|
224
|
+
] as const;
|
|
225
|
+
export type ConfigurablePlanningSubagentUnit = (typeof CONFIGURABLE_PLANNING_SUBAGENT_UNITS)[number];
|
|
226
|
+
|
|
227
|
+
export interface PlanningSubagentUnitConfig {
|
|
228
|
+
allowed?: string[];
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export type PlanningSubagentsConfig = Partial<
|
|
232
|
+
Record<ConfigurablePlanningSubagentUnit, PlanningSubagentUnitConfig>
|
|
233
|
+
>;
|
|
234
|
+
|
|
220
235
|
|
|
221
236
|
export const SKILL_ACTIONS = new Set(["use", "prefer", "avoid"]);
|
|
222
237
|
|
|
@@ -476,6 +491,7 @@ export interface GSDPreferences {
|
|
|
476
491
|
git?: GitPreferences;
|
|
477
492
|
post_unit_hooks?: PostUnitHookConfig[];
|
|
478
493
|
pre_dispatch_hooks?: PreDispatchHookConfig[];
|
|
494
|
+
planning_subagents?: PlanningSubagentsConfig;
|
|
479
495
|
dynamic_routing?: DynamicRoutingConfig;
|
|
480
496
|
/** Provider IDs to exclude from /model and automatic model routing while leaving tool auth intact. */
|
|
481
497
|
disabled_model_providers?: string[];
|
|
@@ -17,6 +17,7 @@ import { getGateIdsForTurn } from "./gate-registry.js";
|
|
|
17
17
|
import {
|
|
18
18
|
KNOWN_PREFERENCE_KEYS,
|
|
19
19
|
KNOWN_UNIT_LABELS,
|
|
20
|
+
CONFIGURABLE_PLANNING_SUBAGENT_UNITS,
|
|
20
21
|
GSD_MODEL_PHASE_KEYS,
|
|
21
22
|
|
|
22
23
|
SKILL_ACTIONS,
|
|
@@ -26,6 +27,10 @@ import {
|
|
|
26
27
|
type GSDSkillRule,
|
|
27
28
|
type GSDThinkingLevel,
|
|
28
29
|
} from "./preferences-types.js";
|
|
30
|
+
import {
|
|
31
|
+
ALLOWED_PLANNING_DISPATCH_AGENTS,
|
|
32
|
+
allowedPlanningDispatchAgentsList,
|
|
33
|
+
} from "./planning-subagent-registry.js";
|
|
29
34
|
|
|
30
35
|
const VALID_TOKEN_PROFILES = new Set<TokenProfile>(["budget", "balanced", "quality", "burn-max"]);
|
|
31
36
|
const VALID_THINKING_LEVELS = new Set<GSDThinkingLevel>([
|
|
@@ -747,6 +752,63 @@ export function validatePreferences(preferences: GSDPreferences): {
|
|
|
747
752
|
}
|
|
748
753
|
}
|
|
749
754
|
|
|
755
|
+
// ─── Planning Subagents ─────────────────────────────────────────────────
|
|
756
|
+
if (preferences.planning_subagents !== undefined) {
|
|
757
|
+
if (
|
|
758
|
+
!preferences.planning_subagents ||
|
|
759
|
+
typeof preferences.planning_subagents !== "object" ||
|
|
760
|
+
Array.isArray(preferences.planning_subagents)
|
|
761
|
+
) {
|
|
762
|
+
errors.push("planning_subagents must be an object keyed by planning unit type");
|
|
763
|
+
} else {
|
|
764
|
+
const validUnits = new Set<string>(CONFIGURABLE_PLANNING_SUBAGENT_UNITS);
|
|
765
|
+
const validPlanningSubagents: NonNullable<GSDPreferences["planning_subagents"]> = {};
|
|
766
|
+
|
|
767
|
+
for (const [unitType, rawConfig] of Object.entries(preferences.planning_subagents as Record<string, unknown>)) {
|
|
768
|
+
if (!validUnits.has(unitType)) {
|
|
769
|
+
errors.push(
|
|
770
|
+
`planning_subagents unknown or unsupported unit "${unitType}" — supported units: ` +
|
|
771
|
+
`${CONFIGURABLE_PLANNING_SUBAGENT_UNITS.join(", ")}`,
|
|
772
|
+
);
|
|
773
|
+
continue;
|
|
774
|
+
}
|
|
775
|
+
if (!rawConfig || typeof rawConfig !== "object" || Array.isArray(rawConfig)) {
|
|
776
|
+
errors.push(`planning_subagents.${unitType} must be an object with an allowed array`);
|
|
777
|
+
continue;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
const allowed = normalizeStringArray((rawConfig as Record<string, unknown>).allowed);
|
|
781
|
+
if (allowed.length === 0) {
|
|
782
|
+
errors.push(`planning_subagents.${unitType}.allowed must include at least one read-only planning specialist`);
|
|
783
|
+
continue;
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
const sanitizedAllowed: string[] = [];
|
|
787
|
+
for (const agentId of allowed) {
|
|
788
|
+
if (!ALLOWED_PLANNING_DISPATCH_AGENTS.has(agentId)) {
|
|
789
|
+
errors.push(
|
|
790
|
+
`planning_subagents.${unitType}.allowed includes "${agentId}", which is not classified as a ` +
|
|
791
|
+
`read-only planning specialist. Allowed agents: ${allowedPlanningDispatchAgentsList()}`,
|
|
792
|
+
);
|
|
793
|
+
continue;
|
|
794
|
+
}
|
|
795
|
+
sanitizedAllowed.push(agentId);
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
const dedupedAllowed = Array.from(new Set(sanitizedAllowed));
|
|
799
|
+
if (dedupedAllowed.length > 0) {
|
|
800
|
+
validPlanningSubagents[unitType as keyof NonNullable<GSDPreferences["planning_subagents"]>] = {
|
|
801
|
+
allowed: dedupedAllowed,
|
|
802
|
+
};
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
if (Object.keys(validPlanningSubagents).length > 0) {
|
|
807
|
+
validated.planning_subagents = validPlanningSubagents;
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
|
|
750
812
|
// ─── Dynamic Routing ─────────────────────────────────────────────────
|
|
751
813
|
if (preferences.dynamic_routing !== undefined) {
|
|
752
814
|
if (typeof preferences.dynamic_routing === "object" && preferences.dynamic_routing !== null) {
|