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
|
@@ -1,21 +1,49 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
2
|
+
import { join, sep } from "node:path";
|
|
3
3
|
|
|
4
4
|
import type { ExtensionAPI } from "@gsd/pi-coding-agent";
|
|
5
5
|
import { createBashTool, createEditTool, createReadTool, createWriteTool } from "@gsd/pi-coding-agent";
|
|
6
6
|
|
|
7
7
|
import { DEFAULT_BASH_TIMEOUT_SECS } from "../constants.js";
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Resolve the correct DB path for the current working directory.
|
|
11
|
+
* If `basePath` is inside a `.gsd/worktrees/<MID>/` directory, returns
|
|
12
|
+
* the project root's `.gsd/gsd.db` (shared WAL — R012). Otherwise
|
|
13
|
+
* returns `<basePath>/.gsd/gsd.db`.
|
|
14
|
+
*/
|
|
15
|
+
export function resolveProjectRootDbPath(basePath: string): string {
|
|
16
|
+
// Detect worktree: look for `.gsd/worktrees/` in the path segments.
|
|
17
|
+
// A worktree path looks like: /project/root/.gsd/worktrees/M001/...
|
|
18
|
+
// We need to resolve back to /project/root/.gsd/gsd.db
|
|
19
|
+
const marker = `${sep}.gsd${sep}worktrees${sep}`;
|
|
20
|
+
const idx = basePath.indexOf(marker);
|
|
21
|
+
if (idx !== -1) {
|
|
22
|
+
const projectRoot = basePath.slice(0, idx);
|
|
23
|
+
return join(projectRoot, ".gsd", "gsd.db");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Also handle forward-slash paths on all platforms
|
|
27
|
+
const fwdMarker = "/.gsd/worktrees/";
|
|
28
|
+
const fwdIdx = basePath.indexOf(fwdMarker);
|
|
29
|
+
if (fwdIdx !== -1) {
|
|
30
|
+
const projectRoot = basePath.slice(0, fwdIdx);
|
|
31
|
+
return join(projectRoot, ".gsd", "gsd.db");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return join(basePath, ".gsd", "gsd.db");
|
|
35
|
+
}
|
|
36
|
+
|
|
9
37
|
export async function ensureDbOpen(): Promise<boolean> {
|
|
10
38
|
try {
|
|
11
39
|
const db = await import("../gsd-db.js");
|
|
12
40
|
if (db.isDbAvailable()) return true;
|
|
13
41
|
|
|
14
42
|
const basePath = process.cwd();
|
|
43
|
+
const dbPath = resolveProjectRootDbPath(basePath);
|
|
15
44
|
const gsdDir = join(basePath, ".gsd");
|
|
16
|
-
const dbPath = join(gsdDir, "gsd.db");
|
|
17
45
|
|
|
18
|
-
// Open existing DB file
|
|
46
|
+
// Open existing DB file (may be at project root for worktrees)
|
|
19
47
|
if (existsSync(dbPath)) {
|
|
20
48
|
return db.openDatabase(dbPath);
|
|
21
49
|
}
|
|
@@ -30,6 +30,13 @@ export function registerHooks(pi: ExtensionAPI): void {
|
|
|
30
30
|
resetWriteGateState();
|
|
31
31
|
resetToolCallLoopGuard();
|
|
32
32
|
await syncServiceTierStatus(ctx);
|
|
33
|
+
|
|
34
|
+
// Apply show_token_cost preference (#1515)
|
|
35
|
+
try {
|
|
36
|
+
const { loadEffectiveGSDPreferences } = await import("../preferences.js");
|
|
37
|
+
const prefs = loadEffectiveGSDPreferences();
|
|
38
|
+
process.env.GSD_SHOW_TOKEN_COST = prefs?.preferences.show_token_cost ? "1" : "";
|
|
39
|
+
} catch { /* non-fatal */ }
|
|
33
40
|
if (isFirstSession) {
|
|
34
41
|
isFirstSession = false;
|
|
35
42
|
} else {
|
|
@@ -15,7 +15,7 @@ export interface GsdCommandDefinition {
|
|
|
15
15
|
type CompletionMap = Record<string, readonly GsdCommandDefinition[]>;
|
|
16
16
|
|
|
17
17
|
export const GSD_COMMAND_DESCRIPTION =
|
|
18
|
-
"GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|rate|skip|export|cleanup|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast";
|
|
18
|
+
"GSD — Get Shit Done: /gsd help|start|templates|next|auto|stop|pause|status|widget|visualize|queue|quick|discuss|capture|triage|dispatch|history|undo|undo-task|reset-slice|rate|skip|export|cleanup|mode|prefs|config|keys|hooks|run-hook|skill-health|doctor|logs|forensics|changelog|migrate|remote|steer|knowledge|new-milestone|parallel|cmux|park|unpark|init|setup|inspect|extensions|update|fast";
|
|
19
19
|
|
|
20
20
|
export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
|
|
21
21
|
{ cmd: "help", desc: "Categorized command reference with descriptions" },
|
|
@@ -35,6 +35,8 @@ export const TOP_LEVEL_SUBCOMMANDS: readonly GsdCommandDefinition[] = [
|
|
|
35
35
|
{ cmd: "dispatch", desc: "Dispatch a specific phase directly" },
|
|
36
36
|
{ cmd: "history", desc: "View execution history" },
|
|
37
37
|
{ cmd: "undo", desc: "Revert last completed unit" },
|
|
38
|
+
{ cmd: "undo-task", desc: "Reset a specific task's completion state (DB + markdown)" },
|
|
39
|
+
{ cmd: "reset-slice", desc: "Reset a slice and all its tasks (DB + markdown)" },
|
|
38
40
|
{ cmd: "rate", desc: "Rate last unit's model tier (over/ok/under) — improves adaptive routing" },
|
|
39
41
|
{ cmd: "skip", desc: "Prevent a unit from auto-mode dispatch" },
|
|
40
42
|
{ cmd: "export", desc: "Export milestone/slice results" },
|
|
@@ -6,7 +6,7 @@ import { handleConfig } from "../../commands-config.js";
|
|
|
6
6
|
import { handleDoctor, handleCapture, handleKnowledge, handleRunHook, handleSkillHealth, handleSteer, handleTriage, handleUpdate } from "../../commands-handlers.js";
|
|
7
7
|
import { handleInspect } from "../../commands-inspect.js";
|
|
8
8
|
import { handleLogs } from "../../commands-logs.js";
|
|
9
|
-
import { handleCleanupBranches, handleCleanupSnapshots, handleSkip, handleCleanupProjects, handleCleanupWorktrees } from "../../commands-maintenance.js";
|
|
9
|
+
import { handleCleanupBranches, handleCleanupSnapshots, handleSkip, handleCleanupProjects, handleCleanupWorktrees, handleRecover } from "../../commands-maintenance.js";
|
|
10
10
|
import { handleExport } from "../../export.js";
|
|
11
11
|
import { handleHistory } from "../../history.js";
|
|
12
12
|
import { handleUndo } from "../../undo.js";
|
|
@@ -53,6 +53,16 @@ export async function handleOpsCommand(trimmed: string, ctx: ExtensionCommandCon
|
|
|
53
53
|
await handleHistory(trimmed.replace(/^history\s*/, "").trim(), ctx, projectRoot());
|
|
54
54
|
return true;
|
|
55
55
|
}
|
|
56
|
+
if (trimmed === "undo-task" || trimmed.startsWith("undo-task ")) {
|
|
57
|
+
const { handleUndoTask } = await import("../../undo.js");
|
|
58
|
+
await handleUndoTask(trimmed.replace(/^undo-task\s*/, "").trim(), ctx, pi, projectRoot());
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
if (trimmed === "reset-slice" || trimmed.startsWith("reset-slice ")) {
|
|
62
|
+
const { handleResetSlice } = await import("../../undo.js");
|
|
63
|
+
await handleResetSlice(trimmed.replace(/^reset-slice\s*/, "").trim(), ctx, pi, projectRoot());
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
56
66
|
if (trimmed === "undo" || trimmed.startsWith("undo ")) {
|
|
57
67
|
await handleUndo(trimmed.replace(/^undo\s*/, "").trim(), ctx, pi, projectRoot());
|
|
58
68
|
return true;
|
|
@@ -65,6 +75,10 @@ export async function handleOpsCommand(trimmed: string, ctx: ExtensionCommandCon
|
|
|
65
75
|
await handleSkip(trimmed.replace(/^skip\s*/, "").trim(), ctx, projectRoot());
|
|
66
76
|
return true;
|
|
67
77
|
}
|
|
78
|
+
if (trimmed === "recover") {
|
|
79
|
+
await handleRecover(ctx, projectRoot());
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
68
82
|
if (trimmed === "export" || trimmed.startsWith("export ")) {
|
|
69
83
|
await handleExport(trimmed.replace(/^export\s*/, "").trim(), ctx, projectRoot());
|
|
70
84
|
return true;
|
|
@@ -82,7 +82,7 @@ export async function handleDoctor(args: string, ctx: ExtensionCommandContext, p
|
|
|
82
82
|
scope: effectiveScope,
|
|
83
83
|
includeWarnings: true,
|
|
84
84
|
});
|
|
85
|
-
const actionable = unresolved.filter(issue => issue.severity === "error"
|
|
85
|
+
const actionable = unresolved.filter(issue => issue.severity === "error");
|
|
86
86
|
if (actionable.length === 0) {
|
|
87
87
|
ctx.ui.notify("Doctor heal found nothing actionable to hand off to the LLM.", "info");
|
|
88
88
|
return;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GSD Maintenance — cleanup, skip,
|
|
2
|
+
* GSD Maintenance — cleanup, skip, dry-run, and recover handlers.
|
|
3
3
|
*
|
|
4
|
-
* Contains: handleCleanupBranches, handleCleanupSnapshots, handleCleanupWorktrees, handleSkip, handleDryRun
|
|
4
|
+
* Contains: handleCleanupBranches, handleCleanupSnapshots, handleCleanupWorktrees, handleSkip, handleDryRun, handleRecover
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
@@ -44,8 +44,10 @@ export async function handleCleanupBranches(ctx: ExtensionCommandContext, basePa
|
|
|
44
44
|
try {
|
|
45
45
|
const { listWorktrees } = await import("./worktree-manager.js");
|
|
46
46
|
const { resolveMilestoneFile } = await import("./paths.js");
|
|
47
|
-
const { loadFile
|
|
47
|
+
const { loadFile } = await import("./files.js");
|
|
48
|
+
const { parseRoadmap } = await import("./parsers-legacy.js");
|
|
48
49
|
const { isMilestoneComplete } = await import("./state.js");
|
|
50
|
+
const { isDbAvailable, getMilestone } = await import("./gsd-db.js");
|
|
49
51
|
|
|
50
52
|
const attachedBranches = new Set(
|
|
51
53
|
listWorktrees(basePath).map((wt) => wt.branch),
|
|
@@ -54,6 +56,22 @@ export async function handleCleanupBranches(ctx: ExtensionCommandContext, basePa
|
|
|
54
56
|
for (const branch of milestoneBranches) {
|
|
55
57
|
if (attachedBranches.has(branch)) continue;
|
|
56
58
|
const milestoneId = branch.replace(/^milestone\//, "");
|
|
59
|
+
|
|
60
|
+
// DB-first: check milestone status directly
|
|
61
|
+
if (isDbAvailable()) {
|
|
62
|
+
const dbRow = getMilestone(milestoneId);
|
|
63
|
+
if (dbRow) {
|
|
64
|
+
if (dbRow.status !== "complete" && dbRow.status !== "done") continue;
|
|
65
|
+
// Milestone is complete per DB — proceed to delete branch
|
|
66
|
+
try {
|
|
67
|
+
nativeBranchDelete(basePath, branch, true);
|
|
68
|
+
deletedStaleMilestones++;
|
|
69
|
+
} catch { /* non-fatal */ }
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Filesystem fallback
|
|
57
75
|
const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
58
76
|
if (!roadmapPath) continue;
|
|
59
77
|
let roadmapContent: string | null = null;
|
|
@@ -450,3 +468,68 @@ export async function handleCleanupProjects(args: string, ctx: ExtensionCommandC
|
|
|
450
468
|
|
|
451
469
|
ctx.ui.notify(lines.join("\n"), "info");
|
|
452
470
|
}
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* `gsd recover` — Reconstruct DB hierarchy state from rendered markdown on disk.
|
|
474
|
+
*
|
|
475
|
+
* Deletes milestones, slices, and tasks table rows (preserves decisions,
|
|
476
|
+
* requirements, artifacts, memories), re-runs `migrateHierarchyToDb()` to
|
|
477
|
+
* repopulate from markdown, then calls `deriveState()` to verify sanity.
|
|
478
|
+
*
|
|
479
|
+
* Prints counts of recovered items and the resulting project phase.
|
|
480
|
+
*/
|
|
481
|
+
export async function handleRecover(ctx: ExtensionCommandContext, basePath: string): Promise<void> {
|
|
482
|
+
const { isDbAvailable: dbAvailable, _getAdapter, transaction: dbTransaction } = await import("./gsd-db.js");
|
|
483
|
+
const { migrateHierarchyToDb } = await import("./md-importer.js");
|
|
484
|
+
const { invalidateStateCache } = await import("./state.js");
|
|
485
|
+
|
|
486
|
+
if (!dbAvailable()) {
|
|
487
|
+
ctx.ui.notify("gsd recover: No database open. Run a GSD command first to initialize the DB.", "error");
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
try {
|
|
492
|
+
// 1. Delete + re-populate inside a single transaction for atomicity
|
|
493
|
+
const db = _getAdapter()!;
|
|
494
|
+
const counts = dbTransaction(() => {
|
|
495
|
+
db.exec("DELETE FROM tasks");
|
|
496
|
+
db.exec("DELETE FROM slices");
|
|
497
|
+
db.exec("DELETE FROM milestones");
|
|
498
|
+
return migrateHierarchyToDb(basePath);
|
|
499
|
+
});
|
|
500
|
+
|
|
501
|
+
// 3. Invalidate state cache so deriveState() picks up fresh DB data
|
|
502
|
+
invalidateStateCache();
|
|
503
|
+
|
|
504
|
+
// 4. Derive state to verify sanity
|
|
505
|
+
const state = await deriveState(basePath);
|
|
506
|
+
|
|
507
|
+
// 5. Report
|
|
508
|
+
const lines = [
|
|
509
|
+
`gsd recover: reconstructed hierarchy from markdown`,
|
|
510
|
+
` Milestones: ${counts.milestones}`,
|
|
511
|
+
` Slices: ${counts.slices}`,
|
|
512
|
+
` Tasks: ${counts.tasks}`,
|
|
513
|
+
``,
|
|
514
|
+
` Phase: ${state.phase}`,
|
|
515
|
+
];
|
|
516
|
+
if (state.activeMilestone) {
|
|
517
|
+
lines.push(` Active: ${state.activeMilestone.id}: ${state.activeMilestone.title}`);
|
|
518
|
+
}
|
|
519
|
+
if (state.activeSlice) {
|
|
520
|
+
lines.push(` Slice: ${state.activeSlice.id}: ${state.activeSlice.title}`);
|
|
521
|
+
}
|
|
522
|
+
if (state.activeTask) {
|
|
523
|
+
lines.push(` Task: ${state.activeTask.id}: ${state.activeTask.title}`);
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
process.stderr.write(
|
|
527
|
+
`gsd-recover: recovered ${counts.milestones}M/${counts.slices}S/${counts.tasks}T hierarchy\n`,
|
|
528
|
+
);
|
|
529
|
+
ctx.ui.notify(lines.join("\n"), "success");
|
|
530
|
+
} catch (err) {
|
|
531
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
532
|
+
process.stderr.write(`gsd-recover: failed: ${msg}\n`);
|
|
533
|
+
ctx.ui.notify(`gsd recover failed: ${msg}`, "error");
|
|
534
|
+
}
|
|
535
|
+
}
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
import type { Theme } from "@gsd/pi-coding-agent";
|
|
10
10
|
import { truncateToWidth, visibleWidth, matchesKey, Key } from "@gsd/pi-tui";
|
|
11
11
|
import { deriveState } from "./state.js";
|
|
12
|
-
import { loadFile
|
|
12
|
+
import { loadFile } from "./files.js";
|
|
13
|
+
import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
|
|
13
14
|
import { resolveMilestoneFile, resolveSliceFile } from "./paths.js";
|
|
14
15
|
import { getAutoDashboardData } from "./auto.js";
|
|
15
16
|
import type { AutoDashboardData } from "./auto-dashboard.js";
|
|
@@ -159,9 +160,14 @@ export class GSDDashboardOverlay {
|
|
|
159
160
|
|
|
160
161
|
const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
161
162
|
const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
163
|
+
// Normalize slices from DB
|
|
164
|
+
type NormSlice = { id: string; done: boolean; title: string; risk: string };
|
|
165
|
+
let normSlices: NormSlice[] = [];
|
|
166
|
+
if (isDbAvailable()) {
|
|
167
|
+
normSlices = getMilestoneSlices(mid).map(s => ({ id: s.id, done: s.status === "complete", title: s.title, risk: s.risk || "medium" }));
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
for (const s of normSlices) {
|
|
165
171
|
const sliceView: SliceView = {
|
|
166
172
|
id: s.id,
|
|
167
173
|
title: s.title,
|
|
@@ -172,19 +178,18 @@ export class GSDDashboardOverlay {
|
|
|
172
178
|
};
|
|
173
179
|
|
|
174
180
|
if (sliceView.active) {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
const plan = parsePlan(planContent);
|
|
181
|
+
// Normalize tasks from DB
|
|
182
|
+
if (isDbAvailable()) {
|
|
183
|
+
const dbTasks = getSliceTasks(mid, s.id);
|
|
179
184
|
sliceView.taskProgress = {
|
|
180
|
-
done:
|
|
181
|
-
total:
|
|
185
|
+
done: dbTasks.filter(t => t.status === "complete" || t.status === "done").length,
|
|
186
|
+
total: dbTasks.length,
|
|
182
187
|
};
|
|
183
|
-
for (const t of
|
|
188
|
+
for (const t of dbTasks) {
|
|
184
189
|
sliceView.tasks.push({
|
|
185
190
|
id: t.id,
|
|
186
191
|
title: t.title,
|
|
187
|
-
done: t.done,
|
|
192
|
+
done: t.status === "complete" || t.status === "done",
|
|
188
193
|
active: state.activeTask?.id === t.id,
|
|
189
194
|
});
|
|
190
195
|
}
|
|
@@ -192,7 +197,6 @@ export class GSDDashboardOverlay {
|
|
|
192
197
|
}
|
|
193
198
|
|
|
194
199
|
view.slices.push(sliceView);
|
|
195
|
-
}
|
|
196
200
|
}
|
|
197
201
|
|
|
198
202
|
this.milestoneData = view;
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
// parseDecisionsTable() and parseRequirementsSections() with field fidelity.
|
|
10
10
|
|
|
11
11
|
import { join, resolve } from 'node:path';
|
|
12
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
12
13
|
import type { Decision, Requirement } from './types.js';
|
|
13
14
|
import { resolveGsdRootFile } from './paths.js';
|
|
14
15
|
import { saveFile } from './files.js';
|
|
@@ -17,6 +18,58 @@ import { invalidateStateCache } from './state.js';
|
|
|
17
18
|
import { clearPathCache } from './paths.js';
|
|
18
19
|
import { clearParseCache } from './files.js';
|
|
19
20
|
|
|
21
|
+
// ─── Freeform Detection ───────────────────────────────────────────────────
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Detect whether a DECISIONS.md file is in canonical table format
|
|
25
|
+
* (generated by generateDecisionsMd).
|
|
26
|
+
*
|
|
27
|
+
* Returns true only if the file starts with the canonical header
|
|
28
|
+
* ("# Decisions Register") that generateDecisionsMd produces.
|
|
29
|
+
* Files with freeform content — even if they contain an appended
|
|
30
|
+
* decisions table section — return false so the freeform content
|
|
31
|
+
* is preserved.
|
|
32
|
+
*/
|
|
33
|
+
export function isDecisionsTableFormat(content: string): boolean {
|
|
34
|
+
// The canonical format always starts with "# Decisions Register"
|
|
35
|
+
const firstLine = content.split('\n')[0]?.trim() ?? '';
|
|
36
|
+
if (firstLine !== '# Decisions Register') return false;
|
|
37
|
+
|
|
38
|
+
// Additionally verify the file has the canonical table header
|
|
39
|
+
return content.includes('| # | When | Scope | Decision | Choice | Rationale | Revisable?');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Generate a minimal decisions table section (header + rows) for appending
|
|
44
|
+
* to a freeform DECISIONS.md file.
|
|
45
|
+
*/
|
|
46
|
+
function generateDecisionsAppendBlock(decisions: Decision[]): string {
|
|
47
|
+
const lines: string[] = [];
|
|
48
|
+
lines.push('');
|
|
49
|
+
lines.push('---');
|
|
50
|
+
lines.push('');
|
|
51
|
+
lines.push('## Decisions Table');
|
|
52
|
+
lines.push('');
|
|
53
|
+
lines.push('| # | When | Scope | Decision | Choice | Rationale | Revisable? | Made By |');
|
|
54
|
+
lines.push('|---|------|-------|----------|--------|-----------|------------|---------|');
|
|
55
|
+
|
|
56
|
+
for (const d of decisions) {
|
|
57
|
+
const cells = [
|
|
58
|
+
d.id,
|
|
59
|
+
d.when_context,
|
|
60
|
+
d.scope,
|
|
61
|
+
d.decision,
|
|
62
|
+
d.choice,
|
|
63
|
+
d.rationale,
|
|
64
|
+
d.revisable,
|
|
65
|
+
d.made_by ?? 'agent',
|
|
66
|
+
].map(cell => (cell ?? '').replace(/\|/g, '\\|'));
|
|
67
|
+
lines.push(`| ${cells.join(' | ')} |`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return lines.join('\n') + '\n';
|
|
71
|
+
}
|
|
72
|
+
|
|
20
73
|
// ─── Markdown Generators ──────────────────────────────────────────────────
|
|
21
74
|
|
|
22
75
|
/**
|
|
@@ -230,9 +283,40 @@ export async function saveDecisionToDb(
|
|
|
230
283
|
}));
|
|
231
284
|
}
|
|
232
285
|
|
|
233
|
-
const md = generateDecisionsMd(allDecisions);
|
|
234
286
|
const filePath = resolveGsdRootFile(basePath, 'DECISIONS');
|
|
235
|
-
|
|
287
|
+
|
|
288
|
+
// Check if existing DECISIONS.md has freeform (non-table) content.
|
|
289
|
+
// If so, preserve that content and append/update the decisions table
|
|
290
|
+
// at the end instead of overwriting the entire file.
|
|
291
|
+
let existingContent: string | null = null;
|
|
292
|
+
if (existsSync(filePath)) {
|
|
293
|
+
existingContent = readFileSync(filePath, 'utf-8');
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
let md: string;
|
|
297
|
+
if (existingContent && !isDecisionsTableFormat(existingContent)) {
|
|
298
|
+
// Freeform content detected — preserve it and append decisions table.
|
|
299
|
+
// Strip any previously appended decisions table section to avoid duplication.
|
|
300
|
+
const marker = '---\n\n## Decisions Table';
|
|
301
|
+
const markerIdx = existingContent.indexOf(marker);
|
|
302
|
+
const freeformPart = markerIdx >= 0
|
|
303
|
+
? existingContent.substring(0, markerIdx).trimEnd()
|
|
304
|
+
: existingContent.trimEnd();
|
|
305
|
+
md = freeformPart + '\n' + generateDecisionsAppendBlock(allDecisions);
|
|
306
|
+
} else {
|
|
307
|
+
// Table format or no existing file — full regeneration (original behavior)
|
|
308
|
+
md = generateDecisionsMd(allDecisions);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
try {
|
|
312
|
+
await saveFile(filePath, md);
|
|
313
|
+
} catch (diskErr) {
|
|
314
|
+
process.stderr.write(
|
|
315
|
+
`gsd-db: saveDecisionToDb — disk write failed, rolling back DB row: ${(diskErr as Error).message}\n`,
|
|
316
|
+
);
|
|
317
|
+
adapter?.prepare('DELETE FROM decisions WHERE id = :id').run({ ':id': id });
|
|
318
|
+
throw diskErr;
|
|
319
|
+
}
|
|
236
320
|
// Invalidate file-read caches so deriveState() sees the updated markdown.
|
|
237
321
|
// Do NOT clear the artifacts table — we just wrote to it intentionally.
|
|
238
322
|
invalidateStateCache();
|
|
@@ -301,7 +385,15 @@ export async function updateRequirementInDb(
|
|
|
301
385
|
|
|
302
386
|
const md = generateRequirementsMd(nonSuperseded);
|
|
303
387
|
const filePath = resolveGsdRootFile(basePath, 'REQUIREMENTS');
|
|
304
|
-
|
|
388
|
+
try {
|
|
389
|
+
await saveFile(filePath, md);
|
|
390
|
+
} catch (diskErr) {
|
|
391
|
+
process.stderr.write(
|
|
392
|
+
`gsd-db: updateRequirementInDb — disk write failed, reverting DB row: ${(diskErr as Error).message}\n`,
|
|
393
|
+
);
|
|
394
|
+
db.upsertRequirement(existing);
|
|
395
|
+
throw diskErr;
|
|
396
|
+
}
|
|
305
397
|
// Invalidate file-read caches so deriveState() sees the updated markdown.
|
|
306
398
|
// Do NOT clear the artifacts table — we just wrote to it intentionally.
|
|
307
399
|
invalidateStateCache();
|
|
@@ -351,7 +443,16 @@ export async function saveArtifactToDb(
|
|
|
351
443
|
if (!fullPath.startsWith(gsdDir)) {
|
|
352
444
|
throw new GSDError(GSD_IO_ERROR, `saveArtifactToDb: path escapes .gsd/ directory: ${opts.path}`);
|
|
353
445
|
}
|
|
354
|
-
|
|
446
|
+
try {
|
|
447
|
+
await saveFile(fullPath, opts.content);
|
|
448
|
+
} catch (diskErr) {
|
|
449
|
+
process.stderr.write(
|
|
450
|
+
`gsd-db: saveArtifactToDb — disk write failed, rolling back DB row: ${(diskErr as Error).message}\n`,
|
|
451
|
+
);
|
|
452
|
+
const rollbackAdapter = db._getAdapter();
|
|
453
|
+
rollbackAdapter?.prepare('DELETE FROM artifacts WHERE path = :path').run({ ':path': opts.path });
|
|
454
|
+
throw diskErr;
|
|
455
|
+
}
|
|
355
456
|
// Invalidate file-read caches so deriveState() sees the updated markdown.
|
|
356
457
|
// Do NOT clear the artifacts table — we just wrote to it intentionally.
|
|
357
458
|
invalidateStateCache();
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
// GSD Dispatch Guard — prevents out-of-order slice dispatch
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import { readdirSync } from "node:fs";
|
|
5
|
-
import { resolveMilestoneFile, milestonesDir } from "./paths.js";
|
|
6
|
-
import { parseRoadmapSlices } from "./roadmap-slices.js";
|
|
3
|
+
import { resolveMilestoneFile } from "./paths.js";
|
|
7
4
|
import { findMilestoneIds } from "./guided-flow.js";
|
|
5
|
+
import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
|
|
6
|
+
import { parseRoadmap } from "./parsers-legacy.js";
|
|
7
|
+
import { readFileSync } from "node:fs";
|
|
8
8
|
|
|
9
9
|
const SLICE_DISPATCH_TYPES = new Set([
|
|
10
10
|
"research-slice",
|
|
@@ -14,28 +14,6 @@ const SLICE_DISPATCH_TYPES = new Set([
|
|
|
14
14
|
"complete-slice",
|
|
15
15
|
]);
|
|
16
16
|
|
|
17
|
-
/**
|
|
18
|
-
* Read a roadmap file from disk (working tree) rather than from a git branch.
|
|
19
|
-
*
|
|
20
|
-
* Prior implementation used `git show <branch>:<path>` which read committed
|
|
21
|
-
* state on a specific branch. This caused false-positive blockers when work
|
|
22
|
-
* was committed on a milestone/worktree branch but the integration branch
|
|
23
|
-
* (main) hadn't been updated yet — the guard would see prior slices as
|
|
24
|
-
* incomplete on main even though they were done in the working tree (#530).
|
|
25
|
-
*
|
|
26
|
-
* Reading from disk always reflects the latest state, regardless of which
|
|
27
|
-
* branch is checked out or whether changes have been committed.
|
|
28
|
-
*/
|
|
29
|
-
function readRoadmapFromDisk(base: string, milestoneId: string): string | null {
|
|
30
|
-
try {
|
|
31
|
-
const absPath = resolveMilestoneFile(base, milestoneId, "ROADMAP");
|
|
32
|
-
if (!absPath) return null;
|
|
33
|
-
return readFileSync(absPath, "utf-8").trim();
|
|
34
|
-
} catch {
|
|
35
|
-
return null;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
17
|
export function getPriorSliceCompletionBlocker(
|
|
40
18
|
base: string,
|
|
41
19
|
_mainBranch: string,
|
|
@@ -58,11 +36,35 @@ export function getPriorSliceCompletionBlocker(
|
|
|
58
36
|
if (resolveMilestoneFile(base, mid, "PARKED")) continue;
|
|
59
37
|
if (resolveMilestoneFile(base, mid, "SUMMARY")) continue;
|
|
60
38
|
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
|
|
39
|
+
// Normalised slice list from DB or file fallback
|
|
40
|
+
type NormSlice = { id: string; done: boolean; depends: string[] };
|
|
41
|
+
let slices: NormSlice[] | null = null;
|
|
42
|
+
|
|
43
|
+
if (isDbAvailable()) {
|
|
44
|
+
const rows = getMilestoneSlices(mid);
|
|
45
|
+
if (rows.length > 0) {
|
|
46
|
+
slices = rows.map((r) => ({
|
|
47
|
+
id: r.id,
|
|
48
|
+
done: r.status === "complete",
|
|
49
|
+
depends: r.depends ?? [],
|
|
50
|
+
}));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
if (!slices) {
|
|
54
|
+
// File-based fallback: parse roadmap checkboxes
|
|
55
|
+
const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
56
|
+
if (!roadmapPath) continue;
|
|
57
|
+
let roadmapContent: string;
|
|
58
|
+
try { roadmapContent = readFileSync(roadmapPath, "utf-8"); } catch { continue; }
|
|
59
|
+
const parsed = parseRoadmap(roadmapContent);
|
|
60
|
+
if (parsed.slices.length === 0) continue;
|
|
61
|
+
slices = parsed.slices.map((s) => ({
|
|
62
|
+
id: s.id,
|
|
63
|
+
done: s.done,
|
|
64
|
+
depends: s.depends ?? [],
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
64
67
|
|
|
65
|
-
const slices = parseRoadmapSlices(roadmapContent);
|
|
66
68
|
if (mid !== targetMid) {
|
|
67
69
|
const incomplete = slices.find((slice) => !slice.done);
|
|
68
70
|
if (incomplete) {
|
|
@@ -3,7 +3,9 @@ import { basename, dirname, join, sep } from "node:path";
|
|
|
3
3
|
|
|
4
4
|
import type { DoctorIssue, DoctorIssueCode } from "./doctor-types.js";
|
|
5
5
|
import { readRepoMeta, externalProjectsRoot, cleanNumberedGsdVariants } from "./repo-identity.js";
|
|
6
|
-
import { loadFile
|
|
6
|
+
import { loadFile } from "./files.js";
|
|
7
|
+
import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
|
|
8
|
+
import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
|
|
7
9
|
import { resolveMilestoneFile, milestonesDir, gsdRoot, resolveGsdRootFile, relGsdRootFile } from "./paths.js";
|
|
8
10
|
import { deriveState, isMilestoneComplete } from "./state.js";
|
|
9
11
|
import { saveFile } from "./files.js";
|
|
@@ -51,12 +53,18 @@ export async function checkGitHealth(
|
|
|
51
53
|
// Check if milestone is complete via roadmap
|
|
52
54
|
let isComplete = false;
|
|
53
55
|
if (milestoneEntry) {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
if (isDbAvailable()) {
|
|
57
|
+
const dbSlices = getMilestoneSlices(milestoneId);
|
|
58
|
+
isComplete = dbSlices.length > 0 && dbSlices.every(s => s.status === "complete");
|
|
59
|
+
} else {
|
|
60
|
+
const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
61
|
+
const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
|
|
62
|
+
if (roadmapContent) {
|
|
63
|
+
const roadmap = parseLegacyRoadmap(roadmapContent);
|
|
64
|
+
isComplete = isMilestoneComplete(roadmap);
|
|
65
|
+
}
|
|
59
66
|
}
|
|
67
|
+
// When DB unavailable and no roadmap, isComplete stays false
|
|
60
68
|
}
|
|
61
69
|
|
|
62
70
|
if (isComplete) {
|
|
@@ -98,11 +106,17 @@ export async function checkGitHealth(
|
|
|
98
106
|
|
|
99
107
|
const milestoneId = branch.replace(/^milestone\//, "");
|
|
100
108
|
const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
101
|
-
|
|
102
|
-
if (
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
109
|
+
let branchMilestoneComplete = false;
|
|
110
|
+
if (isDbAvailable()) {
|
|
111
|
+
const dbSlices = getMilestoneSlices(milestoneId);
|
|
112
|
+
branchMilestoneComplete = dbSlices.length > 0 && dbSlices.every(s => s.status === "complete");
|
|
113
|
+
} else {
|
|
114
|
+
const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
|
|
115
|
+
if (!roadmapContent) continue;
|
|
116
|
+
const roadmap = parseLegacyRoadmap(roadmapContent);
|
|
117
|
+
branchMilestoneComplete = isMilestoneComplete(roadmap);
|
|
118
|
+
}
|
|
119
|
+
if (branchMilestoneComplete) {
|
|
106
120
|
issues.push({
|
|
107
121
|
severity: "info",
|
|
108
122
|
code: "stale_milestone_branch",
|
|
@@ -37,6 +37,29 @@ const CMD_TIMEOUT = 5_000;
|
|
|
37
37
|
|
|
38
38
|
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
39
39
|
|
|
40
|
+
/** Worktree sentinel — path segment that marks an auto-worktree directory. */
|
|
41
|
+
const WORKTREE_PATH_SEGMENT = `${join(".gsd", "worktrees")}/`;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Resolve the project root when running inside a `.gsd/worktrees/<name>/`
|
|
45
|
+
* auto-worktree. Returns `null` if not in a worktree.
|
|
46
|
+
*
|
|
47
|
+
* Detection order:
|
|
48
|
+
* 1. `GSD_WORKTREE` env var (set by the worktree launcher)
|
|
49
|
+
* 2. `.gsd/worktrees/` segment in basePath
|
|
50
|
+
*/
|
|
51
|
+
function resolveWorktreeProjectRoot(basePath: string): string | null {
|
|
52
|
+
const envRoot = process.env.GSD_WORKTREE;
|
|
53
|
+
if (envRoot) return envRoot;
|
|
54
|
+
|
|
55
|
+
const normalised = basePath.replace(/\\/g, "/");
|
|
56
|
+
const idx = normalised.indexOf(WORKTREE_PATH_SEGMENT.replace(/\\/g, "/"));
|
|
57
|
+
if (idx === -1) return null;
|
|
58
|
+
|
|
59
|
+
// Everything before `.gsd/worktrees/` is the project root
|
|
60
|
+
return basePath.slice(0, idx);
|
|
61
|
+
}
|
|
62
|
+
|
|
40
63
|
function tryExec(cmd: string, cwd: string): string | null {
|
|
41
64
|
try {
|
|
42
65
|
return execSync(cmd, {
|
|
@@ -111,6 +134,14 @@ function checkDependenciesInstalled(basePath: string): EnvironmentCheckResult |
|
|
|
111
134
|
|
|
112
135
|
const nodeModules = join(basePath, "node_modules");
|
|
113
136
|
if (!existsSync(nodeModules)) {
|
|
137
|
+
// In auto-worktrees node_modules is absent by design — the worktree
|
|
138
|
+
// symlinks to (or expects) the project root's copy. Fall back to
|
|
139
|
+
// checking the project root before reporting an error (#2303).
|
|
140
|
+
const projectRoot = resolveWorktreeProjectRoot(basePath);
|
|
141
|
+
if (projectRoot && existsSync(join(projectRoot, "node_modules"))) {
|
|
142
|
+
return { name: "dependencies", status: "ok", message: "Dependencies installed (project root)" };
|
|
143
|
+
}
|
|
144
|
+
|
|
114
145
|
return {
|
|
115
146
|
name: "dependencies",
|
|
116
147
|
status: "error",
|