@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
|
@@ -210,6 +210,56 @@ test('handleReassessRoadmap succeeds when modifying only pending slices', async
|
|
|
210
210
|
}
|
|
211
211
|
});
|
|
212
212
|
|
|
213
|
+
test('handleReassessRoadmap writes legacy-layout reassessment to S##-ASSESSMENT.md', async () => {
|
|
214
|
+
const base = mkdtempSync(join(tmpdir(), 'gsd-reassess-legacy-'));
|
|
215
|
+
mkdirSync(join(base, '.gsd', 'milestones', 'M005-3qxqd7', 'slices', 'S04'), { recursive: true });
|
|
216
|
+
mkdirSync(join(base, '.gsd', 'phases', '05-3qxqd7-legacy-milestone'), { recursive: true });
|
|
217
|
+
openDatabase(join(base, '.gsd', 'gsd.db'));
|
|
218
|
+
|
|
219
|
+
try {
|
|
220
|
+
insertMilestone({ id: 'M005-3qxqd7', title: 'Legacy Milestone', status: 'active' });
|
|
221
|
+
insertSlice({
|
|
222
|
+
id: 'S04',
|
|
223
|
+
milestoneId: 'M005-3qxqd7',
|
|
224
|
+
title: 'Legacy Slice Four',
|
|
225
|
+
status: 'complete',
|
|
226
|
+
demo: 'Demo four.',
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
const result = await handleReassessRoadmap({
|
|
230
|
+
milestoneId: 'M005-3qxqd7',
|
|
231
|
+
completedSliceId: 'S04',
|
|
232
|
+
verdict: 'confirmed',
|
|
233
|
+
assessment: 'S04 completed successfully. Roadmap remains valid.',
|
|
234
|
+
sliceChanges: {
|
|
235
|
+
modified: [],
|
|
236
|
+
added: [],
|
|
237
|
+
removed: [],
|
|
238
|
+
},
|
|
239
|
+
}, base);
|
|
240
|
+
|
|
241
|
+
if ('error' in result) {
|
|
242
|
+
assert.fail(`unexpected error: ${result.error}`);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
const correctPath = join(base, '.gsd', 'milestones', 'M005-3qxqd7', 'slices', 'S04', 'S04-ASSESSMENT.md');
|
|
246
|
+
const wrongFlatNameInLegacyDir = join(base, '.gsd', 'milestones', 'M005-3qxqd7', 'slices', 'S04', '05-04-ASSESSMENT.md');
|
|
247
|
+
const wrongFlatPhasePath = join(base, '.gsd', 'phases', '05-3qxqd7-legacy-milestone', '05-04-ASSESSMENT.md');
|
|
248
|
+
assert.match(
|
|
249
|
+
result.assessmentPath.replace(/\\/g, '/'),
|
|
250
|
+
/\/\.gsd\/milestones\/M005-3qxqd7\/slices\/S04\/S04-ASSESSMENT\.md$/,
|
|
251
|
+
);
|
|
252
|
+
assert.ok(existsSync(correctPath), 'legacy ASSESSMENT should use S## filename inside slices/S##/');
|
|
253
|
+
assert.equal(existsSync(wrongFlatNameInLegacyDir), false, 'legacy slice dir must not receive flat-phase assessment filename');
|
|
254
|
+
assert.equal(existsSync(wrongFlatPhasePath), false, 'legacy reassessment must not be diverted to a coexisting flat-phase dir');
|
|
255
|
+
|
|
256
|
+
const assessment = getAssessment('.gsd/milestones/M005-3qxqd7/slices/S04/S04-ASSESSMENT.md');
|
|
257
|
+
assert.ok(assessment, 'assessment row should use the legacy-layout path');
|
|
258
|
+
} finally {
|
|
259
|
+
cleanup(base);
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
|
|
213
263
|
test('handleReassessRoadmap cache invalidation: getMilestoneSlices reflects mutations', async () => {
|
|
214
264
|
const base = makeTmpBase();
|
|
215
265
|
openDatabase(join(base, '.gsd', 'gsd.db'));
|
|
@@ -6,8 +6,10 @@ import { join } from "node:path";
|
|
|
6
6
|
import { randomUUID } from "node:crypto";
|
|
7
7
|
|
|
8
8
|
import { autoSession } from "../auto-runtime-state.ts";
|
|
9
|
+
import { postUnitPreVerification } from "../auto-post-unit.ts";
|
|
9
10
|
import { registerHooks } from "../bootstrap/register-hooks.ts";
|
|
10
11
|
import { resetToolCallLoopGuard } from "../bootstrap/tool-call-loop-guard.ts";
|
|
12
|
+
import { closeDatabase, openDatabase } from "../gsd-db.ts";
|
|
11
13
|
import { readUnitHarnessAbort } from "../unit-runtime.ts";
|
|
12
14
|
|
|
13
15
|
type Handler = (event: any, ctx?: any) => Promise<any> | any;
|
|
@@ -166,6 +168,109 @@ test("register-hooks does not record normal product tool failures as harness abo
|
|
|
166
168
|
assert.equal(abort, null);
|
|
167
169
|
});
|
|
168
170
|
|
|
171
|
+
test("tool_execution_end latches a failed ScheduleWakeup across unrelated tool success", async (t) => {
|
|
172
|
+
const base = makeRuntimeBase();
|
|
173
|
+
mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
|
|
174
|
+
openDatabase(join(base, ".gsd", "gsd.db"));
|
|
175
|
+
autoSession.reset();
|
|
176
|
+
autoSession.active = true;
|
|
177
|
+
autoSession.basePath = base;
|
|
178
|
+
autoSession.currentUnit = { type: "discuss-milestone", id: "M001", startedAt: Date.now() };
|
|
179
|
+
t.after(() => {
|
|
180
|
+
closeDatabase();
|
|
181
|
+
autoSession.reset();
|
|
182
|
+
rmSync(base, { recursive: true, force: true });
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
const { emitToolExecutionEnd } = makeHookHarness();
|
|
186
|
+
const error = "`prompt` is required when `stop` is not true";
|
|
187
|
+
|
|
188
|
+
await emitToolExecutionEnd({
|
|
189
|
+
toolName: "ScheduleWakeup",
|
|
190
|
+
isError: true,
|
|
191
|
+
result: error,
|
|
192
|
+
});
|
|
193
|
+
assert.equal(autoSession.lastToolInvocationError, `ScheduleWakeup: ${error}`);
|
|
194
|
+
|
|
195
|
+
await emitToolExecutionEnd({
|
|
196
|
+
toolName: "read",
|
|
197
|
+
isError: false,
|
|
198
|
+
result: "file contents",
|
|
199
|
+
});
|
|
200
|
+
assert.equal(
|
|
201
|
+
autoSession.lastToolInvocationError,
|
|
202
|
+
`ScheduleWakeup: ${error}`,
|
|
203
|
+
"an unrelated success must not erase a failed continuation before the unit boundary",
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
await emitToolExecutionEnd({
|
|
207
|
+
toolName: "parse_payload",
|
|
208
|
+
isError: true,
|
|
209
|
+
result: "Unexpected end of JSON input",
|
|
210
|
+
});
|
|
211
|
+
assert.equal(
|
|
212
|
+
autoSession.lastToolInvocationError,
|
|
213
|
+
`ScheduleWakeup: ${error}`,
|
|
214
|
+
"a later invocation error must not replace the failed continuation",
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
let pauseCalled = false;
|
|
218
|
+
const notifications: Array<{ message: string; severity?: string }> = [];
|
|
219
|
+
const result = await postUnitPreVerification(
|
|
220
|
+
{
|
|
221
|
+
s: autoSession,
|
|
222
|
+
ctx: {
|
|
223
|
+
ui: {
|
|
224
|
+
notify: (message: string, severity?: string) => notifications.push({ message, severity }),
|
|
225
|
+
},
|
|
226
|
+
} as any,
|
|
227
|
+
pi: {} as any,
|
|
228
|
+
buildSnapshotOpts: () => ({}) as any,
|
|
229
|
+
lockBase: () => base,
|
|
230
|
+
stopAuto: async () => {},
|
|
231
|
+
pauseAuto: async () => { pauseCalled = true; },
|
|
232
|
+
updateProgressWidget: () => {},
|
|
233
|
+
},
|
|
234
|
+
{ skipSettleDelay: true, skipWorktreeSync: true },
|
|
235
|
+
);
|
|
236
|
+
|
|
237
|
+
assert.equal(result, "dispatched");
|
|
238
|
+
assert.equal(pauseCalled, true);
|
|
239
|
+
assert.equal(autoSession.pendingVerificationRetry, null);
|
|
240
|
+
assert.ok(
|
|
241
|
+
notifications.some(({ message, severity }) => severity === "error" && message.includes(error)),
|
|
242
|
+
"the unit boundary must surface the rejected continuation",
|
|
243
|
+
);
|
|
244
|
+
assert.equal(autoSession.lastToolInvocationError, null);
|
|
245
|
+
|
|
246
|
+
await emitToolExecutionEnd({
|
|
247
|
+
toolName: "ScheduleWakeup",
|
|
248
|
+
isError: true,
|
|
249
|
+
result: error,
|
|
250
|
+
});
|
|
251
|
+
await emitToolExecutionEnd({
|
|
252
|
+
toolName: "ScheduleWakeup",
|
|
253
|
+
isError: false,
|
|
254
|
+
result: "Wakeup scheduled",
|
|
255
|
+
});
|
|
256
|
+
assert.equal(autoSession.lastToolInvocationError, null);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
test("tool_execution_end ignores ScheduleWakeup-shaped business validation from other tools", async (t) => {
|
|
260
|
+
autoSession.reset();
|
|
261
|
+
autoSession.active = true;
|
|
262
|
+
t.after(() => autoSession.reset());
|
|
263
|
+
|
|
264
|
+
const { emitToolExecutionEnd } = makeHookHarness();
|
|
265
|
+
await emitToolExecutionEnd({
|
|
266
|
+
toolName: "submit_review",
|
|
267
|
+
isError: true,
|
|
268
|
+
result: "`prompt` is required when `stop` is not true",
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
assert.equal(autoSession.lastToolInvocationError, null);
|
|
272
|
+
});
|
|
273
|
+
|
|
169
274
|
test("register-hooks does not classify normal gsd_uat_exec nonzero exits as harness aborts", async (t) => {
|
|
170
275
|
const base = makeRuntimeBase();
|
|
171
276
|
const startedAt = Date.now();
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { mkdtempSync, mkdirSync, rmSync, readFileSync, existsSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
openDatabase,
|
|
9
|
+
closeDatabase,
|
|
10
|
+
insertMilestone,
|
|
11
|
+
insertSlice,
|
|
12
|
+
insertTask,
|
|
13
|
+
upsertTaskPlanning,
|
|
14
|
+
getTask,
|
|
15
|
+
getReplanHistory,
|
|
16
|
+
} from '../gsd-db.ts';
|
|
17
|
+
import { handleReplanTask } from '../tools/replan-task.ts';
|
|
18
|
+
|
|
19
|
+
function makeTmpBase(): string {
|
|
20
|
+
const base = mkdtempSync(join(tmpdir(), 'gsd-replan-task-'));
|
|
21
|
+
mkdirSync(join(base, '.gsd', 'phases', '01-test'), { recursive: true });
|
|
22
|
+
return base;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function cleanup(base: string): void {
|
|
26
|
+
try { closeDatabase(); } catch { /* noop */ }
|
|
27
|
+
try { rmSync(base, { recursive: true, force: true }); } catch { /* noop */ }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function seedTask(status = 'pending'): void {
|
|
31
|
+
insertMilestone({ id: 'M001', title: 'Test Milestone', status: 'active' });
|
|
32
|
+
insertSlice({ id: 'S01', milestoneId: 'M001', title: 'Test Slice', status: 'active', demo: 'Demo.' });
|
|
33
|
+
insertTask({ id: 'T01', sliceId: 'S01', milestoneId: 'M001', title: 'Original Task', status });
|
|
34
|
+
upsertTaskPlanning('M001', 'S01', 'T01', {
|
|
35
|
+
description: 'Original task description.',
|
|
36
|
+
estimate: '30m',
|
|
37
|
+
files: ['src/original.ts'],
|
|
38
|
+
verify: 'node --test original.test.ts',
|
|
39
|
+
inputs: ['src/original.ts'],
|
|
40
|
+
expectedOutput: ['src/original.ts'],
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function validReplanTaskParams() {
|
|
45
|
+
return {
|
|
46
|
+
milestoneId: 'M001',
|
|
47
|
+
sliceId: 'S01',
|
|
48
|
+
taskId: 'T01',
|
|
49
|
+
title: 'Replanned Task',
|
|
50
|
+
description: 'Updated task description with blocking rework scope.',
|
|
51
|
+
estimate: '45m',
|
|
52
|
+
files: ['src/replanned.ts'],
|
|
53
|
+
verify: 'node --test replanned.test.ts',
|
|
54
|
+
inputs: ['src/original.ts'],
|
|
55
|
+
expectedOutput: ['src/replanned.ts'],
|
|
56
|
+
reworkBriefRef: 'RB-001',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
test('handleReplanTask updates one pending task plan and records a task-scoped replan history entry', async () => {
|
|
61
|
+
const base = makeTmpBase();
|
|
62
|
+
openDatabase(join(base, '.gsd', 'gsd.db'));
|
|
63
|
+
|
|
64
|
+
try {
|
|
65
|
+
seedTask('pending');
|
|
66
|
+
|
|
67
|
+
const result = await handleReplanTask(validReplanTaskParams(), base);
|
|
68
|
+
assert.ok(!('error' in result), `unexpected error: ${'error' in result ? result.error : ''}`);
|
|
69
|
+
|
|
70
|
+
const task = getTask('M001', 'S01', 'T01');
|
|
71
|
+
assert.ok(task, 'task should still exist');
|
|
72
|
+
assert.equal(task.title, 'Replanned Task');
|
|
73
|
+
assert.equal(task.description, 'Updated task description with blocking rework scope.');
|
|
74
|
+
assert.equal(task.verify, 'node --test replanned.test.ts');
|
|
75
|
+
assert.deepEqual(task.files, ['src/replanned.ts']);
|
|
76
|
+
|
|
77
|
+
const history = getReplanHistory('M001', 'S01');
|
|
78
|
+
assert.ok(history.some((row) => row['task_id'] === 'T01' && String(row['summary']).includes('RB-001')));
|
|
79
|
+
|
|
80
|
+
const planPath = join(base, '.gsd', 'phases', '01-test', '01-01-PLAN.md');
|
|
81
|
+
assert.ok(existsSync(planPath), 'slice plan projection should be rendered');
|
|
82
|
+
const planContent = readFileSync(planPath, 'utf-8');
|
|
83
|
+
assert.match(planContent, /Replanned Task/);
|
|
84
|
+
assert.match(planContent, /node --test replanned\.test\.ts/);
|
|
85
|
+
} finally {
|
|
86
|
+
cleanup(base);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test('handleReplanTask rejects completed tasks', async () => {
|
|
91
|
+
const base = makeTmpBase();
|
|
92
|
+
openDatabase(join(base, '.gsd', 'gsd.db'));
|
|
93
|
+
|
|
94
|
+
try {
|
|
95
|
+
seedTask('complete');
|
|
96
|
+
|
|
97
|
+
const result = await handleReplanTask(validReplanTaskParams(), base);
|
|
98
|
+
assert.ok('error' in result);
|
|
99
|
+
assert.match(result.error, /cannot replan completed task T01/i);
|
|
100
|
+
} finally {
|
|
101
|
+
cleanup(base);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { createTestContext } from './test-helpers.ts';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import * as os from 'node:os';
|
|
5
|
+
import {
|
|
6
|
+
openDatabase,
|
|
7
|
+
closeDatabase,
|
|
8
|
+
_getAdapter,
|
|
9
|
+
type ReworkBriefFindingInput,
|
|
10
|
+
} from '../gsd-db.ts';
|
|
11
|
+
import { handleReworkBriefSave } from '../tools/rework-brief.ts';
|
|
12
|
+
|
|
13
|
+
const { assertEq, assertTrue, assertMatch, report } = createTestContext();
|
|
14
|
+
|
|
15
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
16
|
+
// Helpers
|
|
17
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
18
|
+
|
|
19
|
+
function tempDbPath(): string {
|
|
20
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-rework-brief-'));
|
|
21
|
+
return path.join(dir, 'test.db');
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function cleanup(dbPath: string): void {
|
|
25
|
+
closeDatabase();
|
|
26
|
+
try {
|
|
27
|
+
const dir = path.dirname(dbPath);
|
|
28
|
+
for (const f of fs.readdirSync(dir)) fs.unlinkSync(path.join(dir, f));
|
|
29
|
+
fs.rmdirSync(dir);
|
|
30
|
+
} catch {
|
|
31
|
+
// best effort
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function finding(overrides: Partial<ReworkBriefFindingInput> = {}): ReworkBriefFindingInput {
|
|
36
|
+
return {
|
|
37
|
+
findingId: 'F1',
|
|
38
|
+
severity: 'blocking',
|
|
39
|
+
description: 'Compile regression',
|
|
40
|
+
requiredFix: 'Fix compile error',
|
|
41
|
+
verificationCommands: ['pnpm run typecheck:extensions'],
|
|
42
|
+
...overrides,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const baseParams = {
|
|
47
|
+
briefId: 'RB-001',
|
|
48
|
+
milestoneId: 'M001',
|
|
49
|
+
sliceId: 'S01',
|
|
50
|
+
taskId: 'T01',
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
function findingRow(): { status: string; evidence: string; decision_ref: string } | undefined {
|
|
54
|
+
return _getAdapter()!
|
|
55
|
+
.prepare("SELECT status, evidence, decision_ref FROM rework_brief_findings WHERE brief_id = 'RB-001' AND finding_id = 'F1'")
|
|
56
|
+
.get() as { status: string; evidence: string; decision_ref: string } | undefined;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
60
|
+
// rework-brief: a blocking finding saved as non-pending must carry the same
|
|
61
|
+
// justification a reworkResolution would, otherwise it bypasses the
|
|
62
|
+
// gsd_task_complete blocking gate (which only sees `pending` rows).
|
|
63
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
64
|
+
|
|
65
|
+
console.log('\n=== rework-brief: rejects blocking resolved finding without evidence ===');
|
|
66
|
+
{
|
|
67
|
+
const dbPath = tempDbPath();
|
|
68
|
+
openDatabase(dbPath);
|
|
69
|
+
|
|
70
|
+
const result = await handleReworkBriefSave({
|
|
71
|
+
...baseParams,
|
|
72
|
+
findings: [finding({ status: 'resolved' })],
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
assertTrue('error' in result, 'blocking resolved finding without evidence should be rejected');
|
|
76
|
+
if ('error' in result) {
|
|
77
|
+
assertMatch(result.error, /evidence is required/i, 'error should mention the evidence requirement');
|
|
78
|
+
}
|
|
79
|
+
const rows = _getAdapter()!.prepare('SELECT COUNT(*) AS n FROM rework_brief_findings').get() as { n: number };
|
|
80
|
+
assertEq(rows.n, 0, 'no finding rows should be persisted when validation fails');
|
|
81
|
+
|
|
82
|
+
cleanup(dbPath);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
console.log('\n=== rework-brief: rejects blocking deferred-with-override without decisionRef ===');
|
|
86
|
+
{
|
|
87
|
+
const dbPath = tempDbPath();
|
|
88
|
+
openDatabase(dbPath);
|
|
89
|
+
|
|
90
|
+
const result = await handleReworkBriefSave({
|
|
91
|
+
...baseParams,
|
|
92
|
+
findings: [finding({ status: 'deferred-with-override', evidence: 'Maintainer accepted temporary deferral.' })],
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
assertTrue('error' in result, 'deferred-with-override without decisionRef should be rejected');
|
|
96
|
+
if ('error' in result) {
|
|
97
|
+
assertMatch(result.error, /decisionRef is required/i, 'error should mention the decisionRef requirement');
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
cleanup(dbPath);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
console.log('\n=== rework-brief: rejects invalid finding status ===');
|
|
104
|
+
{
|
|
105
|
+
const dbPath = tempDbPath();
|
|
106
|
+
openDatabase(dbPath);
|
|
107
|
+
|
|
108
|
+
const result = await handleReworkBriefSave({
|
|
109
|
+
...baseParams,
|
|
110
|
+
findings: [finding({ status: 'bogus' as unknown as ReworkBriefFindingInput['status'] })],
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
assertTrue('error' in result, 'an unknown status value should be rejected');
|
|
114
|
+
if ('error' in result) {
|
|
115
|
+
assertMatch(result.error, /status must be/i, 'error should name the allowed statuses');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
cleanup(dbPath);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
122
|
+
// rework-brief: legitimate saves still succeed.
|
|
123
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
124
|
+
|
|
125
|
+
console.log('\n=== rework-brief: blocking finding defaults to pending ===');
|
|
126
|
+
{
|
|
127
|
+
const dbPath = tempDbPath();
|
|
128
|
+
openDatabase(dbPath);
|
|
129
|
+
|
|
130
|
+
const result = await handleReworkBriefSave({
|
|
131
|
+
...baseParams,
|
|
132
|
+
findings: [finding()],
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
assertTrue(!('error' in result), 'a blocking finding without a status should be accepted');
|
|
136
|
+
assertEq(findingRow()?.status, 'pending', 'finding without status should default to pending');
|
|
137
|
+
|
|
138
|
+
cleanup(dbPath);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
console.log('\n=== rework-brief: accepts blocking resolved finding with evidence ===');
|
|
142
|
+
{
|
|
143
|
+
const dbPath = tempDbPath();
|
|
144
|
+
openDatabase(dbPath);
|
|
145
|
+
|
|
146
|
+
const result = await handleReworkBriefSave({
|
|
147
|
+
...baseParams,
|
|
148
|
+
findings: [finding({ status: 'resolved', evidence: 'Fixed compile error and reran pnpm run typecheck:extensions.' })],
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
assertTrue(!('error' in result), 'a resolved blocking finding with evidence should be accepted');
|
|
152
|
+
assertEq(findingRow()?.status, 'resolved', 'finding should persist as resolved when evidence is supplied');
|
|
153
|
+
assertMatch(findingRow()?.evidence ?? '', /Fixed compile error/, 'resolution evidence should be persisted');
|
|
154
|
+
|
|
155
|
+
cleanup(dbPath);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
console.log('\n=== rework-brief: accepts blocking deferred-with-override with evidence and decisionRef ===');
|
|
159
|
+
{
|
|
160
|
+
const dbPath = tempDbPath();
|
|
161
|
+
openDatabase(dbPath);
|
|
162
|
+
|
|
163
|
+
const result = await handleReworkBriefSave({
|
|
164
|
+
...baseParams,
|
|
165
|
+
findings: [finding({
|
|
166
|
+
status: 'deferred-with-override',
|
|
167
|
+
evidence: 'Maintainer accepted temporary deferral.',
|
|
168
|
+
decisionRef: 'DEC-2026-07-07-rework-deferral',
|
|
169
|
+
})],
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
assertTrue(!('error' in result), 'a deferred-with-override finding with evidence and decisionRef should be accepted');
|
|
173
|
+
assertEq(findingRow()?.status, 'deferred-with-override', 'finding should persist the override status');
|
|
174
|
+
assertEq(findingRow()?.decision_ref, 'DEC-2026-07-07-rework-deferral', 'decision reference should be persisted');
|
|
175
|
+
|
|
176
|
+
cleanup(dbPath);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
console.log('\n=== rework-brief: advisory resolved finding does not require evidence ===');
|
|
180
|
+
{
|
|
181
|
+
const dbPath = tempDbPath();
|
|
182
|
+
openDatabase(dbPath);
|
|
183
|
+
|
|
184
|
+
// Advisory findings never gate gsd_task_complete, so pre-resolving one
|
|
185
|
+
// without evidence is harmless and stays permitted.
|
|
186
|
+
const result = await handleReworkBriefSave({
|
|
187
|
+
...baseParams,
|
|
188
|
+
findings: [finding({ severity: 'advisory', status: 'resolved' })],
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
assertTrue(!('error' in result), 'an advisory resolved finding should be accepted without evidence');
|
|
192
|
+
assertEq(findingRow()?.status, 'resolved', 'advisory finding status should be preserved');
|
|
193
|
+
|
|
194
|
+
cleanup(dbPath);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
report();
|
|
@@ -35,6 +35,10 @@ describe("supportsServiceTier", () => {
|
|
|
35
35
|
assert.equal(supportsServiceTier("gpt-5.5"), false);
|
|
36
36
|
});
|
|
37
37
|
|
|
38
|
+
test("returns false for gpt-5.6 until service_tier payload support is verified", () => {
|
|
39
|
+
assert.equal(supportsServiceTier("gpt-5.6"), false);
|
|
40
|
+
});
|
|
41
|
+
|
|
38
42
|
test("returns false for provider-only identifier without gpt-5.4 model suffix", () => {
|
|
39
43
|
assert.equal(supportsServiceTier("vibeproxy-openai"), false);
|
|
40
44
|
});
|
|
@@ -7,8 +7,9 @@
|
|
|
7
7
|
* self-identify (Stream 2: actor identity passthrough).
|
|
8
8
|
*
|
|
9
9
|
* 2. The 3 reversibility handlers (reopen-task/slice/milestone) are
|
|
10
|
-
* registered as MCP tools
|
|
11
|
-
*
|
|
10
|
+
* registered as MCP tools under their canonical names, and additionally
|
|
11
|
+
* under their alias names when GSD_ADVERTISE_TOOL_ALIASES=1 (plan 035
|
|
12
|
+
* suppresses alias schemas by default) (Stream 3: reversibility tools).
|
|
12
13
|
*
|
|
13
14
|
* 3. The reopen tools accept the documented core params plus optional
|
|
14
15
|
* reason/actorName/triggerReason without rejecting valid payloads.
|
|
@@ -36,6 +37,18 @@ function getTool(name: string) {
|
|
|
36
37
|
return pi.tools.find((t: any) => t.name === name);
|
|
37
38
|
}
|
|
38
39
|
|
|
40
|
+
function withEnv(name: string, value: string | undefined, fn: () => void): void {
|
|
41
|
+
const previous = process.env[name];
|
|
42
|
+
if (value === undefined) delete process.env[name];
|
|
43
|
+
else process.env[name] = value;
|
|
44
|
+
try {
|
|
45
|
+
fn();
|
|
46
|
+
} finally {
|
|
47
|
+
if (previous === undefined) delete process.env[name];
|
|
48
|
+
else process.env[name] = previous;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
39
52
|
function getRequiredProps(tool: any): string[] {
|
|
40
53
|
return tool.parameters.required ?? [];
|
|
41
54
|
}
|
|
@@ -78,7 +91,9 @@ for (const name of ACTOR_TOOLS) {
|
|
|
78
91
|
});
|
|
79
92
|
}
|
|
80
93
|
|
|
81
|
-
// ─── Stream 3: reopen tools registered
|
|
94
|
+
// ─── Stream 3: reopen tools registered under canonical names ────────────────
|
|
95
|
+
// Plan 035 suppresses alias schemas by default; the canonical reopen tools are
|
|
96
|
+
// always registered, and their aliases only when GSD_ADVERTISE_TOOL_ALIASES=1.
|
|
82
97
|
|
|
83
98
|
const REOPEN_TOOLS = [
|
|
84
99
|
{ canonical: "gsd_task_reopen", alias: "gsd_reopen_task" },
|
|
@@ -87,13 +102,24 @@ const REOPEN_TOOLS = [
|
|
|
87
102
|
];
|
|
88
103
|
|
|
89
104
|
for (const { canonical, alias } of REOPEN_TOOLS) {
|
|
90
|
-
test(`${canonical} — registered
|
|
105
|
+
test(`${canonical} — registered under its canonical name, no alias by default`, () => {
|
|
91
106
|
const canonicalTool = getTool(canonical);
|
|
92
|
-
const aliasTool = getTool(alias);
|
|
93
107
|
assert.ok(canonicalTool, `${canonical} must be registered`);
|
|
94
|
-
assert.ok(aliasTool, `${alias} must be registered as alias`);
|
|
95
108
|
assert.ok(typeof canonicalTool.execute === "function", `${canonical} must have an execute function`);
|
|
96
|
-
assert.ok(
|
|
109
|
+
assert.ok(!getTool(alias), `${alias} must not be registered by default (plan 035 alias suppression)`);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test(`${canonical} — registered with alias ${alias} when GSD_ADVERTISE_TOOL_ALIASES=1`, () => {
|
|
113
|
+
withEnv("GSD_ADVERTISE_TOOL_ALIASES", "1", () => {
|
|
114
|
+
const aliasPi = makeMockPi();
|
|
115
|
+
registerDbTools(aliasPi);
|
|
116
|
+
const canonicalTool = aliasPi.tools.find((t: any) => t.name === canonical);
|
|
117
|
+
const aliasTool = aliasPi.tools.find((t: any) => t.name === alias);
|
|
118
|
+
assert.ok(canonicalTool, `${canonical} must be registered`);
|
|
119
|
+
assert.ok(aliasTool, `${alias} must be registered as alias`);
|
|
120
|
+
assert.ok(typeof canonicalTool.execute === "function", `${canonical} must have an execute function`);
|
|
121
|
+
assert.ok(typeof aliasTool.execute === "function", `${alias} must have an execute function`);
|
|
122
|
+
});
|
|
97
123
|
});
|
|
98
124
|
}
|
|
99
125
|
|
|
@@ -56,6 +56,10 @@ function buildBlock(
|
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
+
function expectedSkillRead(base: string, name: string): string {
|
|
60
|
+
return `Read the skill file at \`${join(base, "skills", name, "SKILL.md")}\``;
|
|
61
|
+
}
|
|
62
|
+
|
|
59
63
|
test("buildSkillActivationBlock does not auto-activate skills via broad context heuristic", () => {
|
|
60
64
|
const base = makeTempBase();
|
|
61
65
|
try {
|
|
@@ -92,7 +96,7 @@ test("buildSkillActivationBlock activates skills via prefer_skills when context
|
|
|
92
96
|
prefer_skills: ["react"],
|
|
93
97
|
});
|
|
94
98
|
|
|
95
|
-
assert.
|
|
99
|
+
assert.ok(result.includes(expectedSkillRead(base, "react")));
|
|
96
100
|
assert.doesNotMatch(result, /swiftui/);
|
|
97
101
|
} finally {
|
|
98
102
|
cleanup(base);
|
|
@@ -111,7 +115,7 @@ test("buildSkillActivationBlock includes always_use_skills using read-based skil
|
|
|
111
115
|
|
|
112
116
|
assert.equal(
|
|
113
117
|
result,
|
|
114
|
-
|
|
118
|
+
`<skill_activation>Read the skill file at \`${join(base, "skills", "swift-testing", "SKILL.md")}\`.</skill_activation>`,
|
|
115
119
|
);
|
|
116
120
|
} finally {
|
|
117
121
|
cleanup(base);
|
|
@@ -140,8 +144,8 @@ test("buildSkillActivationBlock includes skill_rules matches and task-plan skill
|
|
|
140
144
|
skill_rules: [{ when: "prisma database schema", use: ["prisma"] }],
|
|
141
145
|
});
|
|
142
146
|
|
|
143
|
-
assert.
|
|
144
|
-
assert.
|
|
147
|
+
assert.ok(result.includes(expectedSkillRead(base, "accessibility")));
|
|
148
|
+
assert.ok(result.includes(expectedSkillRead(base, "prisma")));
|
|
145
149
|
} finally {
|
|
146
150
|
cleanup(base);
|
|
147
151
|
}
|
|
@@ -163,7 +167,7 @@ test("buildSkillActivationBlock matches skill_rules against exact unit type cont
|
|
|
163
167
|
],
|
|
164
168
|
});
|
|
165
169
|
|
|
166
|
-
assert.
|
|
170
|
+
assert.ok(result.includes(expectedSkillRead(base, "complete-slice-policies")));
|
|
167
171
|
assert.doesNotMatch(result, /slice-broad/);
|
|
168
172
|
} finally {
|
|
169
173
|
cleanup(base);
|
|
@@ -267,8 +271,8 @@ test("buildSkillActivationBlock allows valid skill names and rejects invalid one
|
|
|
267
271
|
});
|
|
268
272
|
|
|
269
273
|
assert.match(result, /skill_activation/);
|
|
270
|
-
assert.
|
|
271
|
-
assert.
|
|
274
|
+
assert.ok(result.includes(expectedSkillRead(base, "react")));
|
|
275
|
+
assert.ok(result.includes(expectedSkillRead(base, "good-skill-2")));
|
|
272
276
|
assert.doesNotMatch(result, /bad'name/);
|
|
273
277
|
} finally {
|
|
274
278
|
cleanup(base);
|
|
@@ -292,8 +296,8 @@ test("buildSkillActivationBlock: explicit always_use_skills bypass the unit-type
|
|
|
292
296
|
always_use_skills: ["write-docs", "swiftui"],
|
|
293
297
|
});
|
|
294
298
|
|
|
295
|
-
assert.
|
|
296
|
-
assert.
|
|
299
|
+
assert.ok(result.includes(expectedSkillRead(base, "write-docs")));
|
|
300
|
+
assert.ok(result.includes(expectedSkillRead(base, "swiftui")));
|
|
297
301
|
} finally {
|
|
298
302
|
cleanup(base);
|
|
299
303
|
}
|
|
@@ -310,7 +314,7 @@ test("buildSkillActivationBlock falls through to all skills for unknown unit typ
|
|
|
310
314
|
});
|
|
311
315
|
|
|
312
316
|
// Unknown unit type = wildcard fallback (pre-manifest behavior).
|
|
313
|
-
assert.
|
|
317
|
+
assert.ok(result.includes(expectedSkillRead(base, "swiftui")));
|
|
314
318
|
} finally {
|
|
315
319
|
cleanup(base);
|
|
316
320
|
}
|
|
@@ -327,7 +331,7 @@ test("buildSkillActivationBlock without unitType preserves pre-manifest behavior
|
|
|
327
331
|
always_use_skills: ["swiftui"],
|
|
328
332
|
});
|
|
329
333
|
|
|
330
|
-
assert.
|
|
334
|
+
assert.ok(result.includes(expectedSkillRead(base, "swiftui")));
|
|
331
335
|
} finally {
|
|
332
336
|
cleanup(base);
|
|
333
337
|
}
|
|
@@ -344,12 +348,12 @@ test("milestone prompt builders propagate always_use_skills through buildSkillAc
|
|
|
344
348
|
loadOnlyTestSkills(base);
|
|
345
349
|
|
|
346
350
|
const researchPrompt = await buildResearchMilestonePrompt("M001", "Test", base);
|
|
347
|
-
assert.
|
|
348
|
-
assert.
|
|
351
|
+
assert.ok(researchPrompt.includes(expectedSkillRead(base, "write-docs")));
|
|
352
|
+
assert.ok(researchPrompt.includes(expectedSkillRead(base, "swiftui")));
|
|
349
353
|
|
|
350
354
|
const planPrompt = await buildPlanMilestonePrompt("M001", "Test", base);
|
|
351
|
-
assert.
|
|
352
|
-
assert.
|
|
355
|
+
assert.ok(planPrompt.includes(expectedSkillRead(base, "write-docs")));
|
|
356
|
+
assert.ok(planPrompt.includes(expectedSkillRead(base, "swiftui")));
|
|
353
357
|
} finally {
|
|
354
358
|
cleanup(base);
|
|
355
359
|
}
|
|
@@ -380,7 +384,7 @@ test("complete-slice prompt propagates always_use_skills through buildSkillActiv
|
|
|
380
384
|
|
|
381
385
|
const prompt = await buildCompleteSlicePrompt("M001", "Test", "S01", "Slice", base);
|
|
382
386
|
|
|
383
|
-
assert.
|
|
387
|
+
assert.ok(prompt.includes(expectedSkillRead(base, "write-docs")));
|
|
384
388
|
} finally {
|
|
385
389
|
cleanup(base);
|
|
386
390
|
}
|