gsd-pi 2.43.0 → 2.44.0-dev.62b5d6c
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/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-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.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 +17 -16
- 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 +17 -16
- 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/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/.next/static/fOnWQBjWXMKUs4bqTg530/_buildManifest.js +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/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/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/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/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/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/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +26 -37
- 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/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/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/sdk.ts +4 -0
- 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/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-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.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/atomic-task-closeout.test.ts +8 -120
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +150 -5
- 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 +15 -20
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +410 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +439 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +527 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +593 -2
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +104 -57
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +22 -80
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -130
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +38 -76
- package/src/resources/extensions/gsd/tests/doctor.test.ts +9 -19
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +290 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +240 -0
- package/src/resources/extensions/gsd/tests/git-service.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +462 -0
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +4 -172
- 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 +1205 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +439 -0
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/parsers.test.ts +2 -1
- 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/prompt-contracts.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
- 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/schema-v9-sequence.test.ts +176 -0
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +216 -0
- package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +11 -3
- package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
- 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/worktree-health-dispatch.test.ts +12 -5
- 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 → fOnWQBjWXMKUs4bqTg530}/_ssgManifest.js +0 -0
|
@@ -5,9 +5,11 @@
|
|
|
5
5
|
// Exports: parseDecisionsTable, parseRequirementsSections, migrateFromMarkdown
|
|
6
6
|
import { readFileSync, readdirSync, existsSync } from 'node:fs';
|
|
7
7
|
import { join } from 'node:path';
|
|
8
|
-
import { upsertDecision, upsertRequirement, insertArtifact, openDatabase, transaction, _getAdapter, } from './gsd-db.js';
|
|
9
|
-
import { resolveGsdRootFile, milestonesDir, gsdRoot, resolveTaskFiles, } from './paths.js';
|
|
8
|
+
import { upsertDecision, upsertRequirement, insertArtifact, insertMilestone, insertSlice, insertTask, openDatabase, transaction, _getAdapter, } from './gsd-db.js';
|
|
9
|
+
import { resolveGsdRootFile, resolveMilestoneFile, resolveSliceFile, resolveTasksDir, milestonesDir, gsdRoot, resolveTaskFiles, } from './paths.js';
|
|
10
10
|
import { findMilestoneIds } from './guided-flow.js';
|
|
11
|
+
import { parseRoadmap, parsePlan } from './parsers-legacy.js';
|
|
12
|
+
import { parseContextDependsOn } from './files.js';
|
|
11
13
|
// ─── DECISIONS.md Parser ───────────────────────────────────────────────────
|
|
12
14
|
const VALID_MADE_BY = new Set(['human', 'agent', 'collaborative']);
|
|
13
15
|
/**
|
|
@@ -403,6 +405,175 @@ function findFileByPrefixAndSuffix(dir, idPrefix, suffix) {
|
|
|
403
405
|
return null;
|
|
404
406
|
}
|
|
405
407
|
}
|
|
408
|
+
// ─── Hierarchy Migration (milestones/slices/tasks from roadmaps+plans) ────
|
|
409
|
+
/**
|
|
410
|
+
* Walk .gsd/milestones/ dirs, parse roadmaps and plans, and populate
|
|
411
|
+
* the milestones/slices/tasks DB tables.
|
|
412
|
+
*
|
|
413
|
+
* - Milestone title: from roadmap H1 (e.g. "# M001: Title") or CONTEXT.md
|
|
414
|
+
* - Milestone status: 'complete' if SUMMARY exists, 'parked' if PARKED exists, else 'active'
|
|
415
|
+
* - Milestone depends_on: from CONTEXT.md frontmatter
|
|
416
|
+
* - Slice metadata: from parseRoadmap() — id, title, risk, depends, done, demo
|
|
417
|
+
* - Task metadata: from parsePlan() — id, title, done, estimate
|
|
418
|
+
*
|
|
419
|
+
* Uses INSERT OR IGNORE for idempotency. Insert order: milestones → slices → tasks.
|
|
420
|
+
* Ghost milestones (dirs with no CONTEXT, ROADMAP, or SUMMARY) are skipped.
|
|
421
|
+
*
|
|
422
|
+
* Returns count of inserted hierarchy items.
|
|
423
|
+
*/
|
|
424
|
+
export function migrateHierarchyToDb(basePath) {
|
|
425
|
+
const counts = { milestones: 0, slices: 0, tasks: 0 };
|
|
426
|
+
const milestoneIds = findMilestoneIds(basePath);
|
|
427
|
+
for (const milestoneId of milestoneIds) {
|
|
428
|
+
// Check for ghost milestones — skip dirs with no meaningful content
|
|
429
|
+
const roadmapPath = resolveMilestoneFile(basePath, milestoneId, 'ROADMAP');
|
|
430
|
+
const contextPath = resolveMilestoneFile(basePath, milestoneId, 'CONTEXT');
|
|
431
|
+
const summaryPath = resolveMilestoneFile(basePath, milestoneId, 'SUMMARY');
|
|
432
|
+
const parkedPath = resolveMilestoneFile(basePath, milestoneId, 'PARKED');
|
|
433
|
+
const hasRoadmap = roadmapPath !== null && existsSync(roadmapPath);
|
|
434
|
+
const hasContext = contextPath !== null && existsSync(contextPath);
|
|
435
|
+
const hasSummary = summaryPath !== null && existsSync(summaryPath);
|
|
436
|
+
const hasParked = parkedPath !== null && existsSync(parkedPath);
|
|
437
|
+
// Ghost milestone: no CONTEXT, ROADMAP, or SUMMARY → skip
|
|
438
|
+
if (!hasRoadmap && !hasContext && !hasSummary)
|
|
439
|
+
continue;
|
|
440
|
+
// Determine milestone status
|
|
441
|
+
let milestoneStatus = 'active';
|
|
442
|
+
if (hasSummary)
|
|
443
|
+
milestoneStatus = 'complete';
|
|
444
|
+
else if (hasParked)
|
|
445
|
+
milestoneStatus = 'parked';
|
|
446
|
+
// Determine milestone title from roadmap H1 or CONTEXT heading
|
|
447
|
+
let milestoneTitle = '';
|
|
448
|
+
let roadmapContent = null;
|
|
449
|
+
let roadmap = null;
|
|
450
|
+
if (hasRoadmap) {
|
|
451
|
+
roadmapContent = readFileSync(roadmapPath, 'utf-8');
|
|
452
|
+
roadmap = parseRoadmap(roadmapContent);
|
|
453
|
+
milestoneTitle = roadmap.title;
|
|
454
|
+
}
|
|
455
|
+
if (!milestoneTitle && hasContext) {
|
|
456
|
+
const contextContent = readFileSync(contextPath, 'utf-8');
|
|
457
|
+
const h1Match = contextContent.match(/^#\s+(.+)/m);
|
|
458
|
+
if (h1Match)
|
|
459
|
+
milestoneTitle = h1Match[1].trim();
|
|
460
|
+
}
|
|
461
|
+
// Determine depends_on from CONTEXT frontmatter
|
|
462
|
+
let dependsOn = [];
|
|
463
|
+
if (hasContext) {
|
|
464
|
+
const contextContent = readFileSync(contextPath, 'utf-8');
|
|
465
|
+
dependsOn = parseContextDependsOn(contextContent);
|
|
466
|
+
}
|
|
467
|
+
// Extract raw "## Boundary Map" section from roadmap markdown for planning column
|
|
468
|
+
let boundaryMapSection = '';
|
|
469
|
+
if (roadmapContent) {
|
|
470
|
+
const bmIdx = roadmapContent.indexOf('## Boundary Map');
|
|
471
|
+
if (bmIdx >= 0) {
|
|
472
|
+
const afterBm = roadmapContent.slice(bmIdx);
|
|
473
|
+
// Take content until next ## heading or EOF
|
|
474
|
+
const nextHeading = afterBm.indexOf('\n## ', 1);
|
|
475
|
+
boundaryMapSection = nextHeading >= 0 ? afterBm.slice(0, nextHeading).trim() : afterBm.trim();
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
// Insert milestone (FK parent — must come first)
|
|
479
|
+
insertMilestone({
|
|
480
|
+
id: milestoneId,
|
|
481
|
+
title: milestoneTitle,
|
|
482
|
+
status: milestoneStatus,
|
|
483
|
+
depends_on: dependsOn,
|
|
484
|
+
planning: {
|
|
485
|
+
vision: roadmap?.vision ?? '',
|
|
486
|
+
successCriteria: roadmap?.successCriteria ?? [],
|
|
487
|
+
boundaryMapMarkdown: boundaryMapSection,
|
|
488
|
+
},
|
|
489
|
+
});
|
|
490
|
+
counts.milestones++;
|
|
491
|
+
// Parse roadmap for slices
|
|
492
|
+
if (!roadmap)
|
|
493
|
+
continue;
|
|
494
|
+
for (const sliceEntry of roadmap.slices) {
|
|
495
|
+
// Per K002: use 'complete' not 'done'
|
|
496
|
+
const sliceStatus = sliceEntry.done ? 'complete' : 'pending';
|
|
497
|
+
// Parse slice plan early so goal is available for insertSlice planning column
|
|
498
|
+
const planPath = resolveSliceFile(basePath, milestoneId, sliceEntry.id, 'PLAN');
|
|
499
|
+
let plan = null;
|
|
500
|
+
if (planPath && existsSync(planPath)) {
|
|
501
|
+
const planContent = readFileSync(planPath, 'utf-8');
|
|
502
|
+
plan = parsePlan(planContent);
|
|
503
|
+
}
|
|
504
|
+
insertSlice({
|
|
505
|
+
id: sliceEntry.id,
|
|
506
|
+
milestoneId: milestoneId,
|
|
507
|
+
title: sliceEntry.title,
|
|
508
|
+
status: sliceStatus,
|
|
509
|
+
risk: sliceEntry.risk,
|
|
510
|
+
depends: sliceEntry.depends,
|
|
511
|
+
demo: sliceEntry.demo,
|
|
512
|
+
planning: {
|
|
513
|
+
goal: plan?.goal ?? '',
|
|
514
|
+
},
|
|
515
|
+
});
|
|
516
|
+
counts.slices++;
|
|
517
|
+
// Insert tasks from parsed plan
|
|
518
|
+
if (!plan)
|
|
519
|
+
continue;
|
|
520
|
+
for (const taskEntry of plan.tasks) {
|
|
521
|
+
// Per K002: use 'complete' not 'done'
|
|
522
|
+
let taskStatus = taskEntry.done ? 'complete' : 'pending';
|
|
523
|
+
// Pre-migration consistency: if task is marked done in the plan but has
|
|
524
|
+
// no summary file on disk, import as 'pending' so it gets re-executed
|
|
525
|
+
// rather than silently importing bad state as the new DB authority.
|
|
526
|
+
if (taskStatus === 'complete') {
|
|
527
|
+
const tDir = resolveTasksDir(basePath, milestoneId, sliceEntry.id);
|
|
528
|
+
if (tDir) {
|
|
529
|
+
const summaryFile = join(tDir, `${taskEntry.id}-SUMMARY.md`);
|
|
530
|
+
if (!existsSync(summaryFile)) {
|
|
531
|
+
taskStatus = 'pending';
|
|
532
|
+
process.stderr.write(`gsd-migrate: ${milestoneId}/${sliceEntry.id}/${taskEntry.id} marked done but missing summary — importing as pending\n`);
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
insertTask({
|
|
537
|
+
id: taskEntry.id,
|
|
538
|
+
sliceId: sliceEntry.id,
|
|
539
|
+
milestoneId: milestoneId,
|
|
540
|
+
title: taskEntry.title,
|
|
541
|
+
status: taskStatus,
|
|
542
|
+
planning: {
|
|
543
|
+
files: taskEntry.files ?? [],
|
|
544
|
+
verify: taskEntry.verify ?? '',
|
|
545
|
+
},
|
|
546
|
+
});
|
|
547
|
+
counts.tasks++;
|
|
548
|
+
}
|
|
549
|
+
// Pre-migration consistency: if all tasks are done and the slice
|
|
550
|
+
// summary exists but the roadmap checkbox is unchecked, upgrade the
|
|
551
|
+
// slice to complete. This handles the common
|
|
552
|
+
// "all_tasks_done_roadmap_not_checked" inconsistency that the old
|
|
553
|
+
// doctor would have auto-fixed. Without a slice summary, the slice
|
|
554
|
+
// is in the "summarizing" phase, not complete.
|
|
555
|
+
if (!sliceEntry.done) {
|
|
556
|
+
const sliceSummaryPath = resolveSliceFile(basePath, milestoneId, sliceEntry.id, 'SUMMARY');
|
|
557
|
+
const hasSliceSummary = sliceSummaryPath !== null && existsSync(sliceSummaryPath);
|
|
558
|
+
const allTasksDone = plan.tasks.length > 0 && plan.tasks.every(t => {
|
|
559
|
+
const tDir = resolveTasksDir(basePath, milestoneId, sliceEntry.id);
|
|
560
|
+
if (!tDir)
|
|
561
|
+
return t.done;
|
|
562
|
+
const summaryFile = join(tDir, `${t.id}-SUMMARY.md`);
|
|
563
|
+
return t.done && existsSync(summaryFile);
|
|
564
|
+
});
|
|
565
|
+
if (allTasksDone && hasSliceSummary) {
|
|
566
|
+
const adapter = _getAdapter();
|
|
567
|
+
if (adapter) {
|
|
568
|
+
adapter.prepare(`UPDATE slices SET status = 'complete' WHERE id = :sid AND milestone_id = :mid`).run({ ':sid': sliceEntry.id, ':mid': milestoneId });
|
|
569
|
+
process.stderr.write(`gsd-migrate: ${milestoneId}/${sliceEntry.id} all tasks + slice summary complete — upgrading slice to complete\n`);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
return counts;
|
|
576
|
+
}
|
|
406
577
|
// ─── Orchestrator ──────────────────────────────────────────────────────────
|
|
407
578
|
/**
|
|
408
579
|
* Import all markdown artifacts from a .gsd/ directory into the database.
|
|
@@ -420,6 +591,7 @@ export function migrateFromMarkdown(gsdDir) {
|
|
|
420
591
|
let decisions = 0;
|
|
421
592
|
let requirements = 0;
|
|
422
593
|
let artifacts = 0;
|
|
594
|
+
let hierarchy = { milestones: 0, slices: 0, tasks: 0 };
|
|
423
595
|
transaction(() => {
|
|
424
596
|
try {
|
|
425
597
|
decisions = importDecisions(gsdDir);
|
|
@@ -439,7 +611,13 @@ export function migrateFromMarkdown(gsdDir) {
|
|
|
439
611
|
catch (err) {
|
|
440
612
|
process.stderr.write(`gsd-migrate: skipping artifacts import: ${err.message}\n`);
|
|
441
613
|
}
|
|
614
|
+
try {
|
|
615
|
+
hierarchy = migrateHierarchyToDb(gsdDir);
|
|
616
|
+
}
|
|
617
|
+
catch (err) {
|
|
618
|
+
process.stderr.write(`gsd-migrate: skipping hierarchy migration: ${err.message}\n`);
|
|
619
|
+
}
|
|
442
620
|
});
|
|
443
|
-
process.stderr.write(`gsd-migrate: imported ${decisions} decisions, ${requirements} requirements, ${artifacts} artifacts\n`);
|
|
444
|
-
return { decisions, requirements, artifacts };
|
|
621
|
+
process.stderr.write(`gsd-migrate: imported ${decisions} decisions, ${requirements} requirements, ${artifacts} artifacts, ${hierarchy.milestones}M/${hierarchy.slices}S/${hierarchy.tasks}T hierarchy\n`);
|
|
622
|
+
return { decisions, requirements, artifacts, hierarchy };
|
|
445
623
|
}
|
|
@@ -697,7 +697,16 @@ export function nativeMergeSquash(basePath, branch) {
|
|
|
697
697
|
if (stderr.includes("local changes would be overwritten") ||
|
|
698
698
|
stderr.includes("not possible because you have unmerged files") ||
|
|
699
699
|
stderr.includes("overwritten by merge")) {
|
|
700
|
-
|
|
700
|
+
// Extract filenames from git stderr so callers can report which files
|
|
701
|
+
// are dirty instead of generically blaming .gsd/ (#2151).
|
|
702
|
+
// Git lists them as tab-indented lines between the "would be overwritten"
|
|
703
|
+
// header and the "Please commit" footer.
|
|
704
|
+
const dirtyFiles = stderr
|
|
705
|
+
.split("\n")
|
|
706
|
+
.filter((line) => line.startsWith("\t"))
|
|
707
|
+
.map((line) => line.trim())
|
|
708
|
+
.filter(Boolean);
|
|
709
|
+
return { success: false, conflicts: ["__dirty_working_tree__"], dirtyFiles };
|
|
701
710
|
}
|
|
702
711
|
// Check for real content conflicts
|
|
703
712
|
const conflictOutput = gitExec(basePath, ["diff", "--name-only", "--diff-filter=U"], true);
|
|
@@ -5,35 +5,30 @@
|
|
|
5
5
|
* dependency satisfaction and file overlap across slice plans.
|
|
6
6
|
*/
|
|
7
7
|
import { deriveState } from "./state.js";
|
|
8
|
-
import { parseRoadmap, parsePlan, loadFile } from "./files.js";
|
|
9
|
-
import { resolveMilestoneFile, resolveSliceFile } from "./paths.js";
|
|
10
8
|
import { findMilestoneIds } from "./guided-flow.js";
|
|
9
|
+
import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
|
|
11
10
|
// ─── File Collection ─────────────────────────────────────────────────────────
|
|
12
11
|
/**
|
|
13
12
|
* Collect all `filesLikelyTouched` across every slice plan in a milestone.
|
|
14
13
|
* Returns a deduplicated list of file paths.
|
|
15
14
|
*/
|
|
16
15
|
async function collectTouchedFiles(basePath, milestoneId) {
|
|
17
|
-
const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
18
|
-
if (!roadmapPath)
|
|
19
|
-
return [];
|
|
20
|
-
const roadmapContent = await loadFile(roadmapPath);
|
|
21
|
-
if (!roadmapContent)
|
|
22
|
-
return [];
|
|
23
|
-
const roadmap = parseRoadmap(roadmapContent);
|
|
24
16
|
const files = new Set();
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
17
|
+
if (isDbAvailable()) {
|
|
18
|
+
// DB path: query slices and their tasks for file lists
|
|
19
|
+
const slices = getMilestoneSlices(milestoneId);
|
|
20
|
+
for (const slice of slices) {
|
|
21
|
+
const tasks = getSliceTasks(milestoneId, slice.id);
|
|
22
|
+
for (const task of tasks) {
|
|
23
|
+
if (Array.isArray(task.files)) {
|
|
24
|
+
for (const f of task.files) {
|
|
25
|
+
files.add(f);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
35
29
|
}
|
|
36
30
|
}
|
|
31
|
+
// When DB unavailable, return empty file set — parallel eligibility cannot be determined
|
|
37
32
|
return [...files];
|
|
38
33
|
}
|
|
39
34
|
// ─── Overlap Detection ──────────────────────────────────────────────────────
|
|
@@ -266,6 +266,15 @@ export async function startParallel(basePath, milestoneIds, prefs) {
|
|
|
266
266
|
return { started: [], errors: [{ mid: "all", error: "Cannot start parallel from within a parallel worker" }] };
|
|
267
267
|
}
|
|
268
268
|
const config = resolveParallelConfig(prefs);
|
|
269
|
+
// Release any leftover state from a previous session before reassigning
|
|
270
|
+
if (state) {
|
|
271
|
+
for (const w of state.workers.values()) {
|
|
272
|
+
w.cleanup?.();
|
|
273
|
+
w.cleanup = undefined;
|
|
274
|
+
w.process = null;
|
|
275
|
+
}
|
|
276
|
+
state.workers.clear();
|
|
277
|
+
}
|
|
269
278
|
// Try to restore from a previous crash
|
|
270
279
|
const restored = restoreState(basePath);
|
|
271
280
|
if (restored && restored.workers.length > 0) {
|
|
@@ -483,6 +492,15 @@ export function spawnWorker(basePath, milestoneId) {
|
|
|
483
492
|
startedAt: worker.startedAt,
|
|
484
493
|
worktreePath: worker.worktreePath,
|
|
485
494
|
});
|
|
495
|
+
// Store cleanup function to remove all listeners from the child process.
|
|
496
|
+
// This prevents listener accumulation when workers are respawned, since
|
|
497
|
+
// handler closures capture milestoneId and other data that would otherwise
|
|
498
|
+
// be retained indefinitely.
|
|
499
|
+
worker.cleanup = () => {
|
|
500
|
+
child.stdout?.removeAllListeners();
|
|
501
|
+
child.stderr?.removeAllListeners();
|
|
502
|
+
child.removeAllListeners();
|
|
503
|
+
};
|
|
486
504
|
// Handle worker exit
|
|
487
505
|
child.on("exit", (code) => {
|
|
488
506
|
if (!state)
|
|
@@ -490,6 +508,9 @@ export function spawnWorker(basePath, milestoneId) {
|
|
|
490
508
|
const w = state.workers.get(milestoneId);
|
|
491
509
|
if (!w)
|
|
492
510
|
return;
|
|
511
|
+
// Remove all stream listeners to release closure references
|
|
512
|
+
w.cleanup?.();
|
|
513
|
+
w.cleanup = undefined;
|
|
493
514
|
w.process = null;
|
|
494
515
|
if (w.state === "stopped")
|
|
495
516
|
return; // graceful stop, already handled
|
|
@@ -667,6 +688,9 @@ export async function stopParallel(basePath, milestoneId) {
|
|
|
667
688
|
catch { /* process may already be dead */ }
|
|
668
689
|
await waitForWorkerExit(worker, 250);
|
|
669
690
|
}
|
|
691
|
+
// Remove stream listeners before releasing the process handle
|
|
692
|
+
worker.cleanup?.();
|
|
693
|
+
worker.cleanup = undefined;
|
|
670
694
|
// Update in-memory state
|
|
671
695
|
worker.state = "stopped";
|
|
672
696
|
worker.process = null;
|
|
@@ -733,6 +757,8 @@ export function refreshWorkerStatuses(basePath, options = {}) {
|
|
|
733
757
|
for (const mid of staleIds) {
|
|
734
758
|
const worker = state.workers.get(mid);
|
|
735
759
|
if (worker) {
|
|
760
|
+
worker.cleanup?.();
|
|
761
|
+
worker.cleanup = undefined;
|
|
736
762
|
worker.state = "error";
|
|
737
763
|
worker.process = null;
|
|
738
764
|
}
|
|
@@ -748,6 +774,8 @@ export function refreshWorkerStatuses(basePath, options = {}) {
|
|
|
748
774
|
const diskStatus = statusMap.get(mid);
|
|
749
775
|
if (!diskStatus) {
|
|
750
776
|
if (!isPidAlive(worker.pid)) {
|
|
777
|
+
worker.cleanup?.();
|
|
778
|
+
worker.cleanup = undefined;
|
|
751
779
|
worker.state = worker.completedUnits > 0 ? "stopped" : "error";
|
|
752
780
|
worker.process = null;
|
|
753
781
|
}
|
|
@@ -784,5 +812,15 @@ export function isBudgetExceeded() {
|
|
|
784
812
|
// ─── Reset ─────────────────────────────────────────────────────────────────
|
|
785
813
|
/** Reset orchestrator state. Called on clean shutdown. */
|
|
786
814
|
export function resetOrchestrator() {
|
|
815
|
+
if (state) {
|
|
816
|
+
// Explicitly release all WorkerInfo references and run any pending
|
|
817
|
+
// cleanup callbacks so child process stream closures are freed.
|
|
818
|
+
for (const w of state.workers.values()) {
|
|
819
|
+
w.cleanup?.();
|
|
820
|
+
w.cleanup = undefined;
|
|
821
|
+
w.process = null;
|
|
822
|
+
}
|
|
823
|
+
state.workers.clear();
|
|
824
|
+
}
|
|
787
825
|
state = null;
|
|
788
826
|
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
// GSD Extension - Legacy Parsers
|
|
2
|
+
// parseRoadmap() and parsePlan() extracted from files.ts.
|
|
3
|
+
// Used only by: md-importer.ts (migration), state.ts (pre-migration fallback),
|
|
4
|
+
// markdown-renderer.ts (detectStaleRenders disk-vs-DB comparison),
|
|
5
|
+
// commands-maintenance.ts (cold-path branch cleanup), and tests.
|
|
6
|
+
//
|
|
7
|
+
// NOT used in the dispatch loop or any hot-path runtime code.
|
|
8
|
+
import { extractSection, parseBullets, extractBoldField, extractAllSections, registerCacheClearCallback } from './files.js';
|
|
9
|
+
import { splitFrontmatter } from '../shared/frontmatter.js';
|
|
10
|
+
import { nativeParseRoadmap, nativeParsePlanFile } from './native-parser-bridge.js';
|
|
11
|
+
import { debugTime, debugCount } from './debug-logger.js';
|
|
12
|
+
import { CACHE_MAX } from './constants.js';
|
|
13
|
+
// Re-export parseRoadmapSlices so callers can import all legacy parsers from one module
|
|
14
|
+
import { parseRoadmapSlices } from './roadmap-slices.js';
|
|
15
|
+
export { parseRoadmapSlices };
|
|
16
|
+
// ─── Parse Cache (local to this module) ───────────────────────────────────
|
|
17
|
+
/** Fast composite key: length + first/mid/last 100 chars. The middle sample
|
|
18
|
+
* prevents collisions when only a few characters change in the interior of
|
|
19
|
+
* a file (e.g., a checkbox [ ] → [x] that doesn't alter length or endpoints). */
|
|
20
|
+
function cacheKey(content) {
|
|
21
|
+
const len = content.length;
|
|
22
|
+
const head = content.slice(0, 100);
|
|
23
|
+
const midStart = Math.max(0, Math.floor(len / 2) - 50);
|
|
24
|
+
const mid = len > 200 ? content.slice(midStart, midStart + 100) : '';
|
|
25
|
+
const tail = len > 100 ? content.slice(-100) : '';
|
|
26
|
+
return `${len}:${head}:${mid}:${tail}`;
|
|
27
|
+
}
|
|
28
|
+
const _parseCache = new Map();
|
|
29
|
+
function cachedParse(content, tag, parseFn) {
|
|
30
|
+
const key = tag + '|' + cacheKey(content);
|
|
31
|
+
if (_parseCache.has(key))
|
|
32
|
+
return _parseCache.get(key);
|
|
33
|
+
if (_parseCache.size >= CACHE_MAX)
|
|
34
|
+
_parseCache.clear();
|
|
35
|
+
const result = parseFn(content);
|
|
36
|
+
_parseCache.set(key, result);
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
/** Clear the legacy parser cache. Called by clearParseCache() in files.ts. */
|
|
40
|
+
export function clearLegacyParseCache() {
|
|
41
|
+
_parseCache.clear();
|
|
42
|
+
}
|
|
43
|
+
// Register with files.ts so clearParseCache() also clears our cache
|
|
44
|
+
registerCacheClearCallback(clearLegacyParseCache);
|
|
45
|
+
// ─── Roadmap Parser ────────────────────────────────────────────────────────
|
|
46
|
+
export function parseRoadmap(content) {
|
|
47
|
+
return cachedParse(content, 'roadmap', _parseRoadmapImpl);
|
|
48
|
+
}
|
|
49
|
+
function _parseRoadmapImpl(content) {
|
|
50
|
+
const stopTimer = debugTime("parse-roadmap");
|
|
51
|
+
// Try native parser first for better performance
|
|
52
|
+
const nativeResult = nativeParseRoadmap(content);
|
|
53
|
+
if (nativeResult) {
|
|
54
|
+
stopTimer({ native: true, slices: nativeResult.slices.length, boundaryEntries: nativeResult.boundaryMap.length });
|
|
55
|
+
debugCount("parseRoadmapCalls");
|
|
56
|
+
return nativeResult;
|
|
57
|
+
}
|
|
58
|
+
const lines = content.split('\n');
|
|
59
|
+
const h1 = lines.find(l => l.startsWith('# '));
|
|
60
|
+
const title = h1 ? h1.slice(2).trim() : '';
|
|
61
|
+
const vision = extractBoldField(content, 'Vision') || '';
|
|
62
|
+
const scSection = extractSection(content, 'Success Criteria', 2) ||
|
|
63
|
+
(() => {
|
|
64
|
+
const idx = content.indexOf('**Success Criteria:**');
|
|
65
|
+
if (idx === -1)
|
|
66
|
+
return '';
|
|
67
|
+
const rest = content.slice(idx);
|
|
68
|
+
const nextSection = rest.indexOf('\n---');
|
|
69
|
+
const block = rest.slice(0, nextSection === -1 ? undefined : nextSection);
|
|
70
|
+
const firstNewline = block.indexOf('\n');
|
|
71
|
+
return firstNewline === -1 ? '' : block.slice(firstNewline + 1);
|
|
72
|
+
})();
|
|
73
|
+
const successCriteria = scSection ? parseBullets(scSection) : [];
|
|
74
|
+
// Slices
|
|
75
|
+
const slices = parseRoadmapSlices(content);
|
|
76
|
+
// Boundary map
|
|
77
|
+
const boundaryMap = [];
|
|
78
|
+
const bmSection = extractSection(content, 'Boundary Map');
|
|
79
|
+
if (bmSection) {
|
|
80
|
+
const h3Sections = extractAllSections(bmSection, 3);
|
|
81
|
+
for (const [heading, sectionContent] of h3Sections) {
|
|
82
|
+
const arrowMatch = heading.match(/^(\S+)\s*→\s*(\S+)/);
|
|
83
|
+
if (!arrowMatch)
|
|
84
|
+
continue;
|
|
85
|
+
const fromSlice = arrowMatch[1];
|
|
86
|
+
const toSlice = arrowMatch[2];
|
|
87
|
+
let produces = '';
|
|
88
|
+
let consumes = '';
|
|
89
|
+
// Use indexOf-based parsing instead of [\s\S]*? regex to avoid
|
|
90
|
+
// catastrophic backtracking on content with code fences (#468).
|
|
91
|
+
const prodIdx = sectionContent.search(/^Produces:\s*$/m);
|
|
92
|
+
if (prodIdx !== -1) {
|
|
93
|
+
const afterProd = sectionContent.indexOf('\n', prodIdx);
|
|
94
|
+
if (afterProd !== -1) {
|
|
95
|
+
const consIdx = sectionContent.search(/^Consumes/m);
|
|
96
|
+
const endIdx = consIdx !== -1 && consIdx > afterProd ? consIdx : sectionContent.length;
|
|
97
|
+
produces = sectionContent.slice(afterProd + 1, endIdx).trim();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const consLineMatch = sectionContent.match(/^Consumes[^:]*:\s*(.+)$/m);
|
|
101
|
+
if (consLineMatch) {
|
|
102
|
+
consumes = consLineMatch[1].trim();
|
|
103
|
+
}
|
|
104
|
+
if (!consumes) {
|
|
105
|
+
const consIdx = sectionContent.search(/^Consumes[^:]*:\s*$/m);
|
|
106
|
+
if (consIdx !== -1) {
|
|
107
|
+
const afterCons = sectionContent.indexOf('\n', consIdx);
|
|
108
|
+
if (afterCons !== -1) {
|
|
109
|
+
consumes = sectionContent.slice(afterCons + 1).trim();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
boundaryMap.push({ fromSlice, toSlice, produces, consumes });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const result = { title, vision, successCriteria, slices, boundaryMap };
|
|
117
|
+
stopTimer({ native: false, slices: slices.length, boundaryEntries: boundaryMap.length });
|
|
118
|
+
debugCount("parseRoadmapCalls");
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
// ─── Slice Plan Parser ─────────────────────────────────────────────────────
|
|
122
|
+
export function parsePlan(content) {
|
|
123
|
+
return cachedParse(content, 'plan', _parsePlanImpl);
|
|
124
|
+
}
|
|
125
|
+
function _parsePlanImpl(content) {
|
|
126
|
+
const stopTimer = debugTime("parse-plan");
|
|
127
|
+
const [, body] = splitFrontmatter(content);
|
|
128
|
+
// Try native parser first for better performance
|
|
129
|
+
const nativeResult = nativeParsePlanFile(body);
|
|
130
|
+
if (nativeResult) {
|
|
131
|
+
stopTimer({ native: true });
|
|
132
|
+
return {
|
|
133
|
+
id: nativeResult.id,
|
|
134
|
+
title: nativeResult.title,
|
|
135
|
+
goal: nativeResult.goal,
|
|
136
|
+
demo: nativeResult.demo,
|
|
137
|
+
mustHaves: nativeResult.mustHaves,
|
|
138
|
+
tasks: nativeResult.tasks.map(t => ({
|
|
139
|
+
id: t.id,
|
|
140
|
+
title: t.title,
|
|
141
|
+
description: t.description,
|
|
142
|
+
done: t.done,
|
|
143
|
+
estimate: t.estimate,
|
|
144
|
+
...(t.files.length > 0 ? { files: t.files } : {}),
|
|
145
|
+
...(t.verify ? { verify: t.verify } : {}),
|
|
146
|
+
})),
|
|
147
|
+
filesLikelyTouched: nativeResult.filesLikelyTouched,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
const lines = body.split('\n');
|
|
151
|
+
const h1 = lines.find(l => l.startsWith('# '));
|
|
152
|
+
let id = '';
|
|
153
|
+
let title = '';
|
|
154
|
+
if (h1) {
|
|
155
|
+
const match = h1.match(/^#\s+(\w+):\s+(.+)/);
|
|
156
|
+
if (match) {
|
|
157
|
+
id = match[1];
|
|
158
|
+
title = match[2].trim();
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
title = h1.slice(2).trim();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const goal = extractBoldField(body, 'Goal') || '';
|
|
165
|
+
const demo = extractBoldField(body, 'Demo') || '';
|
|
166
|
+
const mhSection = extractSection(body, 'Must-Haves');
|
|
167
|
+
const mustHaves = mhSection ? parseBullets(mhSection) : [];
|
|
168
|
+
const tasksSection = extractSection(body, 'Tasks');
|
|
169
|
+
const tasks = [];
|
|
170
|
+
if (tasksSection) {
|
|
171
|
+
const taskLines = tasksSection.split('\n');
|
|
172
|
+
let currentTask = null;
|
|
173
|
+
for (const line of taskLines) {
|
|
174
|
+
const cbMatch = line.match(/^-\s+\[([ xX])\]\s+\*\*([\w.]+):\s+(.+?)\*\*\s*(.*)/);
|
|
175
|
+
// Heading-style: ### T01 -- Title, ### T01: Title, ### T01 — Title
|
|
176
|
+
const hdMatch = !cbMatch ? line.match(/^#{2,4}\s+([\w.]+)\s*(?:--|—|:)\s*(.+)/) : null;
|
|
177
|
+
if (cbMatch || hdMatch) {
|
|
178
|
+
if (currentTask)
|
|
179
|
+
tasks.push(currentTask);
|
|
180
|
+
if (cbMatch) {
|
|
181
|
+
const rest = cbMatch[4] || '';
|
|
182
|
+
const estMatch = rest.match(/`est:([^`]+)`/);
|
|
183
|
+
const estimate = estMatch ? estMatch[1] : '';
|
|
184
|
+
currentTask = {
|
|
185
|
+
id: cbMatch[2],
|
|
186
|
+
title: cbMatch[3],
|
|
187
|
+
description: '',
|
|
188
|
+
done: cbMatch[1].toLowerCase() === 'x',
|
|
189
|
+
estimate,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
const rest = hdMatch[2] || '';
|
|
194
|
+
const titleEstMatch = rest.match(/^(.+?)\s*`est:([^`]+)`\s*$/);
|
|
195
|
+
const title = titleEstMatch ? titleEstMatch[1].trim() : rest.trim();
|
|
196
|
+
const estimate = titleEstMatch ? titleEstMatch[2] : '';
|
|
197
|
+
currentTask = {
|
|
198
|
+
id: hdMatch[1],
|
|
199
|
+
title,
|
|
200
|
+
description: '',
|
|
201
|
+
done: false,
|
|
202
|
+
estimate,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else if (currentTask && line.match(/^\s*-\s+Files:\s*(.*)/)) {
|
|
207
|
+
const filesMatch = line.match(/^\s*-\s+Files:\s*(.*)/);
|
|
208
|
+
if (filesMatch) {
|
|
209
|
+
currentTask.files = filesMatch[1]
|
|
210
|
+
.split(',')
|
|
211
|
+
.map(f => f.replace(/`/g, '').trim())
|
|
212
|
+
.filter(f => f.length > 0);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else if (currentTask && line.match(/^\s*-\s+Verify:\s*(.*)/)) {
|
|
216
|
+
const verifyMatch = line.match(/^\s*-\s+Verify:\s*(.*)/);
|
|
217
|
+
if (verifyMatch) {
|
|
218
|
+
currentTask.verify = verifyMatch[1].trim();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else if (currentTask && line.trim() && !line.startsWith('#')) {
|
|
222
|
+
const desc = line.trim();
|
|
223
|
+
if (desc) {
|
|
224
|
+
currentTask.description = currentTask.description
|
|
225
|
+
? currentTask.description + ' ' + desc
|
|
226
|
+
: desc;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (currentTask)
|
|
231
|
+
tasks.push(currentTask);
|
|
232
|
+
}
|
|
233
|
+
const filesSection = extractSection(body, 'Files Likely Touched');
|
|
234
|
+
const filesLikelyTouched = filesSection ? parseBullets(filesSection) : [];
|
|
235
|
+
const result = { id, title, goal, demo, mustHaves, tasks, filesLikelyTouched };
|
|
236
|
+
stopTimer({ tasks: tasks.length });
|
|
237
|
+
debugCount("parsePlanCalls");
|
|
238
|
+
return result;
|
|
239
|
+
}
|
|
@@ -775,5 +775,14 @@ export function validatePreferences(preferences) {
|
|
|
775
775
|
errors.push("github must be an object");
|
|
776
776
|
}
|
|
777
777
|
}
|
|
778
|
+
// ─── Show Token Cost ──────────────────────────────────────────────
|
|
779
|
+
if (preferences.show_token_cost !== undefined) {
|
|
780
|
+
if (typeof preferences.show_token_cost === "boolean") {
|
|
781
|
+
validated.show_token_cost = preferences.show_token_cost;
|
|
782
|
+
}
|
|
783
|
+
else {
|
|
784
|
+
errors.push("show_token_cost must be a boolean");
|
|
785
|
+
}
|
|
786
|
+
}
|
|
778
787
|
return { preferences: validated, errors, warnings };
|
|
779
788
|
}
|
|
@@ -266,6 +266,7 @@ function mergePreferences(base, override) {
|
|
|
266
266
|
: undefined,
|
|
267
267
|
service_tier: override.service_tier ?? base.service_tier,
|
|
268
268
|
forensics_dedup: override.forensics_dedup ?? base.forensics_dedup,
|
|
269
|
+
show_token_cost: override.show_token_cost ?? base.show_token_cost,
|
|
269
270
|
};
|
|
270
271
|
}
|
|
271
272
|
function mergeStringLists(base, override) {
|