@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
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// gsd-pi - /gsd migrate presentation helpers.
|
|
2
|
+
// File Purpose: Pure formatting for migration previews and post-write review prompts.
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { gsdRoot } from "../paths.js";
|
|
7
|
+
function formatRequirements(preview) {
|
|
8
|
+
if (preview.requirements.total === 0)
|
|
9
|
+
return null;
|
|
10
|
+
return `Requirements: ${preview.requirements.total} (${preview.requirements.validated} validated, ${preview.requirements.active} active, ${preview.requirements.deferred} deferred, ${preview.requirements.outOfScope} out of scope)`;
|
|
11
|
+
}
|
|
12
|
+
function formatLegacyInputs(preview) {
|
|
13
|
+
if (!preview.migrationInputs)
|
|
14
|
+
return null;
|
|
15
|
+
return `Legacy inputs: ${preview.migrationInputs.milestonePhaseDirs} milestone phase dir(s), ${preview.migrationInputs.decisions} decision file(s), ${preview.migrationInputs.seeds} seed file(s)`;
|
|
16
|
+
}
|
|
17
|
+
export function buildMigrationPreviewSummary(preview, targetRoot) {
|
|
18
|
+
const lines = [
|
|
19
|
+
`Decisions: ${preview.decisions.total}`,
|
|
20
|
+
`Milestones: ${preview.milestoneCount}`,
|
|
21
|
+
`Slices: ${preview.totalSlices} (${preview.doneSlices} done — ${preview.sliceCompletionPct}%)`,
|
|
22
|
+
`Tasks: ${preview.totalTasks} (${preview.doneTasks} done — ${preview.taskCompletionPct}%)`,
|
|
23
|
+
];
|
|
24
|
+
const requirements = formatRequirements(preview);
|
|
25
|
+
if (requirements)
|
|
26
|
+
lines.push(requirements);
|
|
27
|
+
const legacyInputs = formatLegacyInputs(preview);
|
|
28
|
+
if (legacyInputs)
|
|
29
|
+
lines.push(legacyInputs);
|
|
30
|
+
const targetGsdPath = gsdRoot(targetRoot);
|
|
31
|
+
if (existsSync(targetGsdPath)) {
|
|
32
|
+
lines.push("");
|
|
33
|
+
lines.push(`⚠ A .gsd directory already exists at ${targetGsdPath}.`);
|
|
34
|
+
lines.push("It will be backed up, deleted, and rewritten fresh before DB import.");
|
|
35
|
+
}
|
|
36
|
+
return lines;
|
|
37
|
+
}
|
|
38
|
+
export function formatMigrationPreviewStats(preview) {
|
|
39
|
+
const lines = [
|
|
40
|
+
`- Decisions: ${preview.decisions.total}`,
|
|
41
|
+
`- Milestones: ${preview.milestoneCount}`,
|
|
42
|
+
`- Slices: ${preview.totalSlices} (${preview.doneSlices} done — ${preview.sliceCompletionPct}%)`,
|
|
43
|
+
`- Tasks: ${preview.totalTasks} (${preview.doneTasks} done — ${preview.taskCompletionPct}%)`,
|
|
44
|
+
];
|
|
45
|
+
const requirements = formatRequirements(preview);
|
|
46
|
+
if (requirements)
|
|
47
|
+
lines.push(`- ${requirements}`);
|
|
48
|
+
const legacyInputs = formatLegacyInputs(preview);
|
|
49
|
+
if (legacyInputs)
|
|
50
|
+
lines.push(`- ${legacyInputs}`);
|
|
51
|
+
return lines.join("\n");
|
|
52
|
+
}
|
|
53
|
+
function defaultReviewTemplatePath() {
|
|
54
|
+
const promptsDir = join(dirname(fileURLToPath(import.meta.url)), "..", "prompts");
|
|
55
|
+
return join(promptsDir, "review-migration.md");
|
|
56
|
+
}
|
|
57
|
+
export function buildReviewPrompt(input) {
|
|
58
|
+
const templatePath = input.templatePath ?? defaultReviewTemplatePath();
|
|
59
|
+
let content = readFileSync(templatePath, "utf-8");
|
|
60
|
+
content = content.replaceAll("{{sourcePath}}", input.sourcePath);
|
|
61
|
+
content = content.replaceAll("{{gsdPath}}", input.gsdPath);
|
|
62
|
+
content = content.replaceAll("{{previewStats}}", formatMigrationPreviewStats(input.preview));
|
|
63
|
+
return content.trim();
|
|
64
|
+
}
|
|
@@ -48,6 +48,8 @@ export const BUNDLED_COST_TABLE = [
|
|
|
48
48
|
// GPT-5.5 API list price, also used for live Codex OAuth routing.
|
|
49
49
|
// Source: https://openai.com/api/pricing/
|
|
50
50
|
{ id: "gpt-5.5", inputPer1k: 0.005, outputPer1k: 0.03, updatedAt: "2026-04-23" },
|
|
51
|
+
// Mirrors gpt-5.5 list pricing until OpenAI publishes official gpt-5.6 pricing.
|
|
52
|
+
{ id: "gpt-5.6", inputPer1k: 0.005, outputPer1k: 0.03, updatedAt: "2026-07-08" },
|
|
51
53
|
// Google
|
|
52
54
|
{ id: "gemini-2.0-flash", inputPer1k: 0.0001, outputPer1k: 0.0004, updatedAt: "2025-03-15" },
|
|
53
55
|
{ id: "gemini-flash-2.0", inputPer1k: 0.0001, outputPer1k: 0.0004, updatedAt: "2025-03-15" },
|
|
@@ -46,10 +46,12 @@ export const MODEL_CAPABILITY_TIER = {
|
|
|
46
46
|
"gpt-5.3-codex": "heavy",
|
|
47
47
|
"gpt-5.4": "heavy",
|
|
48
48
|
"gpt-5.5": "heavy",
|
|
49
|
+
"gpt-5.6": "heavy",
|
|
49
50
|
"o1": "heavy",
|
|
50
51
|
"o3": "heavy",
|
|
51
52
|
"o4-mini": "heavy",
|
|
52
53
|
"o4-mini-deep-research": "heavy",
|
|
54
|
+
"grok-4.5": "heavy",
|
|
53
55
|
};
|
|
54
56
|
// ─── Cost Table (per 1K input tokens, approximate USD) ───────────────────────
|
|
55
57
|
// Used for cross-provider cost comparison when multiple providers offer
|
|
@@ -82,11 +84,13 @@ const MODEL_COST_PER_1K_INPUT = {
|
|
|
82
84
|
"gpt-5.3-codex-spark": 0.0003,
|
|
83
85
|
"gpt-5.4": 0.005,
|
|
84
86
|
"gpt-5.5": 0.005,
|
|
87
|
+
"gpt-5.6": 0.005,
|
|
85
88
|
"o4-mini": 0.005,
|
|
86
89
|
"o4-mini-deep-research": 0.005,
|
|
87
90
|
"gemini-2.0-flash": 0.0001,
|
|
88
91
|
"gemini-2.5-pro": 0.00125,
|
|
89
92
|
"deepseek-chat": 0.00014,
|
|
93
|
+
"grok-4.5": 0.002,
|
|
90
94
|
};
|
|
91
95
|
// ─── Capability Profiles Data Table ──────────────────────────────────────────
|
|
92
96
|
// Per-model capability profiles (0–100 scale). Used for capability-aware
|
|
@@ -128,6 +132,9 @@ export const MODEL_CAPABILITY_PROFILES = {
|
|
|
128
132
|
// OpenAI's 2026-04-23 published eval deltas across coding, tool use, and long context.
|
|
129
133
|
// Source: https://openai.com/index/introducing-gpt-5-5/
|
|
130
134
|
"gpt-5.5": { coding: 96, debugging: 93, research: 89, reasoning: 95, speed: 42, longContext: 90, instruction: 93 },
|
|
135
|
+
// GPT-5.6 profile is provisional: a small uniform step over gpt-5.5, to be
|
|
136
|
+
// recalibrated once OpenAI publishes official eval results.
|
|
137
|
+
"gpt-5.6": { coding: 97, debugging: 94, research: 90, reasoning: 96, speed: 42, longContext: 91, instruction: 94 },
|
|
131
138
|
// ── OpenAI o-series (reasoning-first) ──────────────────────────────────────
|
|
132
139
|
"o1": { coding: 78, debugging: 82, research: 78, reasoning: 90, speed: 20, longContext: 65, instruction: 82 },
|
|
133
140
|
"o3": { coding: 80, debugging: 85, research: 80, reasoning: 92, speed: 25, longContext: 70, instruction: 85 },
|
|
@@ -139,6 +146,10 @@ export const MODEL_CAPABILITY_PROFILES = {
|
|
|
139
146
|
"gemini-flash-2.0": { coding: 50, debugging: 40, research: 50, reasoning: 40, speed: 95, longContext: 60, instruction: 65 },
|
|
140
147
|
// ── DeepSeek ───────────────────────────────────────────────────────────────
|
|
141
148
|
"deepseek-chat": { coding: 75, debugging: 65, research: 55, reasoning: 70, speed: 70, longContext: 55, instruction: 65 },
|
|
149
|
+
// ── xAI ────────────────────────────────────────────────────────────────────
|
|
150
|
+
// Grok 4.5 (2026-07): Opus-class frontier model tuned for coding and agentic
|
|
151
|
+
// work; notably faster and more token-efficient than peer heavy models.
|
|
152
|
+
"grok-4.5": { coding: 95, debugging: 90, research: 82, reasoning: 93, speed: 55, longContext: 80, instruction: 90 },
|
|
142
153
|
};
|
|
143
154
|
// ─── Base Task Requirements Data Table ───────────────────────────────────────
|
|
144
155
|
// Per-unit-type base requirement vectors. Weights indicate how important each
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { deriveState } from "./state.js";
|
|
8
8
|
import { findMilestoneIds } from "./guided-flow.js";
|
|
9
|
-
import { isDbAvailable, getMilestoneSlices,
|
|
9
|
+
import { isDbAvailable, getMilestoneSlices, getTasksBySliceIds } from "./gsd-db.js";
|
|
10
10
|
import { openExistingWorkflowDatabase } from "./db-workspace.js";
|
|
11
11
|
// ─── File Collection ─────────────────────────────────────────────────────────
|
|
12
12
|
/**
|
|
@@ -16,10 +16,11 @@ import { openExistingWorkflowDatabase } from "./db-workspace.js";
|
|
|
16
16
|
async function collectTouchedFiles(basePath, milestoneId) {
|
|
17
17
|
const files = new Set();
|
|
18
18
|
if (isDbAvailable()) {
|
|
19
|
-
// DB path: query slices and their tasks for file lists
|
|
19
|
+
// DB path: query slices and their tasks for file lists (one batched task
|
|
20
|
+
// query instead of one per slice; file order is irrelevant here — Set dedup)
|
|
20
21
|
const slices = getMilestoneSlices(milestoneId);
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
const tasksBySlice = getTasksBySliceIds(slices.map((slice) => ({ milestoneId, sliceId: slice.id })));
|
|
23
|
+
for (const tasks of tasksBySlice.values()) {
|
|
23
24
|
for (const task of tasks) {
|
|
24
25
|
if (Array.isArray(task.files)) {
|
|
25
26
|
for (const f of task.files) {
|
|
@@ -75,15 +75,18 @@ function discoverWorkers(basePath) {
|
|
|
75
75
|
}
|
|
76
76
|
return [...mids].sort();
|
|
77
77
|
}
|
|
78
|
-
|
|
78
|
+
// Slice progress + recent completions share one DB connection per worker per
|
|
79
|
+
// tick. Opening the isolated worker DB twice per refresh (once for each) was
|
|
80
|
+
// pure churn on the 5s interval.
|
|
81
|
+
function queryWorkerProgress(basePath, mid, workRoot = worktreePathFor(basePath, mid)) {
|
|
79
82
|
const dbPath = resolveGsdPathContract(workRoot, basePath).projectDb;
|
|
80
83
|
if (!existsSync(dbPath))
|
|
81
|
-
return [];
|
|
84
|
+
return { slices: [], completions: [] };
|
|
82
85
|
const db = openWorkflowDatabaseIsolated(dbPath);
|
|
83
86
|
if (!db)
|
|
84
|
-
return [];
|
|
87
|
+
return { slices: [], completions: [] };
|
|
85
88
|
try {
|
|
86
|
-
const
|
|
89
|
+
const sliceRows = db.prepare(`SELECT
|
|
87
90
|
s.id AS id,
|
|
88
91
|
s.status AS status,
|
|
89
92
|
COUNT(t.id) AS total,
|
|
@@ -93,15 +96,29 @@ function querySliceProgress(basePath, mid, workRoot = worktreePathFor(basePath,
|
|
|
93
96
|
WHERE s.milestone_id=:mid
|
|
94
97
|
GROUP BY s.id
|
|
95
98
|
ORDER BY s.id`).all({ ":mid": mid });
|
|
96
|
-
|
|
99
|
+
const slices = sliceRows.map((row) => ({
|
|
97
100
|
id: String(row["id"] ?? ""),
|
|
98
101
|
status: String(row["status"] ?? ""),
|
|
99
102
|
total: Number(row["total"] ?? 0),
|
|
100
103
|
done: Number(row["done"] ?? 0),
|
|
101
104
|
}));
|
|
105
|
+
const completionRows = db.prepare(`SELECT id, slice_id, one_liner
|
|
106
|
+
FROM tasks
|
|
107
|
+
WHERE milestone_id=:mid
|
|
108
|
+
AND status='complete'
|
|
109
|
+
AND completed_at IS NOT NULL
|
|
110
|
+
ORDER BY completed_at DESC
|
|
111
|
+
LIMIT 5`).all({ ":mid": mid });
|
|
112
|
+
const completions = completionRows.map((row) => {
|
|
113
|
+
const taskId = String(row["id"] ?? "");
|
|
114
|
+
const sliceId = String(row["slice_id"] ?? "");
|
|
115
|
+
const oneLiner = String(row["one_liner"] ?? "");
|
|
116
|
+
return `✓ ${mid}/${sliceId}/${taskId}${oneLiner ? ": " + oneLiner : ""}`;
|
|
117
|
+
});
|
|
118
|
+
return { slices, completions };
|
|
102
119
|
}
|
|
103
120
|
catch {
|
|
104
|
-
return [];
|
|
121
|
+
return { slices: [], completions: [] };
|
|
105
122
|
}
|
|
106
123
|
finally {
|
|
107
124
|
try {
|
|
@@ -200,39 +217,6 @@ function extractCostFromNdjson(basePath, mid) {
|
|
|
200
217
|
return ndjsonCostCache.get(stdoutPath)?.total ?? 0;
|
|
201
218
|
}
|
|
202
219
|
}
|
|
203
|
-
function queryRecentCompletions(basePath, mid) {
|
|
204
|
-
const workRoot = worktreePathFor(basePath, mid);
|
|
205
|
-
const dbPath = resolveGsdPathContract(workRoot, basePath).projectDb;
|
|
206
|
-
if (!existsSync(dbPath))
|
|
207
|
-
return [];
|
|
208
|
-
const db = openWorkflowDatabaseIsolated(dbPath);
|
|
209
|
-
if (!db)
|
|
210
|
-
return [];
|
|
211
|
-
try {
|
|
212
|
-
const rows = db.prepare(`SELECT id, slice_id, one_liner
|
|
213
|
-
FROM tasks
|
|
214
|
-
WHERE milestone_id=:mid
|
|
215
|
-
AND status='complete'
|
|
216
|
-
AND completed_at IS NOT NULL
|
|
217
|
-
ORDER BY completed_at DESC
|
|
218
|
-
LIMIT 5`).all({ ":mid": mid });
|
|
219
|
-
return rows.map((row) => {
|
|
220
|
-
const taskId = String(row["id"] ?? "");
|
|
221
|
-
const sliceId = String(row["slice_id"] ?? "");
|
|
222
|
-
const oneLiner = String(row["one_liner"] ?? "");
|
|
223
|
-
return `✓ ${mid}/${sliceId}/${taskId}${oneLiner ? ": " + oneLiner : ""}`;
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
catch {
|
|
227
|
-
return [];
|
|
228
|
-
}
|
|
229
|
-
finally {
|
|
230
|
-
try {
|
|
231
|
-
db.close();
|
|
232
|
-
}
|
|
233
|
-
catch { /* ignore */ }
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
220
|
function collectWorkerData(basePath) {
|
|
237
221
|
const mids = discoverWorkers(basePath);
|
|
238
222
|
const parallelDir = join(basePath, ".gsd", "parallel");
|
|
@@ -243,7 +227,7 @@ function collectWorkerData(basePath) {
|
|
|
243
227
|
const workRoot = worktreePathFor(basePath, mid);
|
|
244
228
|
const status = readJsonSafe(join(parallelDir, `${mid}.status.json`));
|
|
245
229
|
const lock = readJsonSafe(join(workRoot, ".gsd", "auto.lock"));
|
|
246
|
-
const slices =
|
|
230
|
+
const { slices, completions } = queryWorkerProgress(basePath, mid, workRoot);
|
|
247
231
|
const pid = lock?.pid || status?.pid || 0;
|
|
248
232
|
const alive = pid ? isPidAlive(pid) : false;
|
|
249
233
|
// Heartbeat: prefer status.json if PID matches, else use file mtime
|
|
@@ -303,6 +287,7 @@ function collectWorkerData(basePath) {
|
|
|
303
287
|
totalSlices: slices.length,
|
|
304
288
|
doneSlices,
|
|
305
289
|
slices,
|
|
290
|
+
completions,
|
|
306
291
|
errors,
|
|
307
292
|
});
|
|
308
293
|
}
|
|
@@ -355,10 +340,10 @@ export class ParallelMonitorOverlay {
|
|
|
355
340
|
if (this.disposed)
|
|
356
341
|
return;
|
|
357
342
|
this.workers = collectWorkerData(this.basePath);
|
|
358
|
-
// Collect completion events
|
|
343
|
+
// Collect completion events (already read during collectWorkerData's single
|
|
344
|
+
// DB open per worker — no second connection here).
|
|
359
345
|
for (const wk of this.workers) {
|
|
360
|
-
const
|
|
361
|
-
for (const evt of completions) {
|
|
346
|
+
for (const evt of wk.completions) {
|
|
362
347
|
if (!this.events.includes(evt))
|
|
363
348
|
this.events.push(evt);
|
|
364
349
|
}
|
|
@@ -122,6 +122,14 @@ function cachedReaddir(dirPath) {
|
|
|
122
122
|
dirListCache.set(dirPath, entries);
|
|
123
123
|
return entries;
|
|
124
124
|
}
|
|
125
|
+
function isExistingFile(path) {
|
|
126
|
+
try {
|
|
127
|
+
return statSync(path).isFile();
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
125
133
|
/**
|
|
126
134
|
* Clear the volatile directory listing caches.
|
|
127
135
|
* Call after milestone transitions, file creation in planning directories,
|
|
@@ -198,6 +206,25 @@ export function buildTaskFileName(taskId, suffix) {
|
|
|
198
206
|
// This helper is deprecated but kept for backward-compat callers.
|
|
199
207
|
return `${taskId}-${suffix}.md`;
|
|
200
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* Build a flat-phase task artifact file name.
|
|
211
|
+
* ("S06", "T03", "SUMMARY") → "S06-T03-SUMMARY.md"
|
|
212
|
+
*/
|
|
213
|
+
export function buildFlatTaskFileName(sliceId, taskId, suffix) {
|
|
214
|
+
return `${sliceId}-${taskId}-${suffix}.md`;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Extract the task ID from a task artifact filename.
|
|
218
|
+
* Supports flat-phase S##-T##-SUFFIX.md plus legacy T##-SUFFIX.md and
|
|
219
|
+
* T##-DESCRIPTOR-SUFFIX.md names.
|
|
220
|
+
*/
|
|
221
|
+
export function taskIdFromTaskFileName(fileName, suffix) {
|
|
222
|
+
const flat = new RegExp(`^S\\d+-(T\\d+)-${suffix}\\.md$`, "i").exec(fileName);
|
|
223
|
+
if (flat?.[1])
|
|
224
|
+
return flat[1].toUpperCase();
|
|
225
|
+
const legacy = new RegExp(`^(T\\d+)(?:-.*)?-${suffix}\\.md$`, "i").exec(fileName);
|
|
226
|
+
return legacy?.[1]?.toUpperCase() ?? null;
|
|
227
|
+
}
|
|
201
228
|
// ─── Resolvers ─────────────────────────────────────────────────────────────
|
|
202
229
|
/**
|
|
203
230
|
* Find a directory entry by ID prefix within a parent directory.
|
|
@@ -238,7 +265,7 @@ export function resolveFile(dir, idPrefix, suffix) {
|
|
|
238
265
|
return null;
|
|
239
266
|
const target = `${idPrefix}-${suffix}.md`.toUpperCase();
|
|
240
267
|
try {
|
|
241
|
-
const entries =
|
|
268
|
+
const entries = cachedReaddirWithTypes(dir).filter(e => e.isFile()).map(e => e.name);
|
|
242
269
|
// Direct match: ID-SUFFIX.md
|
|
243
270
|
const direct = entries.find(e => e.toUpperCase() === target);
|
|
244
271
|
if (direct)
|
|
@@ -259,19 +286,18 @@ export function resolveFile(dir, idPrefix, suffix) {
|
|
|
259
286
|
}
|
|
260
287
|
}
|
|
261
288
|
/**
|
|
262
|
-
* Find all task files matching a pattern in a tasks directory.
|
|
263
|
-
* Returns sorted file names matching T##-SUFFIX.md
|
|
289
|
+
* Find all task files matching a pattern in a tasks directory or flat phase dir.
|
|
290
|
+
* Returns sorted file names matching S##-T##-SUFFIX.md, T##-SUFFIX.md,
|
|
291
|
+
* or legacy T##-*-SUFFIX.md.
|
|
264
292
|
*/
|
|
265
293
|
export function resolveTaskFiles(tasksDir, suffix) {
|
|
266
294
|
if (!existsSync(tasksDir))
|
|
267
295
|
return [];
|
|
268
296
|
try {
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
return cachedReaddir(tasksDir)
|
|
274
|
-
.filter(f => currentPattern.test(f) || legacyPattern.test(f))
|
|
297
|
+
return cachedReaddirWithTypes(tasksDir)
|
|
298
|
+
.filter(e => e.isFile())
|
|
299
|
+
.map(e => e.name)
|
|
300
|
+
.filter(f => taskIdFromTaskFileName(f, suffix) !== null)
|
|
275
301
|
.sort();
|
|
276
302
|
}
|
|
277
303
|
catch {
|
|
@@ -585,19 +611,22 @@ function legacyMilestonesHasSubdirs(basePath) {
|
|
|
585
611
|
* See the matching TODO in markdown-renderer.ts detectStaleRenders, which
|
|
586
612
|
* disabled stale-render detection for the same reason.
|
|
587
613
|
*/
|
|
614
|
+
const LEGACY_MILESTONE_RUNTIME_DIRS = new Set(["anchors"]);
|
|
588
615
|
export function dirIsContentBearingLegacyMilestone(dir) {
|
|
589
616
|
try {
|
|
590
617
|
const entries = readdirSync(dir, { withFileTypes: true });
|
|
591
618
|
// 1. Any non-META regular file → real legacy content.
|
|
592
619
|
if (entries.some(e => e.isFile() && !e.name.endsWith("-META.json")))
|
|
593
620
|
return true;
|
|
594
|
-
// 2. A non-empty subdirectory → real legacy content (e.g. slices/ with slice dirs).
|
|
621
|
+
// 2. A non-empty non-runtime subdirectory → real legacy content (e.g. slices/ with slice dirs).
|
|
595
622
|
// An *empty* subdir is treated as scaffolding (e.g. git-service.ts may create
|
|
596
623
|
// an empty slices/ alongside the integration META file) and must NOT flip the
|
|
597
624
|
// layout — that is the Bugbot finding this guard addresses.
|
|
598
625
|
return entries.some(e => {
|
|
599
626
|
if (!e.isDirectory())
|
|
600
627
|
return false;
|
|
628
|
+
if (LEGACY_MILESTONE_RUNTIME_DIRS.has(e.name))
|
|
629
|
+
return false;
|
|
601
630
|
try {
|
|
602
631
|
return readdirSync(join(dir, e.name)).length > 0;
|
|
603
632
|
}
|
|
@@ -807,7 +836,7 @@ export function resolveMilestoneFile(basePath, milestoneId, suffix) {
|
|
|
807
836
|
const prefix = `${String(phaseNum).padStart(2, "0")}`;
|
|
808
837
|
const flatName = `${prefix}-${suffix}.md`;
|
|
809
838
|
const flatPath = join(mDir, flatName);
|
|
810
|
-
if (
|
|
839
|
+
if (isExistingFile(flatPath))
|
|
811
840
|
return flatPath;
|
|
812
841
|
// Legacy fallback: M001-SUFFIX.md
|
|
813
842
|
const file = resolveFile(mDir, milestoneId, suffix);
|
|
@@ -840,12 +869,12 @@ export function resolveSliceFile(basePath, milestoneId, sliceId, suffix) {
|
|
|
840
869
|
const planNum = sliceIdToPlanNum(sliceId);
|
|
841
870
|
const flatName = planFileName(phaseNum, planNum, suffix);
|
|
842
871
|
const flatPath = join(phaseDir, flatName);
|
|
843
|
-
if (
|
|
872
|
+
if (isExistingFile(flatPath))
|
|
844
873
|
return flatPath;
|
|
845
874
|
// Also check plan-number-only format MM-SUFFIX.md (written by buildSliceFileName)
|
|
846
875
|
const planOnlyName = `${String(planNum).padStart(2, "0")}-${suffix}.md`;
|
|
847
876
|
const planOnlyPath = join(phaseDir, planOnlyName);
|
|
848
|
-
if (
|
|
877
|
+
if (isExistingFile(planOnlyPath))
|
|
849
878
|
return planOnlyPath;
|
|
850
879
|
// Try prefix match for the phase+plan number (handles suffix variations)
|
|
851
880
|
const planPrefix = `${String(phaseNum).padStart(2, "0")}-${String(planNum).padStart(2, "0")}-`;
|
|
@@ -890,8 +919,11 @@ export function resolveTaskFile(basePath, milestoneId, sliceId, taskId, suffix)
|
|
|
890
919
|
const legacyBase = legacyMilestonesDir(basePath);
|
|
891
920
|
const isLegacy = phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\");
|
|
892
921
|
if (suffix !== "PLAN" && !isLegacy) {
|
|
893
|
-
const flatPath = join(phaseDir,
|
|
894
|
-
|
|
922
|
+
const flatPath = join(phaseDir, buildFlatTaskFileName(sliceId, taskId, suffix));
|
|
923
|
+
if (isExistingFile(flatPath))
|
|
924
|
+
return flatPath;
|
|
925
|
+
const legacyFlatPath = join(phaseDir, buildTaskFileName(taskId, suffix));
|
|
926
|
+
return isExistingFile(legacyFlatPath) ? legacyFlatPath : null;
|
|
895
927
|
}
|
|
896
928
|
const tDir = resolveTasksDir(basePath, milestoneId, sliceId);
|
|
897
929
|
if (tDir) {
|
|
@@ -1003,6 +1035,28 @@ export function targetSliceFile(basePath, milestoneId, sliceId, suffix, mileston
|
|
|
1003
1035
|
: planFileName(milestoneIdToPhaseNum(milestoneId), sliceIdToPlanNum(sliceId), suffix);
|
|
1004
1036
|
return join(dir, fileName);
|
|
1005
1037
|
}
|
|
1038
|
+
/**
|
|
1039
|
+
* Build the canonical absolute write target for a task file.
|
|
1040
|
+
* Readers that need legacy flat-phase fallback should call resolveTaskFile.
|
|
1041
|
+
*/
|
|
1042
|
+
export function targetTaskFile(basePath, milestoneId, sliceId, taskId, suffix, milestoneTitle) {
|
|
1043
|
+
if (suffix === "PLAN") {
|
|
1044
|
+
return targetSliceFile(basePath, milestoneId, sliceId, "PLAN", milestoneTitle);
|
|
1045
|
+
}
|
|
1046
|
+
const mDir = resolveMilestonePath(basePath, milestoneId);
|
|
1047
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
1048
|
+
const isLegacy = mDir
|
|
1049
|
+
? mDir.startsWith(legacyBase + "/") || mDir.startsWith(legacyBase + "\\")
|
|
1050
|
+
: isLegacyMilestonesLayout(basePath);
|
|
1051
|
+
const milestoneDir = mDir
|
|
1052
|
+
?? dirname(targetMilestoneFile(basePath, milestoneId, "ROADMAP", milestoneTitle));
|
|
1053
|
+
if (isLegacy) {
|
|
1054
|
+
const slicesDir = join(milestoneDir, "slices");
|
|
1055
|
+
const sliceDir = join(slicesDir, resolveDir(slicesDir, sliceId) ?? sliceId);
|
|
1056
|
+
return join(sliceDir, "tasks", buildTaskFileName(taskId, suffix));
|
|
1057
|
+
}
|
|
1058
|
+
return join(milestoneDir, buildFlatTaskFileName(sliceId, taskId, suffix));
|
|
1059
|
+
}
|
|
1006
1060
|
/**
|
|
1007
1061
|
* Build relative .gsd/ path to a slice file.
|
|
1008
1062
|
* Preserves an existing compatibility filename when present; otherwise falls
|
|
@@ -1033,5 +1087,5 @@ export function relTaskFile(basePath, milestoneId, sliceId, taskId, suffix, mile
|
|
|
1033
1087
|
return relSliceFile(basePath, milestoneId, sliceId, "PLAN");
|
|
1034
1088
|
}
|
|
1035
1089
|
const relS = relSlicePath(basePath, milestoneId, sliceId, milestoneTitle);
|
|
1036
|
-
return `${relS}/${
|
|
1090
|
+
return `${relS}/${buildFlatTaskFileName(sliceId, taskId, suffix)}`;
|
|
1037
1091
|
}
|
|
@@ -7,11 +7,14 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
|
7
7
|
import { join } from "node:path";
|
|
8
8
|
import { gsdRoot } from "./paths.js";
|
|
9
9
|
function anchorsDir(basePath, milestoneId) {
|
|
10
|
-
return join(gsdRoot(basePath), "
|
|
10
|
+
return join(gsdRoot(basePath), "runtime", "anchors", milestoneId);
|
|
11
11
|
}
|
|
12
12
|
function anchorPath(basePath, milestoneId, phase) {
|
|
13
13
|
return join(anchorsDir(basePath, milestoneId), `${phase}.json`);
|
|
14
14
|
}
|
|
15
|
+
function legacyAnchorPath(basePath, milestoneId, phase) {
|
|
16
|
+
return join(gsdRoot(basePath), "milestones", milestoneId, "anchors", `${phase}.json`);
|
|
17
|
+
}
|
|
15
18
|
export function writePhaseAnchor(basePath, milestoneId, anchor) {
|
|
16
19
|
const dir = anchorsDir(basePath, milestoneId);
|
|
17
20
|
if (!existsSync(dir)) {
|
|
@@ -20,7 +23,9 @@ export function writePhaseAnchor(basePath, milestoneId, anchor) {
|
|
|
20
23
|
writeFileSync(anchorPath(basePath, milestoneId, anchor.phase), JSON.stringify(anchor, null, 2), "utf-8");
|
|
21
24
|
}
|
|
22
25
|
export function readPhaseAnchor(basePath, milestoneId, phase) {
|
|
23
|
-
const path = anchorPath(basePath, milestoneId, phase)
|
|
26
|
+
const path = existsSync(anchorPath(basePath, milestoneId, phase))
|
|
27
|
+
? anchorPath(basePath, milestoneId, phase)
|
|
28
|
+
: legacyAnchorPath(basePath, milestoneId, phase);
|
|
24
29
|
if (!existsSync(path))
|
|
25
30
|
return null;
|
|
26
31
|
try {
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { CONFIGURABLE_PLANNING_SUBAGENT_UNITS } from "./preferences-types.js";
|
|
2
|
+
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
3
|
+
const CONFIGURABLE_UNITS = new Set(CONFIGURABLE_PLANNING_SUBAGENT_UNITS);
|
|
4
|
+
function configuredAllowedSubagents(unitType, preferences) {
|
|
5
|
+
if (!CONFIGURABLE_UNITS.has(unitType))
|
|
6
|
+
return [];
|
|
7
|
+
return preferences?.planning_subagents?.[unitType]?.allowed ?? [];
|
|
8
|
+
}
|
|
9
|
+
function mergeAllowedSubagents(current, configured) {
|
|
10
|
+
return Array.from(new Set([...current, ...configured]));
|
|
11
|
+
}
|
|
12
|
+
export function applyPlanningSubagentPreferences(unitType, policy, preferences) {
|
|
13
|
+
if (!policy)
|
|
14
|
+
return policy;
|
|
15
|
+
const configured = configuredAllowedSubagents(unitType, preferences);
|
|
16
|
+
if (configured.length === 0)
|
|
17
|
+
return policy;
|
|
18
|
+
if (policy.mode === "planning") {
|
|
19
|
+
return {
|
|
20
|
+
mode: "planning-dispatch",
|
|
21
|
+
allowedSubagents: mergeAllowedSubagents([], configured),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (policy.mode === "planning-dispatch") {
|
|
25
|
+
return {
|
|
26
|
+
...policy,
|
|
27
|
+
allowedSubagents: mergeAllowedSubagents(policy.allowedSubagents, configured),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
return policy;
|
|
31
|
+
}
|
|
32
|
+
export function resolveEffectivePlanningToolsPolicy(unitType, policy, basePath) {
|
|
33
|
+
if (!basePath)
|
|
34
|
+
return policy;
|
|
35
|
+
const preferences = loadEffectiveGSDPreferences(basePath)?.preferences;
|
|
36
|
+
return applyPlanningSubagentPreferences(unitType, policy, preferences);
|
|
37
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
const PLANNING_DISPATCH_AGENT_REGISTRY = {
|
|
9
|
+
mnemo: { readOnlySpecialist: true },
|
|
10
|
+
scout: { readOnlySpecialist: true },
|
|
11
|
+
planner: { readOnlySpecialist: true },
|
|
12
|
+
reviewer: { readOnlySpecialist: true },
|
|
13
|
+
security: { readOnlySpecialist: true },
|
|
14
|
+
tester: { readOnlySpecialist: true },
|
|
15
|
+
};
|
|
16
|
+
export const ALLOWED_PLANNING_DISPATCH_AGENTS = new Set(Object.entries(PLANNING_DISPATCH_AGENT_REGISTRY)
|
|
17
|
+
.filter(([, metadata]) => metadata.readOnlySpecialist)
|
|
18
|
+
.map(([agentId]) => agentId));
|
|
19
|
+
export function isReadOnlyPlanningDispatchAgent(agentId) {
|
|
20
|
+
const metadata = PLANNING_DISPATCH_AGENT_REGISTRY[agentId];
|
|
21
|
+
return metadata?.readOnlySpecialist === true;
|
|
22
|
+
}
|
|
23
|
+
export function allowedPlanningDispatchAgentsList() {
|
|
24
|
+
return [...ALLOWED_PLANNING_DISPATCH_AGENTS].join(", ");
|
|
25
|
+
}
|
|
@@ -242,11 +242,11 @@ export function checkImportResolution(taskRow, _priorTasks, basePath) {
|
|
|
242
242
|
}
|
|
243
243
|
const imports = extractRelativeImports(source);
|
|
244
244
|
for (const { importPath, lineNum } of imports) {
|
|
245
|
-
// Framework-generated
|
|
246
|
-
// checks
|
|
247
|
-
// block task completion on these imports.
|
|
245
|
+
// Framework/codegen-generated modules may not exist on disk during
|
|
246
|
+
// post-exec checks. Don't block task completion on these imports.
|
|
248
247
|
if (/^\.{1,2}\/\+types\//.test(importPath) ||
|
|
249
|
-
/^(?:\.{1,2}\/)+(?:[^/]+\/)*\$types(?:$|\/)/.test(importPath)
|
|
248
|
+
/^(?:\.{1,2}\/)+(?:[^/]+\/)*\$types(?:$|\/)/.test(importPath) ||
|
|
249
|
+
/^(?:\.{1,2}\/)+(?:[^/]+\/)*_generated(?:$|\/)/.test(importPath)) {
|
|
250
250
|
continue;
|
|
251
251
|
}
|
|
252
252
|
const resolution = resolveImportPath(importPath, file, basePath);
|
|
@@ -61,6 +61,7 @@ export const KNOWN_PREFERENCE_KEYS = new Set([
|
|
|
61
61
|
"git",
|
|
62
62
|
"post_unit_hooks",
|
|
63
63
|
"pre_dispatch_hooks",
|
|
64
|
+
"planning_subagents",
|
|
64
65
|
"dynamic_routing",
|
|
65
66
|
"disabled_model_providers",
|
|
66
67
|
"uok",
|
|
@@ -134,6 +135,10 @@ export const KNOWN_UNIT_LABELS = [
|
|
|
134
135
|
"workflow-preferences", "discuss-project", "discuss-requirements",
|
|
135
136
|
"research-decision", "research-project",
|
|
136
137
|
];
|
|
138
|
+
export const CONFIGURABLE_PLANNING_SUBAGENT_UNITS = [
|
|
139
|
+
"plan-milestone",
|
|
140
|
+
"plan-slice",
|
|
141
|
+
];
|
|
137
142
|
export const SKILL_ACTIONS = new Set(["use", "prefer", "avoid"]);
|
|
138
143
|
/** The nine model-routing phase buckets. */
|
|
139
144
|
export const GSD_MODEL_PHASE_KEYS = [
|
|
@@ -9,7 +9,8 @@ import { isAbsolute } from "node:path";
|
|
|
9
9
|
import { VALID_BRANCH_NAME } from "./git-service.js";
|
|
10
10
|
import { normalizeStringArray } from "../shared/format-utils.js";
|
|
11
11
|
import { getGateIdsForTurn } from "./gate-registry.js";
|
|
12
|
-
import { KNOWN_PREFERENCE_KEYS, KNOWN_UNIT_LABELS, GSD_MODEL_PHASE_KEYS, SKILL_ACTIONS, } from "./preferences-types.js";
|
|
12
|
+
import { KNOWN_PREFERENCE_KEYS, KNOWN_UNIT_LABELS, CONFIGURABLE_PLANNING_SUBAGENT_UNITS, GSD_MODEL_PHASE_KEYS, SKILL_ACTIONS, } from "./preferences-types.js";
|
|
13
|
+
import { ALLOWED_PLANNING_DISPATCH_AGENTS, allowedPlanningDispatchAgentsList, } from "./planning-subagent-registry.js";
|
|
13
14
|
const VALID_TOKEN_PROFILES = new Set(["budget", "balanced", "quality", "burn-max"]);
|
|
14
15
|
const VALID_THINKING_LEVELS = new Set([
|
|
15
16
|
"off",
|
|
@@ -727,6 +728,52 @@ export function validatePreferences(preferences) {
|
|
|
727
728
|
validated.pre_dispatch_hooks = validPreHooks;
|
|
728
729
|
}
|
|
729
730
|
}
|
|
731
|
+
// ─── Planning Subagents ─────────────────────────────────────────────────
|
|
732
|
+
if (preferences.planning_subagents !== undefined) {
|
|
733
|
+
if (!preferences.planning_subagents ||
|
|
734
|
+
typeof preferences.planning_subagents !== "object" ||
|
|
735
|
+
Array.isArray(preferences.planning_subagents)) {
|
|
736
|
+
errors.push("planning_subagents must be an object keyed by planning unit type");
|
|
737
|
+
}
|
|
738
|
+
else {
|
|
739
|
+
const validUnits = new Set(CONFIGURABLE_PLANNING_SUBAGENT_UNITS);
|
|
740
|
+
const validPlanningSubagents = {};
|
|
741
|
+
for (const [unitType, rawConfig] of Object.entries(preferences.planning_subagents)) {
|
|
742
|
+
if (!validUnits.has(unitType)) {
|
|
743
|
+
errors.push(`planning_subagents unknown or unsupported unit "${unitType}" — supported units: ` +
|
|
744
|
+
`${CONFIGURABLE_PLANNING_SUBAGENT_UNITS.join(", ")}`);
|
|
745
|
+
continue;
|
|
746
|
+
}
|
|
747
|
+
if (!rawConfig || typeof rawConfig !== "object" || Array.isArray(rawConfig)) {
|
|
748
|
+
errors.push(`planning_subagents.${unitType} must be an object with an allowed array`);
|
|
749
|
+
continue;
|
|
750
|
+
}
|
|
751
|
+
const allowed = normalizeStringArray(rawConfig.allowed);
|
|
752
|
+
if (allowed.length === 0) {
|
|
753
|
+
errors.push(`planning_subagents.${unitType}.allowed must include at least one read-only planning specialist`);
|
|
754
|
+
continue;
|
|
755
|
+
}
|
|
756
|
+
const sanitizedAllowed = [];
|
|
757
|
+
for (const agentId of allowed) {
|
|
758
|
+
if (!ALLOWED_PLANNING_DISPATCH_AGENTS.has(agentId)) {
|
|
759
|
+
errors.push(`planning_subagents.${unitType}.allowed includes "${agentId}", which is not classified as a ` +
|
|
760
|
+
`read-only planning specialist. Allowed agents: ${allowedPlanningDispatchAgentsList()}`);
|
|
761
|
+
continue;
|
|
762
|
+
}
|
|
763
|
+
sanitizedAllowed.push(agentId);
|
|
764
|
+
}
|
|
765
|
+
const dedupedAllowed = Array.from(new Set(sanitizedAllowed));
|
|
766
|
+
if (dedupedAllowed.length > 0) {
|
|
767
|
+
validPlanningSubagents[unitType] = {
|
|
768
|
+
allowed: dedupedAllowed,
|
|
769
|
+
};
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
if (Object.keys(validPlanningSubagents).length > 0) {
|
|
773
|
+
validated.planning_subagents = validPlanningSubagents;
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
}
|
|
730
777
|
// ─── Dynamic Routing ─────────────────────────────────────────────────
|
|
731
778
|
if (preferences.dynamic_routing !== undefined) {
|
|
732
779
|
if (typeof preferences.dynamic_routing === "object" && preferences.dynamic_routing !== null) {
|