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,16 +1,41 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { join } from "node:path";
|
|
2
|
+
import { join, sep } from "node:path";
|
|
3
3
|
import { createBashTool, createEditTool, createReadTool, createWriteTool } from "@gsd/pi-coding-agent";
|
|
4
4
|
import { DEFAULT_BASH_TIMEOUT_SECS } from "../constants.js";
|
|
5
|
+
/**
|
|
6
|
+
* Resolve the correct DB path for the current working directory.
|
|
7
|
+
* If `basePath` is inside a `.gsd/worktrees/<MID>/` directory, returns
|
|
8
|
+
* the project root's `.gsd/gsd.db` (shared WAL — R012). Otherwise
|
|
9
|
+
* returns `<basePath>/.gsd/gsd.db`.
|
|
10
|
+
*/
|
|
11
|
+
export function resolveProjectRootDbPath(basePath) {
|
|
12
|
+
// Detect worktree: look for `.gsd/worktrees/` in the path segments.
|
|
13
|
+
// A worktree path looks like: /project/root/.gsd/worktrees/M001/...
|
|
14
|
+
// We need to resolve back to /project/root/.gsd/gsd.db
|
|
15
|
+
const marker = `${sep}.gsd${sep}worktrees${sep}`;
|
|
16
|
+
const idx = basePath.indexOf(marker);
|
|
17
|
+
if (idx !== -1) {
|
|
18
|
+
const projectRoot = basePath.slice(0, idx);
|
|
19
|
+
return join(projectRoot, ".gsd", "gsd.db");
|
|
20
|
+
}
|
|
21
|
+
// Also handle forward-slash paths on all platforms
|
|
22
|
+
const fwdMarker = "/.gsd/worktrees/";
|
|
23
|
+
const fwdIdx = basePath.indexOf(fwdMarker);
|
|
24
|
+
if (fwdIdx !== -1) {
|
|
25
|
+
const projectRoot = basePath.slice(0, fwdIdx);
|
|
26
|
+
return join(projectRoot, ".gsd", "gsd.db");
|
|
27
|
+
}
|
|
28
|
+
return join(basePath, ".gsd", "gsd.db");
|
|
29
|
+
}
|
|
5
30
|
export async function ensureDbOpen() {
|
|
6
31
|
try {
|
|
7
32
|
const db = await import("../gsd-db.js");
|
|
8
33
|
if (db.isDbAvailable())
|
|
9
34
|
return true;
|
|
10
35
|
const basePath = process.cwd();
|
|
36
|
+
const dbPath = resolveProjectRootDbPath(basePath);
|
|
11
37
|
const gsdDir = join(basePath, ".gsd");
|
|
12
|
-
|
|
13
|
-
// Open existing DB file
|
|
38
|
+
// Open existing DB file (may be at project root for worktrees)
|
|
14
39
|
if (existsSync(dbPath)) {
|
|
15
40
|
return db.openDatabase(dbPath);
|
|
16
41
|
}
|
|
@@ -24,6 +24,13 @@ export function registerHooks(pi) {
|
|
|
24
24
|
resetWriteGateState();
|
|
25
25
|
resetToolCallLoopGuard();
|
|
26
26
|
await syncServiceTierStatus(ctx);
|
|
27
|
+
// Apply show_token_cost preference (#1515)
|
|
28
|
+
try {
|
|
29
|
+
const { loadEffectiveGSDPreferences } = await import("../preferences.js");
|
|
30
|
+
const prefs = loadEffectiveGSDPreferences();
|
|
31
|
+
process.env.GSD_SHOW_TOKEN_COST = prefs?.preferences.show_token_cost ? "1" : "";
|
|
32
|
+
}
|
|
33
|
+
catch { /* non-fatal */ }
|
|
27
34
|
if (isFirstSession) {
|
|
28
35
|
isFirstSession = false;
|
|
29
36
|
}
|
|
@@ -4,7 +4,7 @@ import { join } from "node:path";
|
|
|
4
4
|
import { loadRegistry } from "../workflow-templates.js";
|
|
5
5
|
import { resolveProjectRoot } from "../worktree.js";
|
|
6
6
|
const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
|
|
7
|
-
export const GSD_COMMAND_DESCRIPTION = "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";
|
|
7
|
+
export const GSD_COMMAND_DESCRIPTION = "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";
|
|
8
8
|
export const TOP_LEVEL_SUBCOMMANDS = [
|
|
9
9
|
{ cmd: "help", desc: "Categorized command reference with descriptions" },
|
|
10
10
|
{ cmd: "next", desc: "Explicit step mode (same as /gsd)" },
|
|
@@ -23,6 +23,8 @@ export const TOP_LEVEL_SUBCOMMANDS = [
|
|
|
23
23
|
{ cmd: "dispatch", desc: "Dispatch a specific phase directly" },
|
|
24
24
|
{ cmd: "history", desc: "View execution history" },
|
|
25
25
|
{ cmd: "undo", desc: "Revert last completed unit" },
|
|
26
|
+
{ cmd: "undo-task", desc: "Reset a specific task's completion state (DB + markdown)" },
|
|
27
|
+
{ cmd: "reset-slice", desc: "Reset a slice and all its tasks (DB + markdown)" },
|
|
26
28
|
{ cmd: "rate", desc: "Rate last unit's model tier (over/ok/under) — improves adaptive routing" },
|
|
27
29
|
{ cmd: "skip", desc: "Prevent a unit from auto-mode dispatch" },
|
|
28
30
|
{ cmd: "export", desc: "Export milestone/slice results" },
|
|
@@ -3,7 +3,7 @@ import { handleConfig } from "../../commands-config.js";
|
|
|
3
3
|
import { handleDoctor, handleCapture, handleKnowledge, handleRunHook, handleSkillHealth, handleSteer, handleTriage, handleUpdate } from "../../commands-handlers.js";
|
|
4
4
|
import { handleInspect } from "../../commands-inspect.js";
|
|
5
5
|
import { handleLogs } from "../../commands-logs.js";
|
|
6
|
-
import { handleCleanupBranches, handleCleanupSnapshots, handleSkip, handleCleanupProjects, handleCleanupWorktrees } from "../../commands-maintenance.js";
|
|
6
|
+
import { handleCleanupBranches, handleCleanupSnapshots, handleSkip, handleCleanupProjects, handleCleanupWorktrees, handleRecover } from "../../commands-maintenance.js";
|
|
7
7
|
import { handleExport } from "../../export.js";
|
|
8
8
|
import { handleHistory } from "../../history.js";
|
|
9
9
|
import { handleUndo } from "../../undo.js";
|
|
@@ -50,6 +50,16 @@ export async function handleOpsCommand(trimmed, ctx, pi) {
|
|
|
50
50
|
await handleHistory(trimmed.replace(/^history\s*/, "").trim(), ctx, projectRoot());
|
|
51
51
|
return true;
|
|
52
52
|
}
|
|
53
|
+
if (trimmed === "undo-task" || trimmed.startsWith("undo-task ")) {
|
|
54
|
+
const { handleUndoTask } = await import("../../undo.js");
|
|
55
|
+
await handleUndoTask(trimmed.replace(/^undo-task\s*/, "").trim(), ctx, pi, projectRoot());
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
if (trimmed === "reset-slice" || trimmed.startsWith("reset-slice ")) {
|
|
59
|
+
const { handleResetSlice } = await import("../../undo.js");
|
|
60
|
+
await handleResetSlice(trimmed.replace(/^reset-slice\s*/, "").trim(), ctx, pi, projectRoot());
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
53
63
|
if (trimmed === "undo" || trimmed.startsWith("undo ")) {
|
|
54
64
|
await handleUndo(trimmed.replace(/^undo\s*/, "").trim(), ctx, pi, projectRoot());
|
|
55
65
|
return true;
|
|
@@ -62,6 +72,10 @@ export async function handleOpsCommand(trimmed, ctx, pi) {
|
|
|
62
72
|
await handleSkip(trimmed.replace(/^skip\s*/, "").trim(), ctx, projectRoot());
|
|
63
73
|
return true;
|
|
64
74
|
}
|
|
75
|
+
if (trimmed === "recover") {
|
|
76
|
+
await handleRecover(ctx, projectRoot());
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
65
79
|
if (trimmed === "export" || trimmed.startsWith("export ")) {
|
|
66
80
|
await handleExport(trimmed.replace(/^export\s*/, "").trim(), ctx, projectRoot());
|
|
67
81
|
return true;
|
|
@@ -62,7 +62,7 @@ export async function handleDoctor(args, ctx, pi) {
|
|
|
62
62
|
scope: effectiveScope,
|
|
63
63
|
includeWarnings: true,
|
|
64
64
|
});
|
|
65
|
-
const actionable = unresolved.filter(issue => issue.severity === "error"
|
|
65
|
+
const actionable = unresolved.filter(issue => issue.severity === "error");
|
|
66
66
|
if (actionable.length === 0) {
|
|
67
67
|
ctx.ui.notify("Doctor heal found nothing actionable to hand off to the LLM.", "info");
|
|
68
68
|
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
|
import { deriveState } from "./state.js";
|
|
7
7
|
import { nativeBranchList, nativeDetectMainBranch, nativeBranchListMerged, nativeBranchDelete, nativeForEachRef, nativeUpdateRef } from "./native-git-bridge.js";
|
|
@@ -40,14 +40,32 @@ export async function handleCleanupBranches(ctx, basePath) {
|
|
|
40
40
|
try {
|
|
41
41
|
const { listWorktrees } = await import("./worktree-manager.js");
|
|
42
42
|
const { resolveMilestoneFile } = await import("./paths.js");
|
|
43
|
-
const { loadFile
|
|
43
|
+
const { loadFile } = await import("./files.js");
|
|
44
|
+
const { parseRoadmap } = await import("./parsers-legacy.js");
|
|
44
45
|
const { isMilestoneComplete } = await import("./state.js");
|
|
46
|
+
const { isDbAvailable, getMilestone } = await import("./gsd-db.js");
|
|
45
47
|
const attachedBranches = new Set(listWorktrees(basePath).map((wt) => wt.branch));
|
|
46
48
|
const milestoneBranches = nativeBranchList(basePath, "milestone/*");
|
|
47
49
|
for (const branch of milestoneBranches) {
|
|
48
50
|
if (attachedBranches.has(branch))
|
|
49
51
|
continue;
|
|
50
52
|
const milestoneId = branch.replace(/^milestone\//, "");
|
|
53
|
+
// DB-first: check milestone status directly
|
|
54
|
+
if (isDbAvailable()) {
|
|
55
|
+
const dbRow = getMilestone(milestoneId);
|
|
56
|
+
if (dbRow) {
|
|
57
|
+
if (dbRow.status !== "complete" && dbRow.status !== "done")
|
|
58
|
+
continue;
|
|
59
|
+
// Milestone is complete per DB — proceed to delete branch
|
|
60
|
+
try {
|
|
61
|
+
nativeBranchDelete(basePath, branch, true);
|
|
62
|
+
deletedStaleMilestones++;
|
|
63
|
+
}
|
|
64
|
+
catch { /* non-fatal */ }
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Filesystem fallback
|
|
51
69
|
const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
52
70
|
if (!roadmapPath)
|
|
53
71
|
continue;
|
|
@@ -408,3 +426,60 @@ export async function handleCleanupProjects(args, ctx) {
|
|
|
408
426
|
}
|
|
409
427
|
ctx.ui.notify(lines.join("\n"), "info");
|
|
410
428
|
}
|
|
429
|
+
/**
|
|
430
|
+
* `gsd recover` — Reconstruct DB hierarchy state from rendered markdown on disk.
|
|
431
|
+
*
|
|
432
|
+
* Deletes milestones, slices, and tasks table rows (preserves decisions,
|
|
433
|
+
* requirements, artifacts, memories), re-runs `migrateHierarchyToDb()` to
|
|
434
|
+
* repopulate from markdown, then calls `deriveState()` to verify sanity.
|
|
435
|
+
*
|
|
436
|
+
* Prints counts of recovered items and the resulting project phase.
|
|
437
|
+
*/
|
|
438
|
+
export async function handleRecover(ctx, basePath) {
|
|
439
|
+
const { isDbAvailable: dbAvailable, _getAdapter, transaction: dbTransaction } = await import("./gsd-db.js");
|
|
440
|
+
const { migrateHierarchyToDb } = await import("./md-importer.js");
|
|
441
|
+
const { invalidateStateCache } = await import("./state.js");
|
|
442
|
+
if (!dbAvailable()) {
|
|
443
|
+
ctx.ui.notify("gsd recover: No database open. Run a GSD command first to initialize the DB.", "error");
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
try {
|
|
447
|
+
// 1. Delete + re-populate inside a single transaction for atomicity
|
|
448
|
+
const db = _getAdapter();
|
|
449
|
+
const counts = dbTransaction(() => {
|
|
450
|
+
db.exec("DELETE FROM tasks");
|
|
451
|
+
db.exec("DELETE FROM slices");
|
|
452
|
+
db.exec("DELETE FROM milestones");
|
|
453
|
+
return migrateHierarchyToDb(basePath);
|
|
454
|
+
});
|
|
455
|
+
// 3. Invalidate state cache so deriveState() picks up fresh DB data
|
|
456
|
+
invalidateStateCache();
|
|
457
|
+
// 4. Derive state to verify sanity
|
|
458
|
+
const state = await deriveState(basePath);
|
|
459
|
+
// 5. Report
|
|
460
|
+
const lines = [
|
|
461
|
+
`gsd recover: reconstructed hierarchy from markdown`,
|
|
462
|
+
` Milestones: ${counts.milestones}`,
|
|
463
|
+
` Slices: ${counts.slices}`,
|
|
464
|
+
` Tasks: ${counts.tasks}`,
|
|
465
|
+
``,
|
|
466
|
+
` Phase: ${state.phase}`,
|
|
467
|
+
];
|
|
468
|
+
if (state.activeMilestone) {
|
|
469
|
+
lines.push(` Active: ${state.activeMilestone.id}: ${state.activeMilestone.title}`);
|
|
470
|
+
}
|
|
471
|
+
if (state.activeSlice) {
|
|
472
|
+
lines.push(` Slice: ${state.activeSlice.id}: ${state.activeSlice.title}`);
|
|
473
|
+
}
|
|
474
|
+
if (state.activeTask) {
|
|
475
|
+
lines.push(` Task: ${state.activeTask.id}: ${state.activeTask.title}`);
|
|
476
|
+
}
|
|
477
|
+
process.stderr.write(`gsd-recover: recovered ${counts.milestones}M/${counts.slices}S/${counts.tasks}T hierarchy\n`);
|
|
478
|
+
ctx.ui.notify(lines.join("\n"), "success");
|
|
479
|
+
}
|
|
480
|
+
catch (err) {
|
|
481
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
482
|
+
process.stderr.write(`gsd-recover: failed: ${msg}\n`);
|
|
483
|
+
ctx.ui.notify(`gsd recover failed: ${msg}`, "error");
|
|
484
|
+
}
|
|
485
|
+
}
|
|
@@ -7,8 +7,9 @@
|
|
|
7
7
|
*/
|
|
8
8
|
import { truncateToWidth, visibleWidth, matchesKey, Key } from "@gsd/pi-tui";
|
|
9
9
|
import { deriveState } from "./state.js";
|
|
10
|
-
import { loadFile
|
|
11
|
-
import {
|
|
10
|
+
import { loadFile } from "./files.js";
|
|
11
|
+
import { isDbAvailable, getMilestoneSlices, getSliceTasks } from "./gsd-db.js";
|
|
12
|
+
import { resolveMilestoneFile } from "./paths.js";
|
|
12
13
|
import { getAutoDashboardData } from "./auto.js";
|
|
13
14
|
import { getLedger, getProjectTotals, aggregateByPhase, aggregateBySlice, aggregateByModel, aggregateCacheHitRate, formatCost, formatTokenCount, formatCostProjection, } from "./metrics.js";
|
|
14
15
|
import { loadEffectiveGSDPreferences } from "./preferences.js";
|
|
@@ -136,38 +137,38 @@ export class GSDDashboardOverlay {
|
|
|
136
137
|
};
|
|
137
138
|
const roadmapFile = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
138
139
|
const roadmapContent = roadmapFile ? await loadFile(roadmapFile) : null;
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
}
|
|
140
|
+
let normSlices = [];
|
|
141
|
+
if (isDbAvailable()) {
|
|
142
|
+
normSlices = getMilestoneSlices(mid).map(s => ({ id: s.id, done: s.status === "complete", title: s.title, risk: s.risk || "medium" }));
|
|
143
|
+
}
|
|
144
|
+
for (const s of normSlices) {
|
|
145
|
+
const sliceView = {
|
|
146
|
+
id: s.id,
|
|
147
|
+
title: s.title,
|
|
148
|
+
done: s.done,
|
|
149
|
+
risk: s.risk,
|
|
150
|
+
active: state.activeSlice?.id === s.id,
|
|
151
|
+
tasks: [],
|
|
152
|
+
};
|
|
153
|
+
if (sliceView.active) {
|
|
154
|
+
// Normalize tasks from DB
|
|
155
|
+
if (isDbAvailable()) {
|
|
156
|
+
const dbTasks = getSliceTasks(mid, s.id);
|
|
157
|
+
sliceView.taskProgress = {
|
|
158
|
+
done: dbTasks.filter(t => t.status === "complete" || t.status === "done").length,
|
|
159
|
+
total: dbTasks.length,
|
|
160
|
+
};
|
|
161
|
+
for (const t of dbTasks) {
|
|
162
|
+
sliceView.tasks.push({
|
|
163
|
+
id: t.id,
|
|
164
|
+
title: t.title,
|
|
165
|
+
done: t.status === "complete" || t.status === "done",
|
|
166
|
+
active: state.activeTask?.id === t.id,
|
|
167
|
+
});
|
|
167
168
|
}
|
|
168
169
|
}
|
|
169
|
-
view.slices.push(sliceView);
|
|
170
170
|
}
|
|
171
|
+
view.slices.push(sliceView);
|
|
171
172
|
}
|
|
172
173
|
this.milestoneData = view;
|
|
173
174
|
return true;
|
|
@@ -8,12 +8,60 @@
|
|
|
8
8
|
// Critical invariant: generated markdown must round-trip through
|
|
9
9
|
// parseDecisionsTable() and parseRequirementsSections() with field fidelity.
|
|
10
10
|
import { resolve } from 'node:path';
|
|
11
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
11
12
|
import { resolveGsdRootFile } from './paths.js';
|
|
12
13
|
import { saveFile } from './files.js';
|
|
13
14
|
import { GSDError, GSD_STALE_STATE, GSD_IO_ERROR } from './errors.js';
|
|
14
15
|
import { invalidateStateCache } from './state.js';
|
|
15
16
|
import { clearPathCache } from './paths.js';
|
|
16
17
|
import { clearParseCache } from './files.js';
|
|
18
|
+
// ─── Freeform Detection ───────────────────────────────────────────────────
|
|
19
|
+
/**
|
|
20
|
+
* Detect whether a DECISIONS.md file is in canonical table format
|
|
21
|
+
* (generated by generateDecisionsMd).
|
|
22
|
+
*
|
|
23
|
+
* Returns true only if the file starts with the canonical header
|
|
24
|
+
* ("# Decisions Register") that generateDecisionsMd produces.
|
|
25
|
+
* Files with freeform content — even if they contain an appended
|
|
26
|
+
* decisions table section — return false so the freeform content
|
|
27
|
+
* is preserved.
|
|
28
|
+
*/
|
|
29
|
+
export function isDecisionsTableFormat(content) {
|
|
30
|
+
// The canonical format always starts with "# Decisions Register"
|
|
31
|
+
const firstLine = content.split('\n')[0]?.trim() ?? '';
|
|
32
|
+
if (firstLine !== '# Decisions Register')
|
|
33
|
+
return false;
|
|
34
|
+
// Additionally verify the file has the canonical table header
|
|
35
|
+
return content.includes('| # | When | Scope | Decision | Choice | Rationale | Revisable?');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Generate a minimal decisions table section (header + rows) for appending
|
|
39
|
+
* to a freeform DECISIONS.md file.
|
|
40
|
+
*/
|
|
41
|
+
function generateDecisionsAppendBlock(decisions) {
|
|
42
|
+
const lines = [];
|
|
43
|
+
lines.push('');
|
|
44
|
+
lines.push('---');
|
|
45
|
+
lines.push('');
|
|
46
|
+
lines.push('## Decisions Table');
|
|
47
|
+
lines.push('');
|
|
48
|
+
lines.push('| # | When | Scope | Decision | Choice | Rationale | Revisable? | Made By |');
|
|
49
|
+
lines.push('|---|------|-------|----------|--------|-----------|------------|---------|');
|
|
50
|
+
for (const d of decisions) {
|
|
51
|
+
const cells = [
|
|
52
|
+
d.id,
|
|
53
|
+
d.when_context,
|
|
54
|
+
d.scope,
|
|
55
|
+
d.decision,
|
|
56
|
+
d.choice,
|
|
57
|
+
d.rationale,
|
|
58
|
+
d.revisable,
|
|
59
|
+
d.made_by ?? 'agent',
|
|
60
|
+
].map(cell => (cell ?? '').replace(/\|/g, '\\|'));
|
|
61
|
+
lines.push(`| ${cells.join(' | ')} |`);
|
|
62
|
+
}
|
|
63
|
+
return lines.join('\n') + '\n';
|
|
64
|
+
}
|
|
17
65
|
// ─── Markdown Generators ──────────────────────────────────────────────────
|
|
18
66
|
/**
|
|
19
67
|
* Generate full DECISIONS.md content from an array of Decision objects.
|
|
@@ -194,9 +242,37 @@ export async function saveDecisionToDb(fields, basePath) {
|
|
|
194
242
|
superseded_by: row['superseded_by'] ?? null,
|
|
195
243
|
}));
|
|
196
244
|
}
|
|
197
|
-
const md = generateDecisionsMd(allDecisions);
|
|
198
245
|
const filePath = resolveGsdRootFile(basePath, 'DECISIONS');
|
|
199
|
-
|
|
246
|
+
// Check if existing DECISIONS.md has freeform (non-table) content.
|
|
247
|
+
// If so, preserve that content and append/update the decisions table
|
|
248
|
+
// at the end instead of overwriting the entire file.
|
|
249
|
+
let existingContent = null;
|
|
250
|
+
if (existsSync(filePath)) {
|
|
251
|
+
existingContent = readFileSync(filePath, 'utf-8');
|
|
252
|
+
}
|
|
253
|
+
let md;
|
|
254
|
+
if (existingContent && !isDecisionsTableFormat(existingContent)) {
|
|
255
|
+
// Freeform content detected — preserve it and append decisions table.
|
|
256
|
+
// Strip any previously appended decisions table section to avoid duplication.
|
|
257
|
+
const marker = '---\n\n## Decisions Table';
|
|
258
|
+
const markerIdx = existingContent.indexOf(marker);
|
|
259
|
+
const freeformPart = markerIdx >= 0
|
|
260
|
+
? existingContent.substring(0, markerIdx).trimEnd()
|
|
261
|
+
: existingContent.trimEnd();
|
|
262
|
+
md = freeformPart + '\n' + generateDecisionsAppendBlock(allDecisions);
|
|
263
|
+
}
|
|
264
|
+
else {
|
|
265
|
+
// Table format or no existing file — full regeneration (original behavior)
|
|
266
|
+
md = generateDecisionsMd(allDecisions);
|
|
267
|
+
}
|
|
268
|
+
try {
|
|
269
|
+
await saveFile(filePath, md);
|
|
270
|
+
}
|
|
271
|
+
catch (diskErr) {
|
|
272
|
+
process.stderr.write(`gsd-db: saveDecisionToDb — disk write failed, rolling back DB row: ${diskErr.message}\n`);
|
|
273
|
+
adapter?.prepare('DELETE FROM decisions WHERE id = :id').run({ ':id': id });
|
|
274
|
+
throw diskErr;
|
|
275
|
+
}
|
|
200
276
|
// Invalidate file-read caches so deriveState() sees the updated markdown.
|
|
201
277
|
// Do NOT clear the artifacts table — we just wrote to it intentionally.
|
|
202
278
|
invalidateStateCache();
|
|
@@ -253,7 +329,14 @@ export async function updateRequirementInDb(id, updates, basePath) {
|
|
|
253
329
|
const nonSuperseded = allRequirements.filter(r => r.superseded_by == null);
|
|
254
330
|
const md = generateRequirementsMd(nonSuperseded);
|
|
255
331
|
const filePath = resolveGsdRootFile(basePath, 'REQUIREMENTS');
|
|
256
|
-
|
|
332
|
+
try {
|
|
333
|
+
await saveFile(filePath, md);
|
|
334
|
+
}
|
|
335
|
+
catch (diskErr) {
|
|
336
|
+
process.stderr.write(`gsd-db: updateRequirementInDb — disk write failed, reverting DB row: ${diskErr.message}\n`);
|
|
337
|
+
db.upsertRequirement(existing);
|
|
338
|
+
throw diskErr;
|
|
339
|
+
}
|
|
257
340
|
// Invalidate file-read caches so deriveState() sees the updated markdown.
|
|
258
341
|
// Do NOT clear the artifacts table — we just wrote to it intentionally.
|
|
259
342
|
invalidateStateCache();
|
|
@@ -287,7 +370,15 @@ export async function saveArtifactToDb(opts, basePath) {
|
|
|
287
370
|
if (!fullPath.startsWith(gsdDir)) {
|
|
288
371
|
throw new GSDError(GSD_IO_ERROR, `saveArtifactToDb: path escapes .gsd/ directory: ${opts.path}`);
|
|
289
372
|
}
|
|
290
|
-
|
|
373
|
+
try {
|
|
374
|
+
await saveFile(fullPath, opts.content);
|
|
375
|
+
}
|
|
376
|
+
catch (diskErr) {
|
|
377
|
+
process.stderr.write(`gsd-db: saveArtifactToDb — disk write failed, rolling back DB row: ${diskErr.message}\n`);
|
|
378
|
+
const rollbackAdapter = db._getAdapter();
|
|
379
|
+
rollbackAdapter?.prepare('DELETE FROM artifacts WHERE path = :path').run({ ':path': opts.path });
|
|
380
|
+
throw diskErr;
|
|
381
|
+
}
|
|
291
382
|
// Invalidate file-read caches so deriveState() sees the updated markdown.
|
|
292
383
|
// Do NOT clear the artifacts table — we just wrote to it intentionally.
|
|
293
384
|
invalidateStateCache();
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// GSD Dispatch Guard — prevents out-of-order slice dispatch
|
|
2
|
-
import { readFileSync } from "node:fs";
|
|
3
2
|
import { resolveMilestoneFile } from "./paths.js";
|
|
4
|
-
import { parseRoadmapSlices } from "./roadmap-slices.js";
|
|
5
3
|
import { findMilestoneIds } from "./guided-flow.js";
|
|
4
|
+
import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
|
|
5
|
+
import { parseRoadmap } from "./parsers-legacy.js";
|
|
6
|
+
import { readFileSync } from "node:fs";
|
|
6
7
|
const SLICE_DISPATCH_TYPES = new Set([
|
|
7
8
|
"research-slice",
|
|
8
9
|
"plan-slice",
|
|
@@ -10,29 +11,6 @@ const SLICE_DISPATCH_TYPES = new Set([
|
|
|
10
11
|
"execute-task",
|
|
11
12
|
"complete-slice",
|
|
12
13
|
]);
|
|
13
|
-
/**
|
|
14
|
-
* Read a roadmap file from disk (working tree) rather than from a git branch.
|
|
15
|
-
*
|
|
16
|
-
* Prior implementation used `git show <branch>:<path>` which read committed
|
|
17
|
-
* state on a specific branch. This caused false-positive blockers when work
|
|
18
|
-
* was committed on a milestone/worktree branch but the integration branch
|
|
19
|
-
* (main) hadn't been updated yet — the guard would see prior slices as
|
|
20
|
-
* incomplete on main even though they were done in the working tree (#530).
|
|
21
|
-
*
|
|
22
|
-
* Reading from disk always reflects the latest state, regardless of which
|
|
23
|
-
* branch is checked out or whether changes have been committed.
|
|
24
|
-
*/
|
|
25
|
-
function readRoadmapFromDisk(base, milestoneId) {
|
|
26
|
-
try {
|
|
27
|
-
const absPath = resolveMilestoneFile(base, milestoneId, "ROADMAP");
|
|
28
|
-
if (!absPath)
|
|
29
|
-
return null;
|
|
30
|
-
return readFileSync(absPath, "utf-8").trim();
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
14
|
export function getPriorSliceCompletionBlocker(base, _mainBranch, unitType, unitId) {
|
|
37
15
|
if (!SLICE_DISPATCH_TYPES.has(unitType))
|
|
38
16
|
return null;
|
|
@@ -51,11 +29,38 @@ export function getPriorSliceCompletionBlocker(base, _mainBranch, unitType, unit
|
|
|
51
29
|
continue;
|
|
52
30
|
if (resolveMilestoneFile(base, mid, "SUMMARY"))
|
|
53
31
|
continue;
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
32
|
+
let slices = null;
|
|
33
|
+
if (isDbAvailable()) {
|
|
34
|
+
const rows = getMilestoneSlices(mid);
|
|
35
|
+
if (rows.length > 0) {
|
|
36
|
+
slices = rows.map((r) => ({
|
|
37
|
+
id: r.id,
|
|
38
|
+
done: r.status === "complete",
|
|
39
|
+
depends: r.depends ?? [],
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (!slices) {
|
|
44
|
+
// File-based fallback: parse roadmap checkboxes
|
|
45
|
+
const roadmapPath = resolveMilestoneFile(base, mid, "ROADMAP");
|
|
46
|
+
if (!roadmapPath)
|
|
47
|
+
continue;
|
|
48
|
+
let roadmapContent;
|
|
49
|
+
try {
|
|
50
|
+
roadmapContent = readFileSync(roadmapPath, "utf-8");
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
const parsed = parseRoadmap(roadmapContent);
|
|
56
|
+
if (parsed.slices.length === 0)
|
|
57
|
+
continue;
|
|
58
|
+
slices = parsed.slices.map((s) => ({
|
|
59
|
+
id: s.id,
|
|
60
|
+
done: s.done,
|
|
61
|
+
depends: s.depends ?? [],
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
59
64
|
if (mid !== targetMid) {
|
|
60
65
|
const incomplete = slices.find((slice) => !slice.done);
|
|
61
66
|
if (incomplete) {
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { existsSync, lstatSync, readdirSync, readFileSync, realpathSync, rmSync, statSync } from "node:fs";
|
|
2
2
|
import { basename, dirname, join, sep } from "node:path";
|
|
3
3
|
import { readRepoMeta, externalProjectsRoot, cleanNumberedGsdVariants } from "./repo-identity.js";
|
|
4
|
-
import { loadFile
|
|
4
|
+
import { loadFile } from "./files.js";
|
|
5
|
+
import { parseRoadmap as parseLegacyRoadmap } from "./parsers-legacy.js";
|
|
6
|
+
import { isDbAvailable, getMilestoneSlices } from "./gsd-db.js";
|
|
5
7
|
import { resolveMilestoneFile, milestonesDir, gsdRoot, resolveGsdRootFile } from "./paths.js";
|
|
6
8
|
import { deriveState, isMilestoneComplete } from "./state.js";
|
|
7
9
|
import { saveFile } from "./files.js";
|
|
@@ -37,12 +39,19 @@ export async function checkGitHealth(basePath, issues, fixesApplied, shouldFix,
|
|
|
37
39
|
// Check if milestone is complete via roadmap
|
|
38
40
|
let isComplete = false;
|
|
39
41
|
if (milestoneEntry) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const roadmap = parseRoadmap(roadmapContent);
|
|
44
|
-
isComplete = isMilestoneComplete(roadmap);
|
|
42
|
+
if (isDbAvailable()) {
|
|
43
|
+
const dbSlices = getMilestoneSlices(milestoneId);
|
|
44
|
+
isComplete = dbSlices.length > 0 && dbSlices.every(s => s.status === "complete");
|
|
45
45
|
}
|
|
46
|
+
else {
|
|
47
|
+
const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
48
|
+
const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
|
|
49
|
+
if (roadmapContent) {
|
|
50
|
+
const roadmap = parseLegacyRoadmap(roadmapContent);
|
|
51
|
+
isComplete = isMilestoneComplete(roadmap);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// When DB unavailable and no roadmap, isComplete stays false
|
|
46
55
|
}
|
|
47
56
|
if (isComplete) {
|
|
48
57
|
issues.push({
|
|
@@ -82,11 +91,19 @@ export async function checkGitHealth(basePath, issues, fixesApplied, shouldFix,
|
|
|
82
91
|
continue;
|
|
83
92
|
const milestoneId = branch.replace(/^milestone\//, "");
|
|
84
93
|
const roadmapPath = resolveMilestoneFile(basePath, milestoneId, "ROADMAP");
|
|
85
|
-
|
|
86
|
-
if (
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
94
|
+
let branchMilestoneComplete = false;
|
|
95
|
+
if (isDbAvailable()) {
|
|
96
|
+
const dbSlices = getMilestoneSlices(milestoneId);
|
|
97
|
+
branchMilestoneComplete = dbSlices.length > 0 && dbSlices.every(s => s.status === "complete");
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const roadmapContent = roadmapPath ? await loadFile(roadmapPath) : null;
|
|
101
|
+
if (!roadmapContent)
|
|
102
|
+
continue;
|
|
103
|
+
const roadmap = parseLegacyRoadmap(roadmapContent);
|
|
104
|
+
branchMilestoneComplete = isMilestoneComplete(roadmap);
|
|
105
|
+
}
|
|
106
|
+
if (branchMilestoneComplete) {
|
|
90
107
|
issues.push({
|
|
91
108
|
severity: "info",
|
|
92
109
|
code: "stale_milestone_branch",
|
|
@@ -19,6 +19,27 @@ const MIN_DISK_BYTES = 500 * 1024 * 1024;
|
|
|
19
19
|
/** Timeout for external commands (ms). */
|
|
20
20
|
const CMD_TIMEOUT = 5_000;
|
|
21
21
|
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
22
|
+
/** Worktree sentinel — path segment that marks an auto-worktree directory. */
|
|
23
|
+
const WORKTREE_PATH_SEGMENT = `${join(".gsd", "worktrees")}/`;
|
|
24
|
+
/**
|
|
25
|
+
* Resolve the project root when running inside a `.gsd/worktrees/<name>/`
|
|
26
|
+
* auto-worktree. Returns `null` if not in a worktree.
|
|
27
|
+
*
|
|
28
|
+
* Detection order:
|
|
29
|
+
* 1. `GSD_WORKTREE` env var (set by the worktree launcher)
|
|
30
|
+
* 2. `.gsd/worktrees/` segment in basePath
|
|
31
|
+
*/
|
|
32
|
+
function resolveWorktreeProjectRoot(basePath) {
|
|
33
|
+
const envRoot = process.env.GSD_WORKTREE;
|
|
34
|
+
if (envRoot)
|
|
35
|
+
return envRoot;
|
|
36
|
+
const normalised = basePath.replace(/\\/g, "/");
|
|
37
|
+
const idx = normalised.indexOf(WORKTREE_PATH_SEGMENT.replace(/\\/g, "/"));
|
|
38
|
+
if (idx === -1)
|
|
39
|
+
return null;
|
|
40
|
+
// Everything before `.gsd/worktrees/` is the project root
|
|
41
|
+
return basePath.slice(0, idx);
|
|
42
|
+
}
|
|
22
43
|
function tryExec(cmd, cwd) {
|
|
23
44
|
try {
|
|
24
45
|
return execSync(cmd, {
|
|
@@ -87,6 +108,13 @@ function checkDependenciesInstalled(basePath) {
|
|
|
87
108
|
return null;
|
|
88
109
|
const nodeModules = join(basePath, "node_modules");
|
|
89
110
|
if (!existsSync(nodeModules)) {
|
|
111
|
+
// In auto-worktrees node_modules is absent by design — the worktree
|
|
112
|
+
// symlinks to (or expects) the project root's copy. Fall back to
|
|
113
|
+
// checking the project root before reporting an error (#2303).
|
|
114
|
+
const projectRoot = resolveWorktreeProjectRoot(basePath);
|
|
115
|
+
if (projectRoot && existsSync(join(projectRoot, "node_modules"))) {
|
|
116
|
+
return { name: "dependencies", status: "ok", message: "Dependencies installed (project root)" };
|
|
117
|
+
}
|
|
90
118
|
return {
|
|
91
119
|
name: "dependencies",
|
|
92
120
|
status: "error",
|