gsd-pi 2.43.0 → 2.44.0-dev.0b97ffd
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/README.md +30 -12
- 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-start.js +10 -0
- 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/workflow.js +5 -0
- 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 +18 -17
- 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 +18 -17
- 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/alS4hoANx0TK4UVZY27da/_buildManifest.js +1 -0
- 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/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/auth-storage.test.js +6 -8
- package/packages/pi-coding-agent/dist/core/auth-storage.test.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/runner.test.js +24 -26
- package/packages/pi-coding-agent/dist/core/extensions/runner.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/fs-utils.test.js +29 -48
- package/packages/pi-coding-agent/dist/core/fs-utils.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/resolve-config-value.test.js +34 -44
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
- 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/core/session-manager.test.js +30 -34
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.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/dist/resources/extensions/memory/storage.test.js +43 -47
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.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/auth-storage.test.ts +7 -7
- 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/runner.test.ts +26 -26
- 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/fs-utils.test.ts +31 -43
- 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/resolve-config-value.test.ts +40 -45
- package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
- 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/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
- 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-start.ts +14 -0
- 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/workflow.ts +8 -0
- 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/all-milestones-complete-merge.test.ts +99 -99
- package/src/resources/extensions/gsd/tests/atomic-task-closeout.test.ts +8 -120
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +14 -16
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +20 -11
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +600 -513
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +73 -75
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +34 -56
- 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 +540 -668
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +165 -143
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +29 -52
- package/src/resources/extensions/gsd/tests/captures.test.ts +148 -176
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +32 -33
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +141 -143
- package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +25 -25
- package/src/resources/extensions/gsd/tests/commands-logs.test.ts +81 -81
- package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +39 -60
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +375 -0
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +387 -0
- package/src/resources/extensions/gsd/tests/context-store.test.ts +354 -367
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +68 -72
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +92 -106
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +27 -35
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -2
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +390 -420
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +512 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +644 -84
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +78 -101
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +192 -227
- package/src/resources/extensions/gsd/tests/detection.test.ts +232 -278
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +30 -34
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +192 -161
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +43 -49
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +28 -32
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +30 -90
- package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +57 -80
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +164 -0
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +55 -153
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +104 -145
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +84 -106
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +53 -97
- package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
- package/src/resources/extensions/gsd/tests/doctor.test.ts +109 -149
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +48 -57
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +5 -7
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +278 -0
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +232 -0
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
- package/src/resources/extensions/gsd/tests/git-service.test.ts +291 -390
- package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +31 -39
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +63 -69
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +255 -264
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +108 -119
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +440 -0
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +229 -262
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +29 -37
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +81 -270
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +16 -18
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +41 -46
- package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +42 -53
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +75 -91
- 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 +1161 -0
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +101 -125
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +45 -54
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +429 -0
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +161 -170
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +125 -141
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +107 -131
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +89 -97
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +127 -164
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +35 -36
- package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
- package/src/resources/extensions/gsd/tests/parsers.test.ts +548 -612
- package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
- 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/post-unit-hooks.test.ts +77 -117
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +139 -0
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +93 -119
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +70 -82
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +42 -55
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +100 -0
- package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +45 -73
- package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +325 -0
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +28 -38
- package/src/resources/extensions/gsd/tests/replan-handler.test.ts +410 -0
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +73 -80
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -74
- package/src/resources/extensions/gsd/tests/requirements.test.ts +70 -75
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +44 -66
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +114 -181
- 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/rule-registry.test.ts +63 -65
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
- package/src/resources/extensions/gsd/tests/schema-v9-sequence.test.ts +176 -0
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +18 -25
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +37 -44
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +209 -0
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +63 -0
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +6 -8
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
- package/src/resources/extensions/gsd/tests/token-cost-display.test.ts +118 -0
- package/src/resources/extensions/gsd/tests/token-savings.test.ts +54 -56
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +23 -25
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +19 -13
- package/src/resources/extensions/gsd/tests/undo.test.ts +321 -1
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
- 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/visualizer-critical-path.test.ts +20 -22
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -86
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +41 -43
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +94 -96
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +27 -29
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +50 -52
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +10 -13
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +14 -18
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +38 -39
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +17 -21
- package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +12 -5
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +25 -30
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +15 -22
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +59 -66
- package/src/resources/extensions/gsd/tests/worktree.test.ts +44 -50
- 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 → alS4hoANx0TK4UVZY27da}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
2
3
|
import * as fs from 'node:fs';
|
|
3
4
|
import * as path from 'node:path';
|
|
4
5
|
import * as os from 'node:os';
|
|
@@ -16,7 +17,6 @@ import {
|
|
|
16
17
|
reconcileWorktreeDb,
|
|
17
18
|
} from '../gsd-db.ts';
|
|
18
19
|
|
|
19
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
20
20
|
|
|
21
21
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
22
22
|
// Helpers
|
|
@@ -91,18 +91,18 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
|
|
|
91
91
|
closeDatabase();
|
|
92
92
|
|
|
93
93
|
const result = copyWorktreeDb(srcDb, destDb);
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
assert.ok(result === true, 'copyWorktreeDb returns true on success');
|
|
95
|
+
assert.ok(fs.existsSync(destDb), 'dest DB file exists after copy');
|
|
96
96
|
|
|
97
97
|
// Open the copy and verify data is queryable
|
|
98
98
|
openDatabase(destDb);
|
|
99
99
|
const d = getDecisionById('D001');
|
|
100
|
-
|
|
101
|
-
|
|
100
|
+
assert.ok(d !== null, 'decision queryable in copied DB');
|
|
101
|
+
assert.deepStrictEqual(d?.choice, 'node:sqlite', 'decision data preserved in copy');
|
|
102
102
|
|
|
103
103
|
const r = getRequirementById('R001');
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
assert.ok(r !== null, 'requirement queryable in copied DB');
|
|
105
|
+
assert.deepStrictEqual(r?.description, 'Must store decisions', 'requirement data preserved in copy');
|
|
106
106
|
|
|
107
107
|
cleanup(srcDir, destDir);
|
|
108
108
|
}
|
|
@@ -123,9 +123,9 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
|
|
|
123
123
|
|
|
124
124
|
copyWorktreeDb(srcDb, destDb);
|
|
125
125
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
126
|
+
assert.ok(fs.existsSync(destDb), 'DB file copied');
|
|
127
|
+
assert.ok(!fs.existsSync(destDb + '-wal'), 'WAL file NOT copied');
|
|
128
|
+
assert.ok(!fs.existsSync(destDb + '-shm'), 'SHM file NOT copied');
|
|
129
129
|
|
|
130
130
|
cleanup(srcDir, destDir);
|
|
131
131
|
}
|
|
@@ -134,7 +134,7 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
|
|
|
134
134
|
{
|
|
135
135
|
const destDir = tempDir();
|
|
136
136
|
const result = copyWorktreeDb('/nonexistent/path/gsd.db', path.join(destDir, 'gsd.db'));
|
|
137
|
-
|
|
137
|
+
assert.deepStrictEqual(result, false, 'returns false for missing source');
|
|
138
138
|
cleanup(destDir);
|
|
139
139
|
}
|
|
140
140
|
|
|
@@ -149,8 +149,8 @@ console.log('\n=== worktree-db: copyWorktreeDb ===');
|
|
|
149
149
|
closeDatabase();
|
|
150
150
|
|
|
151
151
|
const result = copyWorktreeDb(srcDb, deepDest);
|
|
152
|
-
|
|
153
|
-
|
|
152
|
+
assert.ok(result === true, 'copyWorktreeDb succeeds with nested dest');
|
|
153
|
+
assert.ok(fs.existsSync(deepDest), 'DB file created at deeply nested path');
|
|
154
154
|
|
|
155
155
|
cleanup(srcDir, destDir);
|
|
156
156
|
}
|
|
@@ -192,10 +192,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
192
192
|
openDatabase(mainDb);
|
|
193
193
|
const result = reconcileWorktreeDb(mainDb, wtDb);
|
|
194
194
|
|
|
195
|
-
|
|
195
|
+
assert.ok(result.decisions > 0, 'decisions merged count > 0');
|
|
196
196
|
const d2 = getDecisionById('D002');
|
|
197
|
-
|
|
198
|
-
|
|
197
|
+
assert.ok(d2 !== null, 'D002 from worktree now in main');
|
|
198
|
+
assert.deepStrictEqual(d2?.choice, 'WAL', 'D002 data correct after merge');
|
|
199
199
|
|
|
200
200
|
cleanup(mainDir, wtDir);
|
|
201
201
|
}
|
|
@@ -231,10 +231,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
231
231
|
openDatabase(mainDb);
|
|
232
232
|
const result = reconcileWorktreeDb(mainDb, wtDb);
|
|
233
233
|
|
|
234
|
-
|
|
234
|
+
assert.ok(result.requirements > 0, 'requirements merged count > 0');
|
|
235
235
|
const r2 = getRequirementById('R002');
|
|
236
|
-
|
|
237
|
-
|
|
236
|
+
assert.ok(r2 !== null, 'R002 from worktree now in main');
|
|
237
|
+
assert.deepStrictEqual(r2?.description, 'Must be fast', 'R002 data correct after merge');
|
|
238
238
|
|
|
239
239
|
cleanup(mainDir, wtDir);
|
|
240
240
|
}
|
|
@@ -264,11 +264,11 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
264
264
|
openDatabase(mainDb);
|
|
265
265
|
const result = reconcileWorktreeDb(mainDb, wtDb);
|
|
266
266
|
|
|
267
|
-
|
|
267
|
+
assert.ok(result.artifacts > 0, 'artifacts merged count > 0');
|
|
268
268
|
const adapter = _getAdapter()!;
|
|
269
269
|
const row = adapter.prepare('SELECT * FROM artifacts WHERE path = ?').get('docs/api.md');
|
|
270
|
-
|
|
271
|
-
|
|
270
|
+
assert.ok(row !== null, 'artifact from worktree now in main');
|
|
271
|
+
assert.deepStrictEqual(row?.['artifact_type'], 'reference', 'artifact data correct after merge');
|
|
272
272
|
|
|
273
273
|
cleanup(mainDir, wtDir);
|
|
274
274
|
}
|
|
@@ -305,15 +305,15 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
305
305
|
openDatabase(mainDb);
|
|
306
306
|
const result = reconcileWorktreeDb(mainDb, wtDb);
|
|
307
307
|
|
|
308
|
-
|
|
309
|
-
|
|
308
|
+
assert.ok(result.conflicts.length > 0, 'conflicts detected');
|
|
309
|
+
assert.ok(
|
|
310
310
|
result.conflicts.some(c => c.includes('D001')),
|
|
311
311
|
'conflict mentions D001',
|
|
312
312
|
);
|
|
313
313
|
|
|
314
314
|
// Worktree-wins: D001 should now have worktree's value
|
|
315
315
|
const d1 = getDecisionById('D001');
|
|
316
|
-
|
|
316
|
+
assert.deepStrictEqual(d1?.choice, 'sql.js', 'worktree wins on conflict (INSERT OR REPLACE)');
|
|
317
317
|
|
|
318
318
|
cleanup(mainDir, wtDir);
|
|
319
319
|
}
|
|
@@ -326,10 +326,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
326
326
|
seedMainDb(mainDb);
|
|
327
327
|
|
|
328
328
|
const result = reconcileWorktreeDb(mainDb, '/nonexistent/worktree.db');
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
329
|
+
assert.deepStrictEqual(result.decisions, 0, 'no decisions merged for missing worktree DB');
|
|
330
|
+
assert.deepStrictEqual(result.requirements, 0, 'no requirements merged for missing worktree DB');
|
|
331
|
+
assert.deepStrictEqual(result.artifacts, 0, 'no artifacts merged for missing worktree DB');
|
|
332
|
+
assert.deepStrictEqual(result.conflicts.length, 0, 'no conflicts for missing worktree DB');
|
|
333
333
|
|
|
334
334
|
cleanup(mainDir);
|
|
335
335
|
}
|
|
@@ -366,9 +366,9 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
366
366
|
|
|
367
367
|
openDatabase(mainDb);
|
|
368
368
|
const result = reconcileWorktreeDb(mainDb, wtDb);
|
|
369
|
-
|
|
369
|
+
assert.ok(result.decisions > 0, 'reconciliation works with spaces in path');
|
|
370
370
|
const d3 = getDecisionById('D003');
|
|
371
|
-
|
|
371
|
+
assert.ok(d3 !== null, 'D003 merged from worktree with spaces in path');
|
|
372
372
|
|
|
373
373
|
cleanup(baseDir);
|
|
374
374
|
}
|
|
@@ -388,7 +388,7 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
388
388
|
reconcileWorktreeDb(mainDb, wtDb);
|
|
389
389
|
|
|
390
390
|
// Verify main DB is still fully usable after DETACH
|
|
391
|
-
|
|
391
|
+
assert.ok(isDbAvailable(), 'DB still available after reconciliation');
|
|
392
392
|
|
|
393
393
|
insertDecision({
|
|
394
394
|
id: 'D099',
|
|
@@ -403,8 +403,8 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
403
403
|
});
|
|
404
404
|
|
|
405
405
|
const d99 = getDecisionById('D099');
|
|
406
|
-
|
|
407
|
-
|
|
406
|
+
assert.ok(d99 !== null, 'can insert and query after reconciliation');
|
|
407
|
+
assert.deepStrictEqual(d99?.choice, 'works', 'post-reconcile data correct');
|
|
408
408
|
|
|
409
409
|
// Verify no "wt" database still attached
|
|
410
410
|
const adapter = _getAdapter()!;
|
|
@@ -415,7 +415,7 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
415
415
|
} catch {
|
|
416
416
|
// Expected — wt should be detached
|
|
417
417
|
}
|
|
418
|
-
|
|
418
|
+
assert.ok(!wtAccessible, 'wt database is detached after reconciliation');
|
|
419
419
|
|
|
420
420
|
cleanup(mainDir, wtDir);
|
|
421
421
|
}
|
|
@@ -436,11 +436,10 @@ console.log('\n=== worktree-db: reconcileWorktreeDb ===');
|
|
|
436
436
|
const result = reconcileWorktreeDb(mainDb, wtDb);
|
|
437
437
|
|
|
438
438
|
// Should still report counts for the existing rows (INSERT OR REPLACE touches them)
|
|
439
|
-
|
|
440
|
-
|
|
439
|
+
assert.ok(result.conflicts.length === 0, 'no conflicts when DBs are identical');
|
|
440
|
+
assert.ok(isDbAvailable(), 'DB usable after no-change reconciliation');
|
|
441
441
|
|
|
442
442
|
cleanup(mainDir, wtDir);
|
|
443
443
|
}
|
|
444
444
|
|
|
445
445
|
// ─── Final Report ──────────────────────────────────────────────────────────
|
|
446
|
-
report();
|
|
@@ -22,9 +22,9 @@ import {
|
|
|
22
22
|
import { getSliceBranchName } from "../worktree.ts";
|
|
23
23
|
import { abortAndReset } from "../git-self-heal.ts";
|
|
24
24
|
import { runGSDDoctor } from "../doctor.ts";
|
|
25
|
-
import {
|
|
25
|
+
import { describe, test } from 'node:test';
|
|
26
|
+
import assert from 'node:assert/strict';
|
|
26
27
|
|
|
27
|
-
const { assertEq, assertTrue, assertMatch, report } = createTestContext();
|
|
28
28
|
|
|
29
29
|
// ---- Helpers ----
|
|
30
30
|
|
|
@@ -80,7 +80,7 @@ function addSliceToMilestone(
|
|
|
80
80
|
run(`git merge --no-ff ${sliceBranch} -m "merge ${sliceId}"`, wtPath);
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
async
|
|
83
|
+
describe('worktree-e2e', async () => {
|
|
84
84
|
const savedCwd = process.cwd();
|
|
85
85
|
const tempDirs: string[] = [];
|
|
86
86
|
|
|
@@ -100,7 +100,7 @@ async function main(): Promise<void> {
|
|
|
100
100
|
// Create worktree for M001
|
|
101
101
|
const wtPath = createAutoWorktree(repo, "M001");
|
|
102
102
|
tempDirs.push(wtPath);
|
|
103
|
-
|
|
103
|
+
assert.ok(existsSync(wtPath), "worktree directory created");
|
|
104
104
|
|
|
105
105
|
// Add two slices with commits
|
|
106
106
|
addSliceToMilestone(repo, wtPath, "M001", "S01", "Add auth", [
|
|
@@ -124,19 +124,19 @@ async function main(): Promise<void> {
|
|
|
124
124
|
// Assert exactly one new commit on main
|
|
125
125
|
const mainLogAfter = run("git log --oneline main", repo);
|
|
126
126
|
const commitCountAfter = mainLogAfter.split("\n").length;
|
|
127
|
-
|
|
127
|
+
assert.deepStrictEqual(commitCountAfter, commitCountBefore + 1, "exactly one new commit on main");
|
|
128
128
|
|
|
129
129
|
// Commit message contains both slice titles
|
|
130
130
|
const lastCommitMsg = run("git log -1 --format=%B main", repo);
|
|
131
|
-
|
|
132
|
-
|
|
131
|
+
assert.match(lastCommitMsg, /Add auth/, "commit message contains S01 title");
|
|
132
|
+
assert.match(lastCommitMsg, /Add dashboard/, "commit message contains S02 title");
|
|
133
133
|
|
|
134
134
|
// Worktree directory removed
|
|
135
|
-
|
|
135
|
+
assert.ok(!existsSync(wtPath), "worktree directory removed after merge");
|
|
136
136
|
|
|
137
137
|
// Milestone branch deleted
|
|
138
138
|
const branches = run("git branch", repo);
|
|
139
|
-
|
|
139
|
+
assert.ok(!branches.includes("milestone/M001"), "milestone branch deleted");
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
// ================================================================
|
|
@@ -159,11 +159,11 @@ async function main(): Promise<void> {
|
|
|
159
159
|
|
|
160
160
|
// Trigger merge conflict
|
|
161
161
|
try { run("git merge feature", repo); } catch { /* expected */ }
|
|
162
|
-
|
|
162
|
+
assert.ok(existsSync(join(repo, ".git", "MERGE_HEAD")), "MERGE_HEAD exists before abort");
|
|
163
163
|
|
|
164
164
|
const abortResult = abortAndReset(repo);
|
|
165
|
-
|
|
166
|
-
|
|
165
|
+
assert.ok(!existsSync(join(repo, ".git", "MERGE_HEAD")), "MERGE_HEAD removed after abort");
|
|
166
|
+
assert.ok(abortResult.cleaned.length > 0, "abortAndReset reports cleaned items");
|
|
167
167
|
}
|
|
168
168
|
|
|
169
169
|
// ================================================================
|
|
@@ -211,19 +211,19 @@ _None_
|
|
|
211
211
|
// Detect
|
|
212
212
|
const detect = await runGSDDoctor(repo, { isolationMode: "worktree" });
|
|
213
213
|
const orphanIssues = detect.issues.filter(i => i.code === "orphaned_auto_worktree");
|
|
214
|
-
|
|
215
|
-
|
|
214
|
+
assert.ok(orphanIssues.length > 0, "doctor detects orphaned worktree");
|
|
215
|
+
assert.deepStrictEqual(orphanIssues[0]?.unitId, "M001", "orphaned worktree unitId is M001");
|
|
216
216
|
|
|
217
217
|
// Fix
|
|
218
218
|
const fixed = await runGSDDoctor(repo, { fix: true, isolationMode: "worktree" });
|
|
219
|
-
|
|
219
|
+
assert.ok(
|
|
220
220
|
fixed.fixesApplied.some(f => f.includes("removed orphaned worktree")),
|
|
221
221
|
"doctor fix removes orphaned worktree",
|
|
222
222
|
);
|
|
223
223
|
|
|
224
224
|
// Verify gone
|
|
225
225
|
const wtList = run("git worktree list", repo);
|
|
226
|
-
|
|
226
|
+
assert.ok(!wtList.includes("milestone/M001"), "worktree gone after doctor fix");
|
|
227
227
|
}
|
|
228
228
|
} else {
|
|
229
229
|
console.log("\n=== Doctor: orphaned worktree detection (skipped on Windows) ===");
|
|
@@ -234,8 +234,4 @@ _None_
|
|
|
234
234
|
try { rmSync(d, { recursive: true, force: true }); } catch { /* ignore */ }
|
|
235
235
|
}
|
|
236
236
|
}
|
|
237
|
-
|
|
238
|
-
report();
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
main();
|
|
237
|
+
});
|
|
@@ -36,18 +36,24 @@ function createGitRepo(): string {
|
|
|
36
36
|
* Returns true when the directory would PASS the health check (dispatch
|
|
37
37
|
* proceeds), false when it would FAIL (dispatch blocked).
|
|
38
38
|
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
39
|
+
* The only hard gate is .git — project files are advisory (greenfield
|
|
40
|
+
* projects won't have them yet). Returns { pass, greenfield } to
|
|
41
|
+
* distinguish "pass with project files" from "pass as greenfield".
|
|
41
42
|
*/
|
|
42
43
|
function wouldPassHealthCheck(basePath: string, existsSyncFn: (p: string) => boolean): boolean {
|
|
43
44
|
const hasGit = existsSyncFn(join(basePath, ".git"));
|
|
44
45
|
if (!hasGit) return false;
|
|
45
46
|
|
|
47
|
+
// .git is sufficient — greenfield projects proceed with a warning
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** Whether the directory has recognized project files (used for greenfield detection). */
|
|
52
|
+
function hasRecognizedProjectFiles(basePath: string, existsSyncFn: (p: string) => boolean): boolean {
|
|
46
53
|
for (const file of PROJECT_FILES) {
|
|
47
54
|
if (existsSyncFn(join(basePath, file))) return true;
|
|
48
55
|
}
|
|
49
56
|
if (existsSyncFn(join(basePath, "src"))) return true;
|
|
50
|
-
|
|
51
57
|
return false;
|
|
52
58
|
}
|
|
53
59
|
|
|
@@ -118,8 +124,9 @@ describe("health check with git repo", () => {
|
|
|
118
124
|
assert.ok(wouldPassHealthCheck(dir, existsSync), "src/-only project should pass health check");
|
|
119
125
|
});
|
|
120
126
|
|
|
121
|
-
test("health check
|
|
122
|
-
assert.ok(
|
|
127
|
+
test("health check passes for empty git repo (greenfield project)", () => {
|
|
128
|
+
assert.ok(wouldPassHealthCheck(dir, existsSync), "empty git repo should pass health check (greenfield)");
|
|
129
|
+
assert.ok(!hasRecognizedProjectFiles(dir, existsSync), "empty git repo has no recognized project files");
|
|
123
130
|
});
|
|
124
131
|
});
|
|
125
132
|
|
|
@@ -12,9 +12,9 @@ import { execSync } from "node:child_process";
|
|
|
12
12
|
|
|
13
13
|
import { getWorktreeHealth, formatWorktreeStatusLine } from "../worktree-health.ts";
|
|
14
14
|
import { listWorktrees } from "../worktree-manager.ts";
|
|
15
|
-
import {
|
|
15
|
+
import { describe, test } from 'node:test';
|
|
16
|
+
import assert from 'node:assert/strict';
|
|
16
17
|
|
|
17
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
18
18
|
|
|
19
19
|
function run(cmd: string, cwd: string): string {
|
|
20
20
|
return execSync(cmd, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
@@ -32,11 +32,10 @@ function createBaseRepo(): string {
|
|
|
32
32
|
return dir;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
async
|
|
35
|
+
describe('worktree-health', async () => {
|
|
36
36
|
// Skip all tests on Windows — git worktree path resolution issues
|
|
37
37
|
if (process.platform === "win32") {
|
|
38
38
|
console.log("(all worktree-health tests skipped on Windows)");
|
|
39
|
-
report();
|
|
40
39
|
return;
|
|
41
40
|
}
|
|
42
41
|
|
|
@@ -59,16 +58,16 @@ async function main(): Promise<void> {
|
|
|
59
58
|
|
|
60
59
|
const worktrees = listWorktrees(dir);
|
|
61
60
|
const wt = worktrees.find(w => w.name === "done-feature");
|
|
62
|
-
|
|
61
|
+
assert.ok(!!wt, "worktree found");
|
|
63
62
|
|
|
64
63
|
const health = getWorktreeHealth(dir, wt!);
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
64
|
+
assert.ok(health.mergedIntoMain, "branch detected as merged");
|
|
65
|
+
assert.ok(!health.dirty, "not dirty");
|
|
66
|
+
assert.ok(health.safeToRemove, "safe to remove");
|
|
68
67
|
|
|
69
68
|
const line = formatWorktreeStatusLine(health);
|
|
70
|
-
|
|
71
|
-
|
|
69
|
+
assert.ok(line.includes("merged"), "status line mentions merged");
|
|
70
|
+
assert.ok(line.includes("safe to remove"), "status line mentions safe to remove");
|
|
72
71
|
}
|
|
73
72
|
|
|
74
73
|
// ─── Test: unmerged worktree with dirty files ──────────────────────
|
|
@@ -89,13 +88,13 @@ async function main(): Promise<void> {
|
|
|
89
88
|
|
|
90
89
|
const worktrees = listWorktrees(dir);
|
|
91
90
|
const wt = worktrees.find(w => w.name === "dirty-wip");
|
|
92
|
-
|
|
91
|
+
assert.ok(!!wt, "worktree found");
|
|
93
92
|
|
|
94
93
|
const health = getWorktreeHealth(dir, wt!);
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
94
|
+
assert.ok(!health.mergedIntoMain, "not merged");
|
|
95
|
+
assert.ok(health.dirty, "dirty detected");
|
|
96
|
+
assert.ok(health.dirtyFileCount > 0, "dirty file count > 0");
|
|
97
|
+
assert.ok(!health.safeToRemove, "not safe to remove");
|
|
99
98
|
}
|
|
100
99
|
|
|
101
100
|
// ─── Test: unmerged worktree with unpushed commits ─────────────────
|
|
@@ -113,12 +112,12 @@ async function main(): Promise<void> {
|
|
|
113
112
|
|
|
114
113
|
const worktrees = listWorktrees(dir);
|
|
115
114
|
const wt = worktrees.find(w => w.name === "unpushed");
|
|
116
|
-
|
|
115
|
+
assert.ok(!!wt, "worktree found");
|
|
117
116
|
|
|
118
117
|
const health = getWorktreeHealth(dir, wt!);
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
118
|
+
assert.ok(!health.mergedIntoMain, "not merged");
|
|
119
|
+
assert.ok(health.unpushedCommits > 0, "unpushed commits detected");
|
|
120
|
+
assert.ok(!health.safeToRemove, "not safe to remove");
|
|
122
121
|
}
|
|
123
122
|
|
|
124
123
|
// ─── Test: stale detection with short threshold ────────────────────
|
|
@@ -137,17 +136,17 @@ async function main(): Promise<void> {
|
|
|
137
136
|
|
|
138
137
|
const worktrees = listWorktrees(dir);
|
|
139
138
|
const wt = worktrees.find(w => w.name === "stale-test");
|
|
140
|
-
|
|
139
|
+
assert.ok(!!wt, "worktree found");
|
|
141
140
|
|
|
142
141
|
// With staleDays=0, any worktree should be stale (commit was just now, but threshold is 0)
|
|
143
142
|
// Actually, a just-created worktree has lastCommitAgeDays ~0 which is >= 0
|
|
144
143
|
const health = getWorktreeHealth(dir, wt!, 0);
|
|
145
|
-
|
|
146
|
-
|
|
144
|
+
assert.ok(health.stale, "stale with 0-day threshold");
|
|
145
|
+
assert.ok(health.lastCommitAgeDays >= 0, "last commit age is non-negative");
|
|
147
146
|
|
|
148
147
|
// With staleDays=9999, should NOT be stale
|
|
149
148
|
const healthNotStale = getWorktreeHealth(dir, wt!, 9999);
|
|
150
|
-
|
|
149
|
+
assert.ok(!healthNotStale.stale, "not stale with high threshold");
|
|
151
150
|
}
|
|
152
151
|
|
|
153
152
|
// ─── Test: formatWorktreeStatusLine for clean active worktree ──────
|
|
@@ -166,12 +165,12 @@ async function main(): Promise<void> {
|
|
|
166
165
|
|
|
167
166
|
const worktrees = listWorktrees(dir);
|
|
168
167
|
const wt = worktrees.find(w => w.name === "clean-active");
|
|
169
|
-
|
|
168
|
+
assert.ok(!!wt, "worktree found");
|
|
170
169
|
|
|
171
170
|
const health = getWorktreeHealth(dir, wt!, 9999); // high threshold so not stale
|
|
172
171
|
const line = formatWorktreeStatusLine(health);
|
|
173
172
|
// Should show last commit age since it's not merged and not stale
|
|
174
|
-
|
|
173
|
+
assert.ok(line.includes("last commit"), "shows last commit age for active worktree");
|
|
175
174
|
}
|
|
176
175
|
|
|
177
176
|
} finally {
|
|
@@ -179,8 +178,4 @@ async function main(): Promise<void> {
|
|
|
179
178
|
try { rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
|
|
180
179
|
}
|
|
181
180
|
}
|
|
182
|
-
|
|
183
|
-
report();
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
main();
|
|
181
|
+
});
|
|
@@ -29,9 +29,9 @@ import {
|
|
|
29
29
|
} from "../worktree.ts";
|
|
30
30
|
|
|
31
31
|
import { deriveState } from "../state.ts";
|
|
32
|
-
import {
|
|
32
|
+
import { describe, test } from 'node:test';
|
|
33
|
+
import assert from 'node:assert/strict';
|
|
33
34
|
|
|
34
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
35
35
|
function run(command: string, cwd: string): string {
|
|
36
36
|
return execSync(command, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
37
37
|
}
|
|
@@ -73,42 +73,42 @@ writeFileSync(
|
|
|
73
73
|
run("git add .", base);
|
|
74
74
|
run('git commit -m "chore: init"', base);
|
|
75
75
|
|
|
76
|
-
async
|
|
76
|
+
describe('worktree-integration', async () => {
|
|
77
77
|
// ── Verify main tree baseline ──────────────────────────────────────────────
|
|
78
78
|
|
|
79
79
|
console.log("\n=== Main tree baseline ===");
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
assert.deepStrictEqual(getMainBranch(base), "main", "main tree getMainBranch returns main");
|
|
81
|
+
assert.deepStrictEqual(detectWorktreeName(base), null, "main tree not detected as worktree");
|
|
82
82
|
|
|
83
83
|
// ── Create worktree and verify detection ───────────────────────────────────
|
|
84
84
|
|
|
85
85
|
console.log("\n=== Create worktree ===");
|
|
86
86
|
const wt = createWorktree(base, "alpha");
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
assert.ok(existsSync(wt.path), "worktree created on disk");
|
|
88
|
+
assert.deepStrictEqual(wt.branch, "worktree/alpha", "worktree branch name");
|
|
89
89
|
|
|
90
90
|
console.log("\n=== Worktree detection ===");
|
|
91
|
-
|
|
92
|
-
|
|
91
|
+
assert.deepStrictEqual(detectWorktreeName(wt.path), "alpha", "detectWorktreeName inside worktree");
|
|
92
|
+
assert.deepStrictEqual(getMainBranch(wt.path), "worktree/alpha", "getMainBranch returns worktree branch inside worktree");
|
|
93
93
|
|
|
94
94
|
// ── Verify current branch inside worktree ──────────────────────────────────
|
|
95
95
|
|
|
96
96
|
console.log("\n=== Worktree initial branch ===");
|
|
97
|
-
|
|
97
|
+
assert.deepStrictEqual(getCurrentBranch(wt.path), "worktree/alpha", "worktree starts on its own branch");
|
|
98
98
|
|
|
99
99
|
// ── Verify branch name helper ──────────────────────────────────────────────
|
|
100
100
|
|
|
101
101
|
console.log("\n=== getSliceBranchName with worktree ===");
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
assert.deepStrictEqual(getSliceBranchName("M001", "S01", "alpha"), "gsd/alpha/M001/S01", "explicit worktree param");
|
|
103
|
+
assert.deepStrictEqual(getSliceBranchName("M001", "S01"), "gsd/M001/S01", "no worktree param = plain branch");
|
|
104
104
|
|
|
105
105
|
// ── Slice branch creation and detection inside worktree ────────────────────
|
|
106
106
|
|
|
107
107
|
console.log("\n=== Slice branch in worktree ===");
|
|
108
108
|
const sliceBranch = getSliceBranchName("M001", "S01", "alpha");
|
|
109
109
|
run(`git checkout -b ${sliceBranch}`, wt.path);
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
assert.deepStrictEqual(getCurrentBranch(wt.path), "gsd/alpha/M001/S01", "worktree-namespaced slice branch");
|
|
111
|
+
assert.ok(SLICE_BRANCH_RE.test(getCurrentBranch(wt.path)), "slice branch regex matches namespaced branch");
|
|
112
112
|
|
|
113
113
|
// ── Do work on slice branch, then merge to worktree branch ─────────────────
|
|
114
114
|
|
|
@@ -119,23 +119,23 @@ async function main(): Promise<void> {
|
|
|
119
119
|
|
|
120
120
|
// Checkout worktree base branch and merge slice branch
|
|
121
121
|
run("git checkout worktree/alpha", wt.path);
|
|
122
|
-
|
|
122
|
+
assert.deepStrictEqual(getCurrentBranch(wt.path), "worktree/alpha", "back on worktree branch");
|
|
123
123
|
|
|
124
124
|
run(`git merge --no-ff ${sliceBranch} -m "feat(M001/S01): First"`, wt.path);
|
|
125
125
|
run(`git branch -d ${sliceBranch}`, wt.path);
|
|
126
|
-
|
|
127
|
-
|
|
126
|
+
assert.deepStrictEqual(getCurrentBranch(wt.path), "worktree/alpha", "still on worktree branch after merge");
|
|
127
|
+
assert.ok(readFileSync(join(wt.path, "feature.txt"), "utf-8").includes("new feature"), "merge brought feature to worktree branch");
|
|
128
128
|
|
|
129
129
|
// Verify slice branch is gone
|
|
130
130
|
const branches = run("git branch", base);
|
|
131
|
-
|
|
131
|
+
assert.ok(!branches.includes("gsd/alpha/M001/S01"), "slice branch cleaned up");
|
|
132
132
|
|
|
133
133
|
// ── Second slice in same worktree ──────────────────────────────────────────
|
|
134
134
|
|
|
135
135
|
console.log("\n=== Second slice in worktree ===");
|
|
136
136
|
const sliceBranch2 = getSliceBranchName("M001", "S02", "alpha");
|
|
137
137
|
run(`git checkout -b ${sliceBranch2}`, wt.path);
|
|
138
|
-
|
|
138
|
+
assert.deepStrictEqual(getCurrentBranch(wt.path), "gsd/alpha/M001/S02", "on S02 namespaced branch");
|
|
139
139
|
|
|
140
140
|
writeFileSync(join(wt.path, "feature2.txt"), "second feature\n", "utf-8");
|
|
141
141
|
run("git add .", wt.path);
|
|
@@ -144,28 +144,28 @@ async function main(): Promise<void> {
|
|
|
144
144
|
run("git checkout worktree/alpha", wt.path);
|
|
145
145
|
run(`git merge --no-ff ${sliceBranch2} -m "feat(M001/S02): Second"`, wt.path);
|
|
146
146
|
run(`git branch -d ${sliceBranch2}`, wt.path);
|
|
147
|
-
|
|
147
|
+
assert.deepStrictEqual(getCurrentBranch(wt.path), "worktree/alpha", "back on worktree branch");
|
|
148
148
|
|
|
149
149
|
// ── Parallel worktrees don't conflict ──────────────────────────────────────
|
|
150
150
|
|
|
151
151
|
console.log("\n=== Parallel worktrees ===");
|
|
152
152
|
const wt2 = createWorktree(base, "beta");
|
|
153
|
-
|
|
153
|
+
assert.deepStrictEqual(getMainBranch(wt2.path), "worktree/beta", "second worktree has its own base branch");
|
|
154
154
|
|
|
155
155
|
// Both worktrees can create S01 branches without conflict
|
|
156
156
|
const betaBranch = getSliceBranchName("M001", "S01", "beta");
|
|
157
157
|
run(`git checkout -b ${betaBranch}`, wt2.path);
|
|
158
|
-
|
|
158
|
+
assert.deepStrictEqual(getCurrentBranch(wt2.path), "gsd/beta/M001/S01", "beta has its own namespaced branch");
|
|
159
159
|
|
|
160
160
|
// Alpha worktree can re-create S01 too (it was already merged+deleted earlier)
|
|
161
161
|
const alphaReBranch = getSliceBranchName("M001", "S01", "alpha");
|
|
162
162
|
run(`git checkout -b ${alphaReBranch}`, wt.path);
|
|
163
|
-
|
|
163
|
+
assert.deepStrictEqual(getCurrentBranch(wt.path), "gsd/alpha/M001/S01", "alpha re-created S01");
|
|
164
164
|
|
|
165
165
|
// Both exist simultaneously
|
|
166
166
|
const allBranches = run("git branch", base);
|
|
167
|
-
|
|
168
|
-
|
|
167
|
+
assert.ok(allBranches.includes("gsd/alpha/M001/S01"), "alpha S01 branch exists");
|
|
168
|
+
assert.ok(allBranches.includes("gsd/beta/M001/S01"), "beta S01 branch exists");
|
|
169
169
|
|
|
170
170
|
// ── State derivation in worktree ───────────────────────────────────────────
|
|
171
171
|
|
|
@@ -173,8 +173,8 @@ async function main(): Promise<void> {
|
|
|
173
173
|
// Switch alpha back to its base so deriveState sees milestone files
|
|
174
174
|
run("git checkout worktree/alpha", wt.path);
|
|
175
175
|
const state = await deriveState(wt.path);
|
|
176
|
-
|
|
177
|
-
|
|
176
|
+
assert.ok(state.activeMilestone !== null, "worktree has active milestone");
|
|
177
|
+
assert.deepStrictEqual(state.activeMilestone?.id, "M001", "correct milestone");
|
|
178
178
|
|
|
179
179
|
// ── autoCommitCurrentBranch in worktree ────────────────────────────────────
|
|
180
180
|
|
|
@@ -183,8 +183,8 @@ async function main(): Promise<void> {
|
|
|
183
183
|
run(`git checkout ${betaBranch}`, wt2.path);
|
|
184
184
|
writeFileSync(join(wt2.path, "dirty.txt"), "uncommitted\n", "utf-8");
|
|
185
185
|
const commitMsg = autoCommitCurrentBranch(wt2.path, "execute-task", "M001/S01/T01");
|
|
186
|
-
|
|
187
|
-
|
|
186
|
+
assert.ok(commitMsg !== null, "auto-commit works in worktree");
|
|
187
|
+
assert.deepStrictEqual(run("git status --short", wt2.path), "", "worktree clean after auto-commit");
|
|
188
188
|
|
|
189
189
|
// ── Cleanup ────────────────────────────────────────────────────────────────
|
|
190
190
|
|
|
@@ -194,14 +194,7 @@ async function main(): Promise<void> {
|
|
|
194
194
|
run("git checkout worktree/beta", wt2.path);
|
|
195
195
|
removeWorktree(base, "alpha", { deleteBranch: true });
|
|
196
196
|
removeWorktree(base, "beta", { deleteBranch: true });
|
|
197
|
-
|
|
197
|
+
assert.deepStrictEqual(listWorktrees(base).length, 0, "all worktrees removed");
|
|
198
198
|
|
|
199
199
|
rmSync(base, { recursive: true, force: true });
|
|
200
|
-
|
|
201
|
-
report();
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
main().catch((error) => {
|
|
205
|
-
console.error(error);
|
|
206
|
-
process.exit(1);
|
|
207
200
|
});
|