gsd-pi 2.50.0-dev.d210a87 → 2.50.0
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 +0 -2
- package/dist/cli.js +0 -26
- package/dist/loader.js +0 -4
- package/dist/resource-loader.d.ts +1 -4
- package/dist/resource-loader.js +3 -138
- package/dist/resources/extensions/async-jobs/async-bash-tool.js +1 -3
- package/dist/resources/extensions/bg-shell/interaction.js +1 -3
- package/dist/resources/extensions/bg-shell/process-manager.js +1 -4
- package/dist/resources/extensions/claude-code-cli/partial-builder.js +0 -5
- package/dist/resources/extensions/gsd/auto/phases.js +1 -16
- package/dist/resources/extensions/gsd/auto/session.js +0 -5
- package/dist/resources/extensions/gsd/auto-dashboard.js +3 -22
- package/dist/resources/extensions/gsd/auto-dispatch.js +54 -81
- package/dist/resources/extensions/gsd/auto-post-unit.js +76 -37
- package/dist/resources/extensions/gsd/auto-prompts.js +0 -57
- package/dist/resources/extensions/gsd/auto-recovery.js +25 -21
- package/dist/resources/extensions/gsd/auto.js +5 -15
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +0 -16
- package/dist/resources/extensions/gsd/crash-recovery.js +2 -6
- package/dist/resources/extensions/gsd/custom-execution-policy.js +2 -3
- package/dist/resources/extensions/gsd/custom-verification.js +1 -3
- package/dist/resources/extensions/gsd/custom-workflow-engine.js +2 -3
- package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -4
- package/dist/resources/extensions/gsd/detection.js +3 -589
- package/dist/resources/extensions/gsd/dispatch-guard.js +1 -2
- package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -15
- package/dist/resources/extensions/gsd/files.js +1 -5
- package/dist/resources/extensions/gsd/guided-flow.js +0 -10
- package/dist/resources/extensions/gsd/init-wizard.js +1 -9
- package/dist/resources/extensions/gsd/model-router.js +0 -25
- package/dist/resources/extensions/gsd/notifications.js +0 -23
- package/dist/resources/extensions/gsd/preferences-skills.js +5 -11
- package/dist/resources/extensions/gsd/preferences-types.js +0 -1
- package/dist/resources/extensions/gsd/preferences-validation.js +0 -25
- package/dist/resources/extensions/gsd/preferences.js +0 -3
- package/dist/resources/extensions/gsd/prompts/forensics.md +7 -11
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -6
- package/dist/resources/extensions/gsd/provider-error-pause.js +0 -8
- package/dist/resources/extensions/gsd/rule-registry.js +11 -10
- package/dist/resources/extensions/gsd/session-forensics.js +3 -7
- package/dist/resources/extensions/gsd/skill-discovery.js +2 -3
- package/dist/resources/extensions/gsd/skill-health.js +2 -2
- package/dist/resources/extensions/gsd/skill-telemetry.js +5 -15
- package/dist/resources/extensions/gsd/state.js +5 -17
- package/dist/resources/extensions/gsd/templates/milestone-validation.md +0 -12
- package/dist/resources/extensions/gsd/templates/preferences.md +0 -2
- package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +9 -28
- package/dist/resources/extensions/gsd/undo.js +7 -8
- package/dist/resources/extensions/gsd/unit-runtime.js +1 -2
- package/dist/resources/extensions/gsd/verification-gate.js +1 -3
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -17
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- package/dist/web/standalone/.next/routes-manifest.json +0 -6
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- 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 +2 -2
- 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.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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 +26 -2
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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 +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js.nft.json +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.js.nft.json +1 -1
- 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 +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +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.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +1 -1
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +16 -17
- package/dist/web/standalone/.next/server/chunks/229.js +12 -0
- package/dist/web/standalone/.next/server/chunks/441.js +2 -0
- package/dist/web/standalone/.next/server/chunks/471.js +13 -0
- package/dist/web/standalone/.next/server/chunks/{4741.js → 741.js} +1 -1
- package/dist/web/standalone/.next/server/functions-config-manifest.json +0 -1
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +3 -3
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
- package/dist/web/standalone/.next/static/MQOhBnkC_TLtNn_JvZWDj/_buildManifest.js +1 -0
- package/dist/web/standalone/.next/static/chunks/4024.7c75ac378de0f2b5.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{2008.817d0885545aaea9.js → 485.243af25f0cdf50d6.js} +6 -6
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/boot/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-12dd5ece0df4badc.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/webpack-2473ce2c3879fff4.js +1 -0
- package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.css +1 -0
- 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/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +1 -1
- package/packages/pi-ai/dist/types.d.ts +0 -1
- package/packages/pi-ai/dist/types.d.ts.map +1 -1
- package/packages/pi-ai/dist/types.js.map +1 -1
- package/packages/pi-ai/pnpm-lock.yaml +2022 -0
- package/packages/pi-ai/src/types.ts +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +0 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +0 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.d.ts +1 -3
- package/packages/pi-coding-agent/dist/core/bash-executor.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/bash-executor.js +1 -10
- package/packages/pi-coding-agent/dist/core/bash-executor.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +0 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.js +0 -13
- package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +1 -19
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/wrapper.js +0 -8
- package/packages/pi-coding-agent/dist/core/extensions/wrapper.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-manager.js +1 -8
- package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.d.ts +1 -11
- package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/skills.js +8 -30
- package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js +0 -1
- package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +2 -2
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -1
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +2 -3
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +4 -6
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +0 -5
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +0 -12
- package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -2
- package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
- package/packages/pi-coding-agent/pnpm-lock.yaml +454 -0
- package/packages/pi-coding-agent/src/core/agent-session.ts +1 -2
- package/packages/pi-coding-agent/src/core/bash-executor.ts +2 -10
- package/packages/pi-coding-agent/src/core/extensions/index.ts +0 -2
- package/packages/pi-coding-agent/src/core/extensions/runner.ts +0 -18
- package/packages/pi-coding-agent/src/core/extensions/types.ts +0 -21
- package/packages/pi-coding-agent/src/core/extensions/wrapper.ts +0 -9
- package/packages/pi-coding-agent/src/core/package-manager.ts +1 -10
- package/packages/pi-coding-agent/src/core/skills.ts +10 -35
- package/packages/pi-coding-agent/src/core/slash-commands.ts +0 -1
- package/packages/pi-coding-agent/src/index.ts +0 -4
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +2 -3
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +4 -6
- package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +0 -15
- package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -2
- package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/themes.js +1 -2
- package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
- package/scripts/postinstall.js +6 -163
- package/src/resources/extensions/async-jobs/async-bash-tool.ts +1 -3
- package/src/resources/extensions/bg-shell/interaction.ts +1 -3
- package/src/resources/extensions/bg-shell/process-manager.ts +1 -4
- package/src/resources/extensions/claude-code-cli/partial-builder.ts +0 -5
- package/src/resources/extensions/gsd/auto/phases.ts +1 -15
- package/src/resources/extensions/gsd/auto/session.ts +0 -6
- package/src/resources/extensions/gsd/auto-dashboard.ts +3 -31
- package/src/resources/extensions/gsd/auto-dispatch.ts +51 -84
- package/src/resources/extensions/gsd/auto-post-unit.ts +83 -56
- package/src/resources/extensions/gsd/auto-prompts.ts +0 -48
- package/src/resources/extensions/gsd/auto-recovery.ts +26 -19
- package/src/resources/extensions/gsd/auto.ts +5 -15
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +0 -17
- package/src/resources/extensions/gsd/crash-recovery.ts +2 -6
- package/src/resources/extensions/gsd/custom-execution-policy.ts +2 -3
- package/src/resources/extensions/gsd/custom-verification.ts +1 -3
- package/src/resources/extensions/gsd/custom-workflow-engine.ts +2 -3
- package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -7
- package/src/resources/extensions/gsd/detection.ts +3 -662
- package/src/resources/extensions/gsd/dispatch-guard.ts +1 -2
- package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -15
- package/src/resources/extensions/gsd/files.ts +1 -6
- package/src/resources/extensions/gsd/guided-flow.ts +0 -11
- package/src/resources/extensions/gsd/init-wizard.ts +1 -9
- package/src/resources/extensions/gsd/model-router.ts +0 -25
- package/src/resources/extensions/gsd/notifications.ts +0 -23
- package/src/resources/extensions/gsd/preferences-skills.ts +5 -11
- package/src/resources/extensions/gsd/preferences-types.ts +0 -20
- package/src/resources/extensions/gsd/preferences-validation.ts +0 -26
- package/src/resources/extensions/gsd/preferences.ts +0 -3
- package/src/resources/extensions/gsd/prompts/forensics.md +7 -11
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -6
- package/src/resources/extensions/gsd/provider-error-pause.ts +0 -9
- package/src/resources/extensions/gsd/rule-registry.ts +11 -10
- package/src/resources/extensions/gsd/session-forensics.ts +3 -7
- package/src/resources/extensions/gsd/skill-discovery.ts +2 -3
- package/src/resources/extensions/gsd/skill-health.ts +2 -2
- package/src/resources/extensions/gsd/skill-telemetry.ts +5 -15
- package/src/resources/extensions/gsd/state.ts +5 -16
- package/src/resources/extensions/gsd/templates/milestone-validation.md +0 -12
- package/src/resources/extensions/gsd/templates/preferences.md +0 -2
- package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -16
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +0 -68
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +3 -5
- package/src/resources/extensions/gsd/tests/custom-verification.test.ts +0 -33
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +3 -4
- package/src/resources/extensions/gsd/tests/detection.test.ts +0 -838
- package/src/resources/extensions/gsd/tests/dist-redirect.mjs +9 -28
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +0 -63
- package/src/resources/extensions/gsd/tests/model-router.test.ts +0 -40
- package/src/resources/extensions/gsd/tests/notifications.test.ts +6 -28
- package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -50
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +0 -40
- package/src/resources/extensions/gsd/tests/reactive-executor.test.ts +6 -6
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +5 -4
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +0 -146
- package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +12 -12
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +0 -24
- package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +2 -2
- package/src/resources/extensions/gsd/types.ts +0 -2
- package/src/resources/extensions/gsd/undo.ts +7 -8
- package/src/resources/extensions/gsd/unit-runtime.ts +1 -2
- package/src/resources/extensions/gsd/verification-gate.ts +1 -3
- package/dist/resources/extensions/gsd/auto-observability.js +0 -54
- package/dist/resources/extensions/gsd/auto-utils.js +0 -20
- package/dist/resources/extensions/gsd/observability-validator.js +0 -422
- package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
- package/dist/resources/extensions/gsd/rtk-status.js +0 -43
- package/dist/resources/extensions/gsd/skill-catalog.js +0 -1026
- package/dist/resources/extensions/shared/rtk-session-stats.js +0 -189
- package/dist/resources/extensions/shared/rtk.js +0 -100
- package/dist/rtk.d.ts +0 -52
- package/dist/rtk.js +0 -332
- package/dist/web/standalone/.next/server/app/api/experimental/route.js +0 -3
- package/dist/web/standalone/.next/server/app/api/experimental/route.js.nft.json +0 -1
- package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +0 -1
- package/dist/web/standalone/.next/server/chunks/2229.js +0 -12
- package/dist/web/standalone/.next/server/chunks/2331.js +0 -25
- package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
- package/dist/web/standalone/.next/server/chunks/7471.js +0 -13
- package/dist/web/standalone/.next/static/chunks/4024.9ad5def014d90ce4.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/_global-error/page-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/boot/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/experimental/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-b950e4e384cc62b3.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-c4cc189e7b117ea2.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-cfc9a116e6450a6b.js +0 -1
- package/dist/web/standalone/.next/static/css/de141508b083f922.css +0 -1
- package/dist/web/standalone/.next/static/yJIyd5cXPNpmXTv18ZlyC/_buildManifest.js +0 -1
- package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +0 -105
- package/src/resources/extensions/gsd/auto-observability.ts +0 -72
- package/src/resources/extensions/gsd/auto-utils.ts +0 -25
- package/src/resources/extensions/gsd/observability-validator.ts +0 -456
- package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
- package/src/resources/extensions/gsd/rtk-status.ts +0 -53
- package/src/resources/extensions/gsd/skill-catalog.ts +0 -1085
- package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +0 -97
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
- package/src/resources/extensions/gsd/tests/retry-diagnostic-reasoning.test.ts +0 -161
- package/src/resources/extensions/gsd/tests/rewrite-count-persist.test.ts +0 -82
- package/src/resources/extensions/gsd/tests/skill-catalog.test.ts +0 -193
- package/src/resources/extensions/shared/rtk-session-stats.ts +0 -249
- package/src/resources/extensions/shared/rtk.ts +0 -120
- /package/dist/web/standalone/.next/static/{yJIyd5cXPNpmXTv18ZlyC → MQOhBnkC_TLtNn_JvZWDj}/_ssgManifest.js +0 -0
|
@@ -7,28 +7,17 @@ const require = createRequire(import.meta.url);
|
|
|
7
7
|
const ROOT = new URL("../../../../../", import.meta.url);
|
|
8
8
|
|
|
9
9
|
export function resolve(specifier, context, nextResolve) {
|
|
10
|
-
// 1.
|
|
11
|
-
// CI portability runs don't build any packages/ dist artifacts, so every
|
|
12
|
-
// @gsd/* specifier (including transitive ones pulled in by pi-coding-agent
|
|
13
|
-
// source itself) must resolve to the TypeScript source entrypoint.
|
|
10
|
+
// 1. Direct redirects to dist/ for specific packages
|
|
14
11
|
if (specifier === "../../packages/pi-coding-agent/src/index.js") {
|
|
15
|
-
specifier = new URL("packages/pi-coding-agent/
|
|
16
|
-
} else if (specifier === "@gsd/pi-coding-agent") {
|
|
17
|
-
specifier = new URL("packages/pi-coding-agent/src/index.ts", ROOT).href;
|
|
12
|
+
specifier = new URL("packages/pi-coding-agent/dist/index.js", ROOT).href;
|
|
18
13
|
} else if (specifier === "@gsd/pi-ai/oauth") {
|
|
19
|
-
specifier = new URL("packages/pi-ai/
|
|
14
|
+
specifier = new URL("packages/pi-ai/dist/utils/oauth/index.js", ROOT).href;
|
|
20
15
|
} else if (specifier === "@gsd/pi-ai") {
|
|
21
|
-
specifier = new URL("packages/pi-ai/
|
|
16
|
+
specifier = new URL("packages/pi-ai/dist/index.js", ROOT).href;
|
|
22
17
|
} else if (specifier === "@gsd/pi-agent-core") {
|
|
23
|
-
specifier = new URL("packages/pi-agent-core/
|
|
18
|
+
specifier = new URL("packages/pi-agent-core/dist/index.js", ROOT).href;
|
|
24
19
|
} else if (specifier === "@gsd/pi-tui") {
|
|
25
|
-
specifier = new URL("packages/pi-tui/
|
|
26
|
-
} else if (specifier === "@gsd/native") {
|
|
27
|
-
specifier = new URL("packages/native/src/index.ts", ROOT).href;
|
|
28
|
-
} else if (specifier.startsWith("@gsd/native/")) {
|
|
29
|
-
// Sub-path imports like @gsd/native/fd, @gsd/native/text, etc.
|
|
30
|
-
const subpath = specifier.slice("@gsd/native/".length);
|
|
31
|
-
specifier = new URL(`packages/native/src/${subpath}/index.ts`, ROOT).href;
|
|
20
|
+
specifier = new URL("packages/pi-tui/dist/index.js", ROOT).href;
|
|
32
21
|
}
|
|
33
22
|
// 2. Redirect packages/*/dist/ → packages/*/src/ with .js→.ts for strip-types
|
|
34
23
|
// Also handles local imports — skip rewrite for dist/ paths that are real compiled artifacts.
|
|
@@ -65,15 +54,9 @@ export function resolve(specifier, context, nextResolve) {
|
|
|
65
54
|
}
|
|
66
55
|
|
|
67
56
|
export function load(url, context, nextLoad) {
|
|
68
|
-
// Node's --experimental-strip-types handles
|
|
69
|
-
//
|
|
70
|
-
|
|
71
|
-
// files through TypeScript's transpileModule to avoid those crashes.
|
|
72
|
-
const shouldTranspileWithTypeScript =
|
|
73
|
-
url.endsWith('.tsx') ||
|
|
74
|
-
(url.endsWith('.ts') && url.includes('/packages/') && url.includes('/src/'));
|
|
75
|
-
|
|
76
|
-
if (shouldTranspileWithTypeScript) {
|
|
57
|
+
// Node's --experimental-strip-types handles .ts but not .tsx (which may contain JSX).
|
|
58
|
+
// Use TypeScript to transpile .tsx → JS with react-jsx transform, then serve as module.
|
|
59
|
+
if (url.endsWith('.tsx')) {
|
|
77
60
|
const ts = require('typescript');
|
|
78
61
|
const source = readFileSync(fileURLToPath(url), 'utf-8');
|
|
79
62
|
const { outputText } = ts.transpileModule(source, {
|
|
@@ -83,8 +66,6 @@ export function load(url, context, nextLoad) {
|
|
|
83
66
|
module: ts.ModuleKind.ESNext,
|
|
84
67
|
target: ts.ScriptTarget.ESNext,
|
|
85
68
|
esModuleInterop: true,
|
|
86
|
-
experimentalDecorators: true,
|
|
87
|
-
emitDecoratorMetadata: true,
|
|
88
69
|
},
|
|
89
70
|
});
|
|
90
71
|
return { format: 'module', source: outputText, shortCircuit: true };
|
|
@@ -294,66 +294,3 @@ test('verifyExpectedArtifact: hook types always return true', () => {
|
|
|
294
294
|
}
|
|
295
295
|
});
|
|
296
296
|
|
|
297
|
-
|
|
298
|
-
test('writeBlockerPlaceholder: updates DB task status for execute-task (#2531)', async () => {
|
|
299
|
-
const base = createFixtureBase();
|
|
300
|
-
try {
|
|
301
|
-
const { openDatabase, closeDatabase, insertMilestone, insertSlice, insertTask, getTask, isDbAvailable } =
|
|
302
|
-
await import("../gsd-db.ts");
|
|
303
|
-
|
|
304
|
-
const dbPath = join(base, ".gsd", "gsd.db");
|
|
305
|
-
// Create the tasks directory (required for artifact path resolution)
|
|
306
|
-
mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks"), { recursive: true });
|
|
307
|
-
|
|
308
|
-
openDatabase(dbPath);
|
|
309
|
-
try {
|
|
310
|
-
insertMilestone({ id: "M001", title: "Test", status: "active" });
|
|
311
|
-
insertSlice({ id: "S01", milestoneId: "M001", title: "Slice", status: "active" });
|
|
312
|
-
insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", title: "Task", status: "pending" });
|
|
313
|
-
|
|
314
|
-
// Before fix: writeBlockerPlaceholder wrote the file but left DB as "pending"
|
|
315
|
-
writeBlockerPlaceholder("execute-task", "M001/S01/T01", base, "idle recovery exhausted");
|
|
316
|
-
|
|
317
|
-
const task = getTask("M001", "S01", "T01");
|
|
318
|
-
assert.equal(task?.status, "complete",
|
|
319
|
-
"writeBlockerPlaceholder must update DB task status to 'complete' so verifyExpectedArtifact passes");
|
|
320
|
-
|
|
321
|
-
// Verify the full chain works: verifyExpectedArtifact should return true
|
|
322
|
-
const verified = verifyExpectedArtifact("execute-task", "M001/S01/T01", base);
|
|
323
|
-
assert.equal(verified, true,
|
|
324
|
-
"verifyExpectedArtifact should pass after writeBlockerPlaceholder updates DB status");
|
|
325
|
-
} finally {
|
|
326
|
-
if (isDbAvailable()) closeDatabase();
|
|
327
|
-
}
|
|
328
|
-
} finally {
|
|
329
|
-
cleanup(base);
|
|
330
|
-
}
|
|
331
|
-
});
|
|
332
|
-
|
|
333
|
-
test('writeBlockerPlaceholder: does NOT update DB for non-execute-task types', async () => {
|
|
334
|
-
const base = createFixtureBase();
|
|
335
|
-
try {
|
|
336
|
-
const { openDatabase, closeDatabase, insertMilestone, insertSlice, getSlice, isDbAvailable } =
|
|
337
|
-
await import("../gsd-db.ts");
|
|
338
|
-
|
|
339
|
-
const dbPath = join(base, ".gsd", "gsd.db");
|
|
340
|
-
mkdirSync(join(base, ".gsd", "milestones", "M001", "slices", "S01"), { recursive: true });
|
|
341
|
-
|
|
342
|
-
openDatabase(dbPath);
|
|
343
|
-
try {
|
|
344
|
-
insertMilestone({ id: "M001", title: "Test", status: "active" });
|
|
345
|
-
insertSlice({ id: "S01", milestoneId: "M001", title: "Slice", status: "active" });
|
|
346
|
-
|
|
347
|
-
// research-slice is NOT execute-task — DB should NOT be updated
|
|
348
|
-
writeBlockerPlaceholder("research-slice", "M001/S01", base, "idle recovery exhausted");
|
|
349
|
-
|
|
350
|
-
const slice = getSlice("M001", "S01");
|
|
351
|
-
assert.equal(slice?.status, "active",
|
|
352
|
-
"writeBlockerPlaceholder should not change DB status for non-execute-task types");
|
|
353
|
-
} finally {
|
|
354
|
-
if (isDbAvailable()) closeDatabase();
|
|
355
|
-
}
|
|
356
|
-
} finally {
|
|
357
|
-
cleanup(base);
|
|
358
|
-
}
|
|
359
|
-
});
|
|
@@ -165,43 +165,3 @@ test("falls back to configured model when no light-tier model available", () =>
|
|
|
165
165
|
assert.equal(result.modelId, "claude-opus-4-6");
|
|
166
166
|
assert.equal(result.wasDowngraded, false);
|
|
167
167
|
});
|
|
168
|
-
|
|
169
|
-
// ─── #2192: Unknown models honor explicit config ─────────────────────────────
|
|
170
|
-
|
|
171
|
-
test("#2192: unknown model is not downgraded — respects user config", () => {
|
|
172
|
-
const config = { ...defaultRoutingConfig(), enabled: true };
|
|
173
|
-
const result = resolveModelForComplexity(
|
|
174
|
-
makeClassification("light"),
|
|
175
|
-
{ primary: "gpt-5.4", fallbacks: [] },
|
|
176
|
-
config,
|
|
177
|
-
["gpt-5.4", ...AVAILABLE_MODELS],
|
|
178
|
-
);
|
|
179
|
-
assert.equal(result.modelId, "gpt-5.4", "unknown model should be used as-is");
|
|
180
|
-
assert.equal(result.wasDowngraded, false, "should not be downgraded");
|
|
181
|
-
assert.ok(result.reason.includes("not in the known tier map"), "reason should explain why");
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
test("#2192: unknown model with provider prefix is not downgraded", () => {
|
|
185
|
-
const config = { ...defaultRoutingConfig(), enabled: true };
|
|
186
|
-
const result = resolveModelForComplexity(
|
|
187
|
-
makeClassification("standard"),
|
|
188
|
-
{ primary: "custom-provider/my-model-v3", fallbacks: [] },
|
|
189
|
-
config,
|
|
190
|
-
["custom-provider/my-model-v3", ...AVAILABLE_MODELS],
|
|
191
|
-
);
|
|
192
|
-
assert.equal(result.modelId, "custom-provider/my-model-v3");
|
|
193
|
-
assert.equal(result.wasDowngraded, false);
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
test("#2192: known model is still downgraded normally", () => {
|
|
197
|
-
const config = { ...defaultRoutingConfig(), enabled: true };
|
|
198
|
-
// claude-opus-4-6 is known as "heavy" — a light request should downgrade
|
|
199
|
-
const result = resolveModelForComplexity(
|
|
200
|
-
makeClassification("light"),
|
|
201
|
-
{ primary: "claude-opus-4-6", fallbacks: [] },
|
|
202
|
-
config,
|
|
203
|
-
AVAILABLE_MODELS,
|
|
204
|
-
);
|
|
205
|
-
assert.equal(result.wasDowngraded, true, "known heavy model should still be downgraded for light tasks");
|
|
206
|
-
assert.notEqual(result.modelId, "claude-opus-4-6");
|
|
207
|
-
});
|
|
@@ -31,10 +31,7 @@ test("shouldSendDesktopNotification disables all categories when notifications a
|
|
|
31
31
|
assert.equal(shouldSendDesktopNotification("milestone", prefs), false);
|
|
32
32
|
});
|
|
33
33
|
|
|
34
|
-
test("buildDesktopNotificationCommand
|
|
35
|
-
// When terminal-notifier is not on PATH, falls back to osascript.
|
|
36
|
-
// This test runs in CI where terminal-notifier is typically not installed.
|
|
37
|
-
// If terminal-notifier IS installed, we verify it returns that instead.
|
|
34
|
+
test("buildDesktopNotificationCommand uses argument arrays for macOS notifications", () => {
|
|
38
35
|
const command = buildDesktopNotificationCommand(
|
|
39
36
|
"darwin",
|
|
40
37
|
`Bob's "Milestone"`,
|
|
@@ -43,30 +40,11 @@ test("buildDesktopNotificationCommand falls back to osascript on macOS when term
|
|
|
43
40
|
);
|
|
44
41
|
|
|
45
42
|
assert.ok(command);
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
assert.ok(command.args.includes("Basso")); // error level
|
|
52
|
-
} else {
|
|
53
|
-
// osascript fallback path
|
|
54
|
-
assert.equal(command.file, "osascript");
|
|
55
|
-
assert.deepEqual(command.args.slice(0, 1), ["-e"]);
|
|
56
|
-
assert.match(command.args[1], /Bob's \\"Milestone\\"/);
|
|
57
|
-
assert.match(command.args[1], /Budget! Path: C:\\\\temp/);
|
|
58
|
-
assert.doesNotMatch(command.args[1], /\n/);
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
test("buildDesktopNotificationCommand uses Glass sound for non-error on macOS", () => {
|
|
63
|
-
const command = buildDesktopNotificationCommand("darwin", "Title", "Message", "info");
|
|
64
|
-
assert.ok(command);
|
|
65
|
-
if (command.file.includes("terminal-notifier")) {
|
|
66
|
-
assert.ok(command.args.includes("Glass"));
|
|
67
|
-
} else {
|
|
68
|
-
assert.match(command.args[1], /sound name "Glass"/);
|
|
69
|
-
}
|
|
43
|
+
assert.equal(command.file, "osascript");
|
|
44
|
+
assert.deepEqual(command.args.slice(0, 1), ["-e"]);
|
|
45
|
+
assert.match(command.args[1], /Bob's \\"Milestone\\"/);
|
|
46
|
+
assert.match(command.args[1], /Budget! Path: C:\\\\temp/);
|
|
47
|
+
assert.doesNotMatch(command.args[1], /\n/);
|
|
70
48
|
});
|
|
71
49
|
|
|
72
50
|
test("buildDesktopNotificationCommand preserves literal shell characters on linux", () => {
|
|
@@ -377,53 +377,3 @@ test("unrecognized format warning is emitted at most once (#2373)", () => {
|
|
|
377
377
|
_resetParseWarningFlag();
|
|
378
378
|
}
|
|
379
379
|
});
|
|
380
|
-
|
|
381
|
-
// ── Experimental preferences ─────────────────────────────────────────────────
|
|
382
|
-
|
|
383
|
-
test("experimental.rtk: true is accepted and stored", () => {
|
|
384
|
-
const result = validatePreferences({ experimental: { rtk: true } });
|
|
385
|
-
assert.deepEqual(result.errors, []);
|
|
386
|
-
assert.equal(result.preferences.experimental?.rtk, true);
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
test("experimental.rtk: false is accepted and stored", () => {
|
|
390
|
-
const result = validatePreferences({ experimental: { rtk: false } });
|
|
391
|
-
assert.deepEqual(result.errors, []);
|
|
392
|
-
assert.equal(result.preferences.experimental?.rtk, false);
|
|
393
|
-
});
|
|
394
|
-
|
|
395
|
-
test("experimental.rtk: non-boolean produces error", () => {
|
|
396
|
-
const result = validatePreferences({ experimental: { rtk: "yes" } } as unknown as GSDPreferences);
|
|
397
|
-
assert.ok(result.errors.some(e => e.includes("experimental.rtk")), `expected rtk error in: ${JSON.stringify(result.errors)}`);
|
|
398
|
-
});
|
|
399
|
-
|
|
400
|
-
test("experimental: non-object produces error", () => {
|
|
401
|
-
const result = validatePreferences({ experimental: true } as unknown as GSDPreferences);
|
|
402
|
-
assert.ok(result.errors.some(e => e.includes("experimental must be an object")));
|
|
403
|
-
});
|
|
404
|
-
|
|
405
|
-
test("experimental: unknown key produces warning", () => {
|
|
406
|
-
const result = validatePreferences({ experimental: { rtk: true, future_flag: true } } as unknown as GSDPreferences);
|
|
407
|
-
assert.ok(result.warnings.some(w => w.includes("future_flag")), `expected unknown-key warning in: ${JSON.stringify(result.warnings)}`);
|
|
408
|
-
assert.equal(result.preferences.experimental?.rtk, true);
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
test("experimental: omitting rtk defaults to undefined (opt-in)", () => {
|
|
412
|
-
const result = validatePreferences({ version: 1 });
|
|
413
|
-
assert.equal(result.preferences.experimental, undefined);
|
|
414
|
-
});
|
|
415
|
-
|
|
416
|
-
test("experimental.rtk parses correctly from preferences markdown", () => {
|
|
417
|
-
const content = "---\nversion: 1\nexperimental:\n rtk: true\n---\n";
|
|
418
|
-
const prefs = parsePreferencesMarkdown(content);
|
|
419
|
-
assert.notEqual(prefs, null);
|
|
420
|
-
assert.equal(prefs!.experimental?.rtk, true);
|
|
421
|
-
});
|
|
422
|
-
|
|
423
|
-
test("experimental.rtk defaults to off in new project preferences", () => {
|
|
424
|
-
// No experimental key → feature is disabled
|
|
425
|
-
const content = "---\nversion: 1\n---\n";
|
|
426
|
-
const prefs = parsePreferencesMarkdown(content);
|
|
427
|
-
assert.notEqual(prefs, null);
|
|
428
|
-
assert.equal(prefs!.experimental?.rtk, undefined);
|
|
429
|
-
});
|
|
@@ -292,44 +292,4 @@ test('E2E: depends_on inline format preserved after partial removal', () => {
|
|
|
292
292
|
}
|
|
293
293
|
});
|
|
294
294
|
|
|
295
|
-
test('E2E: DB-backed path respects queue order (#2556)', async () => {
|
|
296
|
-
// Regression test for #2556: getActiveMilestoneId and deriveStateFromDb
|
|
297
|
-
// used lexicographic sort instead of queue order, causing a deadlock when
|
|
298
|
-
// the dispatch guard (which respects queue order) blocked completion.
|
|
299
|
-
const base = createFixtureBase();
|
|
300
|
-
try {
|
|
301
|
-
const { openDatabase, closeDatabase, insertMilestone, isDbAvailable } = await import('../gsd-db.ts');
|
|
302
|
-
const dbPath = join(base, '.gsd', 'gsd.db');
|
|
303
|
-
|
|
304
|
-
// Create milestone directories (required for findMilestoneIds)
|
|
305
|
-
writeMilestoneDir(base, 'M006');
|
|
306
|
-
writeContext(base, 'M006', '', 'Earlier milestone');
|
|
307
|
-
writeMilestoneDir(base, 'M008');
|
|
308
|
-
writeContext(base, 'M008', '', 'Later milestone');
|
|
309
|
-
|
|
310
|
-
// Open DB and insert milestones
|
|
311
|
-
openDatabase(dbPath);
|
|
312
|
-
try {
|
|
313
|
-
insertMilestone({ id: 'M006', title: 'Earlier', status: 'active' });
|
|
314
|
-
insertMilestone({ id: 'M008', title: 'Later', status: 'active' });
|
|
315
|
-
|
|
316
|
-
// Set queue order: M008 should come FIRST (user reordered via /gsd queue)
|
|
317
|
-
saveQueueOrder(base, ['M008', 'M006']);
|
|
318
|
-
|
|
319
|
-
// deriveState should pick M008 (queue-first), not M006 (ID-first)
|
|
320
|
-
invalidateStateCache();
|
|
321
|
-
const state = await deriveState(base);
|
|
322
|
-
assert.equal(
|
|
323
|
-
state.activeMilestone?.id,
|
|
324
|
-
'M008',
|
|
325
|
-
'DB-backed deriveState must respect queue order — M008 is queued first',
|
|
326
|
-
);
|
|
327
|
-
} finally {
|
|
328
|
-
if (isDbAvailable()) closeDatabase();
|
|
329
|
-
}
|
|
330
|
-
} finally {
|
|
331
|
-
cleanup(base);
|
|
332
|
-
}
|
|
333
|
-
});
|
|
334
|
-
|
|
335
295
|
});
|
|
@@ -15,7 +15,6 @@ import {
|
|
|
15
15
|
} from "../reactive-graph.ts";
|
|
16
16
|
import { validatePreferences } from "../preferences-validation.ts";
|
|
17
17
|
import type { ReactiveExecutionState } from "../types.ts";
|
|
18
|
-
import { parseUnitId } from "../unit-id.ts";
|
|
19
18
|
|
|
20
19
|
// ─── Preference Validation ────────────────────────────────────────────────
|
|
21
20
|
|
|
@@ -442,12 +441,13 @@ test("unitId batch encoding round-trips correctly", () => {
|
|
|
442
441
|
const unitId = `${mid}/${sid}/reactive+${selected.join(",")}`;
|
|
443
442
|
|
|
444
443
|
// Parse it back
|
|
445
|
-
const
|
|
446
|
-
assert.equal(
|
|
447
|
-
assert.equal(
|
|
448
|
-
const
|
|
444
|
+
const parts = unitId.split("/");
|
|
445
|
+
assert.equal(parts[0], "M001");
|
|
446
|
+
assert.equal(parts[1], "S01");
|
|
447
|
+
const batchPart = parts[2];
|
|
448
|
+
const plusIdx = batchPart.indexOf("+");
|
|
449
449
|
assert.ok(plusIdx > 0, "Should have + separator");
|
|
450
|
-
const batchIds = batchPart
|
|
450
|
+
const batchIds = batchPart.slice(plusIdx + 1).split(",");
|
|
451
451
|
assert.deepEqual(batchIds, ["T02", "T03", "T05"]);
|
|
452
452
|
});
|
|
453
453
|
|
|
@@ -16,7 +16,6 @@ import {
|
|
|
16
16
|
resolveHookArtifactPath,
|
|
17
17
|
} from "../post-unit-hooks.ts";
|
|
18
18
|
import { uncheckTaskInPlan } from "../undo.ts";
|
|
19
|
-
import { parseUnitId } from "../unit-id.ts";
|
|
20
19
|
|
|
21
20
|
// ─── Fixture Helpers ───────────────────────────────────────────────────────
|
|
22
21
|
|
|
@@ -184,7 +183,8 @@ test('Full retry reset: all steps combined', () => {
|
|
|
184
183
|
retryArtifact: "NEEDS-REWORK.md",
|
|
185
184
|
};
|
|
186
185
|
|
|
187
|
-
const
|
|
186
|
+
const parts = trigger.unitId.split("/");
|
|
187
|
+
const [mid, sid, tid] = parts;
|
|
188
188
|
|
|
189
189
|
// Simulate completedUnits
|
|
190
190
|
let completedUnits = [
|
|
@@ -264,10 +264,11 @@ test('Retry reset: idempotent when artifacts already missing', () => {
|
|
|
264
264
|
};
|
|
265
265
|
|
|
266
266
|
// These should not throw even with missing files
|
|
267
|
-
const
|
|
267
|
+
const parts = trigger.unitId.split("/");
|
|
268
|
+
const [mid, sid, tid] = parts;
|
|
268
269
|
|
|
269
270
|
// Uncheck — returns false because no PLAN file
|
|
270
|
-
const uncheckResult = uncheckTaskInPlan(base, mid, sid
|
|
271
|
+
const uncheckResult = uncheckTaskInPlan(base, mid, sid, tid);
|
|
271
272
|
assert.ok(!uncheckResult, "uncheck returns false when no PLAN exists");
|
|
272
273
|
|
|
273
274
|
// Summary does not exist — no crash
|
|
@@ -460,150 +460,4 @@ test('(n) stale replay guard', async () => {
|
|
|
460
460
|
}
|
|
461
461
|
});
|
|
462
462
|
|
|
463
|
-
test('(q) verdict in ASSESSMENT file skips UAT dispatch (file-based path)', async () => {
|
|
464
|
-
// Regression test for #2644: run-uat prompt writes the verdict to
|
|
465
|
-
// S{sid}-ASSESSMENT.md (via gsd_summary_save artifact_type:"ASSESSMENT"),
|
|
466
|
-
// but checkNeedsRunUat only checked S{sid}-UAT.md — causing a stuck loop.
|
|
467
|
-
const base = createFixtureBase();
|
|
468
|
-
try {
|
|
469
|
-
const roadmapDir = join(base, '.gsd', 'milestones', 'M001');
|
|
470
|
-
mkdirSync(roadmapDir, { recursive: true });
|
|
471
|
-
writeFileSync(
|
|
472
|
-
join(roadmapDir, 'M001-ROADMAP.md'),
|
|
473
|
-
[
|
|
474
|
-
'# M001: Test roadmap',
|
|
475
|
-
'',
|
|
476
|
-
'## Slices',
|
|
477
|
-
'',
|
|
478
|
-
'- [x] **S01: First slice** `risk:low` `depends:[]`',
|
|
479
|
-
'- [ ] **S02: Next slice** `risk:low` `depends:[S01]`',
|
|
480
|
-
'',
|
|
481
|
-
'## Boundary Map',
|
|
482
|
-
'',
|
|
483
|
-
].join('\n'),
|
|
484
|
-
);
|
|
485
|
-
|
|
486
|
-
// UAT spec file WITHOUT a verdict (the spec never gets one)
|
|
487
|
-
writeSliceFile(base, 'M001', 'S01', 'UAT', makeUatContent('artifact-driven'));
|
|
488
|
-
// ASSESSMENT file WITH a verdict (where run-uat actually writes it)
|
|
489
|
-
writeSliceFile(base, 'M001', 'S01', 'ASSESSMENT', '---\nverdict: PASS\n---\n# UAT Assessment\n');
|
|
490
|
-
|
|
491
|
-
const state = {
|
|
492
|
-
activeMilestone: { id: 'M001', title: 'Test roadmap' },
|
|
493
|
-
activeSlice: { id: 'S02', title: 'Next slice' },
|
|
494
|
-
activeTask: null,
|
|
495
|
-
phase: 'planning',
|
|
496
|
-
recentDecisions: [],
|
|
497
|
-
blockers: [],
|
|
498
|
-
nextAction: 'Plan S02',
|
|
499
|
-
registry: [],
|
|
500
|
-
} as const;
|
|
501
|
-
|
|
502
|
-
const result = await checkNeedsRunUat(base, 'M001', state as any, { uat_dispatch: true } as any);
|
|
503
|
-
assert.deepStrictEqual(
|
|
504
|
-
result,
|
|
505
|
-
null,
|
|
506
|
-
'verdict in ASSESSMENT file should prevent re-dispatch of run-uat',
|
|
507
|
-
);
|
|
508
|
-
} finally {
|
|
509
|
-
cleanup(base);
|
|
510
|
-
}
|
|
511
|
-
});
|
|
512
|
-
|
|
513
|
-
test('(r) no ASSESSMENT file still dispatches UAT (no false skip)', async () => {
|
|
514
|
-
// Guard: when there is no ASSESSMENT file at all, UAT should still dispatch
|
|
515
|
-
// normally. The ASSESSMENT check must not cause a false-negative skip.
|
|
516
|
-
const base = createFixtureBase();
|
|
517
|
-
try {
|
|
518
|
-
const roadmapDir = join(base, '.gsd', 'milestones', 'M001');
|
|
519
|
-
mkdirSync(roadmapDir, { recursive: true });
|
|
520
|
-
writeFileSync(
|
|
521
|
-
join(roadmapDir, 'M001-ROADMAP.md'),
|
|
522
|
-
[
|
|
523
|
-
'# M001: Test roadmap',
|
|
524
|
-
'',
|
|
525
|
-
'## Slices',
|
|
526
|
-
'',
|
|
527
|
-
'- [x] **S01: First slice** `risk:low` `depends:[]`',
|
|
528
|
-
'- [ ] **S02: Next slice** `risk:low` `depends:[S01]`',
|
|
529
|
-
'',
|
|
530
|
-
'## Boundary Map',
|
|
531
|
-
'',
|
|
532
|
-
].join('\n'),
|
|
533
|
-
);
|
|
534
|
-
|
|
535
|
-
// UAT spec file WITHOUT a verdict, and NO ASSESSMENT file
|
|
536
|
-
writeSliceFile(base, 'M001', 'S01', 'UAT', makeUatContent('artifact-driven'));
|
|
537
|
-
|
|
538
|
-
const state = {
|
|
539
|
-
activeMilestone: { id: 'M001', title: 'Test roadmap' },
|
|
540
|
-
activeSlice: { id: 'S02', title: 'Next slice' },
|
|
541
|
-
activeTask: null,
|
|
542
|
-
phase: 'planning',
|
|
543
|
-
recentDecisions: [],
|
|
544
|
-
blockers: [],
|
|
545
|
-
nextAction: 'Plan S02',
|
|
546
|
-
registry: [],
|
|
547
|
-
} as const;
|
|
548
|
-
|
|
549
|
-
const result = await checkNeedsRunUat(base, 'M001', state as any, { uat_dispatch: true } as any);
|
|
550
|
-
assert.deepStrictEqual(
|
|
551
|
-
result,
|
|
552
|
-
{ sliceId: 'S01', uatType: 'artifact-driven' },
|
|
553
|
-
'without ASSESSMENT file, UAT still dispatches normally',
|
|
554
|
-
);
|
|
555
|
-
} finally {
|
|
556
|
-
cleanup(base);
|
|
557
|
-
}
|
|
558
|
-
});
|
|
559
|
-
|
|
560
|
-
test('(s) ASSESSMENT without verdict does not skip UAT dispatch', async () => {
|
|
561
|
-
// Guard: an ASSESSMENT file that exists but has no verdict line should
|
|
562
|
-
// NOT suppress UAT dispatch — only a file with an actual verdict should.
|
|
563
|
-
const base = createFixtureBase();
|
|
564
|
-
try {
|
|
565
|
-
const roadmapDir = join(base, '.gsd', 'milestones', 'M001');
|
|
566
|
-
mkdirSync(roadmapDir, { recursive: true });
|
|
567
|
-
writeFileSync(
|
|
568
|
-
join(roadmapDir, 'M001-ROADMAP.md'),
|
|
569
|
-
[
|
|
570
|
-
'# M001: Test roadmap',
|
|
571
|
-
'',
|
|
572
|
-
'## Slices',
|
|
573
|
-
'',
|
|
574
|
-
'- [x] **S01: First slice** `risk:low` `depends:[]`',
|
|
575
|
-
'- [ ] **S02: Next slice** `risk:low` `depends:[S01]`',
|
|
576
|
-
'',
|
|
577
|
-
'## Boundary Map',
|
|
578
|
-
'',
|
|
579
|
-
].join('\n'),
|
|
580
|
-
);
|
|
581
|
-
|
|
582
|
-
// UAT spec WITHOUT verdict
|
|
583
|
-
writeSliceFile(base, 'M001', 'S01', 'UAT', makeUatContent('artifact-driven'));
|
|
584
|
-
// ASSESSMENT file WITHOUT verdict (partial/incomplete assessment)
|
|
585
|
-
writeSliceFile(base, 'M001', 'S01', 'ASSESSMENT', '# UAT Assessment\n\nStill running checks...\n');
|
|
586
|
-
|
|
587
|
-
const state = {
|
|
588
|
-
activeMilestone: { id: 'M001', title: 'Test roadmap' },
|
|
589
|
-
activeSlice: { id: 'S02', title: 'Next slice' },
|
|
590
|
-
activeTask: null,
|
|
591
|
-
phase: 'planning',
|
|
592
|
-
recentDecisions: [],
|
|
593
|
-
blockers: [],
|
|
594
|
-
nextAction: 'Plan S02',
|
|
595
|
-
registry: [],
|
|
596
|
-
} as const;
|
|
597
|
-
|
|
598
|
-
const result = await checkNeedsRunUat(base, 'M001', state as any, { uat_dispatch: true } as any);
|
|
599
|
-
assert.deepStrictEqual(
|
|
600
|
-
result,
|
|
601
|
-
{ sliceId: 'S01', uatType: 'artifact-driven' },
|
|
602
|
-
'ASSESSMENT without verdict should not suppress UAT dispatch',
|
|
603
|
-
);
|
|
604
|
-
} finally {
|
|
605
|
-
cleanup(base);
|
|
606
|
-
}
|
|
607
|
-
});
|
|
608
|
-
|
|
609
463
|
});
|
|
@@ -113,12 +113,12 @@ test("postUnitPostVerification pushes to sidecarQueue for hooks", () => {
|
|
|
113
113
|
assert.ok(triageSectionStart > -1, "auto-post-unit.ts must have a triage check section");
|
|
114
114
|
const hookSection = source.slice(hookSectionStart, triageSectionStart);
|
|
115
115
|
assert.ok(
|
|
116
|
-
hookSection.includes("
|
|
117
|
-
"hook section must
|
|
116
|
+
hookSection.includes("s.sidecarQueue.push("),
|
|
117
|
+
"hook section must push to s.sidecarQueue",
|
|
118
118
|
);
|
|
119
119
|
assert.ok(
|
|
120
|
-
hookSection.includes('"hook"'),
|
|
121
|
-
"hook sidecar item must
|
|
120
|
+
hookSection.includes('kind: "hook"'),
|
|
121
|
+
"hook sidecar item must have kind: 'hook'",
|
|
122
122
|
);
|
|
123
123
|
});
|
|
124
124
|
|
|
@@ -132,12 +132,12 @@ test("postUnitPostVerification pushes to sidecarQueue for triage", () => {
|
|
|
132
132
|
assert.ok(quickTaskSectionStart > -1, "auto-post-unit.ts must have a quick-task dispatch section");
|
|
133
133
|
const triageSection = source.slice(triageSectionStart, quickTaskSectionStart);
|
|
134
134
|
assert.ok(
|
|
135
|
-
triageSection.includes("
|
|
136
|
-
"triage section must
|
|
135
|
+
triageSection.includes("s.sidecarQueue.push("),
|
|
136
|
+
"triage section must push to s.sidecarQueue",
|
|
137
137
|
);
|
|
138
138
|
assert.ok(
|
|
139
|
-
triageSection.includes('"triage"'),
|
|
140
|
-
"triage sidecar item must
|
|
139
|
+
triageSection.includes('kind: "triage"'),
|
|
140
|
+
"triage sidecar item must have kind: 'triage'",
|
|
141
141
|
);
|
|
142
142
|
});
|
|
143
143
|
|
|
@@ -149,12 +149,12 @@ test("postUnitPostVerification pushes to sidecarQueue for quick-tasks", () => {
|
|
|
149
149
|
assert.ok(quickTaskSectionStart > -1, "auto-post-unit.ts must have a quick-task dispatch section");
|
|
150
150
|
const quickTaskSection = source.slice(quickTaskSectionStart);
|
|
151
151
|
assert.ok(
|
|
152
|
-
quickTaskSection.includes("
|
|
153
|
-
"quick-task section must
|
|
152
|
+
quickTaskSection.includes("s.sidecarQueue.push("),
|
|
153
|
+
"quick-task section must push to s.sidecarQueue",
|
|
154
154
|
);
|
|
155
155
|
assert.ok(
|
|
156
|
-
quickTaskSection.includes('"quick-task"'),
|
|
157
|
-
"quick-task sidecar item must
|
|
156
|
+
quickTaskSection.includes('kind: "quick-task"'),
|
|
157
|
+
"quick-task sidecar item must have kind: 'quick-task'",
|
|
158
158
|
);
|
|
159
159
|
});
|
|
160
160
|
|
|
@@ -47,27 +47,3 @@ test("#2309: rate limits are still transient", () => {
|
|
|
47
47
|
assert.equal(rlResult.isTransient, true, "rate limits are still transient");
|
|
48
48
|
assert.equal(rlResult.isRateLimit, true, "rate limits are flagged as rate limits");
|
|
49
49
|
});
|
|
50
|
-
|
|
51
|
-
// --- #2572: stream-truncation JSON parse errors should be transient ---
|
|
52
|
-
|
|
53
|
-
test("#2572: 'Expected double-quoted property name' (truncated stream) is transient", () => {
|
|
54
|
-
const result = classifyProviderError("Expected double-quoted property name in JSON at position 23 (line 1 column 24)");
|
|
55
|
-
assert.equal(result.isTransient, true, "truncated-stream JSON parse error should be transient");
|
|
56
|
-
assert.equal(result.isRateLimit, false, "not a rate limit");
|
|
57
|
-
assert.equal(result.suggestedDelayMs, 15_000, "should use 15s backoff like connection errors");
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
test("#2572: 'Unexpected end of JSON input' (truncated stream) is transient", () => {
|
|
61
|
-
const result = classifyProviderError("Unexpected end of JSON input");
|
|
62
|
-
assert.equal(result.isTransient, true, "'Unexpected end of JSON input' should be transient");
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
test("#2572: 'Unexpected token' in JSON (truncated stream) is transient", () => {
|
|
66
|
-
const result = classifyProviderError("Unexpected token < in JSON at position 0");
|
|
67
|
-
assert.equal(result.isTransient, true, "'Unexpected token in JSON' should be transient");
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
test("#2572: 'SyntaxError' with JSON context (truncated stream) is transient", () => {
|
|
71
|
-
const result = classifyProviderError("SyntaxError: JSON.parse: unexpected character at line 1 column 1");
|
|
72
|
-
assert.equal(result.isTransient, true, "'SyntaxError...JSON' should be transient");
|
|
73
|
-
});
|
|
@@ -119,7 +119,7 @@ test("dispatch: triage dispatch keeps the loop in continue mode", () => {
|
|
|
119
119
|
postUnitSrc.indexOf("// ── Quick-task dispatch"),
|
|
120
120
|
);
|
|
121
121
|
assert.ok(
|
|
122
|
-
triageBlock.includes('return "continue"')
|
|
122
|
+
triageBlock.includes('return "continue"'),
|
|
123
123
|
"triage dispatch should return 'continue' after enqueuing sidecar work",
|
|
124
124
|
);
|
|
125
125
|
});
|
|
@@ -320,7 +320,7 @@ test("dispatch: quick-task dispatch keeps the loop in continue mode", () => {
|
|
|
320
320
|
postUnitSrc.indexOf("if (s.stepMode)"),
|
|
321
321
|
);
|
|
322
322
|
assert.ok(
|
|
323
|
-
quickTaskSection.includes('return "continue"')
|
|
323
|
+
quickTaskSection.includes('return "continue"'),
|
|
324
324
|
"quick-task dispatch should return 'continue' after enqueuing sidecar work",
|
|
325
325
|
);
|
|
326
326
|
});
|
|
@@ -157,8 +157,6 @@ export interface Summary {
|
|
|
157
157
|
whatHappened: string;
|
|
158
158
|
deviations: string;
|
|
159
159
|
filesModified: FileModified[];
|
|
160
|
-
followUps: string;
|
|
161
|
-
knownLimitations: string;
|
|
162
160
|
}
|
|
163
161
|
|
|
164
162
|
// ─── Continue-Here ─────────────────────────────────────────────────────────
|