@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
|
@@ -92,6 +92,11 @@ remote_questions:
|
|
|
92
92
|
uat_dispatch:
|
|
93
93
|
post_unit_hooks: []
|
|
94
94
|
pre_dispatch_hooks: []
|
|
95
|
+
# planning_subagents:
|
|
96
|
+
# plan-milestone:
|
|
97
|
+
# allowed: [scout, planner, security]
|
|
98
|
+
# plan-slice:
|
|
99
|
+
# allowed: [scout, planner, reviewer, security]
|
|
95
100
|
# language:
|
|
96
101
|
# experimental:
|
|
97
102
|
# rtk: false
|
|
@@ -12,10 +12,10 @@
|
|
|
12
12
|
import { existsSync, unlinkSync } from "node:fs";
|
|
13
13
|
import { join } from "node:path";
|
|
14
14
|
import { isClosedStatus } from "../status-guards.js";
|
|
15
|
-
import { transaction, insertMilestone, insertSlice, insertTask, insertVerificationEvidence, getMilestone, getSlice, getTask, updateTaskStatus, deleteVerificationEvidence, saveGateResult, getPendingGatesForTurn, } from "../gsd-db.js";
|
|
15
|
+
import { transaction, insertMilestone, insertSlice, insertTask, insertVerificationEvidence, getMilestone, getSlice, getTask, updateTaskStatus, deleteVerificationEvidence, saveGateResult, getPendingGatesForTurn, getUnresolvedBlockingReworkFindingsForTask, getBlockingReworkFindingsForTask, applyReworkResolutions, } from "../gsd-db.js";
|
|
16
16
|
import { getWorkflowDatabasePath, ensureWorkflowDbAtPath } from "../db-workspace.js";
|
|
17
17
|
import { getGatesForTurn } from "../gate-registry.js";
|
|
18
|
-
import { gsdProjectionRoot, clearPathCache, resolveMilestonePath, resolveSlicePath } from "../paths.js";
|
|
18
|
+
import { buildFlatTaskFileName, buildTaskFileName, gsdProjectionRoot, clearPathCache, legacyMilestonesDir, resolveMilestonePath, resolveSlicePath, } from "../paths.js";
|
|
19
19
|
import { resolveCanonicalMilestoneRoot } from "../worktree-manager.js";
|
|
20
20
|
import { checkOwnership, taskUnitKey } from "../unit-ownership.js";
|
|
21
21
|
import { saveFile, clearParseCache } from "../files.js";
|
|
@@ -34,13 +34,20 @@ function taskSummaryPath(basePath, milestoneId, sliceId, taskId) {
|
|
|
34
34
|
// a legacy layout and breaks all subsequent path resolution for the session.
|
|
35
35
|
const slicePath = resolveSlicePath(basePath, milestoneId, sliceId);
|
|
36
36
|
const phaseDir = resolveMilestonePath(basePath, milestoneId);
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
37
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
38
|
+
const isLegacy = phaseDir
|
|
39
|
+
? phaseDir.startsWith(legacyBase + "/") || phaseDir.startsWith(legacyBase + "\\")
|
|
40
|
+
: false;
|
|
41
|
+
if (isLegacy && phaseDir) {
|
|
42
|
+
// Legacy layout: the slice has its own slices/SID/ subdir → tasks/ subdir.
|
|
43
|
+
const legacySlicePath = slicePath && slicePath !== phaseDir
|
|
44
|
+
? slicePath
|
|
45
|
+
: join(phaseDir, "slices", sliceId);
|
|
46
|
+
return join(legacySlicePath, "tasks", buildTaskFileName(taskId, "SUMMARY"));
|
|
40
47
|
}
|
|
41
48
|
if (phaseDir) {
|
|
42
49
|
// Flat-phase: task summaries go in the phase dir (no tasks/ subdir)
|
|
43
|
-
return join(phaseDir,
|
|
50
|
+
return join(phaseDir, buildFlatTaskFileName(sliceId, taskId, "SUMMARY"));
|
|
44
51
|
}
|
|
45
52
|
// Fallback: legacy hardcoded path (milestone/slice dir not on disk yet)
|
|
46
53
|
return join(gsdProjectionRoot(basePath), "milestones", milestoneId, "slices", sliceId, "tasks", `${taskId}-SUMMARY.md`);
|
|
@@ -107,6 +114,44 @@ export function normalizeListParam(value) {
|
|
|
107
114
|
* Build a TaskRow-shaped object from CompleteTaskParams so the unified
|
|
108
115
|
* renderSummaryContent() can be used at completion time (#2720).
|
|
109
116
|
*/
|
|
117
|
+
function normalizeReworkResolution(params) {
|
|
118
|
+
return (params.reworkResolution ?? []).map((resolution) => ({
|
|
119
|
+
milestoneId: params.milestoneId,
|
|
120
|
+
sliceId: params.sliceId,
|
|
121
|
+
taskId: params.taskId,
|
|
122
|
+
findingId: resolution.findingId,
|
|
123
|
+
status: resolution.status,
|
|
124
|
+
evidence: resolution.evidence,
|
|
125
|
+
decisionRef: resolution.decisionRef,
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
128
|
+
function unresolvedReworkError(missingFindingIds) {
|
|
129
|
+
const plural = missingFindingIds.length === 1 ? "finding" : "findings";
|
|
130
|
+
return `unresolved blocking rework ${plural}: ${missingFindingIds.join(", ")} — provide reworkResolution entries with status resolved and evidence, or status deferred-with-override with evidence and decisionRef, before completing the task`;
|
|
131
|
+
}
|
|
132
|
+
function satisfiesBlockingReworkFinding(resolution) {
|
|
133
|
+
if (resolution.evidence.trim().length === 0)
|
|
134
|
+
return false;
|
|
135
|
+
if (resolution.status === "resolved")
|
|
136
|
+
return true;
|
|
137
|
+
return (resolution.decisionRef ?? "").trim().length > 0;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Restore rework findings to their pre-completion state.
|
|
141
|
+
*
|
|
142
|
+
* The completion transaction flips blocking findings to resolved/
|
|
143
|
+
* deferred-with-override via applyReworkResolutions. When a later projection
|
|
144
|
+
* or escalation write fails and we compensate by reverting the task to
|
|
145
|
+
* `pending`, we must also revert those findings. Otherwise a retry sees no
|
|
146
|
+
* unresolved blocking findings (getUnresolvedBlockingReworkFindingsForTask
|
|
147
|
+
* only returns `pending` rows) and completes the task with the blocking gate
|
|
148
|
+
* silently skipped.
|
|
149
|
+
*/
|
|
150
|
+
function revertAppliedReworkResolutions(snapshot) {
|
|
151
|
+
if (snapshot.length === 0)
|
|
152
|
+
return;
|
|
153
|
+
applyReworkResolutions(snapshot);
|
|
154
|
+
}
|
|
110
155
|
function paramsToTaskRow(params, completedAt) {
|
|
111
156
|
return {
|
|
112
157
|
milestone_id: params.milestoneId,
|
|
@@ -182,6 +227,7 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
182
227
|
let guardError = null;
|
|
183
228
|
let summaryMd = "";
|
|
184
229
|
let repairTaskSummaryRow = null;
|
|
230
|
+
let appliedReworkSnapshot = [];
|
|
185
231
|
const rollbackDbPath = getWorkflowDatabasePath();
|
|
186
232
|
// ── ADR-011 Phase 2: validate escalation payload BEFORE any side effects ─
|
|
187
233
|
// Building the artifact runs the full shape validation (2-4 options, unique
|
|
@@ -192,6 +238,7 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
192
238
|
// no escalation recorded, and the loop would silently advance past it.
|
|
193
239
|
// The filesystem write happens later (after side effects) because that's
|
|
194
240
|
// the cheapest ordering and validation is where 99% of failures live.
|
|
241
|
+
const reworkResolutions = normalizeReworkResolution(params);
|
|
195
242
|
let validatedEscalationArtifact = null;
|
|
196
243
|
let escalationWriteEnabled = false;
|
|
197
244
|
if (params.escalation) {
|
|
@@ -231,6 +278,17 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
231
278
|
return;
|
|
232
279
|
}
|
|
233
280
|
const existingTask = getTask(params.milestoneId, params.sliceId, params.taskId);
|
|
281
|
+
const unresolvedRework = getUnresolvedBlockingReworkFindingsForTask(params.milestoneId, params.sliceId, params.taskId);
|
|
282
|
+
const resolvedFindingIds = new Set(reworkResolutions
|
|
283
|
+
.filter(satisfiesBlockingReworkFinding)
|
|
284
|
+
.map((resolution) => resolution.findingId));
|
|
285
|
+
const missingFindingIds = unresolvedRework
|
|
286
|
+
.filter((finding) => !resolvedFindingIds.has(finding.finding_id))
|
|
287
|
+
.map((finding) => finding.finding_id);
|
|
288
|
+
if (missingFindingIds.length > 0) {
|
|
289
|
+
guardError = unresolvedReworkError(missingFindingIds);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
234
292
|
if (existingTask && isClosedStatus(existingTask.status)) {
|
|
235
293
|
// Stale-turn path: a timed-out turn that was superseded by recovery
|
|
236
294
|
// can still reach this code when its LLM call eventually returns and
|
|
@@ -278,6 +336,33 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
278
336
|
keyDecisions: params.keyDecisions ?? [],
|
|
279
337
|
fullSummaryMd: summaryMd,
|
|
280
338
|
});
|
|
339
|
+
// Only persist resolutions that actually satisfy the evidence
|
|
340
|
+
// requirement. The guard above admits a finding as long as ONE satisfying
|
|
341
|
+
// entry exists, but applyReworkResolutions writes by findingId and lets the
|
|
342
|
+
// last entry win. Persisting every entry would let a later non-satisfying
|
|
343
|
+
// duplicate (empty evidence, or deferred-with-override without decisionRef)
|
|
344
|
+
// overwrite a valid resolution and leave the finding non-pending without
|
|
345
|
+
// acceptable evidence. Filtering with the same predicate the guard uses
|
|
346
|
+
// keeps the applied set and the gate consistent.
|
|
347
|
+
const resolutionsToApply = reworkResolutions.filter(satisfiesBlockingReworkFinding);
|
|
348
|
+
if (resolutionsToApply.length > 0) {
|
|
349
|
+
// Snapshot the pre-resolution state of the findings we're about to
|
|
350
|
+
// change so a compensating rollback can restore them exactly (see
|
|
351
|
+
// revertAppliedReworkResolutions).
|
|
352
|
+
const resolvedFindingIdsForSnapshot = new Set(resolutionsToApply.map((r) => r.findingId));
|
|
353
|
+
appliedReworkSnapshot = getBlockingReworkFindingsForTask(params.milestoneId, params.sliceId, params.taskId)
|
|
354
|
+
.filter((finding) => resolvedFindingIdsForSnapshot.has(finding.finding_id))
|
|
355
|
+
.map((finding) => ({
|
|
356
|
+
milestoneId: params.milestoneId,
|
|
357
|
+
sliceId: params.sliceId,
|
|
358
|
+
taskId: params.taskId,
|
|
359
|
+
findingId: finding.finding_id,
|
|
360
|
+
status: finding.status,
|
|
361
|
+
evidence: finding.evidence,
|
|
362
|
+
decisionRef: finding.decision_ref,
|
|
363
|
+
}));
|
|
364
|
+
applyReworkResolutions(resolutionsToApply);
|
|
365
|
+
}
|
|
281
366
|
for (const evidence of (params.verificationEvidence ?? [])) {
|
|
282
367
|
insertVerificationEvidence({
|
|
283
368
|
taskId: params.taskId,
|
|
@@ -340,6 +425,7 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
340
425
|
ensureWorkflowDbAtPath(rollbackDbPath);
|
|
341
426
|
deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
|
|
342
427
|
updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, "pending");
|
|
428
|
+
revertAppliedReworkResolutions(appliedReworkSnapshot);
|
|
343
429
|
invalidateStateCache();
|
|
344
430
|
rollbackSucceeded = true;
|
|
345
431
|
}
|
|
@@ -430,6 +516,7 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
430
516
|
try {
|
|
431
517
|
deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
|
|
432
518
|
updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, 'pending');
|
|
519
|
+
revertAppliedReworkResolutions(appliedReworkSnapshot);
|
|
433
520
|
invalidateStateCache();
|
|
434
521
|
logWarning("tool", `complete-task rolled back DB completion for ${params.milestoneId}/${params.sliceId}/${params.taskId} after escalation write failure; SUMMARY.md left on disk for retry.`);
|
|
435
522
|
}
|
|
@@ -447,6 +534,7 @@ export async function handleCompleteTask(params, basePath) {
|
|
|
447
534
|
try {
|
|
448
535
|
deleteVerificationEvidence(params.milestoneId, params.sliceId, params.taskId);
|
|
449
536
|
updateTaskStatus(params.milestoneId, params.sliceId, params.taskId, 'pending');
|
|
537
|
+
revertAppliedReworkResolutions(appliedReworkSnapshot);
|
|
450
538
|
invalidateStateCache();
|
|
451
539
|
logWarning("tool", `complete-task rolled back DB completion for ${params.milestoneId}/${params.sliceId}/${params.taskId} because hard-blocker escalation handling is disabled; SUMMARY.md left on disk for retry.`);
|
|
452
540
|
}
|
|
@@ -5,7 +5,7 @@ import { getGateIdsForTurn } from "../gate-registry.js";
|
|
|
5
5
|
import { transaction, getSlice, getTask, insertTask, upsertTaskPlanning, insertGateRow, setSliceSketchFlag } from "../gsd-db.js";
|
|
6
6
|
import { invalidateStateCache } from "../state.js";
|
|
7
7
|
import { renderTaskPlanFromDb, renderPlanFromDb } from "../markdown-renderer.js";
|
|
8
|
-
import {
|
|
8
|
+
import { resolveMilestonePath, resolveSlicePath } from "../paths.js";
|
|
9
9
|
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
10
10
|
import { writeManifest } from "../workflow-manifest.js";
|
|
11
11
|
import { appendEvent } from "../workflow-events.js";
|
|
@@ -193,21 +193,19 @@ export async function handlePlanTask(rawParams, basePath) {
|
|
|
193
193
|
return { error: guardError };
|
|
194
194
|
}
|
|
195
195
|
try {
|
|
196
|
-
const
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
// Guard: resolveTasksDir is null in flat-phase (no tasks/ subdir exists).
|
|
196
|
+
const milestonePath = resolveMilestonePath(basePath, params.milestoneId);
|
|
197
|
+
const slicePath = resolveSlicePath(basePath, params.milestoneId, params.sliceId);
|
|
198
|
+
const isLegacySliceLayout = Boolean(milestonePath && slicePath && slicePath !== milestonePath);
|
|
199
|
+
let renderedPath;
|
|
201
200
|
let slicePlanSynced = false;
|
|
202
|
-
|
|
203
|
-
const
|
|
204
|
-
|
|
205
|
-
await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
|
|
206
|
-
slicePlanSynced = true;
|
|
207
|
-
}
|
|
201
|
+
if (isLegacySliceLayout) {
|
|
202
|
+
const renderResult = await renderTaskPlanFromDb(basePath, params.milestoneId, params.sliceId, params.taskId);
|
|
203
|
+
renderedPath = renderResult.taskPlanPath;
|
|
208
204
|
}
|
|
209
|
-
|
|
210
|
-
|
|
205
|
+
else {
|
|
206
|
+
const renderResult = await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
|
|
207
|
+
renderedPath = renderResult.planPath;
|
|
208
|
+
slicePlanSynced = true;
|
|
211
209
|
}
|
|
212
210
|
if (slicePlanSynced) {
|
|
213
211
|
setSliceSketchFlag(params.milestoneId, params.sliceId, false);
|
|
@@ -234,7 +232,7 @@ export async function handlePlanTask(rawParams, basePath) {
|
|
|
234
232
|
milestoneId: params.milestoneId,
|
|
235
233
|
sliceId: params.sliceId,
|
|
236
234
|
taskId: params.taskId,
|
|
237
|
-
taskPlanPath:
|
|
235
|
+
taskPlanPath: renderedPath,
|
|
238
236
|
};
|
|
239
237
|
}
|
|
240
238
|
catch (err) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync, unlinkSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
3
|
-
import {
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
import { gsdProjectionRoot, gsdRoot, resolveMilestoneFile, resolveMilestonePath, targetMilestoneFile } from "../paths.js";
|
|
4
4
|
import { clearParseCache } from "../files.js";
|
|
5
5
|
import { isClosedStatus } from "../status-guards.js";
|
|
6
6
|
import { isNonEmptyString } from "../validation.js";
|
|
@@ -11,6 +11,14 @@ import { flushWorkflowProjections } from "../projection-flush.js";
|
|
|
11
11
|
import { writeManifest } from "../workflow-manifest.js";
|
|
12
12
|
import { appendEvent } from "../workflow-events.js";
|
|
13
13
|
import { logWarning } from "../workflow-logger.js";
|
|
14
|
+
function assessmentDbPathForRenderedFile(basePath, absPath) {
|
|
15
|
+
const projectionRoot = gsdProjectionRoot(basePath);
|
|
16
|
+
const projectionRel = relative(projectionRoot, absPath);
|
|
17
|
+
const root = projectionRel && !projectionRel.startsWith("..") && !projectionRel.startsWith("/")
|
|
18
|
+
? projectionRoot
|
|
19
|
+
: gsdRoot(basePath);
|
|
20
|
+
return `.gsd/${relative(root, absPath).replace(/\\/g, "/")}`;
|
|
21
|
+
}
|
|
14
22
|
function validateParams(params) {
|
|
15
23
|
if (!isNonEmptyString(params?.milestoneId))
|
|
16
24
|
throw new Error("milestoneId is required");
|
|
@@ -74,10 +82,6 @@ export async function handleReassessRoadmap(rawParams, basePath) {
|
|
|
74
82
|
catch (err) {
|
|
75
83
|
return { error: `validation failed: ${err.message}` };
|
|
76
84
|
}
|
|
77
|
-
// ── Compute assessment artifact path ──────────────────────────────
|
|
78
|
-
// Assessment lives in the completed slice's directory.
|
|
79
|
-
// Use relSliceFile so the path is layout-aware (flat-phase or legacy).
|
|
80
|
-
const assessmentRelPath = relSliceFile(basePath, params.milestoneId, params.completedSliceId, "ASSESSMENT");
|
|
81
85
|
// ── Guards + DB writes inside a single transaction (prevents TOCTOU) ───
|
|
82
86
|
// Guards must be inside the transaction so the state they check cannot
|
|
83
87
|
// change between the read and the write (#2723).
|
|
@@ -152,15 +156,6 @@ export async function handleReassessRoadmap(rawParams, basePath) {
|
|
|
152
156
|
}
|
|
153
157
|
}
|
|
154
158
|
}
|
|
155
|
-
// Record assessment
|
|
156
|
-
insertAssessment({
|
|
157
|
-
path: assessmentRelPath,
|
|
158
|
-
milestoneId: params.milestoneId,
|
|
159
|
-
sliceId: params.completedSliceId,
|
|
160
|
-
status: params.verdict,
|
|
161
|
-
scope: "roadmap",
|
|
162
|
-
fullContent: params.assessment,
|
|
163
|
-
});
|
|
164
159
|
// Apply slice modifications
|
|
165
160
|
for (const mod of params.sliceChanges.modified) {
|
|
166
161
|
updateSliceFields(params.milestoneId, mod.sliceId, {
|
|
@@ -220,6 +215,14 @@ export async function handleReassessRoadmap(rawParams, basePath) {
|
|
|
220
215
|
assessment: params.assessment,
|
|
221
216
|
completedSliceId: params.completedSliceId,
|
|
222
217
|
});
|
|
218
|
+
insertAssessment({
|
|
219
|
+
path: assessmentDbPathForRenderedFile(basePath, assessmentResult.assessmentPath),
|
|
220
|
+
milestoneId: params.milestoneId,
|
|
221
|
+
sliceId: params.completedSliceId,
|
|
222
|
+
status: params.verdict,
|
|
223
|
+
scope: "roadmap",
|
|
224
|
+
fullContent: params.assessment,
|
|
225
|
+
});
|
|
223
226
|
// ── Remove stale VALIDATION file from disk (#2957) ────────────
|
|
224
227
|
const hasStructuralChanges = params.sliceChanges.added.length > 0 ||
|
|
225
228
|
params.sliceChanges.modified.length > 0 ||
|
|
@@ -16,7 +16,7 @@ import { logWarning } from "../workflow-logger.js";
|
|
|
16
16
|
import { debugLog } from "../debug-logger.js";
|
|
17
17
|
import { existsSync, unlinkSync } from "node:fs";
|
|
18
18
|
import { join } from "node:path";
|
|
19
|
-
import { resolveMilestonePath, resolveSlicePath, resolveTasksDir, clearPathCache } from "../paths.js";
|
|
19
|
+
import { buildFlatTaskFileName, buildTaskFileName, legacyMilestonesDir, resolveMilestonePath, resolveSlicePath, resolveTasksDir, clearPathCache, } from "../paths.js";
|
|
20
20
|
export async function handleReopenMilestone(params, basePath) {
|
|
21
21
|
// ── Validate required fields ────────────────────────────────────────────
|
|
22
22
|
if (!params.milestoneId || typeof params.milestoneId !== "string" || params.milestoneId.trim() === "") {
|
|
@@ -41,6 +41,8 @@ export async function handleReopenMilestone(params, basePath) {
|
|
|
41
41
|
// auto-corrects entities back to "complete", making reopen a no-op (#3161).
|
|
42
42
|
try {
|
|
43
43
|
const milestoneDir = resolveMilestonePath(basePath, params.milestoneId);
|
|
44
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
45
|
+
const isLegacy = !!milestoneDir && (milestoneDir.startsWith(legacyBase + "/") || milestoneDir.startsWith(legacyBase + "\\"));
|
|
44
46
|
if (milestoneDir) {
|
|
45
47
|
const milestoneSummary = join(milestoneDir, `${params.milestoneId}-SUMMARY.md`);
|
|
46
48
|
if (existsSync(milestoneSummary))
|
|
@@ -58,10 +60,17 @@ export async function handleReopenMilestone(params, basePath) {
|
|
|
58
60
|
unlinkSync(sliceUat);
|
|
59
61
|
}
|
|
60
62
|
const tasksDir = resolveTasksDir(basePath, params.milestoneId, slice.id);
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
const tasks = getSliceTasks(params.milestoneId, slice.id);
|
|
64
|
+
for (const task of tasks) {
|
|
65
|
+
const taskSummaries = isLegacy
|
|
66
|
+
? (tasksDir ? [join(tasksDir, buildTaskFileName(task.id, "SUMMARY"))] : [])
|
|
67
|
+
: milestoneDir
|
|
68
|
+
? [
|
|
69
|
+
join(milestoneDir, buildFlatTaskFileName(slice.id, task.id, "SUMMARY")),
|
|
70
|
+
join(milestoneDir, buildTaskFileName(task.id, "SUMMARY")),
|
|
71
|
+
]
|
|
72
|
+
: [];
|
|
73
|
+
for (const taskSummary of taskSummaries) {
|
|
65
74
|
if (existsSync(taskSummary))
|
|
66
75
|
unlinkSync(taskSummary);
|
|
67
76
|
}
|
|
@@ -22,7 +22,7 @@ import { appendEvent } from "../workflow-events.js";
|
|
|
22
22
|
import { logWarning } from "../workflow-logger.js";
|
|
23
23
|
import { existsSync, unlinkSync } from "node:fs";
|
|
24
24
|
import { join } from "node:path";
|
|
25
|
-
import { resolveTasksDir, resolveSlicePath, clearPathCache } from "../paths.js";
|
|
25
|
+
import { buildFlatTaskFileName, buildTaskFileName, legacyMilestonesDir, resolveMilestonePath, resolveTasksDir, resolveSlicePath, clearPathCache, } from "../paths.js";
|
|
26
26
|
export async function handleReopenSlice(params, basePath) {
|
|
27
27
|
// ── Validate required fields ────────────────────────────────────────────
|
|
28
28
|
if (!params.sliceId || typeof params.sliceId !== "string" || params.sliceId.trim() === "") {
|
|
@@ -52,11 +52,21 @@ export async function handleReopenSlice(params, basePath) {
|
|
|
52
52
|
// Without this, the DB-filesystem reconciler sees SUMMARY.md files and
|
|
53
53
|
// auto-corrects tasks back to "complete", making reopen a no-op (#3161).
|
|
54
54
|
try {
|
|
55
|
+
const milestoneDir = resolveMilestonePath(basePath, params.milestoneId);
|
|
56
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
57
|
+
const isLegacy = !!milestoneDir && (milestoneDir.startsWith(legacyBase + "/") || milestoneDir.startsWith(legacyBase + "\\"));
|
|
55
58
|
const tasksDir = resolveTasksDir(basePath, params.milestoneId, params.sliceId);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
59
|
+
const tasks = getSliceTasks(params.milestoneId, params.sliceId);
|
|
60
|
+
for (const task of tasks) {
|
|
61
|
+
const summaryPaths = isLegacy
|
|
62
|
+
? (tasksDir ? [join(tasksDir, buildTaskFileName(task.id, "SUMMARY"))] : [])
|
|
63
|
+
: milestoneDir
|
|
64
|
+
? [
|
|
65
|
+
join(milestoneDir, buildFlatTaskFileName(params.sliceId, task.id, "SUMMARY")),
|
|
66
|
+
join(milestoneDir, buildTaskFileName(task.id, "SUMMARY")),
|
|
67
|
+
]
|
|
68
|
+
: [];
|
|
69
|
+
for (const summaryPath of summaryPaths) {
|
|
60
70
|
if (existsSync(summaryPath))
|
|
61
71
|
unlinkSync(summaryPath);
|
|
62
72
|
}
|
|
@@ -17,8 +17,8 @@ import { appendEvent } from "../workflow-events.js";
|
|
|
17
17
|
import { logWarning } from "../workflow-logger.js";
|
|
18
18
|
import { writeReopenReason } from "../reopen-reason.js";
|
|
19
19
|
import { existsSync, unlinkSync } from "node:fs";
|
|
20
|
-
import { join
|
|
21
|
-
import { resolveTasksDir, resolveSlicePath, clearPathCache } from "../paths.js";
|
|
20
|
+
import { join } from "node:path";
|
|
21
|
+
import { buildFlatTaskFileName, buildTaskFileName, legacyMilestonesDir, resolveMilestonePath, resolveTasksDir, resolveSlicePath, clearPathCache, } from "../paths.js";
|
|
22
22
|
export async function handleReopenTask(params, basePath) {
|
|
23
23
|
// ── Validate required fields ────────────────────────────────────────────
|
|
24
24
|
if (!params.taskId || typeof params.taskId !== "string" || params.taskId.trim() === "") {
|
|
@@ -76,14 +76,20 @@ export async function handleReopenTask(params, basePath) {
|
|
|
76
76
|
// summary cleanup into tasks/ (#1208).
|
|
77
77
|
try {
|
|
78
78
|
const slicePath = resolveSlicePath(basePath, params.milestoneId, params.sliceId);
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
79
|
+
const milestonePath = resolveMilestonePath(basePath, params.milestoneId);
|
|
80
|
+
if (milestonePath) {
|
|
81
|
+
const legacyBase = legacyMilestonesDir(basePath);
|
|
82
|
+
const isLegacy = milestonePath.startsWith(legacyBase + "/") || milestonePath.startsWith(legacyBase + "\\");
|
|
83
|
+
const summaryPaths = isLegacy
|
|
84
|
+
? [join(resolveTasksDir(basePath, params.milestoneId, params.sliceId) ?? slicePath ?? join(milestonePath, "slices", params.sliceId, "tasks"), buildTaskFileName(params.taskId, "SUMMARY"))]
|
|
85
|
+
: [
|
|
86
|
+
join(milestonePath, buildFlatTaskFileName(params.sliceId, params.taskId, "SUMMARY")),
|
|
87
|
+
join(milestonePath, buildTaskFileName(params.taskId, "SUMMARY")),
|
|
88
|
+
];
|
|
89
|
+
for (const summaryPath of summaryPaths) {
|
|
90
|
+
if (existsSync(summaryPath))
|
|
91
|
+
unlinkSync(summaryPath);
|
|
92
|
+
}
|
|
87
93
|
}
|
|
88
94
|
}
|
|
89
95
|
catch (cleanupErr) {
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { clearParseCache } from "../files.js";
|
|
2
|
+
import { getSlice, getTask, insertReplanHistory, transaction, upsertTaskPlanning, } from "../gsd-db.js";
|
|
3
|
+
import { invalidateStateCache } from "../state.js";
|
|
4
|
+
import { isClosedStatus } from "../status-guards.js";
|
|
5
|
+
import { isNonEmptyString, validateStringArray } from "../validation.js";
|
|
6
|
+
import { renderPlanFromDb, renderTaskPlanFromDb } from "../markdown-renderer.js";
|
|
7
|
+
import { resolveMilestonePath, resolveSlicePath } from "../paths.js";
|
|
8
|
+
import { flushWorkflowProjections } from "../projection-flush.js";
|
|
9
|
+
import { writeManifest } from "../workflow-manifest.js";
|
|
10
|
+
import { appendEvent } from "../workflow-events.js";
|
|
11
|
+
import { logWarning } from "../workflow-logger.js";
|
|
12
|
+
function validateParams(params) {
|
|
13
|
+
if (!isNonEmptyString(params?.milestoneId))
|
|
14
|
+
throw new Error("milestoneId is required");
|
|
15
|
+
if (!isNonEmptyString(params?.sliceId))
|
|
16
|
+
throw new Error("sliceId is required");
|
|
17
|
+
if (!isNonEmptyString(params?.taskId))
|
|
18
|
+
throw new Error("taskId is required");
|
|
19
|
+
if (!isNonEmptyString(params?.title))
|
|
20
|
+
throw new Error("title is required");
|
|
21
|
+
if (!isNonEmptyString(params?.description))
|
|
22
|
+
throw new Error("description is required");
|
|
23
|
+
if (!isNonEmptyString(params?.estimate))
|
|
24
|
+
throw new Error("estimate is required");
|
|
25
|
+
if (!isNonEmptyString(params?.verify))
|
|
26
|
+
throw new Error("verify is required");
|
|
27
|
+
return {
|
|
28
|
+
...params,
|
|
29
|
+
files: validateStringArray(params.files, "files"),
|
|
30
|
+
inputs: validateStringArray(params.inputs, "inputs"),
|
|
31
|
+
expectedOutput: validateStringArray(params.expectedOutput, "expectedOutput"),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function replanSummary(params) {
|
|
35
|
+
const ref = params.reworkBriefRef?.trim();
|
|
36
|
+
return ref
|
|
37
|
+
? `Task ${params.taskId} replanned from rework brief ${ref}`
|
|
38
|
+
: `Task ${params.taskId} replanned`;
|
|
39
|
+
}
|
|
40
|
+
export async function handleReplanTask(rawParams, basePath) {
|
|
41
|
+
let params;
|
|
42
|
+
try {
|
|
43
|
+
params = validateParams(rawParams);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
return { error: `validation failed: ${err.message}` };
|
|
47
|
+
}
|
|
48
|
+
let guardError = null;
|
|
49
|
+
try {
|
|
50
|
+
transaction(() => {
|
|
51
|
+
const parentSlice = getSlice(params.milestoneId, params.sliceId);
|
|
52
|
+
if (!parentSlice) {
|
|
53
|
+
guardError = `missing parent slice: ${params.milestoneId}/${params.sliceId}`;
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (isClosedStatus(parentSlice.status)) {
|
|
57
|
+
guardError = `cannot replan a task in a closed slice: ${params.sliceId} (status: ${parentSlice.status})`;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const task = getTask(params.milestoneId, params.sliceId, params.taskId);
|
|
61
|
+
if (!task) {
|
|
62
|
+
guardError = `task not found: ${params.milestoneId}/${params.sliceId}/${params.taskId}`;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (isClosedStatus(task.status)) {
|
|
66
|
+
guardError = `cannot replan completed task ${params.taskId} — use gsd_task_reopen first`;
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
upsertTaskPlanning(params.milestoneId, params.sliceId, params.taskId, {
|
|
70
|
+
title: params.title,
|
|
71
|
+
description: params.description,
|
|
72
|
+
estimate: params.estimate,
|
|
73
|
+
files: params.files,
|
|
74
|
+
verify: params.verify,
|
|
75
|
+
inputs: params.inputs,
|
|
76
|
+
expectedOutput: params.expectedOutput,
|
|
77
|
+
fullPlanMd: params.fullPlanMd,
|
|
78
|
+
});
|
|
79
|
+
insertReplanHistory({
|
|
80
|
+
milestoneId: params.milestoneId,
|
|
81
|
+
sliceId: params.sliceId,
|
|
82
|
+
taskId: params.taskId,
|
|
83
|
+
summary: replanSummary(params),
|
|
84
|
+
previousArtifactPath: params.reworkBriefRef ?? null,
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
return { error: `db write failed: ${err.message}` };
|
|
90
|
+
}
|
|
91
|
+
if (guardError)
|
|
92
|
+
return { error: guardError };
|
|
93
|
+
try {
|
|
94
|
+
const milestonePath = resolveMilestonePath(basePath, params.milestoneId);
|
|
95
|
+
const slicePath = resolveSlicePath(basePath, params.milestoneId, params.sliceId);
|
|
96
|
+
const isLegacySliceLayout = Boolean(milestonePath && slicePath && slicePath !== milestonePath);
|
|
97
|
+
const renderResult = isLegacySliceLayout
|
|
98
|
+
? await renderTaskPlanFromDb(basePath, params.milestoneId, params.sliceId, params.taskId)
|
|
99
|
+
: await renderPlanFromDb(basePath, params.milestoneId, params.sliceId);
|
|
100
|
+
const taskPlanPath = "taskPlanPath" in renderResult ? renderResult.taskPlanPath : renderResult.planPath;
|
|
101
|
+
invalidateStateCache();
|
|
102
|
+
clearParseCache();
|
|
103
|
+
try {
|
|
104
|
+
await flushWorkflowProjections(basePath, { milestoneId: params.milestoneId });
|
|
105
|
+
writeManifest(basePath);
|
|
106
|
+
appendEvent(basePath, {
|
|
107
|
+
cmd: "replan-task",
|
|
108
|
+
params: { milestoneId: params.milestoneId, sliceId: params.sliceId, taskId: params.taskId },
|
|
109
|
+
ts: new Date().toISOString(),
|
|
110
|
+
actor: "agent",
|
|
111
|
+
actor_name: params.actorName,
|
|
112
|
+
trigger_reason: params.triggerReason,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch (hookErr) {
|
|
116
|
+
logWarning("tool", `replan-task post-mutation hook warning: ${hookErr.message}`);
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
milestoneId: params.milestoneId,
|
|
120
|
+
sliceId: params.sliceId,
|
|
121
|
+
taskId: params.taskId,
|
|
122
|
+
taskPlanPath,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
return { error: `render failed: ${err.message}` };
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { saveReworkBrief } from "../gsd-db.js";
|
|
2
|
+
import { isNonEmptyString, validateStringArray } from "../validation.js";
|
|
3
|
+
function validateFinding(finding, index) {
|
|
4
|
+
if (!isNonEmptyString(finding?.findingId))
|
|
5
|
+
throw new Error(`findings[${index}].findingId is required`);
|
|
6
|
+
if (finding.severity !== "blocking" && finding.severity !== "advisory") {
|
|
7
|
+
throw new Error(`findings[${index}].severity must be blocking or advisory`);
|
|
8
|
+
}
|
|
9
|
+
if (!isNonEmptyString(finding.description))
|
|
10
|
+
throw new Error(`findings[${index}].description is required`);
|
|
11
|
+
if (!isNonEmptyString(finding.requiredFix))
|
|
12
|
+
throw new Error(`findings[${index}].requiredFix is required`);
|
|
13
|
+
const status = finding.status ?? "pending";
|
|
14
|
+
if (status !== "pending" && status !== "resolved" && status !== "deferred-with-override") {
|
|
15
|
+
throw new Error(`findings[${index}].status must be pending, resolved, or deferred-with-override`);
|
|
16
|
+
}
|
|
17
|
+
// A blocking finding is only enforced by gsd_task_complete while it is
|
|
18
|
+
// `pending` (getUnresolvedBlockingReworkFindingsForTask returns pending rows
|
|
19
|
+
// only). Persisting a blocking finding as resolved/deferred-with-override
|
|
20
|
+
// at save time therefore bypasses the completion gate entirely, so require
|
|
21
|
+
// the same justification a reworkResolution would (evidence for `resolved`,
|
|
22
|
+
// evidence + decisionRef for `deferred-with-override`). Advisory findings do
|
|
23
|
+
// not gate completion, so their status is left as-is.
|
|
24
|
+
if (finding.severity === "blocking" && status !== "pending") {
|
|
25
|
+
if (!isNonEmptyString(finding.evidence)) {
|
|
26
|
+
throw new Error(`findings[${index}].evidence is required when a blocking finding is saved as ${status}`);
|
|
27
|
+
}
|
|
28
|
+
if (status === "deferred-with-override" && !isNonEmptyString(finding.decisionRef)) {
|
|
29
|
+
throw new Error(`findings[${index}].decisionRef is required when a blocking finding is saved as deferred-with-override`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
...finding,
|
|
34
|
+
verificationCommands: validateStringArray(finding.verificationCommands, `findings[${index}].verificationCommands`),
|
|
35
|
+
status,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function validateParams(params) {
|
|
39
|
+
if (!isNonEmptyString(params?.milestoneId))
|
|
40
|
+
throw new Error("milestoneId is required");
|
|
41
|
+
if (!isNonEmptyString(params?.sliceId))
|
|
42
|
+
throw new Error("sliceId is required");
|
|
43
|
+
if (!isNonEmptyString(params?.taskId))
|
|
44
|
+
throw new Error("taskId is required");
|
|
45
|
+
if (!Array.isArray(params.findings) || params.findings.length === 0) {
|
|
46
|
+
throw new Error("findings must be a non-empty array");
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
...params,
|
|
50
|
+
findings: params.findings.map(validateFinding),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export async function handleReworkBriefSave(rawParams) {
|
|
54
|
+
let params;
|
|
55
|
+
try {
|
|
56
|
+
params = validateParams(rawParams);
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
return { error: `validation failed: ${err.message}` };
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const { briefId } = saveReworkBrief(params);
|
|
63
|
+
return {
|
|
64
|
+
briefId,
|
|
65
|
+
milestoneId: params.milestoneId,
|
|
66
|
+
sliceId: params.sliceId,
|
|
67
|
+
taskId: params.taskId,
|
|
68
|
+
findingCount: params.findings.length,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
return { error: `db write failed: ${err.message}` };
|
|
73
|
+
}
|
|
74
|
+
}
|