gsd-pi 2.43.0 → 2.44.0-dev.62b5d6c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +13 -1
- package/dist/help-text.js +24 -0
- package/dist/resources/extensions/bg-shell/overlay.js +3 -0
- package/dist/resources/extensions/github-sync/sync.js +2 -1
- package/dist/resources/extensions/gsd/auto/loop.js +0 -2
- package/dist/resources/extensions/gsd/auto/phases.js +7 -12
- package/dist/resources/extensions/gsd/auto-dashboard.js +19 -18
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +34 -19
- package/dist/resources/extensions/gsd/auto-dispatch.js +36 -21
- package/dist/resources/extensions/gsd/auto-post-unit.js +128 -14
- package/dist/resources/extensions/gsd/auto-prompts.js +202 -92
- package/dist/resources/extensions/gsd/auto-recovery.js +83 -135
- package/dist/resources/extensions/gsd/auto-supervisor.js +14 -0
- package/dist/resources/extensions/gsd/auto-timeout-recovery.js +4 -7
- package/dist/resources/extensions/gsd/auto-verification.js +5 -10
- package/dist/resources/extensions/gsd/auto-worktree.js +123 -30
- package/dist/resources/extensions/gsd/auto.js +1 -4
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +611 -0
- package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +28 -3
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +7 -0
- package/dist/resources/extensions/gsd/commands/catalog.js +3 -1
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +15 -1
- package/dist/resources/extensions/gsd/commands-handlers.js +1 -1
- package/dist/resources/extensions/gsd/commands-maintenance.js +78 -3
- package/dist/resources/extensions/gsd/dashboard-overlay.js +32 -31
- package/dist/resources/extensions/gsd/db-writer.js +95 -4
- package/dist/resources/extensions/gsd/dispatch-guard.js +35 -30
- package/dist/resources/extensions/gsd/doctor-checks.js +28 -11
- package/dist/resources/extensions/gsd/doctor-environment.js +28 -0
- package/dist/resources/extensions/gsd/doctor-types.js +0 -15
- package/dist/resources/extensions/gsd/doctor.js +46 -282
- package/dist/resources/extensions/gsd/file-watcher.js +5 -1
- package/dist/resources/extensions/gsd/files.js +14 -198
- package/dist/resources/extensions/gsd/git-service.js +4 -0
- package/dist/resources/extensions/gsd/gitignore.js +4 -0
- package/dist/resources/extensions/gsd/gsd-db.js +819 -197
- package/dist/resources/extensions/gsd/guided-flow.js +18 -8
- package/dist/resources/extensions/gsd/markdown-renderer.js +862 -0
- package/dist/resources/extensions/gsd/md-importer.js +182 -4
- package/dist/resources/extensions/gsd/native-git-bridge.js +10 -1
- package/dist/resources/extensions/gsd/parallel-eligibility.js +14 -19
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +38 -0
- package/dist/resources/extensions/gsd/parsers-legacy.js +239 -0
- package/dist/resources/extensions/gsd/preferences-types.js +1 -0
- package/dist/resources/extensions/gsd/preferences-validation.js +9 -0
- package/dist/resources/extensions/gsd/preferences.js +1 -0
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +22 -9
- package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +15 -5
- package/dist/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -7
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +6 -6
- package/dist/resources/extensions/gsd/reactive-graph.js +33 -3
- package/dist/resources/extensions/gsd/skill-health.js +3 -1
- package/dist/resources/extensions/gsd/state.js +484 -30
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +128 -0
- package/dist/resources/extensions/gsd/tools/complete-slice.js +244 -0
- package/dist/resources/extensions/gsd/tools/complete-task.js +204 -0
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +205 -0
- package/dist/resources/extensions/gsd/tools/plan-slice.js +155 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +94 -0
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +152 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +146 -0
- package/dist/resources/extensions/gsd/triage-resolution.js +17 -1
- package/dist/resources/extensions/gsd/undo.js +197 -3
- package/dist/resources/extensions/gsd/visualizer-data.js +53 -16
- package/dist/resources/extensions/gsd/workspace-index.js +63 -39
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +17 -16
- package/dist/web/standalone/.next/build-manifest.json +4 -4
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
- package/dist/web/standalone/.next/required-server-files.json +4 -4
- package/dist/web/standalone/.next/routes-manifest.json +6 -0
- package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
- package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
- package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
- package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +5 -5
- package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -0
- package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -0
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -0
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +5 -5
- package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -5
- package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/dist/web/standalone/.next/server/app/page.js +2 -2
- package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app-paths-manifest.json +17 -16
- package/dist/web/standalone/.next/server/chunks/229.js +3 -3
- package/dist/web/standalone/.next/server/chunks/471.js +3 -3
- package/dist/web/standalone/.next/server/functions-config-manifest.json +1 -0
- package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/dist/web/standalone/.next/server/middleware.js +2 -2
- package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
- package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
- package/dist/web/standalone/.next/server/pages/404.html +1 -1
- package/dist/web/standalone/.next/server/pages/500.html +2 -2
- package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
- package/dist/web/standalone/.next/static/chunks/{4024.c195dc1fdd2adbea.js → 4024.0de81b543b28b9fe.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/_global-error/{page-d07a2c023f1aef1e.js → page-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-f2a7482d42a5614b.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/boot/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/input/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/resize/{route-d07a2c023f1aef1e.js → route-d83ba70a25a85472.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/switch-root/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d83ba70a25a85472.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{webpack-fa307370fcf9fb2c.js → webpack-9014b5adb127a98a.js} +1 -1
- package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +1 -0
- package/dist/web/standalone/.next/static/fOnWQBjWXMKUs4bqTg530/_buildManifest.js +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +4 -4
- package/packages/pi-ai/dist/models.custom.d.ts +173 -0
- package/packages/pi-ai/dist/models.custom.d.ts.map +1 -0
- package/packages/pi-ai/dist/models.custom.js +170 -0
- package/packages/pi-ai/dist/models.custom.js.map +1 -0
- package/packages/pi-ai/dist/models.d.ts.map +1 -1
- package/packages/pi-ai/dist/models.js +16 -1
- package/packages/pi-ai/dist/models.js.map +1 -1
- package/packages/pi-ai/dist/models.test.d.ts +2 -0
- package/packages/pi-ai/dist/models.test.d.ts.map +1 -0
- package/packages/pi-ai/dist/models.test.js +67 -0
- package/packages/pi-ai/dist/models.test.js.map +1 -0
- package/packages/pi-ai/src/models.custom.ts +172 -0
- package/packages/pi-ai/src/models.test.ts +85 -0
- package/packages/pi-ai/src/models.ts +17 -1
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +10 -3
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +21 -34
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +6 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +80 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js +63 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +5 -0
- package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lsp/client.js +69 -21
- package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +3 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +11 -199
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts +6 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +21 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +8 -15
- package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/print-mode.js +45 -34
- package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +1 -0
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -2
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -1
- package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +26 -37
- package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
- package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.test.ts +96 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +89 -0
- package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
- package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
- package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
- package/packages/pi-coding-agent/src/core/lsp/client.ts +83 -21
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
- package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
- package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
- package/packages/pi-coding-agent/src/index.ts +7 -0
- package/packages/pi-coding-agent/src/main.ts +11 -232
- package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +20 -0
- package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +9 -16
- package/packages/pi-coding-agent/src/modes/print-mode.ts +42 -32
- package/packages/pi-coding-agent/src/modes/rpc/rpc-client.ts +8 -2
- package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
- package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/pkg/dist/modes/interactive/theme/theme.js +8 -15
- package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
- package/pkg/package.json +1 -1
- package/src/resources/extensions/bg-shell/overlay.ts +4 -0
- package/src/resources/extensions/github-sync/sync.ts +2 -1
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -8
- package/src/resources/extensions/gsd/auto/loop.ts +0 -2
- package/src/resources/extensions/gsd/auto/phases.ts +7 -20
- package/src/resources/extensions/gsd/auto/types.ts +0 -1
- package/src/resources/extensions/gsd/auto-dashboard.ts +20 -16
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +34 -19
- package/src/resources/extensions/gsd/auto-dispatch.ts +38 -21
- package/src/resources/extensions/gsd/auto-post-unit.ts +150 -15
- package/src/resources/extensions/gsd/auto-prompts.ts +186 -103
- package/src/resources/extensions/gsd/auto-recovery.ts +77 -142
- package/src/resources/extensions/gsd/auto-supervisor.ts +14 -0
- package/src/resources/extensions/gsd/auto-timeout-recovery.ts +6 -7
- package/src/resources/extensions/gsd/auto-verification.ts +4 -9
- package/src/resources/extensions/gsd/auto-worktree.ts +126 -30
- package/src/resources/extensions/gsd/auto.ts +0 -9
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +675 -4
- package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +31 -3
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +7 -0
- package/src/resources/extensions/gsd/commands/catalog.ts +3 -1
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +15 -1
- package/src/resources/extensions/gsd/commands-handlers.ts +1 -1
- package/src/resources/extensions/gsd/commands-maintenance.ts +86 -3
- package/src/resources/extensions/gsd/dashboard-overlay.ts +17 -13
- package/src/resources/extensions/gsd/db-writer.ts +105 -4
- package/src/resources/extensions/gsd/dispatch-guard.ts +32 -30
- package/src/resources/extensions/gsd/doctor-checks.ts +25 -11
- package/src/resources/extensions/gsd/doctor-environment.ts +31 -0
- package/src/resources/extensions/gsd/doctor-types.ts +0 -23
- package/src/resources/extensions/gsd/doctor.ts +45 -295
- package/src/resources/extensions/gsd/file-watcher.ts +4 -1
- package/src/resources/extensions/gsd/files.ts +16 -220
- package/src/resources/extensions/gsd/git-service.ts +4 -0
- package/src/resources/extensions/gsd/gitignore.ts +4 -0
- package/src/resources/extensions/gsd/gsd-db.ts +1157 -370
- package/src/resources/extensions/gsd/guided-flow.ts +20 -8
- package/src/resources/extensions/gsd/markdown-renderer.ts +1098 -0
- package/src/resources/extensions/gsd/md-importer.ts +211 -2
- package/src/resources/extensions/gsd/native-git-bridge.ts +12 -1
- package/src/resources/extensions/gsd/parallel-eligibility.ts +14 -18
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +43 -0
- package/src/resources/extensions/gsd/parsers-legacy.ts +271 -0
- package/src/resources/extensions/gsd/preferences-types.ts +3 -0
- package/src/resources/extensions/gsd/preferences-validation.ts +9 -0
- package/src/resources/extensions/gsd/preferences.ts +1 -0
- package/src/resources/extensions/gsd/prompts/complete-slice.md +22 -9
- package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +15 -5
- package/src/resources/extensions/gsd/prompts/guided-complete-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-execute-task.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +6 -10
- package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -7
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +3 -3
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -7
- package/src/resources/extensions/gsd/prompts/replan-slice.md +6 -6
- package/src/resources/extensions/gsd/reactive-graph.ts +33 -3
- package/src/resources/extensions/gsd/skill-health.ts +2 -1
- package/src/resources/extensions/gsd/state.ts +547 -29
- package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +150 -5
- package/src/resources/extensions/gsd/tests/auto-stash-merge.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +15 -20
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +410 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +439 -0
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +527 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +593 -2
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +104 -57
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +22 -80
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -130
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +38 -76
- package/src/resources/extensions/gsd/tests/doctor.test.ts +9 -19
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +290 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +240 -0
- package/src/resources/extensions/gsd/tests/git-service.test.ts +6 -2
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +462 -0
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +4 -172
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +643 -0
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +1205 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +439 -0
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +2 -0
- package/src/resources/extensions/gsd/tests/parsers.test.ts +2 -1
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +176 -113
- package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +7 -0
- package/src/resources/extensions/gsd/tests/plan-slice.test.ts +179 -0
- package/src/resources/extensions/gsd/tests/plan-task.test.ts +145 -0
- package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +305 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
- package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/rogue-file-detection.test.ts +296 -0
- package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +216 -0
- package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +11 -3
- package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
- package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +1 -1
- package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -142
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +12 -5
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +176 -0
- package/src/resources/extensions/gsd/tools/complete-slice.ts +300 -0
- package/src/resources/extensions/gsd/tools/complete-task.ts +245 -0
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +249 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +194 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +116 -0
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +203 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +192 -0
- package/src/resources/extensions/gsd/triage-resolution.ts +20 -1
- package/src/resources/extensions/gsd/types.ts +50 -0
- package/src/resources/extensions/gsd/undo.ts +247 -3
- package/src/resources/extensions/gsd/visualizer-data.ts +54 -17
- package/src/resources/extensions/gsd/workspace-index.ts +64 -46
- package/dist/resources/extensions/gsd/auto-observability.js +0 -56
- package/dist/resources/extensions/gsd/observability-validator.js +0 -422
- package/dist/resources/extensions/gsd/roadmap-mutations.js +0 -110
- package/dist/web/standalone/.next/static/VvclDCW6TAWjEyLU-EYL1/_buildManifest.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/bridge-terminal/stream/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/browse-directories/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/captures/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/cleanup/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/dev-mode/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/doctor/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/export-data/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/files/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/forensics/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/git/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/history/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/hooks/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/inspect/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/knowledge/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/live-state/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/onboarding/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/preferences/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/projects/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/recovery/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/remote-questions/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/browser/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/command/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/events/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/session/manage/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/settings-data/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/shutdown/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/skill-health/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/steer/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/input/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/resize/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/sessions/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/stream/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/terminal/upload/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/undo/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/update/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/api/visualizer/route-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-d07a2c023f1aef1e.js +0 -1
- package/dist/web/standalone/.next/static/css/123c0bb039697968.css +0 -1
- package/src/resources/extensions/gsd/auto-observability.ts +0 -74
- package/src/resources/extensions/gsd/observability-validator.ts +0 -456
- package/src/resources/extensions/gsd/roadmap-mutations.ts +0 -134
- package/src/resources/extensions/gsd/tests/doctor-task-done-missing-summary-slice-loop.test.ts +0 -174
- package/src/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -474
- /package/dist/web/standalone/.next/static/{VvclDCW6TAWjEyLU-EYL1 → fOnWQBjWXMKUs4bqTg530}/_ssgManifest.js +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Tests for atomic task closeout (#1650):
|
|
3
|
-
*
|
|
4
|
-
*
|
|
3
|
+
* Doctor no longer does checkbox reconciliation (reconciliation removed in S06).
|
|
4
|
+
* This file retains only the non-reconciliation behavior tests.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { mkdirSync, writeFileSync, readFileSync, rmSync, existsSync } from "node:fs";
|
|
@@ -10,7 +10,6 @@ import { tmpdir } from "node:os";
|
|
|
10
10
|
import test from "node:test";
|
|
11
11
|
import assert from "node:assert/strict";
|
|
12
12
|
import { runGSDDoctor } from "../doctor.ts";
|
|
13
|
-
import { markTaskUndoneInPlan } from "../roadmap-mutations.ts";
|
|
14
13
|
|
|
15
14
|
function makeTmp(name: string): string {
|
|
16
15
|
const dir = join(tmpdir(), `atomic-closeout-${name}-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
@@ -18,121 +17,6 @@ function makeTmp(name: string): string {
|
|
|
18
17
|
return dir;
|
|
19
18
|
}
|
|
20
19
|
|
|
21
|
-
// ── markTaskUndoneInPlan ─────────────────────────────────────────────────────
|
|
22
|
-
|
|
23
|
-
test("markTaskUndoneInPlan unchecks a checked task", () => {
|
|
24
|
-
const base = makeTmp("uncheck");
|
|
25
|
-
const planPath = join(base, "PLAN.md");
|
|
26
|
-
writeFileSync(planPath, `# S01: Demo
|
|
27
|
-
|
|
28
|
-
## Tasks
|
|
29
|
-
|
|
30
|
-
- [x] **T01: First task** \`est:5m\`
|
|
31
|
-
- [ ] **T02: Second task** \`est:10m\`
|
|
32
|
-
`);
|
|
33
|
-
|
|
34
|
-
const changed = markTaskUndoneInPlan(base, planPath, "T01");
|
|
35
|
-
assert.ok(changed, "should return true when plan was modified");
|
|
36
|
-
|
|
37
|
-
const content = readFileSync(planPath, "utf-8");
|
|
38
|
-
assert.ok(content.includes("- [ ] **T01:"), "T01 should be unchecked");
|
|
39
|
-
assert.ok(content.includes("- [ ] **T02:"), "T02 should remain unchecked");
|
|
40
|
-
|
|
41
|
-
rmSync(base, { recursive: true, force: true });
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
test("markTaskUndoneInPlan is idempotent on already-unchecked task", () => {
|
|
45
|
-
const base = makeTmp("uncheck-noop");
|
|
46
|
-
const planPath = join(base, "PLAN.md");
|
|
47
|
-
writeFileSync(planPath, `# S01: Demo
|
|
48
|
-
|
|
49
|
-
## Tasks
|
|
50
|
-
|
|
51
|
-
- [ ] **T01: First task** \`est:5m\`
|
|
52
|
-
`);
|
|
53
|
-
|
|
54
|
-
const changed = markTaskUndoneInPlan(base, planPath, "T01");
|
|
55
|
-
assert.ok(!changed, "should return false when no change needed");
|
|
56
|
-
|
|
57
|
-
rmSync(base, { recursive: true, force: true });
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
test("markTaskUndoneInPlan handles indented checkboxes", () => {
|
|
61
|
-
const base = makeTmp("uncheck-indent");
|
|
62
|
-
const planPath = join(base, "PLAN.md");
|
|
63
|
-
writeFileSync(planPath, `# S01: Demo
|
|
64
|
-
|
|
65
|
-
## Tasks
|
|
66
|
-
|
|
67
|
-
- [x] **T01: First task** \`est:5m\`
|
|
68
|
-
`);
|
|
69
|
-
|
|
70
|
-
const changed = markTaskUndoneInPlan(base, planPath, "T01");
|
|
71
|
-
assert.ok(changed, "should handle indented checkboxes");
|
|
72
|
-
|
|
73
|
-
const content = readFileSync(planPath, "utf-8");
|
|
74
|
-
assert.ok(content.includes("[ ] **T01:"), "T01 should be unchecked");
|
|
75
|
-
|
|
76
|
-
rmSync(base, { recursive: true, force: true });
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
// ── Doctor: task_done_missing_summary unchecks instead of stubbing ────────────
|
|
80
|
-
|
|
81
|
-
test("doctor unchecks task when checkbox is marked but summary is missing", async () => {
|
|
82
|
-
const base = makeTmp("doctor-uncheck");
|
|
83
|
-
const gsd = join(base, ".gsd");
|
|
84
|
-
const m = join(gsd, "milestones", "M001");
|
|
85
|
-
const s = join(m, "slices", "S01");
|
|
86
|
-
const t = join(s, "tasks");
|
|
87
|
-
mkdirSync(t, { recursive: true });
|
|
88
|
-
|
|
89
|
-
writeFileSync(join(m, "M001-ROADMAP.md"), `# M001: Test
|
|
90
|
-
|
|
91
|
-
## Slices
|
|
92
|
-
|
|
93
|
-
- [ ] **S01: Test Slice** \`risk:low\` \`depends:[]\`
|
|
94
|
-
> Demo
|
|
95
|
-
`);
|
|
96
|
-
|
|
97
|
-
// Task is marked [x] in plan but has no summary file
|
|
98
|
-
writeFileSync(join(s, "S01-PLAN.md"), `# S01: Test Slice
|
|
99
|
-
|
|
100
|
-
**Goal:** test
|
|
101
|
-
|
|
102
|
-
## Tasks
|
|
103
|
-
|
|
104
|
-
- [x] **T01: Do stuff** \`est:5m\`
|
|
105
|
-
- [ ] **T02: Other stuff** \`est:5m\`
|
|
106
|
-
`);
|
|
107
|
-
|
|
108
|
-
// T02 has no summary either, but it's unchecked — should be left alone
|
|
109
|
-
|
|
110
|
-
// Run doctor in diagnose mode first
|
|
111
|
-
const diagnoseReport = await runGSDDoctor(base, { fix: false });
|
|
112
|
-
const issue = diagnoseReport.issues.find(i => i.code === "task_done_missing_summary");
|
|
113
|
-
assert.ok(issue, "should detect task_done_missing_summary");
|
|
114
|
-
assert.equal(issue!.severity, "error");
|
|
115
|
-
|
|
116
|
-
// Run doctor in fix mode
|
|
117
|
-
const fixReport = await runGSDDoctor(base, { fix: true });
|
|
118
|
-
const fixApplied = fixReport.fixesApplied.some(f => f.includes("unchecked T01"));
|
|
119
|
-
assert.ok(fixApplied, "should have unchecked T01 in the fix log");
|
|
120
|
-
|
|
121
|
-
// Verify the plan now has T01 unchecked
|
|
122
|
-
const planContent = readFileSync(join(s, "S01-PLAN.md"), "utf-8");
|
|
123
|
-
assert.ok(planContent.includes("- [ ] **T01:"), "T01 should be unchecked after doctor fix");
|
|
124
|
-
assert.ok(planContent.includes("- [ ] **T02:"), "T02 should remain unchecked");
|
|
125
|
-
|
|
126
|
-
// Verify no stub summary was created
|
|
127
|
-
const stubPath = join(t, "T01-SUMMARY.md");
|
|
128
|
-
assert.ok(
|
|
129
|
-
!existsSync(stubPath),
|
|
130
|
-
"should NOT create a stub summary — task should re-execute instead",
|
|
131
|
-
);
|
|
132
|
-
|
|
133
|
-
rmSync(base, { recursive: true, force: true });
|
|
134
|
-
});
|
|
135
|
-
|
|
136
20
|
test("doctor does not touch task with checkbox AND summary both present", async () => {
|
|
137
21
|
const base = makeTmp("doctor-ok");
|
|
138
22
|
const gsd = join(base, ".gsd");
|
|
@@ -173,8 +57,12 @@ Done.
|
|
|
173
57
|
`);
|
|
174
58
|
|
|
175
59
|
const report = await runGSDDoctor(base, { fix: true });
|
|
176
|
-
|
|
177
|
-
|
|
60
|
+
// Doctor should not produce any task_done_missing_summary issue (code removed)
|
|
61
|
+
const hasOldCode = report.issues.some(i =>
|
|
62
|
+
i.code === "task_done_missing_summary" as any ||
|
|
63
|
+
i.code === "task_summary_without_done_checkbox" as any
|
|
64
|
+
);
|
|
65
|
+
assert.ok(!hasOldCode, "should not produce removed reconciliation issue codes");
|
|
178
66
|
|
|
179
67
|
// Plan should still have T01 checked
|
|
180
68
|
const planContent = readFileSync(join(s, "S01-PLAN.md"), "utf-8");
|
|
@@ -366,8 +366,6 @@ function makeMockDeps(
|
|
|
366
366
|
runPreDispatchHooks: () => ({ firedHooks: [], action: "proceed" }),
|
|
367
367
|
getPriorSliceCompletionBlocker: () => null,
|
|
368
368
|
getMainBranch: () => "main",
|
|
369
|
-
collectObservabilityWarnings: async () => [],
|
|
370
|
-
buildObservabilityRepairBlock: () => null,
|
|
371
369
|
closeoutUnit: async () => {},
|
|
372
370
|
verifyExpectedArtifact: () => true,
|
|
373
371
|
clearUnitRuntimeRecord: () => {},
|
|
@@ -2069,7 +2067,7 @@ test("autoLoop stops when worktree has no .git for execute-task (#1833)", async
|
|
|
2069
2067
|
);
|
|
2070
2068
|
});
|
|
2071
2069
|
|
|
2072
|
-
test("autoLoop
|
|
2070
|
+
test("autoLoop warns but proceeds for greenfield project (no project files) (#1833)", async () => {
|
|
2073
2071
|
_resetPendingResolve();
|
|
2074
2072
|
|
|
2075
2073
|
const ctx = makeMockCtx();
|
|
@@ -2078,10 +2076,17 @@ test("autoLoop stops when worktree has no project files for execute-task (#1833)
|
|
|
2078
2076
|
const pi = makeMockPi();
|
|
2079
2077
|
|
|
2080
2078
|
const notifications: string[] = [];
|
|
2081
|
-
ctx.ui.notify = (msg: string) => { notifications.push(msg); };
|
|
2082
|
-
|
|
2083
2079
|
const s = makeLoopSession({ basePath: "/tmp/empty-worktree" });
|
|
2084
2080
|
|
|
2081
|
+
ctx.ui.notify = (msg: string) => {
|
|
2082
|
+
notifications.push(msg);
|
|
2083
|
+
// Terminate the loop after the greenfield warning fires,
|
|
2084
|
+
// so we don't hang waiting for dispatch resolution.
|
|
2085
|
+
if (msg.includes("greenfield")) {
|
|
2086
|
+
s.active = false;
|
|
2087
|
+
}
|
|
2088
|
+
};
|
|
2089
|
+
|
|
2085
2090
|
const deps = makeMockDeps({
|
|
2086
2091
|
deriveState: async () => {
|
|
2087
2092
|
deps.callLog.push("deriveState");
|
|
@@ -2100,15 +2105,19 @@ test("autoLoop stops when worktree has no project files for execute-task (#1833)
|
|
|
2100
2105
|
|
|
2101
2106
|
await autoLoop(ctx, pi, s, deps);
|
|
2102
2107
|
|
|
2108
|
+
// Should NOT have stopped auto-mode due to health check — greenfield is allowed
|
|
2109
|
+
const stoppedForHealth = notifications.find(
|
|
2110
|
+
(n) => n.includes("Worktree health check failed"),
|
|
2111
|
+
);
|
|
2103
2112
|
assert.ok(
|
|
2104
|
-
|
|
2105
|
-
"should stop
|
|
2113
|
+
!stoppedForHealth,
|
|
2114
|
+
"should not stop with health check failure for greenfield project",
|
|
2106
2115
|
);
|
|
2107
|
-
const
|
|
2108
|
-
(n) => n.includes("
|
|
2116
|
+
const greenfieldWarning = notifications.find(
|
|
2117
|
+
(n) => n.includes("no recognized project files") && n.includes("greenfield"),
|
|
2109
2118
|
);
|
|
2110
2119
|
assert.ok(
|
|
2111
|
-
|
|
2112
|
-
"should
|
|
2120
|
+
greenfieldWarning,
|
|
2121
|
+
"should warn about greenfield project (no project files)",
|
|
2113
2122
|
);
|
|
2114
2123
|
});
|
|
@@ -33,7 +33,7 @@ test("auto-preflight scopes to active milestone, ignoring historical", async ()
|
|
|
33
33
|
|
|
34
34
|
const historicalReport = await runGSDDoctor(tmpBase, { fix: false });
|
|
35
35
|
const historicalWarnings = historicalReport.issues.filter(issue => issue.unitId.startsWith("M001/S01") && issue.severity === "warning");
|
|
36
|
-
assert.
|
|
36
|
+
assert.equal(historicalWarnings.length, 0, "completed historical milestone produces no checkbox/file-mismatch warnings");
|
|
37
37
|
} finally {
|
|
38
38
|
rmSync(tmpBase, { recursive: true, force: true });
|
|
39
39
|
}
|
|
@@ -13,9 +13,18 @@ import {
|
|
|
13
13
|
selfHealRuntimeRecords,
|
|
14
14
|
hasImplementationArtifacts,
|
|
15
15
|
} from "../auto-recovery.ts";
|
|
16
|
-
import { parseRoadmap,
|
|
16
|
+
import { parseRoadmap, parsePlan } from "../parsers-legacy.ts";
|
|
17
|
+
import { parseTaskPlanFile, clearParseCache } from "../files.ts";
|
|
17
18
|
import { invalidateAllCaches } from "../cache.ts";
|
|
18
19
|
import { deriveState, invalidateStateCache } from "../state.ts";
|
|
20
|
+
import {
|
|
21
|
+
openDatabase,
|
|
22
|
+
closeDatabase,
|
|
23
|
+
insertMilestone,
|
|
24
|
+
insertSlice,
|
|
25
|
+
insertTask,
|
|
26
|
+
} from "../gsd-db.ts";
|
|
27
|
+
import { renderPlanFromDb } from "../markdown-renderer.ts";
|
|
19
28
|
|
|
20
29
|
function makeTmpBase(): string {
|
|
21
30
|
const base = join(tmpdir(), `gsd-test-${randomUUID()}`);
|
|
@@ -158,8 +167,7 @@ test("buildLoopRemediationSteps returns steps for execute-task", () => {
|
|
|
158
167
|
const steps = buildLoopRemediationSteps("execute-task", "M001/S01/T01", base);
|
|
159
168
|
assert.ok(steps);
|
|
160
169
|
assert.ok(steps!.includes("T01"));
|
|
161
|
-
assert.ok(steps!.includes("gsd
|
|
162
|
-
assert.ok(steps!.includes("[x]"));
|
|
170
|
+
assert.ok(steps!.includes("gsd undo-task"));
|
|
163
171
|
} finally {
|
|
164
172
|
cleanup(base);
|
|
165
173
|
}
|
|
@@ -171,7 +179,7 @@ test("buildLoopRemediationSteps returns steps for plan-slice", () => {
|
|
|
171
179
|
const steps = buildLoopRemediationSteps("plan-slice", "M001/S01", base);
|
|
172
180
|
assert.ok(steps);
|
|
173
181
|
assert.ok(steps!.includes("PLAN"));
|
|
174
|
-
assert.ok(steps!.includes("gsd
|
|
182
|
+
assert.ok(steps!.includes("gsd recover"));
|
|
175
183
|
} finally {
|
|
176
184
|
cleanup(base);
|
|
177
185
|
}
|
|
@@ -183,7 +191,7 @@ test("buildLoopRemediationSteps returns steps for complete-slice", () => {
|
|
|
183
191
|
const steps = buildLoopRemediationSteps("complete-slice", "M001/S01", base);
|
|
184
192
|
assert.ok(steps);
|
|
185
193
|
assert.ok(steps!.includes("S01"));
|
|
186
|
-
assert.ok(steps!.includes("
|
|
194
|
+
assert.ok(steps!.includes("gsd reset-slice"));
|
|
187
195
|
} finally {
|
|
188
196
|
cleanup(base);
|
|
189
197
|
}
|
|
@@ -471,6 +479,143 @@ test("verifyExpectedArtifact execute-task passes for heading-style plan entry (#
|
|
|
471
479
|
}
|
|
472
480
|
});
|
|
473
481
|
|
|
482
|
+
test("verifyExpectedArtifact plan-slice passes for rendered slice/task plan artifacts from DB", async () => {
|
|
483
|
+
const base = makeTmpBase();
|
|
484
|
+
const dbPath = join(base, ".gsd", "gsd.db");
|
|
485
|
+
openDatabase(dbPath);
|
|
486
|
+
try {
|
|
487
|
+
insertMilestone({ id: "M001", title: "Milestone", status: "active" });
|
|
488
|
+
insertSlice({
|
|
489
|
+
id: "S01",
|
|
490
|
+
milestoneId: "M001",
|
|
491
|
+
title: "Rendered slice",
|
|
492
|
+
status: "pending",
|
|
493
|
+
demo: "Rendered plan artifacts exist.",
|
|
494
|
+
planning: {
|
|
495
|
+
goal: "Render plans from DB rows.",
|
|
496
|
+
successCriteria: "- Slice plan parses\n- Task plan files exist on disk",
|
|
497
|
+
proofLevel: "integration",
|
|
498
|
+
integrationClosure: "DB rows are the source of truth for PLAN artifacts.",
|
|
499
|
+
observabilityImpact: "- Recovery verification fails if a task plan file is missing",
|
|
500
|
+
},
|
|
501
|
+
});
|
|
502
|
+
insertTask({
|
|
503
|
+
id: "T01",
|
|
504
|
+
sliceId: "S01",
|
|
505
|
+
milestoneId: "M001",
|
|
506
|
+
title: "Render plan",
|
|
507
|
+
status: "pending",
|
|
508
|
+
planning: {
|
|
509
|
+
description: "Create the slice plan from DB state.",
|
|
510
|
+
estimate: "30m",
|
|
511
|
+
files: ["src/resources/extensions/gsd/markdown-renderer.ts"],
|
|
512
|
+
verify: "node --test markdown-renderer.test.ts",
|
|
513
|
+
inputs: ["src/resources/extensions/gsd/gsd-db.ts"],
|
|
514
|
+
expectedOutput: ["src/resources/extensions/gsd/tests/markdown-renderer.test.ts"],
|
|
515
|
+
observabilityImpact: "Renderer tests cover the failure mode.",
|
|
516
|
+
},
|
|
517
|
+
});
|
|
518
|
+
insertTask({
|
|
519
|
+
id: "T02",
|
|
520
|
+
sliceId: "S01",
|
|
521
|
+
milestoneId: "M001",
|
|
522
|
+
title: "Verify recovery",
|
|
523
|
+
status: "pending",
|
|
524
|
+
planning: {
|
|
525
|
+
description: "Prove task plan files remain present for recovery.",
|
|
526
|
+
estimate: "20m",
|
|
527
|
+
files: ["src/resources/extensions/gsd/auto-recovery.ts"],
|
|
528
|
+
verify: "node --test auto-recovery.test.ts",
|
|
529
|
+
inputs: ["src/resources/extensions/gsd/auto-recovery.ts"],
|
|
530
|
+
expectedOutput: ["src/resources/extensions/gsd/tests/auto-recovery.test.ts"],
|
|
531
|
+
observabilityImpact: "Missing plan files surface as explicit verification failures.",
|
|
532
|
+
},
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
const rendered = await renderPlanFromDb(base, "M001", "S01");
|
|
536
|
+
assert.ok(existsSync(rendered.planPath), "renderPlanFromDb should write the slice plan");
|
|
537
|
+
assert.equal(rendered.taskPlanPaths.length, 2, "renderPlanFromDb should render one task plan per task");
|
|
538
|
+
|
|
539
|
+
const planContent = readFileSync(rendered.planPath, "utf-8");
|
|
540
|
+
const parsedPlan = parsePlan(planContent);
|
|
541
|
+
assert.equal(parsedPlan.tasks.length, 2, "rendered slice plan should parse into task entries");
|
|
542
|
+
|
|
543
|
+
const taskPlanContent = readFileSync(rendered.taskPlanPaths[0], "utf-8");
|
|
544
|
+
const taskPlan = parseTaskPlanFile(taskPlanContent);
|
|
545
|
+
assert.deepEqual(taskPlan.frontmatter.skills_used, [], "rendered task plans should use conservative empty skills_used");
|
|
546
|
+
|
|
547
|
+
const result = verifyExpectedArtifact("plan-slice", "M001/S01", base);
|
|
548
|
+
assert.equal(result, true, "plan-slice verification should pass when rendered task plan files exist");
|
|
549
|
+
} finally {
|
|
550
|
+
closeDatabase();
|
|
551
|
+
cleanup(base);
|
|
552
|
+
}
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
test("verifyExpectedArtifact plan-slice fails after deleting a rendered task plan file", async () => {
|
|
556
|
+
const base = makeTmpBase();
|
|
557
|
+
const dbPath = join(base, ".gsd", "gsd.db");
|
|
558
|
+
openDatabase(dbPath);
|
|
559
|
+
try {
|
|
560
|
+
insertMilestone({ id: "M001", title: "Milestone", status: "active" });
|
|
561
|
+
insertSlice({
|
|
562
|
+
id: "S01",
|
|
563
|
+
milestoneId: "M001",
|
|
564
|
+
title: "Rendered slice",
|
|
565
|
+
status: "pending",
|
|
566
|
+
demo: "Rendered plan artifacts exist.",
|
|
567
|
+
planning: {
|
|
568
|
+
goal: "Render plans from DB rows.",
|
|
569
|
+
successCriteria: "- Slice plan parses\n- Task plan files exist on disk",
|
|
570
|
+
proofLevel: "integration",
|
|
571
|
+
integrationClosure: "DB rows are the source of truth for PLAN artifacts.",
|
|
572
|
+
observabilityImpact: "- Recovery verification fails if a task plan file is missing",
|
|
573
|
+
},
|
|
574
|
+
});
|
|
575
|
+
insertTask({
|
|
576
|
+
id: "T01",
|
|
577
|
+
sliceId: "S01",
|
|
578
|
+
milestoneId: "M001",
|
|
579
|
+
title: "Render plan",
|
|
580
|
+
status: "pending",
|
|
581
|
+
planning: {
|
|
582
|
+
description: "Create the slice plan from DB state.",
|
|
583
|
+
estimate: "30m",
|
|
584
|
+
files: ["src/resources/extensions/gsd/markdown-renderer.ts"],
|
|
585
|
+
verify: "node --test markdown-renderer.test.ts",
|
|
586
|
+
inputs: ["src/resources/extensions/gsd/gsd-db.ts"],
|
|
587
|
+
expectedOutput: ["src/resources/extensions/gsd/tests/markdown-renderer.test.ts"],
|
|
588
|
+
observabilityImpact: "Renderer tests cover the failure mode.",
|
|
589
|
+
},
|
|
590
|
+
});
|
|
591
|
+
insertTask({
|
|
592
|
+
id: "T02",
|
|
593
|
+
sliceId: "S01",
|
|
594
|
+
milestoneId: "M001",
|
|
595
|
+
title: "Verify recovery",
|
|
596
|
+
status: "pending",
|
|
597
|
+
planning: {
|
|
598
|
+
description: "Prove task plan files remain present for recovery.",
|
|
599
|
+
estimate: "20m",
|
|
600
|
+
files: ["src/resources/extensions/gsd/auto-recovery.ts"],
|
|
601
|
+
verify: "node --test auto-recovery.test.ts",
|
|
602
|
+
inputs: ["src/resources/extensions/gsd/auto-recovery.ts"],
|
|
603
|
+
expectedOutput: ["src/resources/extensions/gsd/tests/auto-recovery.test.ts"],
|
|
604
|
+
observabilityImpact: "Missing plan files surface as explicit verification failures.",
|
|
605
|
+
},
|
|
606
|
+
});
|
|
607
|
+
|
|
608
|
+
const rendered = await renderPlanFromDb(base, "M001", "S01");
|
|
609
|
+
rmSync(rendered.taskPlanPaths[1]);
|
|
610
|
+
|
|
611
|
+
const result = verifyExpectedArtifact("plan-slice", "M001/S01", base);
|
|
612
|
+
assert.equal(result, false, "plan-slice verification should fail when a rendered task plan file is removed");
|
|
613
|
+
} finally {
|
|
614
|
+
closeDatabase();
|
|
615
|
+
cleanup(base);
|
|
616
|
+
}
|
|
617
|
+
});
|
|
618
|
+
|
|
474
619
|
// ─── selfHealRuntimeRecords — worktree base path (#769) ──────────────────
|
|
475
620
|
|
|
476
621
|
test("selfHealRuntimeRecords clears stale dispatched records (#769)", async () => {
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* auto-stash-merge.test.ts — Regression tests for #2151.
|
|
3
|
+
*
|
|
4
|
+
* Tests that mergeMilestoneToMain auto-stashes dirty files before squash merge,
|
|
5
|
+
* and that nativeMergeSquash returns dirty filenames from git stderr.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import test from "node:test";
|
|
9
|
+
import assert from "node:assert/strict";
|
|
10
|
+
import { mkdtempSync, mkdirSync, writeFileSync, rmSync, existsSync, readFileSync, realpathSync } from "node:fs";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import { tmpdir } from "node:os";
|
|
13
|
+
import { execSync } from "node:child_process";
|
|
14
|
+
|
|
15
|
+
import { createAutoWorktree, mergeMilestoneToMain } from "../auto-worktree.ts";
|
|
16
|
+
import { nativeMergeSquash } from "../native-git-bridge.ts";
|
|
17
|
+
|
|
18
|
+
function run(cmd: string, cwd: string): string {
|
|
19
|
+
return execSync(cmd, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function createTempRepo(): string {
|
|
23
|
+
const dir = realpathSync(mkdtempSync(join(tmpdir(), "wt-autostash-test-")));
|
|
24
|
+
run("git init", dir);
|
|
25
|
+
run("git config user.email test@test.com", dir);
|
|
26
|
+
run("git config user.name Test", dir);
|
|
27
|
+
writeFileSync(join(dir, "README.md"), "# test\n");
|
|
28
|
+
mkdirSync(join(dir, ".gsd"), { recursive: true });
|
|
29
|
+
writeFileSync(join(dir, ".gsd", "STATE.md"), "# State\n");
|
|
30
|
+
run("git add .", dir);
|
|
31
|
+
run("git commit -m init", dir);
|
|
32
|
+
run("git branch -M main", dir);
|
|
33
|
+
return dir;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function makeRoadmap(milestoneId: string, title: string, slices: Array<{ id: string; title: string }>): string {
|
|
37
|
+
const sliceLines = slices.map(s => `- [x] **${s.id}: ${s.title}**`).join("\n");
|
|
38
|
+
return `# ${milestoneId}: ${title}\n\n## Slices\n${sliceLines}\n`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function addSliceToMilestone(
|
|
42
|
+
repo: string, wtPath: string, milestoneId: string,
|
|
43
|
+
sliceId: string, sliceTitle: string,
|
|
44
|
+
commits: Array<{ file: string; content: string; message: string }>,
|
|
45
|
+
): void {
|
|
46
|
+
const normalizedPath = wtPath.replaceAll("\\", "/");
|
|
47
|
+
const worktreeName = normalizedPath.split("/").pop() || milestoneId;
|
|
48
|
+
const sliceBranch = `slice/${worktreeName}/${sliceId}`;
|
|
49
|
+
run(`git checkout -b "${sliceBranch}"`, wtPath);
|
|
50
|
+
for (const c of commits) {
|
|
51
|
+
writeFileSync(join(wtPath, c.file), c.content);
|
|
52
|
+
run("git add .", wtPath);
|
|
53
|
+
run(`git commit -m "${c.message}"`, wtPath);
|
|
54
|
+
}
|
|
55
|
+
const milestoneBranch = `milestone/${milestoneId}`;
|
|
56
|
+
run(`git checkout "${milestoneBranch}"`, wtPath);
|
|
57
|
+
run(`git merge --no-ff "${sliceBranch}" -m "merge ${sliceId}: ${sliceTitle}"`, wtPath);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
test("#2151 bug 1: auto-stash unblocks merge when unrelated files are dirty", () => {
|
|
61
|
+
const repo = createTempRepo();
|
|
62
|
+
try {
|
|
63
|
+
const wtPath = createAutoWorktree(repo, "M200");
|
|
64
|
+
|
|
65
|
+
addSliceToMilestone(repo, wtPath, "M200", "S01", "Stash test", [
|
|
66
|
+
{ file: "stash-test.ts", content: "export const stash = true;\n", message: "add stash test" },
|
|
67
|
+
]);
|
|
68
|
+
|
|
69
|
+
// Dirty an unrelated tracked file in the project root — this previously
|
|
70
|
+
// blocked the squash merge with "local changes would be overwritten".
|
|
71
|
+
writeFileSync(join(repo, "README.md"), "# modified locally\n");
|
|
72
|
+
|
|
73
|
+
const roadmap = makeRoadmap("M200", "Auto-stash test", [
|
|
74
|
+
{ id: "S01", title: "Stash test" },
|
|
75
|
+
]);
|
|
76
|
+
|
|
77
|
+
// Should succeed — the dirty README.md is auto-stashed before merge.
|
|
78
|
+
const result = mergeMilestoneToMain(repo, "M200", roadmap);
|
|
79
|
+
assert.ok(result.commitMessage.includes("feat(M200)"), "merge succeeds with dirty unrelated file");
|
|
80
|
+
assert.ok(existsSync(join(repo, "stash-test.ts")), "milestone code merged to main");
|
|
81
|
+
|
|
82
|
+
// Verify the dirty file was restored (stash popped).
|
|
83
|
+
const readmeContent = readFileSync(join(repo, "README.md"), "utf-8");
|
|
84
|
+
assert.equal(readmeContent.replace(/\r\n/g, "\n"), "# modified locally\n", "stash popped — dirty file restored after merge");
|
|
85
|
+
} finally {
|
|
86
|
+
try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM: git holds locks on .git files */ }
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("#2151 bug 2: nativeMergeSquash returns dirty filenames", async () => {
|
|
91
|
+
const { nativeMergeSquash } = await import("../native-git-bridge.ts");
|
|
92
|
+
const repo = createTempRepo();
|
|
93
|
+
try {
|
|
94
|
+
run("git checkout -b milestone/M210", repo);
|
|
95
|
+
writeFileSync(join(repo, "overlap.ts"), "export const overlap = true;\n");
|
|
96
|
+
run("git add .", repo);
|
|
97
|
+
run('git commit -m "add overlap"', repo);
|
|
98
|
+
run("git checkout main", repo);
|
|
99
|
+
|
|
100
|
+
// Create the same file as a dirty local change
|
|
101
|
+
writeFileSync(join(repo, "overlap.ts"), "// local dirty version\n");
|
|
102
|
+
|
|
103
|
+
const result = nativeMergeSquash(repo, "milestone/M210");
|
|
104
|
+
assert.equal(result.success, false, "merge reports failure");
|
|
105
|
+
assert.ok(
|
|
106
|
+
result.conflicts.includes("__dirty_working_tree__"),
|
|
107
|
+
"conflicts include __dirty_working_tree__ sentinel",
|
|
108
|
+
);
|
|
109
|
+
assert.ok(
|
|
110
|
+
Array.isArray(result.dirtyFiles) && result.dirtyFiles.length > 0,
|
|
111
|
+
"dirtyFiles array is populated",
|
|
112
|
+
);
|
|
113
|
+
assert.ok(
|
|
114
|
+
result.dirtyFiles!.includes("overlap.ts"),
|
|
115
|
+
"dirtyFiles includes the actual dirty file name",
|
|
116
|
+
);
|
|
117
|
+
} finally {
|
|
118
|
+
run("git checkout -- . 2>/dev/null || true", repo);
|
|
119
|
+
try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* Windows EPERM: git holds locks on .git files */ }
|
|
120
|
+
}
|
|
121
|
+
});
|
|
@@ -463,8 +463,11 @@ async function main(): Promise<void> {
|
|
|
463
463
|
assertTrue(existsSync(join(repo, "sync-test.ts")), "sync-test.ts on main after merge");
|
|
464
464
|
}
|
|
465
465
|
|
|
466
|
-
// ─── Test 11: #1738 Bug 1+2
|
|
467
|
-
|
|
466
|
+
// ─── Test 11: #1738 Bug 1+2 → #2151: dirty tree auto-stashed, merge succeeds ──
|
|
467
|
+
// Before #2151, a conflicting dirty file in the project root would cause
|
|
468
|
+
// the squash merge to reject. Now auto-stash moves it out of the way,
|
|
469
|
+
// the merge succeeds, and the user's local file goes to the stash.
|
|
470
|
+
console.log("\n=== #2151: dirty tree auto-stashed, merge succeeds ===");
|
|
468
471
|
{
|
|
469
472
|
const repo = freshRepo();
|
|
470
473
|
const wtPath = createAutoWorktree(repo, "M100");
|
|
@@ -473,31 +476,21 @@ async function main(): Promise<void> {
|
|
|
473
476
|
{ file: "e2e.ts", content: "export const e2e = true;\n", message: "add e2e" },
|
|
474
477
|
]);
|
|
475
478
|
|
|
479
|
+
// Create a conflicting local file — previously blocked the merge.
|
|
476
480
|
writeFileSync(join(repo, "e2e.ts"), "// conflicting local file\n");
|
|
477
481
|
|
|
478
482
|
const roadmap = makeRoadmap("M100", "E2E dirty tree", [
|
|
479
483
|
{ id: "S01", title: "E2E test" },
|
|
480
484
|
]);
|
|
481
485
|
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
mergeMilestoneToMain(repo, "M100", roadmap);
|
|
486
|
-
} catch (err: unknown) {
|
|
487
|
-
threw = true;
|
|
488
|
-
errorMsg = err instanceof Error ? err.message : String(err);
|
|
489
|
-
}
|
|
490
|
-
assertTrue(threw, "#1738 e2e: throws on dirty working tree");
|
|
491
|
-
assertTrue(
|
|
492
|
-
errorMsg.includes("dirty") || errorMsg.includes("untracked") || errorMsg.includes("overwritten"),
|
|
493
|
-
"#1738 e2e: error identifies dirty tree cause",
|
|
494
|
-
);
|
|
486
|
+
// With auto-stash (#2151), the merge should succeed.
|
|
487
|
+
const result = mergeMilestoneToMain(repo, "M100", roadmap);
|
|
488
|
+
assertTrue(result.commitMessage.includes("feat(M100)"), "#2151: merge succeeds after auto-stash");
|
|
495
489
|
|
|
496
|
-
|
|
497
|
-
assertTrue(
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
);
|
|
490
|
+
// The milestone code should be on main.
|
|
491
|
+
assertTrue(existsSync(join(repo, "e2e.ts")), "#2151: e2e.ts merged to main");
|
|
492
|
+
const content = readFileSync(join(repo, "e2e.ts"), "utf-8");
|
|
493
|
+
assertEq(content.replace(/\r\n/g, "\n"), "export const e2e = true;\n", "#2151: merged content is from milestone branch");
|
|
501
494
|
}
|
|
502
495
|
|
|
503
496
|
// ─── Test 12: Throw on unanchored code changes after empty commit (#1792) ─
|
|
@@ -771,6 +764,8 @@ async function main(): Promise<void> {
|
|
|
771
764
|
assertTrue(existsSync(join(repo, "real-code.ts")), "real-code.ts merged to main");
|
|
772
765
|
}
|
|
773
766
|
|
|
767
|
+
// Tests 20 and 21 for #2151 are in auto-stash-merge.test.ts (node:test format).
|
|
768
|
+
|
|
774
769
|
} finally {
|
|
775
770
|
process.chdir(savedCwd);
|
|
776
771
|
for (const d of tempDirs) {
|
|
@@ -158,7 +158,7 @@ async function main(): Promise<void> {
|
|
|
158
158
|
{
|
|
159
159
|
const { deriveState, isMilestoneComplete } = await import("../state.ts");
|
|
160
160
|
const { invalidateAllCaches: invalidateAllCachesDynamic } = await import("../cache.ts");
|
|
161
|
-
const { parseRoadmap } = await import("../
|
|
161
|
+
const { parseRoadmap } = await import("../parsers-legacy.ts");
|
|
162
162
|
|
|
163
163
|
const base = createFixtureBase();
|
|
164
164
|
try {
|