gsd-pi 2.44.0 → 2.45.0-dev.1afbdaa
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/help-text.js +1 -1
- package/dist/loader.js +34 -0
- package/dist/resources/extensions/gsd/activity-log.js +7 -0
- package/dist/resources/extensions/gsd/auto/infra-errors.js +3 -0
- package/dist/resources/extensions/gsd/auto/phases.js +63 -77
- package/dist/resources/extensions/gsd/auto/run-unit.js +6 -3
- package/dist/resources/extensions/gsd/auto/session.js +0 -11
- package/dist/resources/extensions/gsd/auto-artifact-paths.js +112 -0
- package/dist/resources/extensions/gsd/auto-post-unit.js +25 -96
- package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
- package/dist/resources/extensions/gsd/auto-start.js +33 -5
- package/dist/resources/extensions/gsd/auto-timers.js +57 -3
- package/dist/resources/extensions/gsd/auto-worktree-sync.js +4 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +14 -10
- package/dist/resources/extensions/gsd/auto.js +42 -60
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +170 -11
- package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +18 -0
- package/dist/resources/extensions/gsd/bootstrap/system-context.js +46 -12
- package/dist/resources/extensions/gsd/commands/catalog.js +7 -1
- package/dist/resources/extensions/gsd/commands/context.js +0 -4
- package/dist/resources/extensions/gsd/commands/handlers/core.js +2 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
- package/dist/resources/extensions/gsd/commands/handlers/parallel.js +1 -1
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
- package/dist/resources/extensions/gsd/commands-mcp-status.js +187 -0
- package/dist/resources/extensions/gsd/crash-recovery.js +2 -4
- package/dist/resources/extensions/gsd/dashboard-overlay.js +0 -44
- package/dist/resources/extensions/gsd/db-writer.js +40 -22
- package/dist/resources/extensions/gsd/doctor-checks.js +167 -2
- package/dist/resources/extensions/gsd/doctor.js +13 -3
- package/dist/resources/extensions/gsd/git-service.js +8 -3
- package/dist/resources/extensions/gsd/gsd-db.js +28 -4
- package/dist/resources/extensions/gsd/guided-flow.js +1 -2
- package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
- package/dist/resources/extensions/gsd/parallel-merge.js +1 -1
- package/dist/resources/extensions/gsd/parallel-orchestrator.js +5 -18
- package/dist/resources/extensions/gsd/preferences-types.js +2 -2
- package/dist/resources/extensions/gsd/preferences.js +17 -5
- package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
- package/dist/resources/extensions/gsd/prompts/complete-slice.md +10 -23
- package/dist/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -15
- package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/dist/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/dist/resources/extensions/gsd/prompts/queue.md +2 -2
- package/dist/resources/extensions/gsd/prompts/quick-task.md +2 -0
- package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
- package/dist/resources/extensions/gsd/prompts/replan-slice.md +3 -14
- package/dist/resources/extensions/gsd/prompts/research-slice.md +3 -3
- package/dist/resources/extensions/gsd/prompts/rethink.md +83 -0
- package/dist/resources/extensions/gsd/prompts/system.md +1 -1
- package/dist/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
- package/dist/resources/extensions/gsd/provider-error-pause.js +7 -0
- package/dist/resources/extensions/gsd/repo-identity.js +45 -7
- package/dist/resources/extensions/gsd/rethink.js +115 -0
- package/dist/resources/extensions/gsd/session-lock.js +1 -3
- package/dist/resources/extensions/gsd/state.js +48 -3
- package/dist/resources/extensions/gsd/sync-lock.js +89 -0
- package/dist/resources/extensions/gsd/tools/complete-milestone.js +61 -11
- package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -11
- package/dist/resources/extensions/gsd/tools/complete-task.js +50 -2
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -1
- package/dist/resources/extensions/gsd/tools/plan-slice.js +31 -1
- package/dist/resources/extensions/gsd/tools/plan-task.js +28 -1
- package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +32 -2
- package/dist/resources/extensions/gsd/tools/reopen-slice.js +86 -0
- package/dist/resources/extensions/gsd/tools/reopen-task.js +90 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +34 -2
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
- package/dist/resources/extensions/gsd/unit-ownership.js +85 -0
- package/dist/resources/extensions/gsd/workflow-events.js +102 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +193 -0
- package/dist/resources/extensions/gsd/workflow-manifest.js +244 -0
- package/dist/resources/extensions/gsd/workflow-migration.js +280 -0
- package/dist/resources/extensions/gsd/workflow-projections.js +373 -0
- package/dist/resources/extensions/gsd/workflow-reconcile.js +411 -0
- package/dist/resources/extensions/gsd/worktree-manager.js +34 -3
- package/dist/resources/extensions/gsd/worktree-resolver.js +43 -0
- package/dist/resources/extensions/gsd/write-intercept.js +84 -0
- package/dist/resources/extensions/mcp-client/index.js +14 -0
- package/dist/resources/extensions/voice/index.js +11 -16
- package/dist/resources/extensions/voice/linux-ready.js +67 -0
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +12 -12
- 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 +2 -2
- package/dist/web/standalone/.next/required-server-files.json +3 -3
- 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 +5 -5
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +5 -5
- 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 -1
- package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
- 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 +6 -6
- 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 +6 -6
- 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 +12 -12
- package/dist/web/standalone/.next/server/chunks/229.js +1 -1
- package/dist/web/standalone/.next/server/chunks/471.js +3 -3
- 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.11ca5c01938e5948.js +9 -0
- package/dist/web/standalone/.next/static/chunks/{3721.bf31263de6d5fa46.js → 485.243af25f0cdf50d6.js} +2 -2
- package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-6654a8cca61a3d1c.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.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/webpack-0a4cd455ec4197d2.js +1 -0
- package/dist/web/standalone/.next/static/css/dd4ae3f58ac9b600.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 +2 -1
- package/packages/native/dist/stream-process/index.js +2 -2
- package/packages/native/src/__tests__/stream-process.test.mjs +34 -0
- package/packages/native/src/stream-process/index.ts +2 -2
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +3 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.js +15 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.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-orchestrator.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +2 -0
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.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 +2 -1
- 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/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 +4 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +10 -5
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js +185 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.js +41 -0
- package/packages/pi-coding-agent/dist/core/local-model-check.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +239 -10
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +13 -1
- 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.test.js +206 -195
- package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -1
- 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/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/settings-manager.d.ts +3 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/settings-manager.js +6 -0
- package/packages/pi-coding-agent/dist/core/settings-manager.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/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +17 -0
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +32 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts +3 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +8 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +12 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts +15 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +40 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -0
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +4 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts +5 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +13 -2
- package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +17 -8
- package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +7 -3
- package/packages/pi-coding-agent/dist/modes/interactive/interactive-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/auth-storage.test.ts +7 -7
- package/packages/pi-coding-agent/src/core/auth-storage.ts +15 -1
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +2 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/extensions/types.ts +2 -1
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.test.ts +227 -0
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +11 -5
- package/packages/pi-coding-agent/src/core/local-model-check.ts +45 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +297 -11
- package/packages/pi-coding-agent/src/core/model-registry.ts +51 -4
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +227 -205
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
- package/packages/pi-coding-agent/src/core/settings-manager.ts +9 -0
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
- package/packages/pi-coding-agent/src/main.ts +19 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +38 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +10 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +48 -0
- package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +3 -1
- package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +18 -3
- package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +16 -7
- package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +8 -1
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
- package/pkg/package.json +1 -1
- package/src/resources/extensions/gsd/activity-log.ts +1 -0
- package/src/resources/extensions/gsd/auto/infra-errors.ts +3 -0
- package/src/resources/extensions/gsd/auto/loop-deps.ts +0 -19
- package/src/resources/extensions/gsd/auto/phases.ts +69 -91
- package/src/resources/extensions/gsd/auto/run-unit.ts +6 -3
- package/src/resources/extensions/gsd/auto/session.ts +0 -18
- package/src/resources/extensions/gsd/auto-artifact-paths.ts +131 -0
- package/src/resources/extensions/gsd/auto-dashboard.ts +0 -1
- package/src/resources/extensions/gsd/auto-post-unit.ts +25 -106
- package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
- package/src/resources/extensions/gsd/auto-start.ts +40 -5
- package/src/resources/extensions/gsd/auto-timers.ts +64 -3
- package/src/resources/extensions/gsd/auto-worktree-sync.ts +5 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +17 -11
- package/src/resources/extensions/gsd/auto.ts +44 -86
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +162 -11
- package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
- package/src/resources/extensions/gsd/bootstrap/system-context.ts +48 -11
- package/src/resources/extensions/gsd/commands/catalog.ts +7 -1
- package/src/resources/extensions/gsd/commands/context.ts +0 -5
- package/src/resources/extensions/gsd/commands/handlers/core.ts +2 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
- package/src/resources/extensions/gsd/commands/handlers/parallel.ts +1 -1
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
- package/src/resources/extensions/gsd/commands-mcp-status.ts +247 -0
- package/src/resources/extensions/gsd/crash-recovery.ts +1 -5
- package/src/resources/extensions/gsd/dashboard-overlay.ts +0 -50
- package/src/resources/extensions/gsd/db-writer.ts +41 -27
- package/src/resources/extensions/gsd/doctor-checks.ts +180 -2
- package/src/resources/extensions/gsd/doctor-types.ts +7 -1
- package/src/resources/extensions/gsd/doctor.ts +13 -4
- package/src/resources/extensions/gsd/git-service.ts +6 -2
- package/src/resources/extensions/gsd/gsd-db.ts +32 -4
- package/src/resources/extensions/gsd/guided-flow.ts +1 -2
- package/src/resources/extensions/gsd/journal.ts +6 -1
- package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
- package/src/resources/extensions/gsd/parallel-merge.ts +1 -1
- package/src/resources/extensions/gsd/parallel-orchestrator.ts +5 -21
- package/src/resources/extensions/gsd/preferences-types.ts +2 -2
- package/src/resources/extensions/gsd/preferences.ts +18 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -10
- package/src/resources/extensions/gsd/prompts/complete-slice.md +10 -23
- package/src/resources/extensions/gsd/prompts/discuss.md +2 -2
- package/src/resources/extensions/gsd/prompts/execute-task.md +5 -15
- package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-plan-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/guided-research-slice.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
- package/src/resources/extensions/gsd/prompts/plan-slice.md +5 -3
- package/src/resources/extensions/gsd/prompts/queue.md +2 -2
- package/src/resources/extensions/gsd/prompts/quick-task.md +2 -0
- package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
- package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +6 -6
- package/src/resources/extensions/gsd/prompts/replan-slice.md +3 -14
- package/src/resources/extensions/gsd/prompts/research-slice.md +3 -3
- package/src/resources/extensions/gsd/prompts/rethink.md +83 -0
- package/src/resources/extensions/gsd/prompts/system.md +1 -1
- package/src/resources/extensions/gsd/prompts/validate-milestone.md +7 -37
- package/src/resources/extensions/gsd/provider-error-pause.ts +9 -0
- package/src/resources/extensions/gsd/repo-identity.ts +46 -7
- package/src/resources/extensions/gsd/rethink.ts +154 -0
- package/src/resources/extensions/gsd/session-lock.ts +0 -4
- package/src/resources/extensions/gsd/state.ts +49 -1
- package/src/resources/extensions/gsd/sync-lock.ts +94 -0
- package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +99 -99
- package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +19 -29
- package/src/resources/extensions/gsd/tests/auto-loop.test.ts +6 -10
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +43 -57
- package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +88 -0
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +11 -13
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +465 -523
- 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-worktree-milestone-merge.test.ts +533 -656
- 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 +134 -59
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +15 -14
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +27 -12
- package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +114 -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 +26 -40
- package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +220 -237
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +465 -416
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
- package/src/resources/extensions/gsd/tests/derive-state-db-disk-reconcile.test.ts +121 -0
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +210 -181
- 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 +164 -180
- 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 +27 -29
- package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +34 -38
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +54 -75
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +21 -32
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +72 -97
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +38 -44
- 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 +54 -60
- package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +72 -93
- package/src/resources/extensions/gsd/tests/doctor.test.ts +104 -134
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +123 -131
- package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +120 -0
- 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 +30 -42
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +198 -206
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +13 -27
- package/src/resources/extensions/gsd/tests/git-service.test.ts +285 -388
- 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 +81 -103
- 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 +82 -103
- package/src/resources/extensions/gsd/tests/infra-error.test.ts +20 -2
- package/src/resources/extensions/gsd/tests/inherited-repo-home-dir.test.ts +121 -0
- 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 +33 -42
- package/src/resources/extensions/gsd/tests/journal-integration.test.ts +0 -3
- package/src/resources/extensions/gsd/tests/knowledge.test.ts +89 -0
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +150 -194
- package/src/resources/extensions/gsd/tests/mcp-status.test.ts +103 -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/merge-conflict-stops-loop.test.ts +66 -0
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +57 -66
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +83 -93
- 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 +87 -96
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +125 -164
- package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +8 -9
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +81 -94
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +75 -37
- package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
- package/src/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -1
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +39 -53
- package/src/resources/extensions/gsd/tests/parallel-merge.test.ts +7 -8
- package/src/resources/extensions/gsd/tests/parallel-orchestration.test.ts +20 -24
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +24 -29
- 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 +546 -611
- package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
- package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
- package/src/resources/extensions/gsd/tests/post-mutation-hook.test.ts +171 -0
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +77 -117
- package/src/resources/extensions/gsd/tests/preferences.test.ts +34 -9
- package/src/resources/extensions/gsd/tests/projection-regression.test.ts +174 -0
- package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +26 -21
- 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-prompt.test.ts +28 -38
- package/src/resources/extensions/gsd/tests/recovery-attempts-reset.test.ts +176 -0
- package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +155 -0
- package/src/resources/extensions/gsd/tests/reopen-task.test.ts +165 -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/rule-registry.test.ts +63 -65
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +66 -128
- 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 -47
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +19 -26
- 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/stop-auto-merge-back.test.ts +67 -0
- package/src/resources/extensions/gsd/tests/stop-auto-remote.test.ts +2 -3
- package/src/resources/extensions/gsd/tests/survivor-branch-complete.test.ts +108 -0
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +22 -28
- package/src/resources/extensions/gsd/tests/sync-lock.test.ts +122 -0
- package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +49 -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 +10 -11
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +66 -82
- package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +175 -0
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +46 -47
- 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-events.test.ts +205 -0
- package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +275 -0
- package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +186 -0
- package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +171 -0
- 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.test.ts +25 -30
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +30 -37
- package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +220 -0
- package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +65 -0
- 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/tests/write-intercept.test.ts +76 -0
- package/src/resources/extensions/gsd/tools/complete-milestone.ts +74 -11
- package/src/resources/extensions/gsd/tools/complete-slice.ts +68 -11
- package/src/resources/extensions/gsd/tools/complete-task.ts +63 -1
- package/src/resources/extensions/gsd/tools/plan-milestone.ts +45 -0
- package/src/resources/extensions/gsd/tools/plan-slice.ts +40 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +37 -1
- package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +39 -1
- package/src/resources/extensions/gsd/tools/reopen-slice.ts +125 -0
- package/src/resources/extensions/gsd/tools/reopen-task.ts +129 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +41 -1
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
- package/src/resources/extensions/gsd/types.ts +8 -0
- package/src/resources/extensions/gsd/unit-ownership.ts +104 -0
- package/src/resources/extensions/gsd/workflow-events.ts +154 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +243 -0
- package/src/resources/extensions/gsd/workflow-manifest.ts +334 -0
- package/src/resources/extensions/gsd/workflow-migration.ts +345 -0
- package/src/resources/extensions/gsd/workflow-projections.ts +425 -0
- package/src/resources/extensions/gsd/workflow-reconcile.ts +503 -0
- package/src/resources/extensions/gsd/worktree-manager.ts +41 -5
- package/src/resources/extensions/gsd/worktree-resolver.ts +44 -0
- package/src/resources/extensions/gsd/write-intercept.ts +90 -0
- package/src/resources/extensions/mcp-client/index.ts +20 -0
- package/src/resources/extensions/voice/index.ts +11 -21
- package/src/resources/extensions/voice/linux-ready.ts +87 -0
- package/src/resources/extensions/voice/tests/linux-ready.test.ts +124 -0
- package/dist/web/standalone/.next/static/chunks/4024.0de81b543b28b9fe.js +0 -9
- package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
- package/dist/web/standalone/.next/static/chunks/webpack-9014b5adb127a98a.js +0 -1
- package/dist/web/standalone/.next/static/css/8a727f372cf53002.css +0 -1
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → j-BskPs0nxxPeYY-bSrab}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → j-BskPs0nxxPeYY-bSrab}/_ssgManifest.js +0 -0
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { describe, test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
1
3
|
/**
|
|
2
4
|
* doctor-git.test.ts — Integration tests for doctor git health checks.
|
|
3
5
|
*
|
|
@@ -14,10 +16,6 @@ import { tmpdir } from "node:os";
|
|
|
14
16
|
import { execSync } from "node:child_process";
|
|
15
17
|
|
|
16
18
|
import { runGSDDoctor } from "../doctor.ts";
|
|
17
|
-
import { createTestContext } from "./test-helpers.ts";
|
|
18
|
-
|
|
19
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
20
|
-
|
|
21
19
|
function run(cmd: string, cwd: string): string {
|
|
22
20
|
return execSync(cmd, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
23
21
|
}
|
|
@@ -114,7 +112,7 @@ _None_
|
|
|
114
112
|
return dir;
|
|
115
113
|
}
|
|
116
114
|
|
|
117
|
-
async
|
|
115
|
+
describe('doctor-git', async () => {
|
|
118
116
|
const cleanups: string[] = [];
|
|
119
117
|
|
|
120
118
|
try {
|
|
@@ -124,8 +122,7 @@ async function main(): Promise<void> {
|
|
|
124
122
|
// logic is correct (tested on macOS/Linux) — the test infra doesn't
|
|
125
123
|
// produce matching paths on Windows CI.
|
|
126
124
|
if (process.platform !== "win32") {
|
|
127
|
-
|
|
128
|
-
{
|
|
125
|
+
test('orphaned_auto_worktree', async () => {
|
|
129
126
|
const dir = createRepoWithCompletedMilestone();
|
|
130
127
|
cleanups.push(dir);
|
|
131
128
|
|
|
@@ -135,26 +132,24 @@ async function main(): Promise<void> {
|
|
|
135
132
|
|
|
136
133
|
const detect = await runGSDDoctor(dir, { isolationMode: "worktree" });
|
|
137
134
|
const orphanIssues = detect.issues.filter(i => i.code === "orphaned_auto_worktree");
|
|
138
|
-
|
|
139
|
-
|
|
135
|
+
assert.ok(orphanIssues.length > 0, "detects orphaned worktree");
|
|
136
|
+
assert.deepStrictEqual(orphanIssues[0]?.unitId, "M001", "orphaned worktree unitId is M001");
|
|
140
137
|
|
|
141
138
|
const fixed = await runGSDDoctor(dir, { fix: true, isolationMode: "worktree" });
|
|
142
|
-
|
|
139
|
+
assert.ok(fixed.fixesApplied.some(f => f.includes("removed orphaned worktree")), "fix removes orphaned worktree");
|
|
143
140
|
|
|
144
141
|
// Verify worktree is gone
|
|
145
142
|
const wtList = run("git worktree list", dir);
|
|
146
|
-
|
|
147
|
-
}
|
|
143
|
+
assert.ok(!wtList.includes("milestone/M001"), "worktree no longer listed after fix");
|
|
144
|
+
});
|
|
148
145
|
} else {
|
|
149
|
-
console.log("\n=== orphaned_auto_worktree (skipped on Windows) ===");
|
|
150
146
|
}
|
|
151
147
|
|
|
152
148
|
// ─── Test 2: Stale milestone branch detection & fix ────────────────
|
|
153
149
|
// Skip on Windows: git branch glob matching and path resolution
|
|
154
150
|
// behave differently in Windows temp dirs.
|
|
155
151
|
if (process.platform !== "win32") {
|
|
156
|
-
|
|
157
|
-
{
|
|
152
|
+
test('stale_milestone_branch', async () => {
|
|
158
153
|
const dir = createRepoWithCompletedMilestone();
|
|
159
154
|
cleanups.push(dir);
|
|
160
155
|
|
|
@@ -163,23 +158,21 @@ async function main(): Promise<void> {
|
|
|
163
158
|
|
|
164
159
|
const detect = await runGSDDoctor(dir, { isolationMode: "worktree" });
|
|
165
160
|
const staleIssues = detect.issues.filter(i => i.code === "stale_milestone_branch");
|
|
166
|
-
|
|
167
|
-
|
|
161
|
+
assert.ok(staleIssues.length > 0, "detects stale milestone branch");
|
|
162
|
+
assert.deepStrictEqual(staleIssues[0]?.unitId, "M001", "stale branch unitId is M001");
|
|
168
163
|
|
|
169
164
|
const fixed = await runGSDDoctor(dir, { fix: true, isolationMode: "worktree" });
|
|
170
|
-
|
|
165
|
+
assert.ok(fixed.fixesApplied.some(f => f.includes("deleted stale branch")), "fix deletes stale branch");
|
|
171
166
|
|
|
172
167
|
// Verify branch is gone
|
|
173
168
|
const branches = run("git branch --list milestone/*", dir);
|
|
174
|
-
|
|
175
|
-
}
|
|
169
|
+
assert.ok(!branches.includes("milestone/M001"), "branch gone after fix");
|
|
170
|
+
});
|
|
176
171
|
} else {
|
|
177
|
-
console.log("\n=== stale_milestone_branch (skipped on Windows) ===");
|
|
178
172
|
}
|
|
179
173
|
|
|
180
174
|
// ─── Test 3: Corrupt merge state detection & fix ───────────────────
|
|
181
|
-
|
|
182
|
-
{
|
|
175
|
+
test('corrupt_merge_state', async () => {
|
|
183
176
|
const dir = createRepoWithCompletedMilestone();
|
|
184
177
|
cleanups.push(dir);
|
|
185
178
|
|
|
@@ -189,18 +182,17 @@ async function main(): Promise<void> {
|
|
|
189
182
|
|
|
190
183
|
const detect = await runGSDDoctor(dir);
|
|
191
184
|
const mergeIssues = detect.issues.filter(i => i.code === "corrupt_merge_state");
|
|
192
|
-
|
|
185
|
+
assert.ok(mergeIssues.length > 0, "detects corrupt merge state");
|
|
193
186
|
|
|
194
187
|
const fixed = await runGSDDoctor(dir, { fix: true });
|
|
195
|
-
|
|
188
|
+
assert.ok(fixed.fixesApplied.some(f => f.includes("cleaned merge state")), "fix cleans merge state");
|
|
196
189
|
|
|
197
190
|
// Verify MERGE_HEAD is gone
|
|
198
|
-
|
|
199
|
-
}
|
|
191
|
+
assert.ok(!existsSync(join(dir, ".git", "MERGE_HEAD")), "MERGE_HEAD removed after fix");
|
|
192
|
+
});
|
|
200
193
|
|
|
201
194
|
// ─── Test 4: Tracked runtime files detection & fix ─────────────────
|
|
202
|
-
|
|
203
|
-
{
|
|
195
|
+
test('tracked_runtime_files', async () => {
|
|
204
196
|
const dir = createRepoWithCompletedMilestone();
|
|
205
197
|
cleanups.push(dir);
|
|
206
198
|
|
|
@@ -213,19 +205,18 @@ async function main(): Promise<void> {
|
|
|
213
205
|
|
|
214
206
|
const detect = await runGSDDoctor(dir);
|
|
215
207
|
const trackedIssues = detect.issues.filter(i => i.code === "tracked_runtime_files");
|
|
216
|
-
|
|
208
|
+
assert.ok(trackedIssues.length > 0, "detects tracked runtime files");
|
|
217
209
|
|
|
218
210
|
const fixed = await runGSDDoctor(dir, { fix: true });
|
|
219
|
-
|
|
211
|
+
assert.ok(fixed.fixesApplied.some(f => f.includes("untracked")), "fix untracks runtime files");
|
|
220
212
|
|
|
221
213
|
// Verify file is no longer tracked
|
|
222
214
|
const tracked = run("git ls-files .gsd/activity/", dir);
|
|
223
|
-
|
|
224
|
-
}
|
|
215
|
+
assert.deepStrictEqual(tracked, "", "runtime file untracked after fix");
|
|
216
|
+
});
|
|
225
217
|
|
|
226
218
|
// ─── Test 5: Non-git directory — graceful degradation ──────────────
|
|
227
|
-
|
|
228
|
-
{
|
|
219
|
+
test('non-git directory', async () => {
|
|
229
220
|
const dir = realpathSync(mkdtempSync(join(tmpdir(), "doc-git-test-")));
|
|
230
221
|
cleanups.push(dir);
|
|
231
222
|
|
|
@@ -236,15 +227,14 @@ async function main(): Promise<void> {
|
|
|
236
227
|
const gitIssues = result.issues.filter(i =>
|
|
237
228
|
["orphaned_auto_worktree", "stale_milestone_branch", "corrupt_merge_state", "tracked_runtime_files"].includes(i.code)
|
|
238
229
|
);
|
|
239
|
-
|
|
230
|
+
assert.deepStrictEqual(gitIssues.length, 0, "no git issues in non-git directory");
|
|
240
231
|
// Should not throw — reaching here means no crash
|
|
241
|
-
|
|
242
|
-
}
|
|
232
|
+
assert.ok(true, "non-git directory does not crash");
|
|
233
|
+
});
|
|
243
234
|
|
|
244
235
|
// ─── Test 6: Active worktree NOT flagged (false positive prevention) ─
|
|
245
236
|
if (process.platform !== "win32") {
|
|
246
|
-
|
|
247
|
-
{
|
|
237
|
+
test('active worktree safety', async () => {
|
|
248
238
|
const dir = createRepoWithActiveMilestone();
|
|
249
239
|
cleanups.push(dir);
|
|
250
240
|
|
|
@@ -254,10 +244,9 @@ async function main(): Promise<void> {
|
|
|
254
244
|
|
|
255
245
|
const detect = await runGSDDoctor(dir, { isolationMode: "worktree" });
|
|
256
246
|
const orphanIssues = detect.issues.filter(i => i.code === "orphaned_auto_worktree");
|
|
257
|
-
|
|
258
|
-
}
|
|
247
|
+
assert.deepStrictEqual(orphanIssues.length, 0, "active worktree NOT flagged as orphaned");
|
|
248
|
+
});
|
|
259
249
|
} else {
|
|
260
|
-
console.log("\n=== active worktree safety (skipped on Windows) ===");
|
|
261
250
|
}
|
|
262
251
|
|
|
263
252
|
// ─── Test 7: none-mode skips orphaned worktree check ───────────────
|
|
@@ -265,8 +254,7 @@ async function main(): Promise<void> {
|
|
|
265
254
|
// at module load time from process.cwd(). We write the prefs file to
|
|
266
255
|
// the test runner's cwd .gsd/preferences.md and clean up afterwards.
|
|
267
256
|
if (process.platform !== "win32") {
|
|
268
|
-
|
|
269
|
-
{
|
|
257
|
+
test('none-mode skips orphaned worktree', async () => {
|
|
270
258
|
const dir = createRepoWithCompletedMilestone();
|
|
271
259
|
cleanups.push(dir);
|
|
272
260
|
|
|
@@ -276,16 +264,14 @@ async function main(): Promise<void> {
|
|
|
276
264
|
|
|
277
265
|
const result = await runGSDDoctor(dir, { isolationMode: "none" });
|
|
278
266
|
const orphanIssues = result.issues.filter(i => i.code === "orphaned_auto_worktree");
|
|
279
|
-
|
|
280
|
-
}
|
|
267
|
+
assert.deepStrictEqual(orphanIssues.length, 0, "none-mode: orphaned worktree NOT detected");
|
|
268
|
+
});
|
|
281
269
|
} else {
|
|
282
|
-
console.log("\n=== none-mode skips orphaned worktree (skipped on Windows) ===");
|
|
283
270
|
}
|
|
284
271
|
|
|
285
272
|
// ─── Test 8: none-mode skips stale branch check ────────────────────
|
|
286
273
|
if (process.platform !== "win32") {
|
|
287
|
-
|
|
288
|
-
{
|
|
274
|
+
test('none-mode skips stale branch', async () => {
|
|
289
275
|
const dir = createRepoWithCompletedMilestone();
|
|
290
276
|
cleanups.push(dir);
|
|
291
277
|
|
|
@@ -294,16 +280,14 @@ async function main(): Promise<void> {
|
|
|
294
280
|
|
|
295
281
|
const result = await runGSDDoctor(dir, { isolationMode: "none" });
|
|
296
282
|
const staleIssues = result.issues.filter(i => i.code === "stale_milestone_branch");
|
|
297
|
-
|
|
298
|
-
}
|
|
283
|
+
assert.deepStrictEqual(staleIssues.length, 0, "none-mode: stale branch NOT detected");
|
|
284
|
+
});
|
|
299
285
|
} else {
|
|
300
|
-
console.log("\n=== none-mode skips stale branch (skipped on Windows) ===");
|
|
301
286
|
}
|
|
302
287
|
|
|
303
288
|
// ─── Test: Integration branch missing ──────────────────────────────
|
|
304
289
|
if (process.platform !== "win32") {
|
|
305
|
-
|
|
306
|
-
{
|
|
290
|
+
test('integration_branch_missing', async () => {
|
|
307
291
|
const dir = createRepoWithActiveMilestone();
|
|
308
292
|
cleanups.push(dir);
|
|
309
293
|
|
|
@@ -313,22 +297,20 @@ async function main(): Promise<void> {
|
|
|
313
297
|
|
|
314
298
|
const detect = await runGSDDoctor(dir);
|
|
315
299
|
const missingBranchIssues = detect.issues.filter(i => i.code === "integration_branch_missing");
|
|
316
|
-
|
|
317
|
-
|
|
300
|
+
assert.ok(missingBranchIssues.length > 0, "detects missing integration branch");
|
|
301
|
+
assert.ok(
|
|
318
302
|
missingBranchIssues[0]?.message.includes("feat/does-not-exist"),
|
|
319
303
|
"message includes the missing branch name",
|
|
320
304
|
);
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
}
|
|
305
|
+
assert.deepStrictEqual(missingBranchIssues[0]?.fixable, true, "integration_branch_missing is auto-fixable via fallback");
|
|
306
|
+
assert.deepStrictEqual(missingBranchIssues[0]?.severity, "warning", "severity is warning (fallback available)");
|
|
307
|
+
});
|
|
324
308
|
} else {
|
|
325
|
-
console.log("\n=== integration_branch_missing (skipped on Windows) ===");
|
|
326
309
|
}
|
|
327
310
|
|
|
328
311
|
// ─── Test: Integration branch present — no false positive ──────────
|
|
329
312
|
if (process.platform !== "win32") {
|
|
330
|
-
|
|
331
|
-
{
|
|
313
|
+
test('integration_branch_missing (no false positive)', async () => {
|
|
332
314
|
const dir = createRepoWithActiveMilestone();
|
|
333
315
|
cleanups.push(dir);
|
|
334
316
|
|
|
@@ -338,15 +320,13 @@ async function main(): Promise<void> {
|
|
|
338
320
|
|
|
339
321
|
const detect = await runGSDDoctor(dir);
|
|
340
322
|
const missingBranchIssues = detect.issues.filter(i => i.code === "integration_branch_missing");
|
|
341
|
-
|
|
342
|
-
}
|
|
323
|
+
assert.deepStrictEqual(missingBranchIssues.length, 0, "existing integration branch NOT flagged");
|
|
324
|
+
});
|
|
343
325
|
} else {
|
|
344
|
-
console.log("\n=== integration_branch_missing (no false positive — skipped on Windows) ===");
|
|
345
326
|
}
|
|
346
327
|
|
|
347
328
|
// ─── Test: Orphaned worktree directory ─────────────────────────────
|
|
348
|
-
|
|
349
|
-
{
|
|
329
|
+
test('integration_branch_missing: stale metadata with detected fallback', async () => {
|
|
350
330
|
const dir = createRepoWithActiveMilestone();
|
|
351
331
|
cleanups.push(dir);
|
|
352
332
|
|
|
@@ -355,27 +335,26 @@ async function main(): Promise<void> {
|
|
|
355
335
|
|
|
356
336
|
const detect = await runGSDDoctor(dir);
|
|
357
337
|
const missingBranchIssues = detect.issues.filter(i => i.code === "integration_branch_missing");
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
338
|
+
assert.deepStrictEqual(missingBranchIssues.length, 1, "reports one stale integration branch issue");
|
|
339
|
+
assert.deepStrictEqual(missingBranchIssues[0]?.severity, "warning", "stale metadata is warning when a fallback branch exists");
|
|
340
|
+
assert.deepStrictEqual(missingBranchIssues[0]?.fixable, true, "stale metadata becomes auto-fixable when fallback exists");
|
|
341
|
+
assert.ok(
|
|
362
342
|
missingBranchIssues[0]?.message.includes("feat/does-not-exist") &&
|
|
363
343
|
missingBranchIssues[0]?.message.includes("main"),
|
|
364
344
|
"warning mentions stale recorded branch and detected fallback branch",
|
|
365
345
|
);
|
|
366
346
|
|
|
367
347
|
const fixed = await runGSDDoctor(dir, { fix: true });
|
|
368
|
-
|
|
348
|
+
assert.ok(
|
|
369
349
|
fixed.fixesApplied.some(f => f.includes('updated integration branch for M001 to "main"')),
|
|
370
350
|
"doctor fix rewrites stale integration branch metadata to detected fallback branch",
|
|
371
351
|
);
|
|
372
352
|
|
|
373
353
|
const repairedMeta = JSON.parse(readFileSync(metaPath, "utf-8"));
|
|
374
|
-
|
|
375
|
-
}
|
|
354
|
+
assert.deepStrictEqual(repairedMeta.integrationBranch, "main", "metadata rewritten to detected fallback branch");
|
|
355
|
+
});
|
|
376
356
|
|
|
377
|
-
|
|
378
|
-
{
|
|
357
|
+
test('integration_branch_missing: stale metadata with configured fallback', async () => {
|
|
379
358
|
const dir = createRepoWithActiveMilestone();
|
|
380
359
|
cleanups.push(dir);
|
|
381
360
|
|
|
@@ -390,17 +369,17 @@ async function main(): Promise<void> {
|
|
|
390
369
|
try {
|
|
391
370
|
const detect = await runGSDDoctor(dir);
|
|
392
371
|
const missingBranchIssues = detect.issues.filter(i => i.code === "integration_branch_missing");
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
372
|
+
assert.deepStrictEqual(missingBranchIssues.length, 1, "configured fallback still reports one stale integration branch issue");
|
|
373
|
+
assert.deepStrictEqual(missingBranchIssues[0]?.severity, "warning", "configured fallback keeps stale metadata at warning severity");
|
|
374
|
+
assert.deepStrictEqual(missingBranchIssues[0]?.fixable, true, "configured fallback remains auto-fixable");
|
|
375
|
+
assert.ok(
|
|
397
376
|
missingBranchIssues[0]?.message.includes("feat/does-not-exist") &&
|
|
398
377
|
missingBranchIssues[0]?.message.includes("trunk"),
|
|
399
378
|
"warning mentions stale recorded branch and configured fallback branch",
|
|
400
379
|
);
|
|
401
380
|
|
|
402
381
|
const fixed = await runGSDDoctor(dir, { fix: true });
|
|
403
|
-
|
|
382
|
+
assert.ok(
|
|
404
383
|
fixed.fixesApplied.some(f => f.includes('updated integration branch for M001 to "trunk"')),
|
|
405
384
|
"doctor fix rewrites stale metadata to configured fallback branch",
|
|
406
385
|
);
|
|
@@ -409,12 +388,11 @@ async function main(): Promise<void> {
|
|
|
409
388
|
}
|
|
410
389
|
|
|
411
390
|
const repairedMeta = JSON.parse(readFileSync(metaPath, "utf-8"));
|
|
412
|
-
|
|
413
|
-
}
|
|
391
|
+
assert.deepStrictEqual(repairedMeta.integrationBranch, "trunk", "metadata rewritten to configured fallback branch");
|
|
392
|
+
});
|
|
414
393
|
|
|
415
394
|
if (process.platform !== "win32") {
|
|
416
|
-
|
|
417
|
-
{
|
|
395
|
+
test('worktree_directory_orphaned', async () => {
|
|
418
396
|
const dir = createRepoWithActiveMilestone();
|
|
419
397
|
cleanups.push(dir);
|
|
420
398
|
|
|
@@ -425,28 +403,26 @@ async function main(): Promise<void> {
|
|
|
425
403
|
|
|
426
404
|
const detect = await runGSDDoctor(dir);
|
|
427
405
|
const orphanDirIssues = detect.issues.filter(i => i.code === "worktree_directory_orphaned");
|
|
428
|
-
|
|
429
|
-
|
|
406
|
+
assert.ok(orphanDirIssues.length > 0, "detects orphaned worktree directory");
|
|
407
|
+
assert.ok(
|
|
430
408
|
orphanDirIssues[0]?.message.includes("orphan-feature"),
|
|
431
409
|
"message includes the orphaned directory name",
|
|
432
410
|
);
|
|
433
|
-
|
|
411
|
+
assert.ok(orphanDirIssues[0]?.fixable === true, "worktree_directory_orphaned is fixable");
|
|
434
412
|
|
|
435
413
|
const fixed = await runGSDDoctor(dir, { fix: true });
|
|
436
|
-
|
|
414
|
+
assert.ok(
|
|
437
415
|
fixed.fixesApplied.some(f => f.includes("removed orphaned worktree directory")),
|
|
438
416
|
"fix removes orphaned worktree directory",
|
|
439
417
|
);
|
|
440
|
-
|
|
441
|
-
}
|
|
418
|
+
assert.ok(!existsSync(orphanDir), "orphaned directory removed after fix");
|
|
419
|
+
});
|
|
442
420
|
} else {
|
|
443
|
-
console.log("\n=== worktree_directory_orphaned (skipped on Windows) ===");
|
|
444
421
|
}
|
|
445
422
|
|
|
446
423
|
// ─── Test: Registered worktree NOT flagged as orphaned ─────────────
|
|
447
424
|
if (process.platform !== "win32") {
|
|
448
|
-
|
|
449
|
-
{
|
|
425
|
+
test('worktree_directory_orphaned (registered worktree not flagged)', async () => {
|
|
450
426
|
const dir = createRepoWithActiveMilestone();
|
|
451
427
|
cleanups.push(dir);
|
|
452
428
|
|
|
@@ -456,15 +432,13 @@ async function main(): Promise<void> {
|
|
|
456
432
|
|
|
457
433
|
const detect = await runGSDDoctor(dir);
|
|
458
434
|
const orphanDirIssues = detect.issues.filter(i => i.code === "worktree_directory_orphaned");
|
|
459
|
-
|
|
460
|
-
}
|
|
435
|
+
assert.deepStrictEqual(orphanDirIssues.length, 0, "registered worktree NOT flagged as orphaned");
|
|
436
|
+
});
|
|
461
437
|
} else {
|
|
462
|
-
console.log("\n=== worktree_directory_orphaned (registered worktree not flagged — skipped on Windows) ===");
|
|
463
438
|
}
|
|
464
439
|
|
|
465
440
|
// ─── Test 9: none-mode still detects corrupt merge state ───────────
|
|
466
|
-
|
|
467
|
-
{
|
|
441
|
+
test('none-mode keeps corrupt merge state', async () => {
|
|
468
442
|
const dir = createRepoWithCompletedMilestone();
|
|
469
443
|
cleanups.push(dir);
|
|
470
444
|
|
|
@@ -474,12 +448,11 @@ async function main(): Promise<void> {
|
|
|
474
448
|
|
|
475
449
|
const result = await runGSDDoctor(dir, { isolationMode: "none" });
|
|
476
450
|
const mergeIssues = result.issues.filter(i => i.code === "corrupt_merge_state");
|
|
477
|
-
|
|
478
|
-
}
|
|
451
|
+
assert.ok(mergeIssues.length > 0, "none-mode: corrupt merge state IS detected");
|
|
452
|
+
});
|
|
479
453
|
|
|
480
454
|
// ─── Test 10: none-mode still detects tracked runtime files ────────
|
|
481
|
-
|
|
482
|
-
{
|
|
455
|
+
test('none-mode keeps tracked runtime files', async () => {
|
|
483
456
|
const dir = createRepoWithCompletedMilestone();
|
|
484
457
|
cleanups.push(dir);
|
|
485
458
|
|
|
@@ -492,13 +465,12 @@ async function main(): Promise<void> {
|
|
|
492
465
|
|
|
493
466
|
const result = await runGSDDoctor(dir, { isolationMode: "none" });
|
|
494
467
|
const trackedIssues = result.issues.filter(i => i.code === "tracked_runtime_files");
|
|
495
|
-
|
|
496
|
-
}
|
|
468
|
+
assert.ok(trackedIssues.length > 0, "none-mode: tracked runtime files IS detected");
|
|
469
|
+
});
|
|
497
470
|
|
|
498
471
|
// ─── Test: Symlinked .gsd does not cause false orphan detection ────
|
|
499
472
|
if (process.platform !== "win32") {
|
|
500
|
-
|
|
501
|
-
{
|
|
473
|
+
test('worktree_directory_orphaned (symlinked .gsd not false-positive)', async () => {
|
|
502
474
|
const dir = createRepoWithActiveMilestone();
|
|
503
475
|
cleanups.push(dir);
|
|
504
476
|
|
|
@@ -515,16 +487,14 @@ async function main(): Promise<void> {
|
|
|
515
487
|
|
|
516
488
|
const detect = await runGSDDoctor(dir);
|
|
517
489
|
const orphanDirIssues = detect.issues.filter(i => i.code === "worktree_directory_orphaned");
|
|
518
|
-
|
|
519
|
-
}
|
|
490
|
+
assert.deepStrictEqual(orphanDirIssues.length, 0, "registered worktree via symlinked .gsd NOT flagged as orphaned");
|
|
491
|
+
});
|
|
520
492
|
} else {
|
|
521
|
-
console.log("\n=== worktree_directory_orphaned (symlinked .gsd — skipped on Windows) ===");
|
|
522
493
|
}
|
|
523
494
|
|
|
524
495
|
// ─── Test: worktree_branch_merged detection & fix ──────────────────
|
|
525
496
|
if (process.platform !== "win32") {
|
|
526
|
-
|
|
527
|
-
{
|
|
497
|
+
test('worktree_branch_merged', async () => {
|
|
528
498
|
const dir = createRepoWithActiveMilestone();
|
|
529
499
|
cleanups.push(dir);
|
|
530
500
|
|
|
@@ -541,23 +511,21 @@ async function main(): Promise<void> {
|
|
|
541
511
|
|
|
542
512
|
const detect = await runGSDDoctor(dir);
|
|
543
513
|
const mergedIssues = detect.issues.filter(i => i.code === "worktree_branch_merged");
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
514
|
+
assert.ok(mergedIssues.length > 0, "detects merged worktree branch");
|
|
515
|
+
assert.ok(mergedIssues[0]?.message.includes("safe to remove"), "message says safe to remove");
|
|
516
|
+
assert.ok(mergedIssues[0]?.fixable === true, "merged worktree is fixable");
|
|
547
517
|
|
|
548
518
|
// Fix should remove the worktree
|
|
549
519
|
const fixed = await runGSDDoctor(dir, { fix: true });
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
}
|
|
520
|
+
assert.ok(fixed.fixesApplied.some(f => f.includes("removed merged worktree")), "fix removes merged worktree");
|
|
521
|
+
assert.ok(!existsSync(wtPath), "worktree directory removed after fix");
|
|
522
|
+
});
|
|
553
523
|
} else {
|
|
554
|
-
console.log("\n=== worktree_branch_merged (skipped on Windows) ===");
|
|
555
524
|
}
|
|
556
525
|
|
|
557
526
|
// ─── Test: merged milestone/* worktree removes milestone branch ────
|
|
558
527
|
if (process.platform !== "win32") {
|
|
559
|
-
|
|
560
|
-
{
|
|
528
|
+
test('worktree_branch_merged (milestone branch cleanup)', async () => {
|
|
561
529
|
const dir = createRepoWithActiveMilestone();
|
|
562
530
|
cleanups.push(dir);
|
|
563
531
|
|
|
@@ -570,20 +538,18 @@ async function main(): Promise<void> {
|
|
|
570
538
|
run("git merge milestone/M001 --no-edit", dir);
|
|
571
539
|
|
|
572
540
|
const fixed = await runGSDDoctor(dir, { fix: true });
|
|
573
|
-
|
|
574
|
-
|
|
541
|
+
assert.ok(fixed.fixesApplied.some(f => f.includes("removed merged worktree")), "fix removes merged milestone worktree");
|
|
542
|
+
assert.ok(!existsSync(wtPath), "milestone worktree directory removed after fix");
|
|
575
543
|
|
|
576
544
|
const branches = run("git branch --list milestone/M001", dir);
|
|
577
|
-
|
|
578
|
-
}
|
|
545
|
+
assert.deepStrictEqual(branches, "", "milestone/M001 branch deleted after merged worktree cleanup");
|
|
546
|
+
});
|
|
579
547
|
} else {
|
|
580
|
-
console.log("\n=== worktree_branch_merged (milestone branch cleanup — skipped on Windows) ===");
|
|
581
548
|
}
|
|
582
549
|
|
|
583
550
|
// ─── Test: worktree_branch_merged NOT flagged for unmerged worktree ─
|
|
584
551
|
if (process.platform !== "win32") {
|
|
585
|
-
|
|
586
|
-
{
|
|
552
|
+
test('worktree_branch_merged (no false positive)', async () => {
|
|
587
553
|
const dir = createRepoWithActiveMilestone();
|
|
588
554
|
cleanups.push(dir);
|
|
589
555
|
|
|
@@ -597,16 +563,14 @@ async function main(): Promise<void> {
|
|
|
597
563
|
// Do NOT merge — branch is ahead of main
|
|
598
564
|
const detect = await runGSDDoctor(dir);
|
|
599
565
|
const mergedIssues = detect.issues.filter(i => i.code === "worktree_branch_merged");
|
|
600
|
-
|
|
601
|
-
}
|
|
566
|
+
assert.deepStrictEqual(mergedIssues.length, 0, "unmerged worktree NOT flagged as merged");
|
|
567
|
+
});
|
|
602
568
|
} else {
|
|
603
|
-
console.log("\n=== worktree_branch_merged (no false positive — skipped on Windows) ===");
|
|
604
569
|
}
|
|
605
570
|
|
|
606
571
|
// ─── Test: legacy_slice_branches now fixable ───────────────────────
|
|
607
572
|
if (process.platform !== "win32") {
|
|
608
|
-
|
|
609
|
-
{
|
|
573
|
+
test('legacy_slice_branches (fixable)', async () => {
|
|
610
574
|
const dir = createRepoWithActiveMilestone();
|
|
611
575
|
cleanups.push(dir);
|
|
612
576
|
|
|
@@ -618,18 +582,17 @@ async function main(): Promise<void> {
|
|
|
618
582
|
|
|
619
583
|
const detect = await runGSDDoctor(dir);
|
|
620
584
|
const legacyIssues = detect.issues.filter(i => i.code === "legacy_slice_branches");
|
|
621
|
-
|
|
622
|
-
|
|
585
|
+
assert.ok(legacyIssues.length > 0, "detects legacy slice branches");
|
|
586
|
+
assert.ok(legacyIssues[0]?.fixable === true, "legacy branches are fixable");
|
|
623
587
|
|
|
624
588
|
const fixed = await runGSDDoctor(dir, { fix: true });
|
|
625
|
-
|
|
589
|
+
assert.ok(fixed.fixesApplied.some(f => f.includes("legacy slice branch")), "fix deletes legacy branches");
|
|
626
590
|
|
|
627
591
|
// Verify branches are gone
|
|
628
592
|
const remaining = run("git branch --list gsd/*/*", dir);
|
|
629
|
-
|
|
630
|
-
}
|
|
593
|
+
assert.deepStrictEqual(remaining, "gsd/quick/1-fix-typo", "quick branch preserved; legacy branches removed");
|
|
594
|
+
});
|
|
631
595
|
} else {
|
|
632
|
-
console.log("\n=== legacy_slice_branches (fixable — skipped on Windows) ===");
|
|
633
596
|
}
|
|
634
597
|
|
|
635
598
|
} finally {
|
|
@@ -637,8 +600,4 @@ async function main(): Promise<void> {
|
|
|
637
600
|
try { rmSync(dir, { recursive: true, force: true }); } catch { /* ignore */ }
|
|
638
601
|
}
|
|
639
602
|
}
|
|
640
|
-
|
|
641
|
-
report();
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
main();
|
|
603
|
+
});
|