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
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GSD Rethink — Conversational project reorganization.
|
|
3
|
+
*
|
|
4
|
+
* Collects a snapshot of all milestones (status, dependencies, slice progress,
|
|
5
|
+
* queue order) and dispatches a prompt that turns Claude into a reorganization
|
|
6
|
+
* assistant. Claude can then reorder, park, unpark, discard, or add milestones
|
|
7
|
+
* through conversation.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
|
|
11
|
+
import { existsSync } from "node:fs";
|
|
12
|
+
|
|
13
|
+
import { isAutoActive } from "./auto.js";
|
|
14
|
+
import { deriveState } from "./state.js";
|
|
15
|
+
import { gsdRoot } from "./paths.js";
|
|
16
|
+
import { findMilestoneIds } from "./milestone-ids.js";
|
|
17
|
+
import { loadQueueOrder, validateQueueOrder } from "./queue-order.js";
|
|
18
|
+
import { isParked, getParkedReason } from "./milestone-actions.js";
|
|
19
|
+
import { getMilestoneSlices, isDbAvailable } from "./gsd-db.js";
|
|
20
|
+
import { buildExistingMilestonesContext } from "./guided-flow-queue.js";
|
|
21
|
+
import { loadPrompt } from "./prompt-loader.js";
|
|
22
|
+
|
|
23
|
+
// ─── Entry Point ──────────────────────────────────────────────────────────────
|
|
24
|
+
|
|
25
|
+
export async function handleRethink(
|
|
26
|
+
_args: string,
|
|
27
|
+
ctx: ExtensionCommandContext,
|
|
28
|
+
pi: ExtensionAPI,
|
|
29
|
+
): Promise<void> {
|
|
30
|
+
if (isAutoActive()) {
|
|
31
|
+
ctx.ui.notify("Cannot rethink while auto-mode is active. Stop auto-mode first.", "error");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const basePath = process.cwd();
|
|
36
|
+
const root = gsdRoot(basePath);
|
|
37
|
+
if (!existsSync(root)) {
|
|
38
|
+
ctx.ui.notify("No GSD project found. Run /gsd init first.", "warning");
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
ctx.ui.notify("Building project snapshot for rethink...", "info");
|
|
43
|
+
|
|
44
|
+
const state = await deriveState(basePath);
|
|
45
|
+
const milestoneIds = findMilestoneIds(basePath);
|
|
46
|
+
|
|
47
|
+
if (milestoneIds.length === 0) {
|
|
48
|
+
ctx.ui.notify("No milestones exist yet. Nothing to rethink.", "warning");
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const queueOrder = loadQueueOrder(basePath);
|
|
53
|
+
const rethinkData = buildRethinkData(basePath, milestoneIds, state, queueOrder);
|
|
54
|
+
const existingMilestonesContext = await buildExistingMilestonesContext(basePath, milestoneIds, state);
|
|
55
|
+
|
|
56
|
+
const content = loadPrompt("rethink", {
|
|
57
|
+
rethinkData,
|
|
58
|
+
existingMilestonesContext,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
pi.sendMessage(
|
|
62
|
+
{ customType: "gsd-rethink", content, display: false },
|
|
63
|
+
{ triggerTurn: true },
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// ─── Data Builder ─────────────────────────────────────────────────────────────
|
|
68
|
+
|
|
69
|
+
function buildRethinkData(
|
|
70
|
+
basePath: string,
|
|
71
|
+
milestoneIds: string[],
|
|
72
|
+
state: Awaited<ReturnType<typeof deriveState>>,
|
|
73
|
+
queueOrder: string[] | null,
|
|
74
|
+
): string {
|
|
75
|
+
const lines: string[] = [];
|
|
76
|
+
const dbAvailable = isDbAvailable();
|
|
77
|
+
|
|
78
|
+
// ── Summary stats ───────────────────────────────────────────────────
|
|
79
|
+
const counts = { complete: 0, active: 0, pending: 0, parked: 0 };
|
|
80
|
+
for (const entry of state.registry) {
|
|
81
|
+
if (entry.status in counts) counts[entry.status as keyof typeof counts]++;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
lines.push("### Summary");
|
|
85
|
+
lines.push(`${counts.complete} complete, ${counts.active} active, ${counts.pending} pending, ${counts.parked} parked — ${milestoneIds.length} total`);
|
|
86
|
+
lines.push(`Queue order source: ${queueOrder ? "explicit QUEUE-ORDER.json" : "default numeric (by ID)"}`);
|
|
87
|
+
if (state.activeMilestone) {
|
|
88
|
+
lines.push(`Active milestone: ${state.activeMilestone}`);
|
|
89
|
+
}
|
|
90
|
+
lines.push("");
|
|
91
|
+
|
|
92
|
+
// ── Milestone table ─────────────────────────────────────────────────
|
|
93
|
+
lines.push("### Execution Order");
|
|
94
|
+
lines.push("");
|
|
95
|
+
lines.push("| # | ID | Title | Status | Dependencies | Slices |");
|
|
96
|
+
lines.push("|---|-----|-------|--------|--------------|--------|");
|
|
97
|
+
|
|
98
|
+
for (let i = 0; i < milestoneIds.length; i++) {
|
|
99
|
+
const mid = milestoneIds[i];
|
|
100
|
+
const entry = state.registry.find(m => m.id === mid);
|
|
101
|
+
const title = entry?.title ?? mid;
|
|
102
|
+
const status = entry?.status ?? "unknown";
|
|
103
|
+
const deps = entry?.dependsOn?.length ? entry.dependsOn.join(", ") : "—";
|
|
104
|
+
|
|
105
|
+
let sliceInfo = "—";
|
|
106
|
+
if (dbAvailable && status !== "complete") {
|
|
107
|
+
const slices = getMilestoneSlices(mid);
|
|
108
|
+
if (slices.length > 0) {
|
|
109
|
+
const done = slices.filter(s => s.status === "complete").length;
|
|
110
|
+
sliceInfo = `${done}/${slices.length} complete`;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Add parked reason if applicable
|
|
115
|
+
let statusDisplay = status;
|
|
116
|
+
if (status === "parked") {
|
|
117
|
+
const reason = getParkedReason(basePath, mid);
|
|
118
|
+
if (reason) statusDisplay = `parked (${reason})`;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
lines.push(`| ${i + 1} | ${mid} | ${title} | ${statusDisplay} | ${deps} | ${sliceInfo} |`);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ── Dependency validation ───────────────────────────────────────────
|
|
125
|
+
const pendingIds = milestoneIds.filter(mid => {
|
|
126
|
+
const entry = state.registry.find(m => m.id === mid);
|
|
127
|
+
return entry?.status !== "complete";
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
const completedIds = new Set(
|
|
131
|
+
state.registry.filter(m => m.status === "complete").map(m => m.id),
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
const depsMap = new Map<string, string[]>();
|
|
135
|
+
for (const entry of state.registry) {
|
|
136
|
+
if (entry.dependsOn?.length) {
|
|
137
|
+
depsMap.set(entry.id, entry.dependsOn);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (pendingIds.length > 0 && depsMap.size > 0) {
|
|
142
|
+
const validation = validateQueueOrder(pendingIds, depsMap, completedIds);
|
|
143
|
+
|
|
144
|
+
if (validation.violations.length > 0) {
|
|
145
|
+
lines.push("");
|
|
146
|
+
lines.push("### Dependency Issues");
|
|
147
|
+
for (const v of validation.violations) {
|
|
148
|
+
lines.push(`- **${v.type}**: ${v.message}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return lines.join("\n");
|
|
154
|
+
}
|
|
@@ -32,7 +32,6 @@ export interface SessionLockData {
|
|
|
32
32
|
unitType: string;
|
|
33
33
|
unitId: string;
|
|
34
34
|
unitStartedAt: string;
|
|
35
|
-
completedUnits: number;
|
|
36
35
|
sessionFile?: string;
|
|
37
36
|
}
|
|
38
37
|
|
|
@@ -205,7 +204,6 @@ export function acquireSessionLock(basePath: string): SessionLockResult {
|
|
|
205
204
|
unitType: "starting",
|
|
206
205
|
unitId: "bootstrap",
|
|
207
206
|
unitStartedAt: new Date().toISOString(),
|
|
208
|
-
completedUnits: 0,
|
|
209
207
|
};
|
|
210
208
|
|
|
211
209
|
let lockfile: typeof import("proper-lockfile");
|
|
@@ -379,7 +377,6 @@ export function updateSessionLock(
|
|
|
379
377
|
basePath: string,
|
|
380
378
|
unitType: string,
|
|
381
379
|
unitId: string,
|
|
382
|
-
completedUnits: number,
|
|
383
380
|
sessionFile?: string,
|
|
384
381
|
): void {
|
|
385
382
|
if (_lockedPath !== basePath && _lockedPath !== null) return;
|
|
@@ -392,7 +389,6 @@ export function updateSessionLock(
|
|
|
392
389
|
unitType,
|
|
393
390
|
unitId,
|
|
394
391
|
unitStartedAt: new Date().toISOString(),
|
|
395
|
-
completedUnits,
|
|
396
392
|
sessionFile,
|
|
397
393
|
};
|
|
398
394
|
atomicWriteSync(lp, JSON.stringify(data, null, 2));
|
|
@@ -48,6 +48,7 @@ import {
|
|
|
48
48
|
getSliceTasks,
|
|
49
49
|
getReplanHistory,
|
|
50
50
|
getSlice,
|
|
51
|
+
insertMilestone,
|
|
51
52
|
type MilestoneRow,
|
|
52
53
|
type SliceRow,
|
|
53
54
|
type TaskRow,
|
|
@@ -117,6 +118,11 @@ interface StateCache {
|
|
|
117
118
|
const CACHE_TTL_MS = 100;
|
|
118
119
|
let _stateCache: StateCache | null = null;
|
|
119
120
|
|
|
121
|
+
// ── Telemetry counters for derive-path observability ────────────────────────
|
|
122
|
+
let _telemetry = { dbDeriveCount: 0, markdownDeriveCount: 0 };
|
|
123
|
+
export function getDeriveTelemetry() { return { ..._telemetry }; }
|
|
124
|
+
export function resetDeriveTelemetry() { _telemetry = { dbDeriveCount: 0, markdownDeriveCount: 0 }; }
|
|
125
|
+
|
|
120
126
|
/**
|
|
121
127
|
* Invalidate the deriveState() cache. Call this whenever planning files on disk
|
|
122
128
|
* may have changed (unit completion, merges, file writes).
|
|
@@ -203,12 +209,15 @@ export async function deriveState(basePath: string): Promise<GSDState> {
|
|
|
203
209
|
const stopDbTimer = debugTime("derive-state-db");
|
|
204
210
|
result = await deriveStateFromDb(basePath);
|
|
205
211
|
stopDbTimer({ phase: result.phase, milestone: result.activeMilestone?.id });
|
|
212
|
+
_telemetry.dbDeriveCount++;
|
|
206
213
|
} else {
|
|
207
214
|
// DB open but empty hierarchy tables — pre-migration project, use filesystem
|
|
208
215
|
result = await _deriveStateImpl(basePath);
|
|
216
|
+
_telemetry.markdownDeriveCount++;
|
|
209
217
|
}
|
|
210
218
|
} else {
|
|
211
219
|
result = await _deriveStateImpl(basePath);
|
|
220
|
+
_telemetry.markdownDeriveCount++;
|
|
212
221
|
}
|
|
213
222
|
|
|
214
223
|
stopTimer({ phase: result.phase, milestone: result.activeMilestone?.id });
|
|
@@ -257,7 +266,46 @@ function isStatusDone(status: string): boolean {
|
|
|
257
266
|
export async function deriveStateFromDb(basePath: string): Promise<GSDState> {
|
|
258
267
|
const requirements = parseRequirementCounts(await loadFile(resolveGsdRootFile(basePath, "REQUIREMENTS")));
|
|
259
268
|
|
|
260
|
-
|
|
269
|
+
let allMilestones = getAllMilestones();
|
|
270
|
+
|
|
271
|
+
// Incremental disk→DB sync: milestone directories created outside the DB
|
|
272
|
+
// write path (via /gsd queue, manual mkdir, or complete-milestone writing the
|
|
273
|
+
// next CONTEXT.md) are never inserted by the initial migration guard in
|
|
274
|
+
// auto-start.ts because that guard only runs when gsd.db doesn't exist yet.
|
|
275
|
+
// Reconcile here so deriveStateFromDb never silently misses queued milestones.
|
|
276
|
+
// insertMilestone uses INSERT OR IGNORE, so this is safe to call every time.
|
|
277
|
+
const dbIdSet = new Set(allMilestones.map(m => m.id));
|
|
278
|
+
const diskIds = findMilestoneIds(basePath);
|
|
279
|
+
let synced = false;
|
|
280
|
+
for (const diskId of diskIds) {
|
|
281
|
+
if (!dbIdSet.has(diskId) && !isGhostMilestone(basePath, diskId)) {
|
|
282
|
+
insertMilestone({ id: diskId, status: 'active' });
|
|
283
|
+
synced = true;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
if (synced) allMilestones = getAllMilestones();
|
|
287
|
+
|
|
288
|
+
// Reconcile: discover milestones that exist on disk but are missing from
|
|
289
|
+
// the DB. This happens when milestones were created before the DB migration
|
|
290
|
+
// or were manually added to the filesystem. Without this, disk-only
|
|
291
|
+
// milestones are invisible after migration (#2416).
|
|
292
|
+
const dbMilestoneIds = new Set(allMilestones.map(m => m.id));
|
|
293
|
+
const diskMilestoneIds = findMilestoneIds(basePath);
|
|
294
|
+
for (const diskId of diskMilestoneIds) {
|
|
295
|
+
if (!dbMilestoneIds.has(diskId)) {
|
|
296
|
+
// Synthesize a minimal MilestoneRow for the disk-only milestone.
|
|
297
|
+
// Title and status will be resolved from disk files in the loop below.
|
|
298
|
+
allMilestones.push({
|
|
299
|
+
id: diskId,
|
|
300
|
+
title: diskId,
|
|
301
|
+
status: 'active',
|
|
302
|
+
depends_on: [] as string[],
|
|
303
|
+
created_at: new Date().toISOString(),
|
|
304
|
+
} as MilestoneRow);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
// Re-sort so milestones are in canonical order after injection
|
|
308
|
+
allMilestones.sort((a, b) => milestoneIdSort(a.id, b.id));
|
|
261
309
|
|
|
262
310
|
// Parallel worker isolation: when locked, filter to just the locked milestone
|
|
263
311
|
const milestoneLock = process.env.GSD_MILESTONE_LOCK;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
// GSD Extension — Advisory Sync Lock
|
|
2
|
+
// Prevents concurrent worktree syncs from colliding via a simple file lock.
|
|
3
|
+
// Stale locks (mtime > 60s) are auto-overridden. Lock acquisition waits up
|
|
4
|
+
// to 5 seconds then skips non-fatally.
|
|
5
|
+
|
|
6
|
+
import { existsSync, statSync, unlinkSync } from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { atomicWriteSync } from "./atomic-write.js";
|
|
9
|
+
|
|
10
|
+
const STALE_THRESHOLD_MS = 60_000; // 60 seconds
|
|
11
|
+
const DEFAULT_TIMEOUT_MS = 5_000; // 5 seconds
|
|
12
|
+
const SPIN_INTERVAL_MS = 100; // 100ms polling interval
|
|
13
|
+
|
|
14
|
+
// SharedArrayBuffer for synchronous sleep via Atomics.wait
|
|
15
|
+
const SLEEP_BUFFER = new SharedArrayBuffer(4);
|
|
16
|
+
const SLEEP_VIEW = new Int32Array(SLEEP_BUFFER);
|
|
17
|
+
|
|
18
|
+
function lockFilePath(basePath: string): string {
|
|
19
|
+
return join(basePath, ".gsd", "sync.lock");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function sleepSync(ms: number): void {
|
|
23
|
+
Atomics.wait(SLEEP_VIEW, 0, 0, ms);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Acquire an advisory sync lock for the given basePath.
|
|
28
|
+
* Returns { acquired: true } on success, { acquired: false } after timeout.
|
|
29
|
+
*
|
|
30
|
+
* - Creates lock file at {basePath}/.gsd/sync.lock with JSON { pid, acquired_at }
|
|
31
|
+
* - If lock exists and mtime > 60s (stale), overrides it
|
|
32
|
+
* - If lock exists and not stale, spins up to timeoutMs before giving up
|
|
33
|
+
*/
|
|
34
|
+
export function acquireSyncLock(
|
|
35
|
+
basePath: string,
|
|
36
|
+
timeoutMs: number = DEFAULT_TIMEOUT_MS,
|
|
37
|
+
): { acquired: boolean } {
|
|
38
|
+
const lp = lockFilePath(basePath);
|
|
39
|
+
const deadline = Date.now() + timeoutMs;
|
|
40
|
+
|
|
41
|
+
while (true) {
|
|
42
|
+
// Check if lock file exists
|
|
43
|
+
if (existsSync(lp)) {
|
|
44
|
+
// Check staleness
|
|
45
|
+
try {
|
|
46
|
+
const stat = statSync(lp);
|
|
47
|
+
const age = Date.now() - stat.mtimeMs;
|
|
48
|
+
if (age > STALE_THRESHOLD_MS) {
|
|
49
|
+
// Stale lock — override it
|
|
50
|
+
try { unlinkSync(lp); } catch { /* race: already removed */ }
|
|
51
|
+
} else {
|
|
52
|
+
// Lock is held and not stale — wait or give up
|
|
53
|
+
if (Date.now() >= deadline) {
|
|
54
|
+
return { acquired: false };
|
|
55
|
+
}
|
|
56
|
+
sleepSync(SPIN_INTERVAL_MS);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
} catch {
|
|
60
|
+
// stat failed (file removed between exists check and stat) — try to acquire
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Lock file does not exist (or was just removed) — try to write it
|
|
65
|
+
try {
|
|
66
|
+
const lockData = {
|
|
67
|
+
pid: process.pid,
|
|
68
|
+
acquired_at: new Date().toISOString(),
|
|
69
|
+
};
|
|
70
|
+
atomicWriteSync(lp, JSON.stringify(lockData, null, 2));
|
|
71
|
+
return { acquired: true };
|
|
72
|
+
} catch {
|
|
73
|
+
// Write failed (race condition with another process) — retry or give up
|
|
74
|
+
if (Date.now() >= deadline) {
|
|
75
|
+
return { acquired: false };
|
|
76
|
+
}
|
|
77
|
+
sleepSync(SPIN_INTERVAL_MS);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Release the advisory sync lock. No-op if lock file does not exist.
|
|
84
|
+
*/
|
|
85
|
+
export function releaseSyncLock(basePath: string): void {
|
|
86
|
+
const lp = lockFilePath(basePath);
|
|
87
|
+
try {
|
|
88
|
+
if (existsSync(lp)) {
|
|
89
|
+
unlinkSync(lp);
|
|
90
|
+
}
|
|
91
|
+
} catch {
|
|
92
|
+
// Non-fatal — lock may have been released by another process
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -130,119 +130,119 @@ test("auto-loop 'all milestones complete' path merges before stopping (#962)", (
|
|
|
130
130
|
|
|
131
131
|
// ─── Integration: single milestone completes → merged to main ────────────────
|
|
132
132
|
|
|
133
|
-
test("single milestone worktree is merged to main when all complete (#962)", () => {
|
|
133
|
+
test("single milestone worktree is merged to main when all complete (#962)", (t) => {
|
|
134
134
|
const savedCwd = process.cwd();
|
|
135
135
|
let tempDir = "";
|
|
136
136
|
|
|
137
|
-
|
|
138
|
-
tempDir = createTempRepo();
|
|
139
|
-
|
|
140
|
-
// Set up a single milestone
|
|
141
|
-
createMilestoneArtifacts(tempDir, "M001");
|
|
142
|
-
run("git add .", tempDir);
|
|
143
|
-
run('git commit -m "add milestone"', tempDir);
|
|
144
|
-
|
|
145
|
-
// Create worktree and simulate work
|
|
146
|
-
const wt = createAutoWorktree(tempDir, "M001");
|
|
147
|
-
assert.ok(isInAutoWorktree(tempDir), "should be in auto-worktree");
|
|
148
|
-
|
|
149
|
-
writeFileSync(join(wt, "feature.ts"), "export const feature = true;\n");
|
|
150
|
-
run("git add .", wt);
|
|
151
|
-
run('git commit -m "feat(M001): add feature"', wt);
|
|
152
|
-
|
|
153
|
-
// Simulate the fix: merge before stopping (what the "all complete" path now does)
|
|
154
|
-
const roadmapPath = join(
|
|
155
|
-
tempDir,
|
|
156
|
-
".gsd",
|
|
157
|
-
"milestones",
|
|
158
|
-
"M001",
|
|
159
|
-
"M001-ROADMAP.md",
|
|
160
|
-
);
|
|
161
|
-
const roadmapContent = readFileSync(roadmapPath, "utf-8");
|
|
162
|
-
const mergeResult = mergeMilestoneToMain(tempDir, "M001", roadmapContent);
|
|
163
|
-
|
|
164
|
-
// Verify work is on main
|
|
165
|
-
assert.ok(
|
|
166
|
-
existsSync(join(tempDir, "feature.ts")),
|
|
167
|
-
"feature.ts should be on main after merge",
|
|
168
|
-
);
|
|
169
|
-
assert.equal(process.cwd(), tempDir, "cwd restored to project root");
|
|
170
|
-
assert.ok(!isInAutoWorktree(tempDir), "no longer in auto-worktree");
|
|
171
|
-
assert.equal(getAutoWorktreeOriginalBase(), null, "originalBase cleared");
|
|
172
|
-
|
|
173
|
-
// Verify milestone branch was cleaned up
|
|
174
|
-
const branches = run("git branch", tempDir);
|
|
175
|
-
assert.ok(
|
|
176
|
-
!branches.includes("milestone/M001"),
|
|
177
|
-
"milestone branch should be deleted",
|
|
178
|
-
);
|
|
179
|
-
|
|
180
|
-
// Verify squash commit on main
|
|
181
|
-
const log = run("git log --oneline -3", tempDir);
|
|
182
|
-
assert.ok(
|
|
183
|
-
log.includes("M001"),
|
|
184
|
-
"squash commit on main should reference M001",
|
|
185
|
-
);
|
|
186
|
-
|
|
187
|
-
assert.ok(mergeResult.commitMessage.length > 0, "commit message returned");
|
|
188
|
-
} finally {
|
|
137
|
+
t.after(() => {
|
|
189
138
|
process.chdir(savedCwd);
|
|
190
139
|
if (tempDir && existsSync(tempDir)) {
|
|
191
|
-
|
|
140
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
192
141
|
}
|
|
193
|
-
}
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
tempDir = createTempRepo();
|
|
145
|
+
|
|
146
|
+
// Set up a single milestone
|
|
147
|
+
createMilestoneArtifacts(tempDir, "M001");
|
|
148
|
+
run("git add .", tempDir);
|
|
149
|
+
run('git commit -m "add milestone"', tempDir);
|
|
150
|
+
|
|
151
|
+
// Create worktree and simulate work
|
|
152
|
+
const wt = createAutoWorktree(tempDir, "M001");
|
|
153
|
+
assert.ok(isInAutoWorktree(tempDir), "should be in auto-worktree");
|
|
154
|
+
|
|
155
|
+
writeFileSync(join(wt, "feature.ts"), "export const feature = true;\n");
|
|
156
|
+
run("git add .", wt);
|
|
157
|
+
run('git commit -m "feat(M001): add feature"', wt);
|
|
158
|
+
|
|
159
|
+
// Simulate the fix: merge before stopping (what the "all complete" path now does)
|
|
160
|
+
const roadmapPath = join(
|
|
161
|
+
tempDir,
|
|
162
|
+
".gsd",
|
|
163
|
+
"milestones",
|
|
164
|
+
"M001",
|
|
165
|
+
"M001-ROADMAP.md",
|
|
166
|
+
);
|
|
167
|
+
const roadmapContent = readFileSync(roadmapPath, "utf-8");
|
|
168
|
+
const mergeResult = mergeMilestoneToMain(tempDir, "M001", roadmapContent);
|
|
169
|
+
|
|
170
|
+
// Verify work is on main
|
|
171
|
+
assert.ok(
|
|
172
|
+
existsSync(join(tempDir, "feature.ts")),
|
|
173
|
+
"feature.ts should be on main after merge",
|
|
174
|
+
);
|
|
175
|
+
assert.equal(process.cwd(), tempDir, "cwd restored to project root");
|
|
176
|
+
assert.ok(!isInAutoWorktree(tempDir), "no longer in auto-worktree");
|
|
177
|
+
assert.equal(getAutoWorktreeOriginalBase(), null, "originalBase cleared");
|
|
178
|
+
|
|
179
|
+
// Verify milestone branch was cleaned up
|
|
180
|
+
const branches = run("git branch", tempDir);
|
|
181
|
+
assert.ok(
|
|
182
|
+
!branches.includes("milestone/M001"),
|
|
183
|
+
"milestone branch should be deleted",
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
// Verify squash commit on main
|
|
187
|
+
const log = run("git log --oneline -3", tempDir);
|
|
188
|
+
assert.ok(
|
|
189
|
+
log.includes("M001"),
|
|
190
|
+
"squash commit on main should reference M001",
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
assert.ok(mergeResult.commitMessage.length > 0, "commit message returned");
|
|
194
194
|
});
|
|
195
195
|
|
|
196
196
|
// ─── Integration: last of multiple milestones completes → merged ─────────────
|
|
197
197
|
|
|
198
|
-
test("last milestone worktree is merged when it's the final one (#962)", () => {
|
|
198
|
+
test("last milestone worktree is merged when it's the final one (#962)", (t) => {
|
|
199
199
|
const savedCwd = process.cwd();
|
|
200
200
|
let tempDir = "";
|
|
201
201
|
|
|
202
|
-
|
|
203
|
-
tempDir = createTempRepo();
|
|
204
|
-
|
|
205
|
-
// Set up two milestones
|
|
206
|
-
createMilestoneArtifacts(tempDir, "M001");
|
|
207
|
-
createMilestoneArtifacts(tempDir, "M002");
|
|
208
|
-
run("git add .", tempDir);
|
|
209
|
-
run('git commit -m "add milestones"', tempDir);
|
|
210
|
-
|
|
211
|
-
// Complete M001 first (merge it)
|
|
212
|
-
const wt1 = createAutoWorktree(tempDir, "M001");
|
|
213
|
-
writeFileSync(join(wt1, "m001-work.ts"), "export const m001 = true;\n");
|
|
214
|
-
run("git add .", wt1);
|
|
215
|
-
run('git commit -m "feat(M001): m001 work"', wt1);
|
|
216
|
-
const roadmap1 = readFileSync(
|
|
217
|
-
join(tempDir, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
|
|
218
|
-
"utf-8",
|
|
219
|
-
);
|
|
220
|
-
mergeMilestoneToMain(tempDir, "M001", roadmap1);
|
|
221
|
-
|
|
222
|
-
// Now complete M002 (the LAST milestone — this is the #962 scenario)
|
|
223
|
-
const wt2 = createAutoWorktree(tempDir, "M002");
|
|
224
|
-
writeFileSync(join(wt2, "m002-work.ts"), "export const m002 = true;\n");
|
|
225
|
-
run("git add .", wt2);
|
|
226
|
-
run('git commit -m "feat(M002): m002 work"', wt2);
|
|
227
|
-
const roadmap2 = readFileSync(
|
|
228
|
-
join(tempDir, ".gsd", "milestones", "M002", "M002-ROADMAP.md"),
|
|
229
|
-
"utf-8",
|
|
230
|
-
);
|
|
231
|
-
mergeMilestoneToMain(tempDir, "M002", roadmap2);
|
|
232
|
-
|
|
233
|
-
// Both features should now be on main
|
|
234
|
-
assert.ok(existsSync(join(tempDir, "m001-work.ts")), "M001 work on main");
|
|
235
|
-
assert.ok(existsSync(join(tempDir, "m002-work.ts")), "M002 work on main");
|
|
236
|
-
assert.ok(!isInAutoWorktree(tempDir), "not in worktree after final merge");
|
|
237
|
-
|
|
238
|
-
// Both milestone branches should be cleaned up
|
|
239
|
-
const branches = run("git branch", tempDir);
|
|
240
|
-
assert.ok(!branches.includes("milestone/M001"), "M001 branch deleted");
|
|
241
|
-
assert.ok(!branches.includes("milestone/M002"), "M002 branch deleted");
|
|
242
|
-
} finally {
|
|
202
|
+
t.after(() => {
|
|
243
203
|
process.chdir(savedCwd);
|
|
244
204
|
if (tempDir && existsSync(tempDir)) {
|
|
245
|
-
|
|
205
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
246
206
|
}
|
|
247
|
-
}
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
tempDir = createTempRepo();
|
|
210
|
+
|
|
211
|
+
// Set up two milestones
|
|
212
|
+
createMilestoneArtifacts(tempDir, "M001");
|
|
213
|
+
createMilestoneArtifacts(tempDir, "M002");
|
|
214
|
+
run("git add .", tempDir);
|
|
215
|
+
run('git commit -m "add milestones"', tempDir);
|
|
216
|
+
|
|
217
|
+
// Complete M001 first (merge it)
|
|
218
|
+
const wt1 = createAutoWorktree(tempDir, "M001");
|
|
219
|
+
writeFileSync(join(wt1, "m001-work.ts"), "export const m001 = true;\n");
|
|
220
|
+
run("git add .", wt1);
|
|
221
|
+
run('git commit -m "feat(M001): m001 work"', wt1);
|
|
222
|
+
const roadmap1 = readFileSync(
|
|
223
|
+
join(tempDir, ".gsd", "milestones", "M001", "M001-ROADMAP.md"),
|
|
224
|
+
"utf-8",
|
|
225
|
+
);
|
|
226
|
+
mergeMilestoneToMain(tempDir, "M001", roadmap1);
|
|
227
|
+
|
|
228
|
+
// Now complete M002 (the LAST milestone — this is the #962 scenario)
|
|
229
|
+
const wt2 = createAutoWorktree(tempDir, "M002");
|
|
230
|
+
writeFileSync(join(wt2, "m002-work.ts"), "export const m002 = true;\n");
|
|
231
|
+
run("git add .", wt2);
|
|
232
|
+
run('git commit -m "feat(M002): m002 work"', wt2);
|
|
233
|
+
const roadmap2 = readFileSync(
|
|
234
|
+
join(tempDir, ".gsd", "milestones", "M002", "M002-ROADMAP.md"),
|
|
235
|
+
"utf-8",
|
|
236
|
+
);
|
|
237
|
+
mergeMilestoneToMain(tempDir, "M002", roadmap2);
|
|
238
|
+
|
|
239
|
+
// Both features should now be on main
|
|
240
|
+
assert.ok(existsSync(join(tempDir, "m001-work.ts")), "M001 work on main");
|
|
241
|
+
assert.ok(existsSync(join(tempDir, "m002-work.ts")), "M002 work on main");
|
|
242
|
+
assert.ok(!isInAutoWorktree(tempDir), "not in worktree after final merge");
|
|
243
|
+
|
|
244
|
+
// Both milestone branches should be cleaned up
|
|
245
|
+
const branches = run("git branch", tempDir);
|
|
246
|
+
assert.ok(!branches.includes("milestone/M001"), "M001 branch deleted");
|
|
247
|
+
assert.ok(!branches.includes("milestone/M002"), "M002 branch deleted");
|
|
248
248
|
});
|