gsd-pi 2.43.0 → 2.44.0-dev.0b97ffd
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 +30 -12
- package/dist/cli.js +13 -1
- package/dist/help-text.js +24 -0
- package/dist/resources/extensions/bg-shell/overlay.js +3 -0
- package/dist/resources/extensions/github-sync/sync.js +2 -1
- package/dist/resources/extensions/gsd/auto/loop.js +0 -2
- package/dist/resources/extensions/gsd/auto/phases.js +7 -12
- package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +34 -19
- package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
- package/dist/resources/extensions/gsd/auto-post-unit.js +128 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +202 -92
- package/dist/resources/extensions/gsd/auto-recovery.js +83 -135
- package/dist/resources/extensions/gsd/auto-start.js +10 -0
- package/dist/resources/extensions/gsd/auto-supervisor.js +14 -0
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
- package/dist/resources/extensions/gsd/auto-verification.js +5 -10
- package/dist/resources/extensions/gsd/auto-worktree.js +123 -30
- package/dist/resources/extensions/gsd/auto.js +1 -4
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +611 -0
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
- package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
- package/dist/resources/extensions/gsd/commands-maintenance.js +78 -3
- package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
- package/dist/resources/extensions/gsd/db-writer.js +95 -4
- package/dist/resources/extensions/gsd/dispatch-guard.js +35 -30
- package/dist/resources/extensions/gsd/doctor-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor-environment.js +28 -0
- package/dist/resources/extensions/gsd/doctor-types.js +0 -15
- package/dist/resources/extensions/gsd/doctor.js +46 -282
- package/dist/resources/extensions/gsd/file-watcher.js +5 -1
- package/dist/resources/extensions/gsd/files.js +14 -198
- package/dist/resources/extensions/gsd/git-service.js +4 -0
- package/dist/resources/extensions/gsd/gitignore.js +4 -0
- package/dist/resources/extensions/gsd/gsd-db.js +819 -197
- package/dist/resources/extensions/gsd/guided-flow.js +18 -8
- package/dist/resources/extensions/gsd/markdown-renderer.js +862 -0
- package/dist/resources/extensions/gsd/md-importer.js +182 -4
- package/dist/resources/extensions/gsd/native-git-bridge.js +10 -1
- package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +38 -0
- package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +9 -0
- package/dist/resources/extensions/gsd/preferences.js +1 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
- package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
- package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -7
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -6
- package/dist/resources/extensions/gsd/reactive-graph.js +33 -3
- package/dist/resources/extensions/gsd/skill-health.js +3 -1
- package/dist/resources/extensions/gsd/state.js +484 -30
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +128 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +244 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +204 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +205 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +155 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +94 -0
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +152 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +146 -0
- package/dist/resources/extensions/gsd/triage-resolution.js +17 -1
- package/dist/resources/extensions/gsd/undo.js +197 -3
- package/dist/resources/extensions/gsd/visualizer-data.js +53 -16
- package/dist/resources/extensions/gsd/workspace-index.js +63 -39
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -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 +1 -1
- package/dist/web/standalone/.next/required-server-files.json +4 -4
- package/dist/web/standalone/.next/routes-manifest.json +6 -0
- 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 +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_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/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/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 +5 -5
- 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 -0
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -0
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -0
- 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 +2 -2
- 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 +18 -17
- package/dist/web/standalone/.next/server/chunks/229.js +3 -3
- package/dist/web/standalone/.next/server/chunks/471.js +3 -3
- package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
- 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 +2 -2
- 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/static/alS4hoANx0TK4UVZY27da/_buildManifest.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{4024.c195dc1fdd2adbea.js → 4024.0de81b543b28b9fe.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/_global-error/{page-d07a2c023f1aef1e.js → page-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/boot/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
- 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 +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
- 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-459824ffb8c323dd.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-fa307370fcf9fb2c.js → webpack-9014b5adb127a98a.js} +1 -1
- package/dist/web/standalone/.next/static/css/8a727f372cf53002.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 +4 -4
- package/packages/pi-ai/dist/models.custom.d.ts +173 -0
- package/packages/pi-ai/dist/models.custom.d.ts.map +1 -0
- package/packages/pi-ai/dist/models.custom.js +170 -0
- package/packages/pi-ai/dist/models.custom.js.map +1 -0
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.js +16 -1
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/models.test.d.ts +2 -0
- package/packages/pi-ai/dist/models.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/models.test.js +67 -0
- package/packages/pi-ai/dist/models.test.js.map +1 -0
- package/packages/pi-ai/src/models.custom.ts +172 -0
- package/packages/pi-ai/src/models.test.ts +85 -0
- package/packages/pi-ai/src/models.ts +17 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +10 -3
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +21 -34
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.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/loader.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +80 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +63 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
- 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/fallback-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.js +69 -21
- package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +3 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +11 -199
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +6 -0
- 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 +21 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +8 -15
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/print-mode.js +45 -34
- package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -2
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +26 -37
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
- package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
- package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +96 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +89 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
- package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
- package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
- package/packages/pi-coding-agent/src/core/lsp/client.ts +83 -21
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
- package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
- package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
- package/packages/pi-coding-agent/src/index.ts +7 -0
- package/packages/pi-coding-agent/src/main.ts +11 -232
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +20 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +9 -16
- package/packages/pi-coding-agent/src/modes/print-mode.ts +42 -32
- package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +8 -2
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +8 -15
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/bg-shell/overlay.ts +4 -0
- package/src/resources/extensions/github-sync/sync.ts +2 -1
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -8
- package/src/resources/extensions/gsd/auto/loop.ts +0 -2
- package/src/resources/extensions/gsd/auto/phases.ts +7 -20
- package/src/resources/extensions/gsd/auto/types.ts +0 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +34 -19
- package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
- package/src/resources/extensions/gsd/auto-post-unit.ts +150 -15
- package/src/resources/extensions/gsd/auto-prompts.ts +186 -103
- package/src/resources/extensions/gsd/auto-recovery.ts +77 -142
- package/src/resources/extensions/gsd/auto-start.ts +14 -0
- package/src/resources/extensions/gsd/auto-supervisor.ts +14 -0
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
- package/src/resources/extensions/gsd/auto-verification.ts +4 -9
- package/src/resources/extensions/gsd/auto-worktree.ts +126 -30
- package/src/resources/extensions/gsd/auto.ts +0 -9
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +675 -4
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
- package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
- package/src/resources/extensions/gsd/commands-maintenance.ts +86 -3
- package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
- package/src/resources/extensions/gsd/db-writer.ts +105 -4
- package/src/resources/extensions/gsd/dispatch-guard.ts +32 -30
- package/src/resources/extensions/gsd/doctor-checks.ts +25 -11
- package/src/resources/extensions/gsd/doctor-environment.ts +31 -0
- package/src/resources/extensions/gsd/doctor-types.ts +0 -23
- package/src/resources/extensions/gsd/doctor.ts +45 -295
- package/src/resources/extensions/gsd/file-watcher.ts +4 -1
- package/src/resources/extensions/gsd/files.ts +16 -220
- package/src/resources/extensions/gsd/git-service.ts +4 -0
- package/src/resources/extensions/gsd/gitignore.ts +4 -0
- package/src/resources/extensions/gsd/gsd-db.ts +1157 -370
- package/src/resources/extensions/gsd/guided-flow.ts +20 -8
- package/src/resources/extensions/gsd/markdown-renderer.ts +1098 -0
- package/src/resources/extensions/gsd/md-importer.ts +211 -2
- package/src/resources/extensions/gsd/native-git-bridge.ts +12 -1
- package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +43 -0
- package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
- package/src/resources/extensions/gsd/preferences-types.ts +3 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +9 -0
- package/src/resources/extensions/gsd/preferences.ts +1 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
- package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
- package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -7
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
- package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -6
- package/src/resources/extensions/gsd/reactive-graph.ts +33 -3
- package/src/resources/extensions/gsd/skill-health.ts +2 -1
- package/src/resources/extensions/gsd/state.ts +547 -29
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
- package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +600 -513
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
- package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +540 -668
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
- package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
- package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +39 -60
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +375 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +387 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +390 -420
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +512 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +644 -84
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
- package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +192 -161
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +30 -90
- package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +57 -80
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +55 -153
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +53 -97
- package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
- package/src/resources/extensions/gsd/tests/doctor.test.ts +109 -149
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +278 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +232 -0
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
- package/src/resources/extensions/gsd/tests/git-service.test.ts +291 -390
- package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +440 -0
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -270
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
- package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1161 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +429 -0
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +89 -97
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +127 -164
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
- package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
- package/src/resources/extensions/gsd/tests/parsers.test.ts +548 -612
- package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
- package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +296 -0
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +63 -65
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
- package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
- package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +19 -13
- package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -142
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +12 -5
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
- package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +176 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +249 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +194 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
- package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
- package/src/resources/extensions/gsd/types.ts +50 -0
- package/src/resources/extensions/gsd/undo.ts +247 -3
- package/src/resources/extensions/gsd/visualizer-data.ts +54 -17
- package/src/resources/extensions/gsd/workspace-index.ts +64 -46
- package/dist/resources/extensions/gsd/auto-observability.js +0 -56
- package/dist/resources/extensions/gsd/observability-validator.js +0 -422
- package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
- package/dist/web/standalone/.next/static/VvclDCW6TAWjEyLU-EYL1/_buildManifest.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/css/123c0bb039697968.css +0 -1
- package/src/resources/extensions/gsd/auto-observability.ts +0 -74
- 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/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
- /package/dist/web/standalone/.next/static/{VvclDCW6TAWjEyLU-EYL1 → alS4hoANx0TK4UVZY27da}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { describe, test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
1
3
|
import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync, readFileSync } from 'node:fs';
|
|
2
4
|
import { join } from 'node:path';
|
|
3
5
|
import { tmpdir } from 'node:os';
|
|
@@ -9,10 +11,6 @@ import {
|
|
|
9
11
|
pruneQueueOrder,
|
|
10
12
|
validateQueueOrder,
|
|
11
13
|
} from '../queue-order.ts';
|
|
12
|
-
import { createTestContext } from './test-helpers.ts';
|
|
13
|
-
|
|
14
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
15
|
-
|
|
16
14
|
// ─── Fixture Helpers ───────────────────────────────────────────────────────
|
|
17
15
|
|
|
18
16
|
function createFixtureBase(): string {
|
|
@@ -29,176 +27,166 @@ function cleanup(base: string): void {
|
|
|
29
27
|
// sortByQueueOrder
|
|
30
28
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
31
29
|
|
|
32
|
-
console.log('\n=== sortByQueueOrder ===');
|
|
33
30
|
|
|
31
|
+
describe('queue-order', () => {
|
|
32
|
+
test('sortByQueueOrder', () => {
|
|
34
33
|
// Null order → default milestoneIdSort
|
|
35
|
-
{
|
|
36
34
|
const result = sortByQueueOrder(['M003', 'M001', 'M002'], null);
|
|
37
|
-
|
|
38
|
-
}
|
|
35
|
+
assert.deepStrictEqual(result, ['M001', 'M002', 'M003'], 'null order falls back to numeric sort');
|
|
36
|
+
});
|
|
39
37
|
|
|
40
38
|
// Custom order → exact sequence
|
|
41
|
-
{
|
|
39
|
+
test('test block at line 39', () => {
|
|
42
40
|
const result = sortByQueueOrder(['M001', 'M002', 'M003'], ['M003', 'M001', 'M002']);
|
|
43
|
-
|
|
44
|
-
}
|
|
41
|
+
assert.deepStrictEqual(result, ['M003', 'M001', 'M002'], 'custom order produces exact sequence');
|
|
42
|
+
});
|
|
45
43
|
|
|
46
44
|
// Custom order with new IDs → appended at end in numeric order
|
|
47
|
-
{
|
|
45
|
+
test('test block at line 45', () => {
|
|
48
46
|
const result = sortByQueueOrder(['M001', 'M002', 'M003', 'M004'], ['M003', 'M001']);
|
|
49
|
-
|
|
50
|
-
}
|
|
47
|
+
assert.deepStrictEqual(result, ['M003', 'M001', 'M002', 'M004'], 'new IDs appended in numeric order');
|
|
48
|
+
});
|
|
51
49
|
|
|
52
50
|
// Custom order with deleted IDs → silently skipped
|
|
53
|
-
{
|
|
51
|
+
test('test block at line 51', () => {
|
|
54
52
|
const result = sortByQueueOrder(['M001', 'M003'], ['M003', 'M002', 'M001']);
|
|
55
|
-
|
|
56
|
-
}
|
|
53
|
+
assert.deepStrictEqual(result, ['M003', 'M001'], 'deleted IDs in order are skipped');
|
|
54
|
+
});
|
|
57
55
|
|
|
58
56
|
// Empty custom order → all IDs in numeric order
|
|
59
|
-
{
|
|
57
|
+
test('test block at line 57', () => {
|
|
60
58
|
const result = sortByQueueOrder(['M002', 'M001'], []);
|
|
61
|
-
|
|
62
|
-
}
|
|
59
|
+
assert.deepStrictEqual(result, ['M001', 'M002'], 'empty custom order falls back to numeric sort');
|
|
60
|
+
});
|
|
63
61
|
|
|
64
62
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
65
63
|
// loadQueueOrder / saveQueueOrder
|
|
66
64
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
67
|
-
|
|
68
|
-
console.log('\n=== loadQueueOrder / saveQueueOrder ===');
|
|
69
|
-
|
|
65
|
+
test('loadQueueOrder / saveQueueOrder', () => {
|
|
70
66
|
// Load returns null when file doesn't exist
|
|
71
|
-
{
|
|
72
67
|
const base = createFixtureBase();
|
|
73
|
-
|
|
68
|
+
assert.deepStrictEqual(loadQueueOrder(base), null, 'returns null when file missing');
|
|
74
69
|
cleanup(base);
|
|
75
|
-
}
|
|
70
|
+
});
|
|
76
71
|
|
|
77
72
|
// Save then load round-trip
|
|
78
|
-
{
|
|
73
|
+
test('test block at line 76', () => {
|
|
79
74
|
const base = createFixtureBase();
|
|
80
75
|
saveQueueOrder(base, ['M003', 'M001', 'M002']);
|
|
81
76
|
const loaded = loadQueueOrder(base);
|
|
82
|
-
|
|
77
|
+
assert.deepStrictEqual(loaded, ['M003', 'M001', 'M002'], 'round-trip preserves order');
|
|
83
78
|
|
|
84
79
|
// Verify file contains updatedAt
|
|
85
80
|
const raw = JSON.parse(readFileSync(join(base, '.gsd', 'QUEUE-ORDER.json'), 'utf-8'));
|
|
86
|
-
|
|
81
|
+
assert.ok(typeof raw.updatedAt === 'string' && raw.updatedAt.length > 0, 'file contains updatedAt');
|
|
87
82
|
|
|
88
83
|
cleanup(base);
|
|
89
|
-
}
|
|
84
|
+
});
|
|
90
85
|
|
|
91
86
|
// Load returns null on corrupt JSON
|
|
92
|
-
{
|
|
87
|
+
test('test block at line 90', () => {
|
|
93
88
|
const base = createFixtureBase();
|
|
94
89
|
writeFileSync(join(base, '.gsd', 'QUEUE-ORDER.json'), 'not json');
|
|
95
|
-
|
|
90
|
+
assert.deepStrictEqual(loadQueueOrder(base), null, 'returns null on corrupt JSON');
|
|
96
91
|
cleanup(base);
|
|
97
|
-
}
|
|
92
|
+
});
|
|
98
93
|
|
|
99
94
|
// Load returns null when order field is not an array
|
|
100
|
-
{
|
|
95
|
+
test('test block at line 98', () => {
|
|
101
96
|
const base = createFixtureBase();
|
|
102
97
|
writeFileSync(join(base, '.gsd', 'QUEUE-ORDER.json'), '{"order": "invalid"}');
|
|
103
|
-
|
|
98
|
+
assert.deepStrictEqual(loadQueueOrder(base), null, 'returns null when order is not array');
|
|
104
99
|
cleanup(base);
|
|
105
|
-
}
|
|
100
|
+
});
|
|
106
101
|
|
|
107
102
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
108
103
|
// pruneQueueOrder
|
|
109
104
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
110
|
-
|
|
111
|
-
console.log('\n=== pruneQueueOrder ===');
|
|
112
|
-
|
|
105
|
+
test('pruneQueueOrder', () => {
|
|
113
106
|
// Prune removes invalid IDs
|
|
114
|
-
{
|
|
115
107
|
const base = createFixtureBase();
|
|
116
108
|
saveQueueOrder(base, ['M001', 'M002', 'M003']);
|
|
117
109
|
pruneQueueOrder(base, ['M001', 'M003']);
|
|
118
|
-
|
|
110
|
+
assert.deepStrictEqual(loadQueueOrder(base), ['M001', 'M003'], 'prune removes invalid IDs');
|
|
119
111
|
cleanup(base);
|
|
120
|
-
}
|
|
112
|
+
});
|
|
121
113
|
|
|
122
114
|
// Prune no-ops when file doesn't exist
|
|
123
|
-
{
|
|
115
|
+
test('test block at line 121', () => {
|
|
124
116
|
const base = createFixtureBase();
|
|
125
117
|
pruneQueueOrder(base, ['M001']); // should not throw
|
|
126
|
-
|
|
118
|
+
assert.ok(!existsSync(join(base, '.gsd', 'QUEUE-ORDER.json')), 'prune does not create file');
|
|
127
119
|
cleanup(base);
|
|
128
|
-
}
|
|
120
|
+
});
|
|
129
121
|
|
|
130
122
|
// Prune no-ops when all IDs are valid
|
|
131
|
-
{
|
|
123
|
+
test('test block at line 129', () => {
|
|
132
124
|
const base = createFixtureBase();
|
|
133
125
|
saveQueueOrder(base, ['M001', 'M002']);
|
|
134
126
|
pruneQueueOrder(base, ['M001', 'M002', 'M003']);
|
|
135
|
-
|
|
127
|
+
assert.deepStrictEqual(loadQueueOrder(base), ['M001', 'M002'], 'prune is no-op when all valid');
|
|
136
128
|
cleanup(base);
|
|
137
|
-
}
|
|
129
|
+
});
|
|
138
130
|
|
|
139
131
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
140
132
|
// validateQueueOrder
|
|
141
133
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
142
|
-
|
|
143
|
-
console.log('\n=== validateQueueOrder ===');
|
|
144
|
-
|
|
134
|
+
test('validateQueueOrder', () => {
|
|
145
135
|
// Valid order with no dependencies
|
|
146
|
-
{
|
|
147
136
|
const depsMap = new Map<string, string[]>();
|
|
148
137
|
const result = validateQueueOrder(['M001', 'M002'], depsMap, new Set());
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
}
|
|
138
|
+
assert.ok(result.valid, 'valid when no dependencies');
|
|
139
|
+
assert.deepStrictEqual(result.violations.length, 0, 'no violations');
|
|
140
|
+
assert.deepStrictEqual(result.redundant.length, 0, 'no redundancies');
|
|
141
|
+
});
|
|
153
142
|
|
|
154
143
|
// Dependency violation: M002 before M001, but M002 depends on M001
|
|
155
|
-
{
|
|
144
|
+
test('test block at line 153', () => {
|
|
156
145
|
const depsMap = new Map<string, string[]>([['M002', ['M001']]]);
|
|
157
146
|
const result = validateQueueOrder(['M002', 'M001'], depsMap, new Set());
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
}
|
|
147
|
+
assert.ok(!result.valid, 'invalid when dep violated');
|
|
148
|
+
assert.deepStrictEqual(result.violations.length, 1, 'one violation');
|
|
149
|
+
assert.deepStrictEqual(result.violations[0].type, 'would_block', 'violation type is would_block');
|
|
150
|
+
assert.deepStrictEqual(result.violations[0].milestone, 'M002', 'violation milestone is M002');
|
|
151
|
+
assert.deepStrictEqual(result.violations[0].dependsOn, 'M001', 'violation dep is M001');
|
|
152
|
+
});
|
|
164
153
|
|
|
165
154
|
// Redundant dependency: M002 depends on M001, M001 comes first in order
|
|
166
|
-
{
|
|
155
|
+
test('test block at line 164', () => {
|
|
167
156
|
const depsMap = new Map<string, string[]>([['M002', ['M001']]]);
|
|
168
157
|
const result = validateQueueOrder(['M001', 'M002'], depsMap, new Set());
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
}
|
|
158
|
+
assert.ok(result.valid, 'valid when dep satisfied by position');
|
|
159
|
+
assert.deepStrictEqual(result.redundant.length, 1, 'one redundancy');
|
|
160
|
+
assert.deepStrictEqual(result.redundant[0].milestone, 'M002', 'redundant milestone is M002');
|
|
161
|
+
});
|
|
173
162
|
|
|
174
163
|
// Completed dep is always satisfied
|
|
175
|
-
{
|
|
164
|
+
test('test block at line 173', () => {
|
|
176
165
|
const depsMap = new Map<string, string[]>([['M002', ['M001']]]);
|
|
177
166
|
const result = validateQueueOrder(['M002'], depsMap, new Set(['M001']));
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}
|
|
167
|
+
assert.ok(result.valid, 'valid when dep is already completed');
|
|
168
|
+
assert.deepStrictEqual(result.violations.length, 0, 'no violations for completed dep');
|
|
169
|
+
});
|
|
181
170
|
|
|
182
171
|
// Missing dependency
|
|
183
|
-
{
|
|
172
|
+
test('test block at line 181', () => {
|
|
184
173
|
const depsMap = new Map<string, string[]>([['M002', ['M099']]]);
|
|
185
174
|
const result = validateQueueOrder(['M001', 'M002'], depsMap, new Set());
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
}
|
|
175
|
+
assert.ok(!result.valid, 'invalid when dep does not exist');
|
|
176
|
+
assert.deepStrictEqual(result.violations[0].type, 'missing_dep', 'violation type is missing_dep');
|
|
177
|
+
});
|
|
189
178
|
|
|
190
179
|
// Circular dependency
|
|
191
|
-
{
|
|
180
|
+
test('test block at line 189', () => {
|
|
192
181
|
const depsMap = new Map<string, string[]>([
|
|
193
182
|
['M001', ['M002']],
|
|
194
183
|
['M002', ['M001']],
|
|
195
184
|
]);
|
|
196
185
|
const result = validateQueueOrder(['M001', 'M002'], depsMap, new Set());
|
|
197
|
-
|
|
186
|
+
assert.ok(!result.valid, 'invalid on circular dependency');
|
|
198
187
|
const circularViolation = result.violations.find(v => v.type === 'circular');
|
|
199
|
-
|
|
200
|
-
}
|
|
188
|
+
assert.ok(!!circularViolation, 'circular violation detected');
|
|
189
|
+
});
|
|
201
190
|
|
|
202
191
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
203
|
-
|
|
204
|
-
report();
|
|
192
|
+
});
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
* 4. A fresh deriveState() call (simulating new session) also works
|
|
12
12
|
*/
|
|
13
13
|
|
|
14
|
+
import { describe, test } from 'node:test';
|
|
15
|
+
import assert from 'node:assert/strict';
|
|
14
16
|
import { mkdtempSync, mkdirSync, rmSync, writeFileSync, readFileSync, existsSync } from 'node:fs';
|
|
15
17
|
import { join } from 'node:path';
|
|
16
18
|
import { tmpdir } from 'node:os';
|
|
@@ -19,10 +21,6 @@ import { deriveState, invalidateStateCache } from '../state.ts';
|
|
|
19
21
|
import { findMilestoneIds } from '../guided-flow.ts';
|
|
20
22
|
import { saveQueueOrder, loadQueueOrder } from '../queue-order.ts';
|
|
21
23
|
import { parseContextDependsOn } from '../files.ts';
|
|
22
|
-
import { createTestContext } from './test-helpers.ts';
|
|
23
|
-
|
|
24
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
25
|
-
|
|
26
24
|
// ─── Fixture Helpers ───────────────────────────────────────────────────────
|
|
27
25
|
|
|
28
26
|
function createFixtureBase(): string {
|
|
@@ -70,8 +68,9 @@ function readContextFile(base: string, mid: string): string {
|
|
|
70
68
|
// Test: Queue order changes milestone activation
|
|
71
69
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
72
70
|
|
|
73
|
-
|
|
74
|
-
{
|
|
71
|
+
|
|
72
|
+
describe('queue-reorder-e2e', () => {
|
|
73
|
+
test('E2E: queue-order changes active milestone', async () => {
|
|
75
74
|
const base = createFixtureBase();
|
|
76
75
|
try {
|
|
77
76
|
// Setup: M007 complete, M008 and M009 pending (no context, no roadmap)
|
|
@@ -84,7 +83,7 @@ console.log('\n=== E2E: queue-order changes active milestone ===');
|
|
|
84
83
|
// Without custom order: M008 comes first (numeric sort)
|
|
85
84
|
invalidateStateCache();
|
|
86
85
|
const stateBefore = await deriveState(base);
|
|
87
|
-
|
|
86
|
+
assert.deepStrictEqual(stateBefore.activeMilestone?.id, 'M008', 'before reorder: M008 is active');
|
|
88
87
|
|
|
89
88
|
// Save custom order: M009 before M008
|
|
90
89
|
saveQueueOrder(base, ['M009', 'M008']);
|
|
@@ -92,25 +91,23 @@ console.log('\n=== E2E: queue-order changes active milestone ===');
|
|
|
92
91
|
// With custom order: M009 should be active
|
|
93
92
|
invalidateStateCache();
|
|
94
93
|
const stateAfter = await deriveState(base);
|
|
95
|
-
|
|
94
|
+
assert.deepStrictEqual(stateAfter.activeMilestone?.id, 'M009', 'after reorder: M009 is active');
|
|
96
95
|
|
|
97
96
|
// findMilestoneIds respects the order
|
|
98
97
|
const ids = findMilestoneIds(base);
|
|
99
98
|
const m008Idx = ids.indexOf('M008');
|
|
100
99
|
const m009Idx = ids.indexOf('M009');
|
|
101
|
-
|
|
100
|
+
assert.ok(m009Idx < m008Idx, 'findMilestoneIds: M009 comes before M008');
|
|
102
101
|
|
|
103
102
|
} finally {
|
|
104
103
|
cleanup(base);
|
|
105
104
|
}
|
|
106
|
-
}
|
|
105
|
+
});
|
|
107
106
|
|
|
108
107
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
109
108
|
// Test: Reorder + depends_on removal = correct state
|
|
110
109
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
111
|
-
|
|
112
|
-
console.log('\n=== E2E: reorder with depends_on removal ===');
|
|
113
|
-
{
|
|
110
|
+
test('E2E: reorder with depends_on removal', async () => {
|
|
114
111
|
const base = createFixtureBase();
|
|
115
112
|
try {
|
|
116
113
|
// Setup: M007 complete, M008 depends_on M009, M009 no deps
|
|
@@ -121,7 +118,7 @@ console.log('\n=== E2E: reorder with depends_on removal ===');
|
|
|
121
118
|
// Before: M008 depends on M009, so deriveState skips M008, M009 is active
|
|
122
119
|
invalidateStateCache();
|
|
123
120
|
const stateBefore = await deriveState(base);
|
|
124
|
-
|
|
121
|
+
assert.deepStrictEqual(stateBefore.activeMilestone?.id, 'M009', 'before: M009 active (M008 dep-blocked)');
|
|
125
122
|
|
|
126
123
|
// Simulate reorder confirm: save order M009→M008, remove depends_on from M008
|
|
127
124
|
saveQueueOrder(base, ['M009', 'M008']);
|
|
@@ -134,29 +131,27 @@ console.log('\n=== E2E: reorder with depends_on removal ===');
|
|
|
134
131
|
// Verify: depends_on is gone
|
|
135
132
|
const updatedContent = readContextFile(base, 'M008');
|
|
136
133
|
const deps = parseContextDependsOn(updatedContent);
|
|
137
|
-
|
|
134
|
+
assert.deepStrictEqual(deps.length, 0, 'depends_on removed from M008-CONTEXT.md');
|
|
138
135
|
|
|
139
136
|
// Verify: deriveState still picks M009 (it's first in queue order)
|
|
140
137
|
invalidateStateCache();
|
|
141
138
|
const stateAfter = await deriveState(base);
|
|
142
|
-
|
|
139
|
+
assert.deepStrictEqual(stateAfter.activeMilestone?.id, 'M009', 'after: M009 still active (first in queue)');
|
|
143
140
|
|
|
144
141
|
// Verify: M008 is now pending (not dep-blocked)
|
|
145
142
|
const m008Entry = stateAfter.registry.find(m => m.id === 'M008');
|
|
146
|
-
|
|
147
|
-
|
|
143
|
+
assert.deepStrictEqual(m008Entry?.status, 'pending', 'M008 is pending (not dep-blocked)');
|
|
144
|
+
assert.ok(!m008Entry?.dependsOn || m008Entry.dependsOn.length === 0, 'M008 has no dependsOn');
|
|
148
145
|
|
|
149
146
|
} finally {
|
|
150
147
|
cleanup(base);
|
|
151
148
|
}
|
|
152
|
-
}
|
|
149
|
+
});
|
|
153
150
|
|
|
154
151
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
155
152
|
// Test: Fresh deriveState (simulating new session) respects queue order
|
|
156
153
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
157
|
-
|
|
158
|
-
console.log('\n=== E2E: fresh session respects queue order ===');
|
|
159
|
-
{
|
|
154
|
+
test('E2E: fresh session respects queue order', async () => {
|
|
160
155
|
const base = createFixtureBase();
|
|
161
156
|
try {
|
|
162
157
|
writeCompleteMilestone(base, 'M007');
|
|
@@ -171,23 +166,21 @@ console.log('\n=== E2E: fresh session respects queue order ===');
|
|
|
171
166
|
|
|
172
167
|
// Derive state — should read QUEUE-ORDER.json from disk
|
|
173
168
|
const state = await deriveState(base);
|
|
174
|
-
|
|
169
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M009', 'fresh session: M009 is active');
|
|
175
170
|
|
|
176
171
|
// Verify queue order persisted
|
|
177
172
|
const order = loadQueueOrder(base);
|
|
178
|
-
|
|
173
|
+
assert.deepStrictEqual(order, ['M009', 'M008'], 'QUEUE-ORDER.json persisted correctly');
|
|
179
174
|
|
|
180
175
|
} finally {
|
|
181
176
|
cleanup(base);
|
|
182
177
|
}
|
|
183
|
-
}
|
|
178
|
+
});
|
|
184
179
|
|
|
185
180
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
186
181
|
// Test: Queue order with newly added milestones
|
|
187
182
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
188
|
-
|
|
189
|
-
console.log('\n=== E2E: new milestones appended to queue ===');
|
|
190
|
-
{
|
|
183
|
+
test('E2E: new milestones appended to queue', async () => {
|
|
191
184
|
const base = createFixtureBase();
|
|
192
185
|
try {
|
|
193
186
|
writeCompleteMilestone(base, 'M007');
|
|
@@ -207,24 +200,22 @@ console.log('\n=== E2E: new milestones appended to queue ===');
|
|
|
207
200
|
const m009Idx = ids.indexOf('M009');
|
|
208
201
|
const m008Idx = ids.indexOf('M008');
|
|
209
202
|
const m010Idx = ids.indexOf('M010');
|
|
210
|
-
|
|
211
|
-
|
|
203
|
+
assert.ok(m009Idx < m008Idx, 'M009 before M008');
|
|
204
|
+
assert.ok(m008Idx < m010Idx, 'M008 before M010 (new milestone appended)');
|
|
212
205
|
|
|
213
206
|
// M009 is still active (first non-complete in queue order)
|
|
214
207
|
const state = await deriveState(base);
|
|
215
|
-
|
|
208
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M009', 'M009 still active after M010 added');
|
|
216
209
|
|
|
217
210
|
} finally {
|
|
218
211
|
cleanup(base);
|
|
219
212
|
}
|
|
220
|
-
}
|
|
213
|
+
});
|
|
221
214
|
|
|
222
215
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
223
216
|
// Test: No queue order file = default numeric sort (backward compat)
|
|
224
217
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
225
|
-
|
|
226
|
-
console.log('\n=== E2E: backward compat without QUEUE-ORDER.json ===');
|
|
227
|
-
{
|
|
218
|
+
test('E2E: backward compat without QUEUE-ORDER.json', async () => {
|
|
228
219
|
const base = createFixtureBase();
|
|
229
220
|
try {
|
|
230
221
|
writeCompleteMilestone(base, 'M007');
|
|
@@ -234,22 +225,20 @@ console.log('\n=== E2E: backward compat without QUEUE-ORDER.json ===');
|
|
|
234
225
|
// No QUEUE-ORDER.json — default numeric sort
|
|
235
226
|
invalidateStateCache();
|
|
236
227
|
const state = await deriveState(base);
|
|
237
|
-
|
|
228
|
+
assert.deepStrictEqual(state.activeMilestone?.id, 'M008', 'no queue order: M008 active (numeric)');
|
|
238
229
|
|
|
239
230
|
const ids = findMilestoneIds(base);
|
|
240
|
-
|
|
231
|
+
assert.ok(ids.indexOf('M008') < ids.indexOf('M009'), 'default sort: M008 before M009');
|
|
241
232
|
|
|
242
233
|
} finally {
|
|
243
234
|
cleanup(base);
|
|
244
235
|
}
|
|
245
|
-
}
|
|
236
|
+
});
|
|
246
237
|
|
|
247
238
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
248
239
|
// Test: non-milestone directories are filtered out (#1494)
|
|
249
240
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
250
|
-
|
|
251
|
-
console.log('\n=== E2E: non-milestone directories filtered from findMilestoneIds (#1494) ===');
|
|
252
|
-
{
|
|
241
|
+
test('E2E: non-milestone directories filtered from findMilestoneIds (#1494)', () => {
|
|
253
242
|
const base = createFixtureBase();
|
|
254
243
|
try {
|
|
255
244
|
writeContext(base, 'M001', '', 'First');
|
|
@@ -260,22 +249,20 @@ console.log('\n=== E2E: non-milestone directories filtered from findMilestoneIds
|
|
|
260
249
|
|
|
261
250
|
invalidateStateCache();
|
|
262
251
|
const ids = findMilestoneIds(base);
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
252
|
+
assert.deepStrictEqual(ids.length, 2, 'only M001 and M002 returned');
|
|
253
|
+
assert.ok(!ids.includes('slices'), 'slices directory excluded');
|
|
254
|
+
assert.ok(!ids.includes('temp-backup'), 'temp-backup directory excluded');
|
|
255
|
+
assert.ok(ids.includes('M001'), 'M001 included');
|
|
256
|
+
assert.ok(ids.includes('M002'), 'M002 included');
|
|
268
257
|
} finally {
|
|
269
258
|
cleanup(base);
|
|
270
259
|
}
|
|
271
|
-
}
|
|
260
|
+
});
|
|
272
261
|
|
|
273
262
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
274
263
|
// Test: depends_on inline array format removal
|
|
275
264
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
276
|
-
|
|
277
|
-
console.log('\n=== E2E: depends_on inline format preserved after partial removal ===');
|
|
278
|
-
{
|
|
265
|
+
test('E2E: depends_on inline format preserved after partial removal', () => {
|
|
279
266
|
const base = createFixtureBase();
|
|
280
267
|
try {
|
|
281
268
|
writeCompleteMilestone(base, 'M007');
|
|
@@ -287,7 +274,7 @@ console.log('\n=== E2E: depends_on inline format preserved after partial removal
|
|
|
287
274
|
// Verify both deps are parsed
|
|
288
275
|
const contentBefore = readContextFile(base, 'M008');
|
|
289
276
|
const depsBefore = parseContextDependsOn(contentBefore);
|
|
290
|
-
|
|
277
|
+
assert.deepStrictEqual(depsBefore.length, 2, 'M008 has 2 deps before');
|
|
291
278
|
|
|
292
279
|
// Simulate removing only M009 dep (keep M010)
|
|
293
280
|
const content = readContextFile(base, 'M008');
|
|
@@ -297,12 +284,12 @@ console.log('\n=== E2E: depends_on inline format preserved after partial removal
|
|
|
297
284
|
// Verify only M010 remains
|
|
298
285
|
const contentAfter = readContextFile(base, 'M008');
|
|
299
286
|
const depsAfter = parseContextDependsOn(contentAfter);
|
|
300
|
-
|
|
301
|
-
|
|
287
|
+
assert.deepStrictEqual(depsAfter.length, 1, 'M008 has 1 dep after removal');
|
|
288
|
+
assert.deepStrictEqual(depsAfter[0], 'M010', 'remaining dep is M010');
|
|
302
289
|
|
|
303
290
|
} finally {
|
|
304
291
|
cleanup(base);
|
|
305
292
|
}
|
|
306
|
-
}
|
|
293
|
+
});
|
|
307
294
|
|
|
308
|
-
|
|
295
|
+
});
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests that /gsd quick is blocked when auto-mode is active.
|
|
3
|
+
*
|
|
4
|
+
* Relates to #2417: /gsd quick freezes terminal when auto-mode is active.
|
|
5
|
+
* The fix adds an isAutoActive() guard in handleWorkflowCommand before
|
|
6
|
+
* delegating to handleQuick.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { describe, it, mock, beforeEach, afterEach } from "node:test";
|
|
10
|
+
import assert from "node:assert/strict";
|
|
11
|
+
import { readFileSync } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
|
|
14
|
+
// ─── Structural test: verify the guard exists in source ──────────────────────
|
|
15
|
+
|
|
16
|
+
describe("/gsd quick auto-mode guard (#2417)", () => {
|
|
17
|
+
it("handleWorkflowCommand checks isAutoActive() before calling handleQuick", () => {
|
|
18
|
+
// Read the source file and verify the guard is structurally present
|
|
19
|
+
const src = readFileSync(
|
|
20
|
+
join(
|
|
21
|
+
import.meta.dirname,
|
|
22
|
+
"..",
|
|
23
|
+
"commands",
|
|
24
|
+
"handlers",
|
|
25
|
+
"workflow.ts",
|
|
26
|
+
),
|
|
27
|
+
"utf-8",
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
// Find the quick command block
|
|
31
|
+
const quickBlockMatch = src.match(
|
|
32
|
+
/if\s*\(\s*trimmed\s*===\s*"quick"\s*\|\|\s*trimmed\.startsWith\("quick "\)\s*\)\s*\{([\s\S]*?)\n \}/,
|
|
33
|
+
);
|
|
34
|
+
assert.ok(quickBlockMatch, "quick command block exists in handleWorkflowCommand");
|
|
35
|
+
|
|
36
|
+
const quickBlock = quickBlockMatch[1];
|
|
37
|
+
|
|
38
|
+
// Verify isAutoActive guard comes BEFORE handleQuick call
|
|
39
|
+
const guardIndex = quickBlock.indexOf("isAutoActive()");
|
|
40
|
+
const handleQuickIndex = quickBlock.indexOf("handleQuick(");
|
|
41
|
+
|
|
42
|
+
assert.ok(guardIndex !== -1, "isAutoActive() guard exists in quick command block");
|
|
43
|
+
assert.ok(handleQuickIndex !== -1, "handleQuick() call exists in quick command block");
|
|
44
|
+
assert.ok(
|
|
45
|
+
guardIndex < handleQuickIndex,
|
|
46
|
+
"isAutoActive() guard appears before handleQuick() call",
|
|
47
|
+
);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("guard shows error message mentioning /gsd stop", () => {
|
|
51
|
+
const src = readFileSync(
|
|
52
|
+
join(
|
|
53
|
+
import.meta.dirname,
|
|
54
|
+
"..",
|
|
55
|
+
"commands",
|
|
56
|
+
"handlers",
|
|
57
|
+
"workflow.ts",
|
|
58
|
+
),
|
|
59
|
+
"utf-8",
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
// The error message should tell the user to stop auto-mode first
|
|
63
|
+
assert.ok(
|
|
64
|
+
src.includes("/gsd quick cannot run while auto-mode is active"),
|
|
65
|
+
"error message explains that quick cannot run during auto-mode",
|
|
66
|
+
);
|
|
67
|
+
assert.ok(
|
|
68
|
+
src.includes("/gsd stop"),
|
|
69
|
+
"error message mentions /gsd stop as the resolution",
|
|
70
|
+
);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("guard returns true (handled) to prevent falling through", () => {
|
|
74
|
+
const src = readFileSync(
|
|
75
|
+
join(
|
|
76
|
+
import.meta.dirname,
|
|
77
|
+
"..",
|
|
78
|
+
"commands",
|
|
79
|
+
"handlers",
|
|
80
|
+
"workflow.ts",
|
|
81
|
+
),
|
|
82
|
+
"utf-8",
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
// After the isAutoActive() check and notify, there should be a `return true`
|
|
86
|
+
// before the handleQuick call
|
|
87
|
+
const quickBlockMatch = src.match(
|
|
88
|
+
/if\s*\(\s*trimmed\s*===\s*"quick"\s*\|\|\s*trimmed\.startsWith\("quick "\)\s*\)\s*\{([\s\S]*?)\n \}/,
|
|
89
|
+
);
|
|
90
|
+
assert.ok(quickBlockMatch);
|
|
91
|
+
const quickBlock = quickBlockMatch[1];
|
|
92
|
+
|
|
93
|
+
// The guard block should have its own return true before handleQuick
|
|
94
|
+
const guardBlock = quickBlock.slice(0, quickBlock.indexOf("handleQuick("));
|
|
95
|
+
assert.ok(
|
|
96
|
+
guardBlock.includes("return true"),
|
|
97
|
+
"guard block returns true before handleQuick is reached",
|
|
98
|
+
);
|
|
99
|
+
});
|
|
100
|
+
});
|