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
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
// gsd-recover.test.ts — Tests for the `gsd recover` recovery logic.
|
|
2
|
+
// Verifies: populate DB → clear hierarchy → recover from markdown → state matches.
|
|
3
|
+
|
|
4
|
+
import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { tmpdir } from 'node:os';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
openDatabase,
|
|
10
|
+
closeDatabase,
|
|
11
|
+
transaction,
|
|
12
|
+
getAllMilestones,
|
|
13
|
+
getMilestoneSlices,
|
|
14
|
+
getSliceTasks,
|
|
15
|
+
_getAdapter,
|
|
16
|
+
insertMilestone,
|
|
17
|
+
insertSlice,
|
|
18
|
+
insertTask,
|
|
19
|
+
getMilestone,
|
|
20
|
+
getSlice,
|
|
21
|
+
getTask,
|
|
22
|
+
} from '../gsd-db.ts';
|
|
23
|
+
import { migrateHierarchyToDb } from '../md-importer.ts';
|
|
24
|
+
import { deriveStateFromDb, invalidateStateCache } from '../state.ts';
|
|
25
|
+
import { createTestContext } from './test-helpers.ts';
|
|
26
|
+
|
|
27
|
+
const { assertEq, assertTrue, report } = createTestContext();
|
|
28
|
+
|
|
29
|
+
// ─── Fixture Helpers ───────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
function createFixtureBase(): string {
|
|
32
|
+
const base = mkdtempSync(join(tmpdir(), 'gsd-recover-'));
|
|
33
|
+
mkdirSync(join(base, '.gsd', 'milestones'), { recursive: true });
|
|
34
|
+
return base;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function writeFile(base: string, relativePath: string, content: string): void {
|
|
38
|
+
const full = join(base, '.gsd', relativePath);
|
|
39
|
+
mkdirSync(join(full, '..'), { recursive: true });
|
|
40
|
+
writeFileSync(full, content);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function cleanup(base: string): void {
|
|
44
|
+
rmSync(base, { recursive: true, force: true });
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// ─── Fixture Content ──────────────────────────────────────────────────────
|
|
48
|
+
|
|
49
|
+
const ROADMAP_M001 = `# M001: Recovery Test
|
|
50
|
+
|
|
51
|
+
**Vision:** Test recovery round-trip.
|
|
52
|
+
|
|
53
|
+
## Success Criteria
|
|
54
|
+
|
|
55
|
+
- All recovery tests pass
|
|
56
|
+
- State matches after round-trip
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
## Slices
|
|
60
|
+
|
|
61
|
+
- [x] **S01: Setup** \`risk:low\` \`depends:[]\`
|
|
62
|
+
> After this: Setup complete.
|
|
63
|
+
|
|
64
|
+
- [ ] **S02: Core** \`risk:medium\` \`depends:[S01]\`
|
|
65
|
+
> After this: Core done.
|
|
66
|
+
|
|
67
|
+
## Boundary Map
|
|
68
|
+
|
|
69
|
+
| From | To | Produces | Consumes |
|
|
70
|
+
|------|-----|----------|----------|
|
|
71
|
+
| S01 | S02 | setup artifacts | setup artifacts |
|
|
72
|
+
`;
|
|
73
|
+
|
|
74
|
+
const PLAN_S01_COMPLETE = `---
|
|
75
|
+
estimated_steps: 2
|
|
76
|
+
estimated_files: 1
|
|
77
|
+
skills_used: []
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
# S01: Setup
|
|
81
|
+
|
|
82
|
+
**Goal:** Setup fixtures.
|
|
83
|
+
**Demo:** Tasks done.
|
|
84
|
+
|
|
85
|
+
## Tasks
|
|
86
|
+
|
|
87
|
+
- [x] **T01: Init** \`est:15m\`
|
|
88
|
+
Initialize things.
|
|
89
|
+
- Files: \`init.ts\`, \`config.ts\`
|
|
90
|
+
- Verify: \`node test-init.ts\`
|
|
91
|
+
|
|
92
|
+
- [x] **T02: Config** \`est:10m\`
|
|
93
|
+
Configure things.
|
|
94
|
+
- Files: \`settings.ts\`
|
|
95
|
+
- Verify: \`node test-config.ts\`
|
|
96
|
+
`;
|
|
97
|
+
|
|
98
|
+
const PLAN_S02_PARTIAL = `---
|
|
99
|
+
estimated_steps: 1
|
|
100
|
+
estimated_files: 1
|
|
101
|
+
skills_used: []
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
# S02: Core
|
|
105
|
+
|
|
106
|
+
**Goal:** Build core.
|
|
107
|
+
**Demo:** Core works.
|
|
108
|
+
|
|
109
|
+
## Tasks
|
|
110
|
+
|
|
111
|
+
- [x] **T01: Build** \`est:30m\`
|
|
112
|
+
Build it.
|
|
113
|
+
- Files: \`core.ts\`
|
|
114
|
+
- Verify: \`node test-build.ts\`
|
|
115
|
+
|
|
116
|
+
- [ ] **T02: Test** \`est:20m\`
|
|
117
|
+
Test it.
|
|
118
|
+
- Files: \`test-core.ts\`, \`helpers.ts\`
|
|
119
|
+
- Verify: \`npm test\`
|
|
120
|
+
|
|
121
|
+
- [ ] **T03: Polish** \`est:15m\`
|
|
122
|
+
Polish it.
|
|
123
|
+
- Files: \`polish.ts\`
|
|
124
|
+
- Verify: \`node test-polish.ts\`
|
|
125
|
+
`;
|
|
126
|
+
|
|
127
|
+
const SUMMARY_S01 = `---
|
|
128
|
+
id: S01
|
|
129
|
+
parent: M001
|
|
130
|
+
milestone: M001
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
# S01: Setup — Summary
|
|
134
|
+
|
|
135
|
+
Setup is complete.
|
|
136
|
+
`;
|
|
137
|
+
|
|
138
|
+
// ─── Recovery helpers (mirrors gsd recover handler logic) ─────────────────
|
|
139
|
+
|
|
140
|
+
function clearHierarchyTables(): void {
|
|
141
|
+
const db = _getAdapter()!;
|
|
142
|
+
transaction(() => {
|
|
143
|
+
db.exec("DELETE FROM tasks");
|
|
144
|
+
db.exec("DELETE FROM slices");
|
|
145
|
+
db.exec("DELETE FROM milestones");
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// ─── Tests ────────────────────────────────────────────────────────────────
|
|
150
|
+
|
|
151
|
+
async function main() {
|
|
152
|
+
// ─── Test (a): Full recovery round-trip ─────────────────────────────────
|
|
153
|
+
console.log('\n=== recover: full round-trip (populate → clear → recover → verify) ===');
|
|
154
|
+
{
|
|
155
|
+
const base = createFixtureBase();
|
|
156
|
+
try {
|
|
157
|
+
// Set up markdown fixtures
|
|
158
|
+
writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_M001);
|
|
159
|
+
writeFile(base, 'milestones/M001/slices/S01/S01-PLAN.md', PLAN_S01_COMPLETE);
|
|
160
|
+
writeFile(base, 'milestones/M001/slices/S01/S01-SUMMARY.md', SUMMARY_S01);
|
|
161
|
+
writeFile(base, 'milestones/M001/slices/S02/S02-PLAN.md', PLAN_S02_PARTIAL);
|
|
162
|
+
|
|
163
|
+
// Step 1: Open DB and populate from markdown
|
|
164
|
+
openDatabase(':memory:');
|
|
165
|
+
const counts1 = migrateHierarchyToDb(base);
|
|
166
|
+
assertEq(counts1.milestones, 1, 'round-trip: initial migration — 1 milestone');
|
|
167
|
+
assertEq(counts1.slices, 2, 'round-trip: initial migration — 2 slices');
|
|
168
|
+
assertTrue(counts1.tasks >= 5, 'round-trip: initial migration — at least 5 tasks');
|
|
169
|
+
|
|
170
|
+
// Step 2: Capture state from DB before clearing
|
|
171
|
+
invalidateStateCache();
|
|
172
|
+
const stateBefore = await deriveStateFromDb(base);
|
|
173
|
+
assertTrue(stateBefore.activeMilestone !== null, 'round-trip: state before has active milestone');
|
|
174
|
+
const milestonesBefore = getAllMilestones();
|
|
175
|
+
const slicesBefore = getMilestoneSlices('M001');
|
|
176
|
+
const s01TasksBefore = getSliceTasks('M001', 'S01');
|
|
177
|
+
const s02TasksBefore = getSliceTasks('M001', 'S02');
|
|
178
|
+
|
|
179
|
+
// Step 3: Clear hierarchy tables
|
|
180
|
+
clearHierarchyTables();
|
|
181
|
+
const milestonesAfterClear = getAllMilestones();
|
|
182
|
+
assertEq(milestonesAfterClear.length, 0, 'round-trip: milestones cleared');
|
|
183
|
+
|
|
184
|
+
// Step 4: Recover from markdown
|
|
185
|
+
const counts2 = migrateHierarchyToDb(base);
|
|
186
|
+
assertEq(counts2.milestones, counts1.milestones, 'round-trip: recovery milestone count matches');
|
|
187
|
+
assertEq(counts2.slices, counts1.slices, 'round-trip: recovery slice count matches');
|
|
188
|
+
assertEq(counts2.tasks, counts1.tasks, 'round-trip: recovery task count matches');
|
|
189
|
+
|
|
190
|
+
// Step 5: Verify state matches
|
|
191
|
+
invalidateStateCache();
|
|
192
|
+
const stateAfter = await deriveStateFromDb(base);
|
|
193
|
+
|
|
194
|
+
assertEq(stateAfter.phase, stateBefore.phase, 'round-trip: phase matches');
|
|
195
|
+
assertEq(
|
|
196
|
+
stateAfter.activeMilestone?.id,
|
|
197
|
+
stateBefore.activeMilestone?.id,
|
|
198
|
+
'round-trip: active milestone ID matches',
|
|
199
|
+
);
|
|
200
|
+
assertEq(
|
|
201
|
+
stateAfter.activeSlice?.id,
|
|
202
|
+
stateBefore.activeSlice?.id,
|
|
203
|
+
'round-trip: active slice ID matches',
|
|
204
|
+
);
|
|
205
|
+
assertEq(
|
|
206
|
+
stateAfter.activeTask?.id,
|
|
207
|
+
stateBefore.activeTask?.id,
|
|
208
|
+
'round-trip: active task ID matches',
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
// Verify row-level data matches
|
|
212
|
+
const milestonesAfter = getAllMilestones();
|
|
213
|
+
assertEq(milestonesAfter.length, milestonesBefore.length, 'round-trip: milestone row count');
|
|
214
|
+
assertEq(milestonesAfter[0]?.id, milestonesBefore[0]?.id, 'round-trip: milestone ID');
|
|
215
|
+
assertEq(milestonesAfter[0]?.title, milestonesBefore[0]?.title, 'round-trip: milestone title');
|
|
216
|
+
|
|
217
|
+
const slicesAfter = getMilestoneSlices('M001');
|
|
218
|
+
assertEq(slicesAfter.length, slicesBefore.length, 'round-trip: slice row count');
|
|
219
|
+
assertEq(slicesAfter[0]?.id, slicesBefore[0]?.id, 'round-trip: S01 ID');
|
|
220
|
+
assertEq(slicesAfter[0]?.status, slicesBefore[0]?.status, 'round-trip: S01 status');
|
|
221
|
+
assertEq(slicesAfter[1]?.id, slicesBefore[1]?.id, 'round-trip: S02 ID');
|
|
222
|
+
|
|
223
|
+
const s01TasksAfter = getSliceTasks('M001', 'S01');
|
|
224
|
+
assertEq(s01TasksAfter.length, s01TasksBefore.length, 'round-trip: S01 task count');
|
|
225
|
+
|
|
226
|
+
const s02TasksAfter = getSliceTasks('M001', 'S02');
|
|
227
|
+
assertEq(s02TasksAfter.length, s02TasksBefore.length, 'round-trip: S02 task count');
|
|
228
|
+
|
|
229
|
+
closeDatabase();
|
|
230
|
+
} finally {
|
|
231
|
+
closeDatabase();
|
|
232
|
+
cleanup(base);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// ─── Test (a2): v8 planning columns populated after recovery ───────────
|
|
237
|
+
console.log('\n=== recover: v8 planning columns populated ===');
|
|
238
|
+
{
|
|
239
|
+
const base = createFixtureBase();
|
|
240
|
+
try {
|
|
241
|
+
writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_M001);
|
|
242
|
+
writeFile(base, 'milestones/M001/slices/S01/S01-PLAN.md', PLAN_S01_COMPLETE);
|
|
243
|
+
writeFile(base, 'milestones/M001/slices/S01/S01-SUMMARY.md', SUMMARY_S01);
|
|
244
|
+
writeFile(base, 'milestones/M001/slices/S02/S02-PLAN.md', PLAN_S02_PARTIAL);
|
|
245
|
+
|
|
246
|
+
openDatabase(':memory:');
|
|
247
|
+
migrateHierarchyToDb(base);
|
|
248
|
+
|
|
249
|
+
// Milestone planning columns
|
|
250
|
+
const milestone = getMilestone('M001');
|
|
251
|
+
assertTrue(milestone !== null, 'v8: milestone exists');
|
|
252
|
+
assertEq(milestone!.vision, 'Test recovery round-trip.', 'v8: milestone vision populated');
|
|
253
|
+
assertTrue(milestone!.success_criteria.length >= 2, 'v8: milestone success_criteria has entries');
|
|
254
|
+
assertEq(milestone!.success_criteria[0], 'All recovery tests pass', 'v8: first success criterion');
|
|
255
|
+
assertTrue(milestone!.boundary_map_markdown.includes('Boundary Map'), 'v8: boundary_map_markdown populated');
|
|
256
|
+
assertTrue(milestone!.boundary_map_markdown.includes('S01'), 'v8: boundary_map_markdown has S01');
|
|
257
|
+
|
|
258
|
+
// Tool-only fields left empty per D004
|
|
259
|
+
assertEq(milestone!.key_risks.length, 0, 'v8: key_risks left empty (tool-only per D004)');
|
|
260
|
+
assertEq(milestone!.requirement_coverage, '', 'v8: requirement_coverage left empty (tool-only per D004)');
|
|
261
|
+
|
|
262
|
+
// Slice planning columns
|
|
263
|
+
const sliceS01 = getSlice('M001', 'S01');
|
|
264
|
+
assertTrue(sliceS01 !== null, 'v8: slice S01 exists');
|
|
265
|
+
assertEq(sliceS01!.goal, 'Setup fixtures.', 'v8: S01 goal populated');
|
|
266
|
+
|
|
267
|
+
const sliceS02 = getSlice('M001', 'S02');
|
|
268
|
+
assertTrue(sliceS02 !== null, 'v8: slice S02 exists');
|
|
269
|
+
assertEq(sliceS02!.goal, 'Build core.', 'v8: S02 goal populated');
|
|
270
|
+
|
|
271
|
+
// Slice tool-only fields left empty per D004
|
|
272
|
+
assertEq(sliceS01!.proof_level, '', 'v8: S01 proof_level left empty (tool-only per D004)');
|
|
273
|
+
|
|
274
|
+
// Task planning columns — S01/T01
|
|
275
|
+
const taskS01T01 = getTask('M001', 'S01', 'T01');
|
|
276
|
+
assertTrue(taskS01T01 !== null, 'v8: task S01/T01 exists');
|
|
277
|
+
assertTrue(taskS01T01!.files.length >= 2, 'v8: S01/T01 files populated');
|
|
278
|
+
assertTrue(taskS01T01!.files.includes('init.ts'), 'v8: S01/T01 files includes init.ts');
|
|
279
|
+
assertTrue(taskS01T01!.files.includes('config.ts'), 'v8: S01/T01 files includes config.ts');
|
|
280
|
+
assertEq(taskS01T01!.verify, '`node test-init.ts`', 'v8: S01/T01 verify populated');
|
|
281
|
+
|
|
282
|
+
// Task planning columns — S02/T02
|
|
283
|
+
const taskS02T02 = getTask('M001', 'S02', 'T02');
|
|
284
|
+
assertTrue(taskS02T02 !== null, 'v8: task S02/T02 exists');
|
|
285
|
+
assertTrue(taskS02T02!.files.length >= 2, 'v8: S02/T02 files populated');
|
|
286
|
+
assertTrue(taskS02T02!.files.includes('test-core.ts'), 'v8: S02/T02 files includes test-core.ts');
|
|
287
|
+
assertEq(taskS02T02!.verify, '`npm test`', 'v8: S02/T02 verify populated');
|
|
288
|
+
|
|
289
|
+
// Task with no Files/Verify — not applicable since all fixtures now have them,
|
|
290
|
+
// but confirm a task from S02 has correct data
|
|
291
|
+
const taskS02T03 = getTask('M001', 'S02', 'T03');
|
|
292
|
+
assertTrue(taskS02T03 !== null, 'v8: task S02/T03 exists');
|
|
293
|
+
assertTrue(taskS02T03!.files.includes('polish.ts'), 'v8: S02/T03 files includes polish.ts');
|
|
294
|
+
assertEq(taskS02T03!.verify, '`node test-polish.ts`', 'v8: S02/T03 verify populated');
|
|
295
|
+
|
|
296
|
+
// Diagnostic: v8 planning columns queryable via SQL
|
|
297
|
+
const db = _getAdapter()!;
|
|
298
|
+
const milestoneRow = db.prepare("SELECT vision, success_criteria, boundary_map_markdown FROM milestones WHERE id = 'M001'").get() as any;
|
|
299
|
+
assertTrue(milestoneRow.vision.length > 0, 'v8-diag: vision column queryable');
|
|
300
|
+
assertTrue(milestoneRow.boundary_map_markdown.length > 0, 'v8-diag: boundary_map_markdown column queryable');
|
|
301
|
+
|
|
302
|
+
const sliceRow = db.prepare("SELECT goal FROM slices WHERE milestone_id = 'M001' AND id = 'S01'").get() as any;
|
|
303
|
+
assertTrue(sliceRow.goal.length > 0, 'v8-diag: goal column queryable');
|
|
304
|
+
|
|
305
|
+
const taskRow = db.prepare("SELECT files, verify FROM tasks WHERE milestone_id = 'M001' AND slice_id = 'S01' AND id = 'T01'").get() as any;
|
|
306
|
+
assertTrue(taskRow.files.length > 2, 'v8-diag: files column queryable (JSON array)');
|
|
307
|
+
assertTrue(taskRow.verify.length > 0, 'v8-diag: verify column queryable');
|
|
308
|
+
|
|
309
|
+
closeDatabase();
|
|
310
|
+
} finally {
|
|
311
|
+
closeDatabase();
|
|
312
|
+
cleanup(base);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
// ─── Test (b): Idempotent recovery — double recover ────────────────────
|
|
318
|
+
console.log('\n=== recover: idempotent — double recovery produces same state ===');
|
|
319
|
+
{
|
|
320
|
+
const base = createFixtureBase();
|
|
321
|
+
try {
|
|
322
|
+
writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_M001);
|
|
323
|
+
writeFile(base, 'milestones/M001/slices/S01/S01-PLAN.md', PLAN_S01_COMPLETE);
|
|
324
|
+
writeFile(base, 'milestones/M001/slices/S01/S01-SUMMARY.md', SUMMARY_S01);
|
|
325
|
+
writeFile(base, 'milestones/M001/slices/S02/S02-PLAN.md', PLAN_S02_PARTIAL);
|
|
326
|
+
|
|
327
|
+
openDatabase(':memory:');
|
|
328
|
+
|
|
329
|
+
// First recovery
|
|
330
|
+
migrateHierarchyToDb(base);
|
|
331
|
+
invalidateStateCache();
|
|
332
|
+
const state1 = await deriveStateFromDb(base);
|
|
333
|
+
|
|
334
|
+
// Clear and recover again
|
|
335
|
+
clearHierarchyTables();
|
|
336
|
+
migrateHierarchyToDb(base);
|
|
337
|
+
invalidateStateCache();
|
|
338
|
+
const state2 = await deriveStateFromDb(base);
|
|
339
|
+
|
|
340
|
+
assertEq(state2.phase, state1.phase, 'idempotent: phase matches');
|
|
341
|
+
assertEq(
|
|
342
|
+
state2.activeMilestone?.id,
|
|
343
|
+
state1.activeMilestone?.id,
|
|
344
|
+
'idempotent: active milestone matches',
|
|
345
|
+
);
|
|
346
|
+
assertEq(
|
|
347
|
+
state2.activeSlice?.id,
|
|
348
|
+
state1.activeSlice?.id,
|
|
349
|
+
'idempotent: active slice matches',
|
|
350
|
+
);
|
|
351
|
+
assertEq(
|
|
352
|
+
state2.activeTask?.id,
|
|
353
|
+
state1.activeTask?.id,
|
|
354
|
+
'idempotent: active task matches',
|
|
355
|
+
);
|
|
356
|
+
|
|
357
|
+
closeDatabase();
|
|
358
|
+
} finally {
|
|
359
|
+
closeDatabase();
|
|
360
|
+
cleanup(base);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// ─── Test (c): Recovery preserves non-hierarchy data ───────────────────
|
|
365
|
+
console.log('\n=== recover: preserves decisions/requirements ===');
|
|
366
|
+
{
|
|
367
|
+
const base = createFixtureBase();
|
|
368
|
+
try {
|
|
369
|
+
writeFile(base, 'milestones/M001/M001-ROADMAP.md', ROADMAP_M001);
|
|
370
|
+
writeFile(base, 'milestones/M001/slices/S01/S01-PLAN.md', PLAN_S01_COMPLETE);
|
|
371
|
+
|
|
372
|
+
openDatabase(':memory:');
|
|
373
|
+
migrateHierarchyToDb(base);
|
|
374
|
+
|
|
375
|
+
// Insert a decision and requirement manually
|
|
376
|
+
const db = _getAdapter()!;
|
|
377
|
+
db.prepare(
|
|
378
|
+
`INSERT INTO decisions (id, when_context, scope, decision, choice, rationale, revisable)
|
|
379
|
+
VALUES (:id, :when, :scope, :decision, :choice, :rationale, :revisable)`,
|
|
380
|
+
).run({
|
|
381
|
+
':id': 'D001',
|
|
382
|
+
':when': 'T03',
|
|
383
|
+
':scope': 'architecture',
|
|
384
|
+
':decision': 'Use shared WAL',
|
|
385
|
+
':choice': 'Single DB',
|
|
386
|
+
':rationale': 'Simpler',
|
|
387
|
+
':revisable': 'Yes',
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
db.prepare(
|
|
391
|
+
`INSERT INTO requirements (id, class, status, description)
|
|
392
|
+
VALUES (:id, :class, :status, :desc)`,
|
|
393
|
+
).run({
|
|
394
|
+
':id': 'R001',
|
|
395
|
+
':class': 'functional',
|
|
396
|
+
':status': 'active',
|
|
397
|
+
':desc': 'Recovery works',
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
// Clear hierarchy only
|
|
401
|
+
clearHierarchyTables();
|
|
402
|
+
|
|
403
|
+
// Verify decisions and requirements survived
|
|
404
|
+
const decisions = db.prepare('SELECT * FROM decisions').all();
|
|
405
|
+
assertEq(decisions.length, 1, 'preserve: decision survives clear');
|
|
406
|
+
assertEq((decisions[0] as any).id, 'D001', 'preserve: decision ID intact');
|
|
407
|
+
|
|
408
|
+
const requirements = db.prepare('SELECT * FROM requirements').all();
|
|
409
|
+
assertEq(requirements.length, 1, 'preserve: requirement survives clear');
|
|
410
|
+
assertEq((requirements[0] as any).id, 'R001', 'preserve: requirement ID intact');
|
|
411
|
+
|
|
412
|
+
// Recover hierarchy
|
|
413
|
+
migrateHierarchyToDb(base);
|
|
414
|
+
const milestones = getAllMilestones();
|
|
415
|
+
assertTrue(milestones.length > 0, 'preserve: milestones recovered after clear');
|
|
416
|
+
|
|
417
|
+
// Verify non-hierarchy data still intact after recovery
|
|
418
|
+
const decisionsAfter = db.prepare('SELECT * FROM decisions').all();
|
|
419
|
+
assertEq(decisionsAfter.length, 1, 'preserve: decision still present after recovery');
|
|
420
|
+
|
|
421
|
+
closeDatabase();
|
|
422
|
+
} finally {
|
|
423
|
+
closeDatabase();
|
|
424
|
+
cleanup(base);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// ─── Test (d): Recovery from empty markdown dir ────────────────────────
|
|
429
|
+
console.log('\n=== recover: empty milestones dir ===');
|
|
430
|
+
{
|
|
431
|
+
const base = createFixtureBase();
|
|
432
|
+
try {
|
|
433
|
+
// No milestones written — just the empty dir
|
|
434
|
+
openDatabase(':memory:');
|
|
435
|
+
|
|
436
|
+
// Pre-populate to simulate existing state
|
|
437
|
+
insertMilestone({ id: 'M001', title: 'Ghost', status: 'active' });
|
|
438
|
+
|
|
439
|
+
// Clear and recover from empty
|
|
440
|
+
clearHierarchyTables();
|
|
441
|
+
const counts = migrateHierarchyToDb(base);
|
|
442
|
+
assertEq(counts.milestones, 0, 'empty: zero milestones recovered');
|
|
443
|
+
assertEq(counts.slices, 0, 'empty: zero slices recovered');
|
|
444
|
+
assertEq(counts.tasks, 0, 'empty: zero tasks recovered');
|
|
445
|
+
|
|
446
|
+
const all = getAllMilestones();
|
|
447
|
+
assertEq(all.length, 0, 'empty: no milestones in DB after recovery');
|
|
448
|
+
|
|
449
|
+
closeDatabase();
|
|
450
|
+
} finally {
|
|
451
|
+
closeDatabase();
|
|
452
|
+
cleanup(base);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
report();
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
main().catch((error) => {
|
|
460
|
+
console.error(error);
|
|
461
|
+
process.exit(1);
|
|
462
|
+
});
|
|
@@ -5,7 +5,6 @@ import { execSync } from "node:child_process";
|
|
|
5
5
|
import {
|
|
6
6
|
resolveExpectedArtifactPath,
|
|
7
7
|
writeBlockerPlaceholder,
|
|
8
|
-
skipExecuteTask,
|
|
9
8
|
verifyExpectedArtifact,
|
|
10
9
|
buildLoopRemediationSteps,
|
|
11
10
|
} from "../auto.ts";
|
|
@@ -157,129 +156,6 @@ function cleanup(base: string): void {
|
|
|
157
156
|
}
|
|
158
157
|
}
|
|
159
158
|
|
|
160
|
-
// ═══ skipExecuteTask ═════════════════════════════════════════════════════════
|
|
161
|
-
|
|
162
|
-
{
|
|
163
|
-
console.log("\n=== skipExecuteTask: writes summary and checks plan checkbox ===");
|
|
164
|
-
const base = createFixtureBase();
|
|
165
|
-
try {
|
|
166
|
-
const planPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md");
|
|
167
|
-
writeFileSync(planPath, [
|
|
168
|
-
"# S01: Test Slice",
|
|
169
|
-
"",
|
|
170
|
-
"## Tasks",
|
|
171
|
-
"",
|
|
172
|
-
"- [ ] **T01: First task** `est:10m`",
|
|
173
|
-
" Do the first thing.",
|
|
174
|
-
"- [ ] **T02: Second task** `est:15m`",
|
|
175
|
-
" Do the second thing.",
|
|
176
|
-
].join("\n"), "utf-8");
|
|
177
|
-
|
|
178
|
-
const result = skipExecuteTask(
|
|
179
|
-
base, "M001", "S01", "T01",
|
|
180
|
-
{ summaryExists: false, taskChecked: false },
|
|
181
|
-
"idle", 2,
|
|
182
|
-
);
|
|
183
|
-
|
|
184
|
-
assertTrue(result === true, "should return true");
|
|
185
|
-
|
|
186
|
-
// Check summary was written
|
|
187
|
-
const summaryPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks", "T01-SUMMARY.md");
|
|
188
|
-
assertTrue(existsSync(summaryPath), "task summary should exist");
|
|
189
|
-
const summaryContent = readFileSync(summaryPath, "utf-8");
|
|
190
|
-
assertTrue(summaryContent.includes("BLOCKER"), "summary should contain BLOCKER");
|
|
191
|
-
assertTrue(summaryContent.includes("T01"), "summary should mention task ID");
|
|
192
|
-
|
|
193
|
-
// Check plan checkbox was marked
|
|
194
|
-
const planContent = readFileSync(planPath, "utf-8");
|
|
195
|
-
assertTrue(planContent.includes("- [x] **T01:"), "T01 should be checked");
|
|
196
|
-
assertTrue(planContent.includes("- [ ] **T02:"), "T02 should remain unchecked");
|
|
197
|
-
} finally {
|
|
198
|
-
cleanup(base);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
{
|
|
203
|
-
console.log("\n=== skipExecuteTask: skips summary if already exists ===");
|
|
204
|
-
const base = createFixtureBase();
|
|
205
|
-
try {
|
|
206
|
-
const planPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md");
|
|
207
|
-
writeFileSync(planPath, "- [ ] **T01: Task** `est:10m`\n", "utf-8");
|
|
208
|
-
|
|
209
|
-
// Pre-write a summary
|
|
210
|
-
const summaryPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks", "T01-SUMMARY.md");
|
|
211
|
-
writeFileSync(summaryPath, "# Real summary\nActual work done.", "utf-8");
|
|
212
|
-
|
|
213
|
-
const result = skipExecuteTask(
|
|
214
|
-
base, "M001", "S01", "T01",
|
|
215
|
-
{ summaryExists: true, taskChecked: false },
|
|
216
|
-
"idle", 2,
|
|
217
|
-
);
|
|
218
|
-
|
|
219
|
-
assertTrue(result === true, "should return true");
|
|
220
|
-
|
|
221
|
-
// Summary should be untouched (not overwritten with blocker)
|
|
222
|
-
const content = readFileSync(summaryPath, "utf-8");
|
|
223
|
-
assertTrue(content.includes("Real summary"), "original summary should be preserved");
|
|
224
|
-
assertTrue(!content.includes("BLOCKER"), "should not contain BLOCKER");
|
|
225
|
-
|
|
226
|
-
// Plan checkbox should still be marked
|
|
227
|
-
const planContent = readFileSync(planPath, "utf-8");
|
|
228
|
-
assertTrue(planContent.includes("- [x] **T01:"), "T01 should be checked");
|
|
229
|
-
} finally {
|
|
230
|
-
cleanup(base);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
{
|
|
235
|
-
console.log("\n=== skipExecuteTask: skips checkbox if already checked ===");
|
|
236
|
-
const base = createFixtureBase();
|
|
237
|
-
try {
|
|
238
|
-
const planPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md");
|
|
239
|
-
writeFileSync(planPath, "- [x] **T01: Task** `est:10m`\n", "utf-8");
|
|
240
|
-
|
|
241
|
-
const result = skipExecuteTask(
|
|
242
|
-
base, "M001", "S01", "T01",
|
|
243
|
-
{ summaryExists: false, taskChecked: true },
|
|
244
|
-
"idle", 2,
|
|
245
|
-
);
|
|
246
|
-
|
|
247
|
-
assertTrue(result === true, "should return true");
|
|
248
|
-
|
|
249
|
-
// Summary should be written (since summaryExists was false)
|
|
250
|
-
const summaryPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks", "T01-SUMMARY.md");
|
|
251
|
-
assertTrue(existsSync(summaryPath), "task summary should exist");
|
|
252
|
-
|
|
253
|
-
// Plan checkbox should be untouched
|
|
254
|
-
const planContent = readFileSync(planPath, "utf-8");
|
|
255
|
-
assertTrue(planContent.includes("- [x] **T01:"), "T01 should remain checked");
|
|
256
|
-
} finally {
|
|
257
|
-
cleanup(base);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
{
|
|
262
|
-
console.log("\n=== skipExecuteTask: handles special regex chars in task ID ===");
|
|
263
|
-
const base = createFixtureBase();
|
|
264
|
-
try {
|
|
265
|
-
const planPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md");
|
|
266
|
-
writeFileSync(planPath, "- [ ] **T01.1: Sub-task** `est:10m`\n", "utf-8");
|
|
267
|
-
|
|
268
|
-
const result = skipExecuteTask(
|
|
269
|
-
base, "M001", "S01", "T01.1",
|
|
270
|
-
{ summaryExists: false, taskChecked: false },
|
|
271
|
-
"idle", 2,
|
|
272
|
-
);
|
|
273
|
-
|
|
274
|
-
assertTrue(result === true, "should return true");
|
|
275
|
-
|
|
276
|
-
const planContent = readFileSync(planPath, "utf-8");
|
|
277
|
-
assertTrue(planContent.includes("- [x] **T01.1:"), "T01.1 should be checked (regex chars escaped)");
|
|
278
|
-
} finally {
|
|
279
|
-
cleanup(base);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
159
|
// ═══ verifyExpectedArtifact: complete-slice roadmap check ════════════════════
|
|
284
160
|
// Regression for #indefinite-hang: complete-slice must verify roadmap [x] or
|
|
285
161
|
// the idempotency skip loops forever after a crash that wrote SUMMARY+UAT but
|
|
@@ -370,12 +246,9 @@ const ROADMAP_COMPLETE = `# M001: Test Milestone
|
|
|
370
246
|
mkdirSync(join(base, ".gsd", "milestones", "M002", "slices", "S03", "tasks"), { recursive: true });
|
|
371
247
|
const result = buildLoopRemediationSteps("execute-task", "M002/S03/T01", base);
|
|
372
248
|
assertTrue(result !== null, "should return remediation steps");
|
|
373
|
-
assertTrue(result!.includes("
|
|
374
|
-
assertTrue(result!.includes("S03-PLAN.md"), "steps mention the slice plan");
|
|
249
|
+
assertTrue(result!.includes("gsd undo-task"), "steps include undo-task command");
|
|
375
250
|
assertTrue(result!.includes("T01"), "steps mention the task ID");
|
|
376
|
-
assertTrue(result!.includes("gsd
|
|
377
|
-
// Exact slice plan checkbox syntax (no trailing **)
|
|
378
|
-
assertTrue(result!.includes('"- [x] **T01:"'), "steps show exact checkbox syntax without trailing **");
|
|
251
|
+
assertTrue(result!.includes("gsd undo-task"), "steps include gsd undo-task command");
|
|
379
252
|
} finally {
|
|
380
253
|
rmSync(base, { recursive: true, force: true });
|
|
381
254
|
}
|
|
@@ -389,7 +262,7 @@ const ROADMAP_COMPLETE = `# M001: Test Milestone
|
|
|
389
262
|
const result = buildLoopRemediationSteps("plan-slice", "M001/S01", base);
|
|
390
263
|
assertTrue(result !== null, "should return remediation steps for plan-slice");
|
|
391
264
|
assertTrue(result!.includes("S01-PLAN.md"), "steps mention the slice plan file");
|
|
392
|
-
assertTrue(result!.includes("gsd
|
|
265
|
+
assertTrue(result!.includes("gsd recover"), "steps include gsd recover command");
|
|
393
266
|
} finally {
|
|
394
267
|
rmSync(base, { recursive: true, force: true });
|
|
395
268
|
}
|
|
@@ -403,7 +276,7 @@ const ROADMAP_COMPLETE = `# M001: Test Milestone
|
|
|
403
276
|
const result = buildLoopRemediationSteps("research-slice", "M001/S01", base);
|
|
404
277
|
assertTrue(result !== null, "should return remediation steps for research-slice");
|
|
405
278
|
assertTrue(result!.includes("S01-RESEARCH.md"), "steps mention the slice research file");
|
|
406
|
-
assertTrue(result!.includes("gsd
|
|
279
|
+
assertTrue(result!.includes("gsd recover"), "steps include gsd recover command");
|
|
407
280
|
} finally {
|
|
408
281
|
rmSync(base, { recursive: true, force: true });
|
|
409
282
|
}
|
|
@@ -420,47 +293,6 @@ const ROADMAP_COMPLETE = `# M001: Test Milestone
|
|
|
420
293
|
}
|
|
421
294
|
}
|
|
422
295
|
|
|
423
|
-
{
|
|
424
|
-
console.log("\n=== skipExecuteTask: loop-recovery writes blocker when both summary and checkbox missing ===");
|
|
425
|
-
const base = mkdtempSync(join(tmpdir(), "gsd-loop-recovery-test-"));
|
|
426
|
-
try {
|
|
427
|
-
mkdirSync(join(base, ".gsd", "milestones", "M002", "slices", "S03", "tasks"), { recursive: true });
|
|
428
|
-
const planPath = join(base, ".gsd", "milestones", "M002", "slices", "S03", "S03-PLAN.md");
|
|
429
|
-
writeFileSync(planPath, [
|
|
430
|
-
"# S03: Harden guided session",
|
|
431
|
-
"",
|
|
432
|
-
"## Tasks",
|
|
433
|
-
"",
|
|
434
|
-
"- [ ] **T01: Harden contract usage** `est:30m`",
|
|
435
|
-
" Harden guided session contract usage in desktop flow.",
|
|
436
|
-
].join("\n"), "utf-8");
|
|
437
|
-
|
|
438
|
-
const result = skipExecuteTask(
|
|
439
|
-
base, "M002", "S03", "T01",
|
|
440
|
-
{ summaryExists: false, taskChecked: false },
|
|
441
|
-
"loop-recovery",
|
|
442
|
-
// 3 == MAX_UNIT_DISPATCHES: represents the prevCount when the final
|
|
443
|
-
// reconciliation path runs (loop detected, reconciling before halting).
|
|
444
|
-
3,
|
|
445
|
-
);
|
|
446
|
-
|
|
447
|
-
assertTrue(result === true, "loop-recovery should succeed");
|
|
448
|
-
|
|
449
|
-
// Blocker summary written
|
|
450
|
-
const summaryPath = join(base, ".gsd", "milestones", "M002", "slices", "S03", "tasks", "T01-SUMMARY.md");
|
|
451
|
-
assertTrue(existsSync(summaryPath), "blocker summary should be written");
|
|
452
|
-
const summaryContent = readFileSync(summaryPath, "utf-8");
|
|
453
|
-
assertTrue(summaryContent.includes("BLOCKER"), "summary should be a blocker placeholder");
|
|
454
|
-
assertTrue(summaryContent.includes("loop-recovery"), "summary should mention the recovery reason");
|
|
455
|
-
|
|
456
|
-
// Checkbox marked
|
|
457
|
-
const planContent = readFileSync(planPath, "utf-8");
|
|
458
|
-
assertTrue(planContent.includes("- [x] **T01:"), "T01 checkbox should be marked [x] after loop-recovery");
|
|
459
|
-
} finally {
|
|
460
|
-
rmSync(base, { recursive: true, force: true });
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
|
|
464
296
|
// ═══ verifyExpectedArtifact: hook unit types ═════════════════════════════════
|
|
465
297
|
|
|
466
298
|
console.log("\n=== verifyExpectedArtifact: hook types always return true ===");
|