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,643 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* integration-proof.test.ts — End-to-end integration proof for M001.
|
|
3
|
+
*
|
|
4
|
+
* Proves all S01–S06 subsystems compose correctly:
|
|
5
|
+
* auto-migration → complete_task → complete_slice → deriveState crossval →
|
|
6
|
+
* doctor zero-fix → rogue detection → DB recovery → undo/reset
|
|
7
|
+
*
|
|
8
|
+
* Requirement coverage:
|
|
9
|
+
* R001 (task completion) — step 3c
|
|
10
|
+
* R002 (slice completion) — step 3e
|
|
11
|
+
* R003 (auto-migration) — step 3b
|
|
12
|
+
* R004 (markdown rendering) — steps 3d, 3f
|
|
13
|
+
* R005 (deriveState crossval) — step 3g
|
|
14
|
+
* R006 (prompt migration) — deferred to T02 grep
|
|
15
|
+
* R007 (hierarchy migration) — step 3b
|
|
16
|
+
* R008 (rogue detection) — step 3i
|
|
17
|
+
* R009 (doctor zero-fix) — step 3h
|
|
18
|
+
* R010 (DB recovery) — step 4
|
|
19
|
+
* R011 (undo/reset) — step 5
|
|
20
|
+
* R012 (shared WAL) — implicit (file-backed DB uses WAL throughout)
|
|
21
|
+
* R013 (stale render) — step 4 stale detection
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import test from "node:test";
|
|
25
|
+
import assert from "node:assert/strict";
|
|
26
|
+
import {
|
|
27
|
+
mkdtempSync,
|
|
28
|
+
mkdirSync,
|
|
29
|
+
writeFileSync,
|
|
30
|
+
readFileSync,
|
|
31
|
+
rmSync,
|
|
32
|
+
existsSync,
|
|
33
|
+
unlinkSync,
|
|
34
|
+
} from "node:fs";
|
|
35
|
+
import { tmpdir } from "node:os";
|
|
36
|
+
import { join } from "node:path";
|
|
37
|
+
|
|
38
|
+
// ── DB layer ──────────────────────────────────────────────────────────────
|
|
39
|
+
import {
|
|
40
|
+
openDatabase,
|
|
41
|
+
closeDatabase,
|
|
42
|
+
insertMilestone,
|
|
43
|
+
insertSlice,
|
|
44
|
+
insertTask,
|
|
45
|
+
getTask,
|
|
46
|
+
getSliceTasks,
|
|
47
|
+
getSlice,
|
|
48
|
+
updateTaskStatus,
|
|
49
|
+
updateSliceStatus,
|
|
50
|
+
transaction,
|
|
51
|
+
isDbAvailable,
|
|
52
|
+
_getAdapter,
|
|
53
|
+
} from "../gsd-db.ts";
|
|
54
|
+
|
|
55
|
+
// ── Tool handlers ─────────────────────────────────────────────────────────
|
|
56
|
+
import { handleCompleteTask } from "../tools/complete-task.ts";
|
|
57
|
+
import { handleCompleteSlice } from "../tools/complete-slice.ts";
|
|
58
|
+
|
|
59
|
+
// ── Markdown renderer ─────────────────────────────────────────────────────
|
|
60
|
+
import {
|
|
61
|
+
renderPlanCheckboxes,
|
|
62
|
+
renderRoadmapCheckboxes,
|
|
63
|
+
renderAllFromDb,
|
|
64
|
+
detectStaleRenders,
|
|
65
|
+
repairStaleRenders,
|
|
66
|
+
} from "../markdown-renderer.ts";
|
|
67
|
+
|
|
68
|
+
// ── State derivation ──────────────────────────────────────────────────────
|
|
69
|
+
import {
|
|
70
|
+
deriveStateFromDb,
|
|
71
|
+
_deriveStateImpl,
|
|
72
|
+
invalidateStateCache,
|
|
73
|
+
} from "../state.ts";
|
|
74
|
+
|
|
75
|
+
// ── Auto-migration ───────────────────────────────────────────────────────
|
|
76
|
+
import {
|
|
77
|
+
migrateHierarchyToDb,
|
|
78
|
+
migrateFromMarkdown,
|
|
79
|
+
} from "../md-importer.ts";
|
|
80
|
+
|
|
81
|
+
// ── Post-unit diagnostics ─────────────────────────────────────────────────
|
|
82
|
+
import { detectRogueFileWrites } from "../auto-post-unit.ts";
|
|
83
|
+
|
|
84
|
+
// ── Doctor ────────────────────────────────────────────────────────────────
|
|
85
|
+
import { runGSDDoctor } from "../doctor.ts";
|
|
86
|
+
|
|
87
|
+
// ── Undo/reset ────────────────────────────────────────────────────────────
|
|
88
|
+
import { handleUndoTask, handleResetSlice } from "../undo.ts";
|
|
89
|
+
|
|
90
|
+
// ── Cache invalidation ───────────────────────────────────────────────────
|
|
91
|
+
import { invalidateAllCaches } from "../cache.ts";
|
|
92
|
+
|
|
93
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
94
|
+
// Helpers
|
|
95
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
96
|
+
|
|
97
|
+
function makeTempDir(): string {
|
|
98
|
+
return mkdtempSync(join(tmpdir(), "gsd-integration-proof-"));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function makeCtx(): { notifications: Array<{ message: string; level: string }>; ctx: any } {
|
|
102
|
+
const notifications: Array<{ message: string; level: string }> = [];
|
|
103
|
+
const ctx = {
|
|
104
|
+
ui: {
|
|
105
|
+
notify(message: string, level: string) {
|
|
106
|
+
notifications.push({ message, level });
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
return { notifications, ctx };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Create a temp directory with a realistic .gsd/ structure:
|
|
115
|
+
* - M001-ROADMAP.md with one slice (S01, two tasks T01/T02)
|
|
116
|
+
* - S01-PLAN.md with two task checkboxes
|
|
117
|
+
* - REQUIREMENTS.md and DECISIONS.md stubs to keep doctor happy
|
|
118
|
+
*/
|
|
119
|
+
function createRealisticFixture(): string {
|
|
120
|
+
const base = makeTempDir();
|
|
121
|
+
const gsdDir = join(base, ".gsd");
|
|
122
|
+
const mDir = join(gsdDir, "milestones", "M001");
|
|
123
|
+
const sliceDir = join(mDir, "slices", "S01");
|
|
124
|
+
const tasksDir = join(sliceDir, "tasks");
|
|
125
|
+
|
|
126
|
+
mkdirSync(tasksDir, { recursive: true });
|
|
127
|
+
mkdirSync(join(gsdDir, "activity"), { recursive: true });
|
|
128
|
+
|
|
129
|
+
// Roadmap with exact format
|
|
130
|
+
writeFileSync(
|
|
131
|
+
join(mDir, "M001-ROADMAP.md"),
|
|
132
|
+
`# M001: Integration Proof Milestone
|
|
133
|
+
|
|
134
|
+
## Vision
|
|
135
|
+
|
|
136
|
+
Prove all subsystems compose.
|
|
137
|
+
|
|
138
|
+
## Success Criteria
|
|
139
|
+
|
|
140
|
+
- All tests pass
|
|
141
|
+
|
|
142
|
+
## Slices
|
|
143
|
+
|
|
144
|
+
- [ ] **S01: Core Feature** \`risk:low\` \`depends:[]\`
|
|
145
|
+
- After this: Core feature is proven end-to-end.
|
|
146
|
+
|
|
147
|
+
## Boundary Map
|
|
148
|
+
|
|
149
|
+
| From | To | Produces | Consumes |
|
|
150
|
+
|------|----|----------|----------|
|
|
151
|
+
| S01 | terminal | Working feature | nothing |
|
|
152
|
+
`,
|
|
153
|
+
"utf-8",
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
// Plan with exact format
|
|
157
|
+
writeFileSync(
|
|
158
|
+
join(sliceDir, "S01-PLAN.md"),
|
|
159
|
+
`# S01: Core Feature
|
|
160
|
+
|
|
161
|
+
**Goal:** Implement and prove the core feature.
|
|
162
|
+
**Demo:** Feature works end-to-end.
|
|
163
|
+
|
|
164
|
+
## Must-Haves
|
|
165
|
+
|
|
166
|
+
- Feature works correctly
|
|
167
|
+
|
|
168
|
+
## Tasks
|
|
169
|
+
|
|
170
|
+
- [ ] **T01: First implementation** \`est:30m\`
|
|
171
|
+
- Do: Implement the first part
|
|
172
|
+
- Verify: Run tests
|
|
173
|
+
|
|
174
|
+
- [ ] **T02: Second implementation** \`est:30m\`
|
|
175
|
+
- Do: Implement the second part
|
|
176
|
+
- Verify: Run tests
|
|
177
|
+
|
|
178
|
+
## Files Likely Touched
|
|
179
|
+
|
|
180
|
+
- src/feature.ts
|
|
181
|
+
`,
|
|
182
|
+
"utf-8",
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
// Minimal REQUIREMENTS.md
|
|
186
|
+
writeFileSync(
|
|
187
|
+
join(gsdDir, "REQUIREMENTS.md"),
|
|
188
|
+
`# Requirements
|
|
189
|
+
|
|
190
|
+
## Active
|
|
191
|
+
|
|
192
|
+
| ID | Description | Owner |
|
|
193
|
+
|----|-------------|-------|
|
|
194
|
+
| R001 | Task completion | S01 |
|
|
195
|
+
`,
|
|
196
|
+
"utf-8",
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
// Minimal DECISIONS.md
|
|
200
|
+
writeFileSync(
|
|
201
|
+
join(gsdDir, "DECISIONS.md"),
|
|
202
|
+
`# Decisions
|
|
203
|
+
|
|
204
|
+
| ID | Decision | Choice | Rationale |
|
|
205
|
+
|----|----------|--------|-----------|
|
|
206
|
+
`,
|
|
207
|
+
"utf-8",
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
// PROJECT.md stub
|
|
211
|
+
writeFileSync(
|
|
212
|
+
join(gsdDir, "PROJECT.md"),
|
|
213
|
+
"# Integration Proof Project\n\nTest project for integration proof.\n",
|
|
214
|
+
"utf-8",
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
return base;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function makeCompleteTaskParams(taskId: string): any {
|
|
221
|
+
return {
|
|
222
|
+
taskId,
|
|
223
|
+
sliceId: "S01",
|
|
224
|
+
milestoneId: "M001",
|
|
225
|
+
oneLiner: `Completed ${taskId} successfully`,
|
|
226
|
+
narrative: `Implemented ${taskId} with full coverage.`,
|
|
227
|
+
verification: "All tests pass.",
|
|
228
|
+
keyFiles: ["src/feature.ts"],
|
|
229
|
+
keyDecisions: [],
|
|
230
|
+
deviations: "None.",
|
|
231
|
+
knownIssues: "None.",
|
|
232
|
+
blockerDiscovered: false,
|
|
233
|
+
verificationEvidence: [
|
|
234
|
+
{
|
|
235
|
+
command: "npm run test:unit",
|
|
236
|
+
exitCode: 0,
|
|
237
|
+
verdict: "✅ pass",
|
|
238
|
+
durationMs: 3000,
|
|
239
|
+
},
|
|
240
|
+
],
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
function makeCompleteSliceParams(): any {
|
|
245
|
+
return {
|
|
246
|
+
sliceId: "S01",
|
|
247
|
+
milestoneId: "M001",
|
|
248
|
+
sliceTitle: "Core Feature",
|
|
249
|
+
oneLiner: "Core feature proven end-to-end",
|
|
250
|
+
narrative: "All tasks completed and verified.",
|
|
251
|
+
verification: "Full test suite passes.",
|
|
252
|
+
keyFiles: ["src/feature.ts"],
|
|
253
|
+
keyDecisions: [],
|
|
254
|
+
patternsEstablished: [],
|
|
255
|
+
observabilitySurfaces: [],
|
|
256
|
+
deviations: "None.",
|
|
257
|
+
knownLimitations: "None.",
|
|
258
|
+
followUps: "None.",
|
|
259
|
+
requirementsAdvanced: [],
|
|
260
|
+
requirementsValidated: [],
|
|
261
|
+
requirementsSurfaced: [],
|
|
262
|
+
requirementsInvalidated: [],
|
|
263
|
+
filesModified: [{ path: "src/feature.ts", description: "Core feature" }],
|
|
264
|
+
uatContent: "All acceptance criteria met.",
|
|
265
|
+
provides: ["core-feature"],
|
|
266
|
+
requires: [],
|
|
267
|
+
affects: [],
|
|
268
|
+
drillDownPaths: [],
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
273
|
+
// Core lifecycle: migrate → complete_task × 2 → complete_slice →
|
|
274
|
+
// deriveState crossval → doctor → rogue detection
|
|
275
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
276
|
+
|
|
277
|
+
test("full lifecycle: migration through completion through doctor", async (t) => {
|
|
278
|
+
const base = createRealisticFixture();
|
|
279
|
+
const dbPath = join(base, ".gsd", "gsd.db");
|
|
280
|
+
|
|
281
|
+
try {
|
|
282
|
+
// ── (a) Open file-backed DB ──────────────────────────────────────
|
|
283
|
+
const opened = openDatabase(dbPath);
|
|
284
|
+
assert.equal(opened, true, "DB should open successfully");
|
|
285
|
+
assert.equal(isDbAvailable(), true, "DB should be available");
|
|
286
|
+
|
|
287
|
+
// Verify WAL mode (R012 — implicit proof via file-backed DB)
|
|
288
|
+
const adapter = _getAdapter()!;
|
|
289
|
+
const journalMode = adapter.prepare("PRAGMA journal_mode").get();
|
|
290
|
+
assert.equal(
|
|
291
|
+
(journalMode as any)?.journal_mode,
|
|
292
|
+
"wal",
|
|
293
|
+
"file-backed DB should use WAL mode",
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
// ── (b) Auto-migrate markdown → DB (R003, R007) ─────────────────
|
|
297
|
+
const counts = migrateHierarchyToDb(base);
|
|
298
|
+
assert.equal(counts.milestones, 1, "should migrate 1 milestone");
|
|
299
|
+
assert.equal(counts.slices, 1, "should migrate 1 slice");
|
|
300
|
+
assert.equal(counts.tasks, 2, "should migrate 2 tasks");
|
|
301
|
+
|
|
302
|
+
// Verify DB rows after migration
|
|
303
|
+
const t1Before = getTask("M001", "S01", "T01");
|
|
304
|
+
assert.ok(t1Before, "T01 should exist in DB after migration");
|
|
305
|
+
assert.equal(t1Before!.status, "pending", "T01 should be pending after migration");
|
|
306
|
+
|
|
307
|
+
const t2Before = getTask("M001", "S01", "T02");
|
|
308
|
+
assert.ok(t2Before, "T02 should exist in DB after migration");
|
|
309
|
+
assert.equal(t2Before!.status, "pending", "T02 should be pending after migration");
|
|
310
|
+
|
|
311
|
+
// ── (c) Complete T01 and T02 via handleCompleteTask (R001) ───────
|
|
312
|
+
const r1 = await handleCompleteTask(makeCompleteTaskParams("T01"), base);
|
|
313
|
+
assert.ok(!("error" in r1), `T01 completion should succeed: ${JSON.stringify(r1)}`);
|
|
314
|
+
|
|
315
|
+
const r2 = await handleCompleteTask(makeCompleteTaskParams("T02"), base);
|
|
316
|
+
assert.ok(!("error" in r2), `T02 completion should succeed: ${JSON.stringify(r2)}`);
|
|
317
|
+
|
|
318
|
+
// ── (d) Verify DB rows and markdown summaries on disk (R004) ─────
|
|
319
|
+
const t1After = getTask("M001", "S01", "T01");
|
|
320
|
+
assert.equal(t1After!.status, "complete", "T01 should be complete in DB");
|
|
321
|
+
assert.ok(t1After!.one_liner, "T01 should have one_liner in DB");
|
|
322
|
+
|
|
323
|
+
const t2After = getTask("M001", "S01", "T02");
|
|
324
|
+
assert.equal(t2After!.status, "complete", "T02 should be complete in DB");
|
|
325
|
+
|
|
326
|
+
// Verify T01-SUMMARY.md on disk
|
|
327
|
+
if (!("error" in r1)) {
|
|
328
|
+
assert.ok(existsSync(r1.summaryPath), "T01 summary file should exist on disk");
|
|
329
|
+
const t1Summary = readFileSync(r1.summaryPath, "utf-8");
|
|
330
|
+
assert.match(t1Summary, /id: T01/, "T01 summary should contain frontmatter");
|
|
331
|
+
assert.match(t1Summary, /Completed T01 successfully/, "T01 summary should contain one-liner");
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Verify plan checkboxes toggled
|
|
335
|
+
const planPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md");
|
|
336
|
+
const planAfterTasks = readFileSync(planPath, "utf-8");
|
|
337
|
+
assert.match(planAfterTasks, /\[x\]\s+\*\*T01:/, "T01 should be checked in plan");
|
|
338
|
+
assert.match(planAfterTasks, /\[x\]\s+\*\*T02:/, "T02 should be checked in plan");
|
|
339
|
+
|
|
340
|
+
// ── (e) Complete slice via handleCompleteSlice (R002) ─────────────
|
|
341
|
+
invalidateAllCaches();
|
|
342
|
+
const sliceResult = await handleCompleteSlice(makeCompleteSliceParams(), base);
|
|
343
|
+
assert.ok(!("error" in sliceResult), `Slice completion should succeed: ${JSON.stringify(sliceResult)}`);
|
|
344
|
+
|
|
345
|
+
// ── (f) Verify slice artifacts on disk (R004) ────────────────────
|
|
346
|
+
if (!("error" in sliceResult)) {
|
|
347
|
+
assert.ok(existsSync(sliceResult.summaryPath), "Slice summary should exist on disk");
|
|
348
|
+
assert.ok(existsSync(sliceResult.uatPath), "Slice UAT should exist on disk");
|
|
349
|
+
|
|
350
|
+
const sliceSummary = readFileSync(sliceResult.summaryPath, "utf-8");
|
|
351
|
+
assert.match(sliceSummary, /id: S01/, "Slice summary should contain frontmatter");
|
|
352
|
+
assert.match(sliceSummary, /Core feature proven/, "Slice summary should contain one-liner");
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// Verify roadmap checkbox toggled
|
|
356
|
+
const roadmapPath = join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md");
|
|
357
|
+
const roadmapAfter = readFileSync(roadmapPath, "utf-8");
|
|
358
|
+
assert.match(roadmapAfter, /\[x\]\s+\*\*S01:/, "S01 should be checked in roadmap");
|
|
359
|
+
|
|
360
|
+
// Verify slice status in DB
|
|
361
|
+
const sliceRow = getSlice("M001", "S01");
|
|
362
|
+
assert.equal(sliceRow?.status, "complete", "S01 should be complete in DB");
|
|
363
|
+
|
|
364
|
+
// ── (g) deriveState cross-validation (R005) ──────────────────────
|
|
365
|
+
invalidateStateCache();
|
|
366
|
+
invalidateAllCaches();
|
|
367
|
+
const dbState = await deriveStateFromDb(base);
|
|
368
|
+
const fileState = await _deriveStateImpl(base);
|
|
369
|
+
|
|
370
|
+
// Both paths should agree on key fields
|
|
371
|
+
assert.equal(
|
|
372
|
+
dbState.activeMilestone?.id ?? null,
|
|
373
|
+
fileState.activeMilestone?.id ?? null,
|
|
374
|
+
"activeMilestone.id should match between DB and filesystem paths",
|
|
375
|
+
);
|
|
376
|
+
assert.equal(
|
|
377
|
+
dbState.activeSlice?.id ?? null,
|
|
378
|
+
fileState.activeSlice?.id ?? null,
|
|
379
|
+
"activeSlice.id should match between DB and filesystem paths",
|
|
380
|
+
);
|
|
381
|
+
assert.equal(dbState.phase, fileState.phase, "phase should match between DB and filesystem paths");
|
|
382
|
+
assert.equal(
|
|
383
|
+
dbState.registry.length,
|
|
384
|
+
fileState.registry.length,
|
|
385
|
+
"registry length should match",
|
|
386
|
+
);
|
|
387
|
+
|
|
388
|
+
// ── (h) Doctor zero-fix (R009) ───────────────────────────────────
|
|
389
|
+
const doctorReport = await runGSDDoctor(base, {
|
|
390
|
+
fix: false,
|
|
391
|
+
isolationMode: "none",
|
|
392
|
+
});
|
|
393
|
+
// Filter to only errors (warnings/info about env, git, etc. are expected in a temp dir)
|
|
394
|
+
const errors = doctorReport.issues.filter(i => i.severity === "error");
|
|
395
|
+
// Doctor should produce zero fixable reconciliation issues on a healthy state
|
|
396
|
+
const reconciliationErrors = errors.filter(i =>
|
|
397
|
+
i.code.includes("checkbox") || i.code.includes("reconcil") || i.code.includes("cascade"),
|
|
398
|
+
);
|
|
399
|
+
assert.equal(
|
|
400
|
+
reconciliationErrors.length,
|
|
401
|
+
0,
|
|
402
|
+
`Doctor should find zero reconciliation errors, got: ${JSON.stringify(reconciliationErrors)}`,
|
|
403
|
+
);
|
|
404
|
+
|
|
405
|
+
// ── (i) Rogue file detection (R008) ──────────────────────────────
|
|
406
|
+
// Write a fake summary for a non-DB-tracked task T99
|
|
407
|
+
const rogueDir = join(base, ".gsd", "milestones", "M001", "slices", "S01", "tasks");
|
|
408
|
+
writeFileSync(join(rogueDir, "T99-SUMMARY.md"), "# Rogue Summary\n", "utf-8");
|
|
409
|
+
|
|
410
|
+
// Clear path cache so resolveTaskFile sees the newly written file
|
|
411
|
+
const { clearPathCache } = await import("../paths.ts");
|
|
412
|
+
clearPathCache();
|
|
413
|
+
|
|
414
|
+
const rogues = detectRogueFileWrites("execute-task", "M001/S01/T99", base);
|
|
415
|
+
assert.ok(rogues.length > 0, "Should detect rogue file write for T99");
|
|
416
|
+
assert.equal(rogues[0].unitId, "M001/S01/T99", "Rogue detection should identify the correct unit");
|
|
417
|
+
} finally {
|
|
418
|
+
closeDatabase();
|
|
419
|
+
rmSync(base, { recursive: true, force: true });
|
|
420
|
+
}
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
424
|
+
// Recovery: DB deletion → migrateFromMarkdown → state reconstruction (R010)
|
|
425
|
+
// Stale render detection (R013)
|
|
426
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
427
|
+
|
|
428
|
+
test("recovery: DB loss → migrateFromMarkdown restores state, stale render detection", async (t) => {
|
|
429
|
+
const base = createRealisticFixture();
|
|
430
|
+
const dbPath = join(base, ".gsd", "gsd.db");
|
|
431
|
+
|
|
432
|
+
try {
|
|
433
|
+
// Set up a completed state first
|
|
434
|
+
openDatabase(dbPath);
|
|
435
|
+
migrateHierarchyToDb(base);
|
|
436
|
+
await handleCompleteTask(makeCompleteTaskParams("T01"), base);
|
|
437
|
+
await handleCompleteTask(makeCompleteTaskParams("T02"), base);
|
|
438
|
+
invalidateAllCaches();
|
|
439
|
+
await handleCompleteSlice(makeCompleteSliceParams(), base);
|
|
440
|
+
|
|
441
|
+
// Verify we have a healthy DB with completed state
|
|
442
|
+
const sliceBefore = getSlice("M001", "S01");
|
|
443
|
+
assert.equal(sliceBefore?.status, "complete", "Slice should be complete before recovery test");
|
|
444
|
+
|
|
445
|
+
// ── Stale render detection (R013) ────────────────────────────────
|
|
446
|
+
// Mutate a task status in DB to create a stale condition
|
|
447
|
+
// (DB says pending but plan checkbox says [x])
|
|
448
|
+
updateTaskStatus("M001", "S01", "T01", "pending", new Date().toISOString());
|
|
449
|
+
invalidateAllCaches();
|
|
450
|
+
|
|
451
|
+
const staleEntries = detectStaleRenders(base);
|
|
452
|
+
assert.ok(staleEntries.length > 0, "Should detect stale renders after DB mutation");
|
|
453
|
+
|
|
454
|
+
// Restore the task status for the recovery test
|
|
455
|
+
updateTaskStatus("M001", "S01", "T01", "complete", new Date().toISOString());
|
|
456
|
+
|
|
457
|
+
// ── DB deletion + recovery (R010) ────────────────────────────────
|
|
458
|
+
closeDatabase();
|
|
459
|
+
|
|
460
|
+
// Delete the DB file and any WAL/SHM files
|
|
461
|
+
for (const suffix of ["", "-wal", "-shm"]) {
|
|
462
|
+
const f = dbPath + suffix;
|
|
463
|
+
if (existsSync(f)) unlinkSync(f);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
assert.equal(existsSync(dbPath), false, "DB file should be deleted");
|
|
467
|
+
|
|
468
|
+
// Clear path caches so gsdRoot re-probes after DB deletion
|
|
469
|
+
const { clearPathCache: clearPaths } = await import("../paths.ts");
|
|
470
|
+
clearPaths();
|
|
471
|
+
invalidateAllCaches();
|
|
472
|
+
|
|
473
|
+
// Recover from markdown — migrateFromMarkdown takes basePath (project root)
|
|
474
|
+
const recoveryResult = migrateFromMarkdown(base);
|
|
475
|
+
|
|
476
|
+
assert.ok(
|
|
477
|
+
recoveryResult.hierarchy.milestones >= 1,
|
|
478
|
+
"Recovery should import at least 1 milestone",
|
|
479
|
+
);
|
|
480
|
+
assert.ok(
|
|
481
|
+
recoveryResult.hierarchy.slices >= 1,
|
|
482
|
+
"Recovery should import at least 1 slice",
|
|
483
|
+
);
|
|
484
|
+
assert.ok(
|
|
485
|
+
recoveryResult.hierarchy.tasks >= 2,
|
|
486
|
+
"Recovery should import at least 2 tasks",
|
|
487
|
+
);
|
|
488
|
+
|
|
489
|
+
// Verify state is reconstructed — slice should be complete (roadmap says [x])
|
|
490
|
+
const sliceAfter = getSlice("M001", "S01");
|
|
491
|
+
assert.ok(sliceAfter, "S01 should exist in DB after recovery");
|
|
492
|
+
assert.equal(
|
|
493
|
+
sliceAfter!.status,
|
|
494
|
+
"complete",
|
|
495
|
+
"S01 should be complete after recovery (roadmap checkbox was [x])",
|
|
496
|
+
);
|
|
497
|
+
|
|
498
|
+
// Tasks should be complete too (plan checkboxes were [x])
|
|
499
|
+
const t1Recovered = getTask("M001", "S01", "T01");
|
|
500
|
+
assert.ok(t1Recovered, "T01 should exist after recovery");
|
|
501
|
+
assert.equal(t1Recovered!.status, "complete", "T01 should be complete after recovery");
|
|
502
|
+
|
|
503
|
+
const t2Recovered = getTask("M001", "S01", "T02");
|
|
504
|
+
assert.ok(t2Recovered, "T02 should exist after recovery");
|
|
505
|
+
assert.equal(t2Recovered!.status, "complete", "T02 should be complete after recovery");
|
|
506
|
+
} finally {
|
|
507
|
+
closeDatabase();
|
|
508
|
+
rmSync(base, { recursive: true, force: true });
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
513
|
+
// Undo/reset: handleUndoTask + handleResetSlice (R011)
|
|
514
|
+
// ═══════════════════════════════════════════════════════════════════════════
|
|
515
|
+
|
|
516
|
+
test("undo/reset: undo task and reset slice revert DB + markdown", async (t) => {
|
|
517
|
+
const base = createRealisticFixture();
|
|
518
|
+
const dbPath = join(base, ".gsd", "gsd.db");
|
|
519
|
+
|
|
520
|
+
try {
|
|
521
|
+
// Build up completed state
|
|
522
|
+
openDatabase(dbPath);
|
|
523
|
+
migrateHierarchyToDb(base);
|
|
524
|
+
await handleCompleteTask(makeCompleteTaskParams("T01"), base);
|
|
525
|
+
await handleCompleteTask(makeCompleteTaskParams("T02"), base);
|
|
526
|
+
invalidateAllCaches();
|
|
527
|
+
await handleCompleteSlice(makeCompleteSliceParams(), base);
|
|
528
|
+
|
|
529
|
+
// Verify completed state
|
|
530
|
+
assert.equal(getTask("M001", "S01", "T01")?.status, "complete");
|
|
531
|
+
assert.equal(getTask("M001", "S01", "T02")?.status, "complete");
|
|
532
|
+
assert.equal(getSlice("M001", "S01")?.status, "complete");
|
|
533
|
+
|
|
534
|
+
// ── Undo T01 ─────────────────────────────────────────────────────
|
|
535
|
+
const { notifications: undoNotifs, ctx: undoCtx } = makeCtx();
|
|
536
|
+
await handleUndoTask("M001/S01/T01 --force", undoCtx, {} as any, base);
|
|
537
|
+
|
|
538
|
+
// DB status should revert
|
|
539
|
+
const t1Undone = getTask("M001", "S01", "T01");
|
|
540
|
+
assert.equal(t1Undone?.status, "pending", "T01 should be pending after undo");
|
|
541
|
+
|
|
542
|
+
// T01 summary file should be deleted
|
|
543
|
+
const t1SummaryPath = join(
|
|
544
|
+
base,
|
|
545
|
+
".gsd",
|
|
546
|
+
"milestones",
|
|
547
|
+
"M001",
|
|
548
|
+
"slices",
|
|
549
|
+
"S01",
|
|
550
|
+
"tasks",
|
|
551
|
+
"T01-SUMMARY.md",
|
|
552
|
+
);
|
|
553
|
+
assert.equal(existsSync(t1SummaryPath), false, "T01 summary should be deleted after undo");
|
|
554
|
+
|
|
555
|
+
// Plan checkbox should be unchecked
|
|
556
|
+
const planPath = join(base, ".gsd", "milestones", "M001", "slices", "S01", "S01-PLAN.md");
|
|
557
|
+
const planAfterUndo = readFileSync(planPath, "utf-8");
|
|
558
|
+
assert.match(planAfterUndo, /\[ \]\s+\*\*T01:/, "T01 should be unchecked in plan after undo");
|
|
559
|
+
|
|
560
|
+
// T02 should still be complete
|
|
561
|
+
assert.equal(getTask("M001", "S01", "T02")?.status, "complete", "T02 should still be complete");
|
|
562
|
+
|
|
563
|
+
// Undo notification should be success
|
|
564
|
+
assert.ok(
|
|
565
|
+
undoNotifs.some(n => n.level === "success"),
|
|
566
|
+
"Undo should produce success notification",
|
|
567
|
+
);
|
|
568
|
+
|
|
569
|
+
// ── Reset S01 ────────────────────────────────────────────────────
|
|
570
|
+
// Re-complete T01 first so we can reset the whole slice
|
|
571
|
+
await handleCompleteTask(makeCompleteTaskParams("T01"), base);
|
|
572
|
+
invalidateAllCaches();
|
|
573
|
+
|
|
574
|
+
// Re-complete slice
|
|
575
|
+
await handleCompleteSlice(makeCompleteSliceParams(), base);
|
|
576
|
+
|
|
577
|
+
const { notifications: resetNotifs, ctx: resetCtx } = makeCtx();
|
|
578
|
+
await handleResetSlice("M001/S01 --force", resetCtx, {} as any, base);
|
|
579
|
+
|
|
580
|
+
// All tasks should be pending
|
|
581
|
+
assert.equal(getTask("M001", "S01", "T01")?.status, "pending", "T01 should be pending after reset");
|
|
582
|
+
assert.equal(getTask("M001", "S01", "T02")?.status, "pending", "T02 should be pending after reset");
|
|
583
|
+
|
|
584
|
+
// Slice should be active (not complete)
|
|
585
|
+
const sliceAfterReset = getSlice("M001", "S01");
|
|
586
|
+
assert.equal(sliceAfterReset?.status, "active", "S01 should be active after reset");
|
|
587
|
+
|
|
588
|
+
// Task summaries should be deleted
|
|
589
|
+
assert.equal(existsSync(t1SummaryPath), false, "T01 summary should be deleted after reset");
|
|
590
|
+
const t2SummaryPath = join(
|
|
591
|
+
base,
|
|
592
|
+
".gsd",
|
|
593
|
+
"milestones",
|
|
594
|
+
"M001",
|
|
595
|
+
"slices",
|
|
596
|
+
"S01",
|
|
597
|
+
"tasks",
|
|
598
|
+
"T02-SUMMARY.md",
|
|
599
|
+
);
|
|
600
|
+
assert.equal(existsSync(t2SummaryPath), false, "T02 summary should be deleted after reset");
|
|
601
|
+
|
|
602
|
+
// Slice summary and UAT should be deleted
|
|
603
|
+
const sliceSummaryPath = join(
|
|
604
|
+
base,
|
|
605
|
+
".gsd",
|
|
606
|
+
"milestones",
|
|
607
|
+
"M001",
|
|
608
|
+
"slices",
|
|
609
|
+
"S01",
|
|
610
|
+
"S01-SUMMARY.md",
|
|
611
|
+
);
|
|
612
|
+
const sliceUatPath = join(
|
|
613
|
+
base,
|
|
614
|
+
".gsd",
|
|
615
|
+
"milestones",
|
|
616
|
+
"M001",
|
|
617
|
+
"slices",
|
|
618
|
+
"S01",
|
|
619
|
+
"S01-UAT.md",
|
|
620
|
+
);
|
|
621
|
+
assert.equal(existsSync(sliceSummaryPath), false, "Slice summary should be deleted after reset");
|
|
622
|
+
assert.equal(existsSync(sliceUatPath), false, "Slice UAT should be deleted after reset");
|
|
623
|
+
|
|
624
|
+
// Plan checkboxes should be unchecked
|
|
625
|
+
const planAfterReset = readFileSync(planPath, "utf-8");
|
|
626
|
+
assert.match(planAfterReset, /\[ \]\s+\*\*T01:/, "T01 should be unchecked after reset");
|
|
627
|
+
assert.match(planAfterReset, /\[ \]\s+\*\*T02:/, "T02 should be unchecked after reset");
|
|
628
|
+
|
|
629
|
+
// Roadmap checkbox should be unchecked
|
|
630
|
+
const roadmapPath = join(base, ".gsd", "milestones", "M001", "M001-ROADMAP.md");
|
|
631
|
+
const roadmapAfterReset = readFileSync(roadmapPath, "utf-8");
|
|
632
|
+
assert.match(roadmapAfterReset, /\[ \]\s+\*\*S01:/, "S01 should be unchecked in roadmap after reset");
|
|
633
|
+
|
|
634
|
+
// Reset notification should be success
|
|
635
|
+
assert.ok(
|
|
636
|
+
resetNotifs.some(n => n.level === "success"),
|
|
637
|
+
"Reset should produce success notification",
|
|
638
|
+
);
|
|
639
|
+
} finally {
|
|
640
|
+
closeDatabase();
|
|
641
|
+
rmSync(base, { recursive: true, force: true });
|
|
642
|
+
}
|
|
643
|
+
});
|
|
@@ -91,8 +91,6 @@ function makeMockDeps(
|
|
|
91
91
|
runPreDispatchHooks: () => ({ firedHooks: [], action: "proceed" }),
|
|
92
92
|
getPriorSliceCompletionBlocker: () => null,
|
|
93
93
|
getMainBranch: () => "main",
|
|
94
|
-
collectObservabilityWarnings: async () => [],
|
|
95
|
-
buildObservabilityRepairBlock: () => null,
|
|
96
94
|
closeoutUnit: async () => {},
|
|
97
95
|
verifyExpectedArtifact: () => true,
|
|
98
96
|
clearUnitRuntimeRecord: () => {},
|
|
@@ -287,7 +285,6 @@ test("runUnitPhase emits unit-start and unit-end with causedBy reference", async
|
|
|
287
285
|
prompt: "do stuff",
|
|
288
286
|
finalPrompt: "do stuff",
|
|
289
287
|
pauseAfterUatDispatch: false,
|
|
290
|
-
observabilityIssues: [],
|
|
291
288
|
state: { phase: "executing", activeMilestone: { id: "M001" }, activeSlice: { id: "S01" }, registry: [], blockers: [] } as any,
|
|
292
289
|
mid: "M001",
|
|
293
290
|
midTitle: "Test",
|