gsd-pi 2.44.0 → 2.45.0-dev.e0ee972
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 +52 -45
- package/dist/resources/extensions/gsd/auto/run-unit.js +6 -3
- package/dist/resources/extensions/gsd/auto-prompts.js +24 -1
- package/dist/resources/extensions/gsd/auto-start.js +31 -2
- 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 +34 -8
- package/dist/resources/extensions/gsd/bootstrap/db-tools.js +168 -11
- 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/handlers/core.js +2 -0
- package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
- 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/db-writer.js +40 -22
- package/dist/resources/extensions/gsd/doctor-checks.js +1 -1
- package/dist/resources/extensions/gsd/doctor.js +10 -2
- package/dist/resources/extensions/gsd/git-service.js +8 -3
- package/dist/resources/extensions/gsd/gsd-db.js +17 -2
- package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
- 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 +2 -4
- package/dist/resources/extensions/gsd/prompts/plan-slice.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/rethink.md +78 -0
- 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/state.js +41 -3
- package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -0
- package/dist/resources/extensions/gsd/tools/plan-task.js +1 -0
- package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -0
- package/dist/resources/extensions/gsd/tools/validate-milestone.js +88 -0
- package/dist/resources/extensions/gsd/workflow-logger.js +138 -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/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 +15 -15
- 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 +15 -15
- 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 +1 -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/phases.ts +61 -59
- package/src/resources/extensions/gsd/auto/run-unit.ts +6 -3
- package/src/resources/extensions/gsd/auto-prompts.ts +24 -1
- package/src/resources/extensions/gsd/auto-start.ts +39 -2
- 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 +40 -6
- package/src/resources/extensions/gsd/bootstrap/db-tools.ts +160 -11
- 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/handlers/core.ts +2 -0
- package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
- 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/db-writer.ts +41 -27
- package/src/resources/extensions/gsd/doctor-checks.ts +1 -1
- package/src/resources/extensions/gsd/doctor.ts +9 -3
- package/src/resources/extensions/gsd/git-service.ts +6 -2
- package/src/resources/extensions/gsd/gsd-db.ts +21 -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/preferences-types.ts +2 -2
- package/src/resources/extensions/gsd/preferences.ts +18 -4
- package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -4
- package/src/resources/extensions/gsd/prompts/plan-slice.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/rethink.md +78 -0
- 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/state.ts +41 -1
- 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 +14 -16
- 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 +38 -59
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +228 -263
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +250 -302
- 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 +27 -35
- 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 +81 -102
- 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 +18 -18
- 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 +80 -93
- 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/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-crash-recovery.test.ts +40 -47
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
- package/src/resources/extensions/gsd/tests/parsers.test.ts +546 -611
- package/src/resources/extensions/gsd/tests/paths.test.ts +72 -87
- 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/prompt-contracts.test.ts +11 -7
- 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/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 -44
- 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/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/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-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-logger.test.ts +275 -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/tools/plan-slice.ts +2 -0
- package/src/resources/extensions/gsd/tools/plan-task.ts +2 -0
- package/src/resources/extensions/gsd/tools/replan-slice.ts +3 -0
- package/src/resources/extensions/gsd/tools/validate-milestone.ts +127 -0
- package/src/resources/extensions/gsd/workflow-logger.ts +193 -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/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_ → dFMji9G1LZ-Tv36el9pRT}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{mgkxN0mGP6gSUmGPEzbk_ → dFMji9G1LZ-Tv36el9pRT}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* worktree-submodule-safety.test.ts — #2337
|
|
3
|
+
*
|
|
4
|
+
* Worktree teardown (removeWorktree) uses --force which destroys
|
|
5
|
+
* uncommitted changes in submodule directories. This test verifies
|
|
6
|
+
* that the removal logic detects submodules and preserves their state.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { readFileSync } from "node:fs";
|
|
10
|
+
import { join } from "node:path";
|
|
11
|
+
import { createTestContext } from "./test-helpers.ts";
|
|
12
|
+
|
|
13
|
+
const { assertTrue, report } = createTestContext();
|
|
14
|
+
|
|
15
|
+
const srcPath = join(import.meta.dirname, "..", "worktree-manager.ts");
|
|
16
|
+
const src = readFileSync(srcPath, "utf-8");
|
|
17
|
+
|
|
18
|
+
console.log("\n=== #2337: Worktree teardown preserves submodule state ===");
|
|
19
|
+
|
|
20
|
+
// ── Test 1: removeWorktree function exists ──────────────────────────────
|
|
21
|
+
|
|
22
|
+
const removeWorktreeIdx = src.indexOf("export function removeWorktree");
|
|
23
|
+
assertTrue(removeWorktreeIdx > 0, "worktree-manager.ts exports removeWorktree");
|
|
24
|
+
|
|
25
|
+
const fnBody = src.slice(removeWorktreeIdx, removeWorktreeIdx + 3000);
|
|
26
|
+
|
|
27
|
+
// ── Test 2: The function checks for submodules before force removal ─────
|
|
28
|
+
|
|
29
|
+
const checksSubmodules =
|
|
30
|
+
fnBody.includes("submodule") ||
|
|
31
|
+
fnBody.includes(".gitmodules");
|
|
32
|
+
|
|
33
|
+
assertTrue(
|
|
34
|
+
checksSubmodules,
|
|
35
|
+
"removeWorktree checks for submodules before force removal (#2337)",
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
// ── Test 3: Submodule changes are stashed or warned about ───────────────
|
|
39
|
+
|
|
40
|
+
const preservesSubmoduleState =
|
|
41
|
+
fnBody.includes("stash") ||
|
|
42
|
+
fnBody.includes("uncommitted") ||
|
|
43
|
+
fnBody.includes("dirty") ||
|
|
44
|
+
fnBody.includes("submodule") && (fnBody.includes("warn") || fnBody.includes("preserv"));
|
|
45
|
+
|
|
46
|
+
assertTrue(
|
|
47
|
+
preservesSubmoduleState,
|
|
48
|
+
"removeWorktree preserves or warns about submodule uncommitted changes (#2337)",
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
// ── Test 4: Force removal is skipped when submodules have changes ───────
|
|
52
|
+
|
|
53
|
+
// The key fix: when submodules have dirty state, we should NOT use force
|
|
54
|
+
// removal. Instead, use non-force first and fall back to force only after
|
|
55
|
+
// submodule state is preserved.
|
|
56
|
+
const hasConditionalForce =
|
|
57
|
+
fnBody.includes("submodule") &&
|
|
58
|
+
(fnBody.includes("force") || fnBody.includes("--force"));
|
|
59
|
+
|
|
60
|
+
assertTrue(
|
|
61
|
+
hasConditionalForce,
|
|
62
|
+
"removeWorktree has conditional force logic around submodules (#2337)",
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
report();
|
|
@@ -20,9 +20,9 @@ import {
|
|
|
20
20
|
listWorktrees,
|
|
21
21
|
worktreePath,
|
|
22
22
|
} from "../worktree-manager.ts";
|
|
23
|
-
import {
|
|
23
|
+
import { describe, test } from 'node:test';
|
|
24
|
+
import assert from 'node:assert/strict';
|
|
24
25
|
|
|
25
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
26
26
|
|
|
27
27
|
function run(command: string, cwd: string): string {
|
|
28
28
|
return execSync(command, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
@@ -46,8 +46,8 @@ mkdirSync(join(externalState, "worktrees"), { recursive: true });
|
|
|
46
46
|
symlinkSync(externalState, join(base, ".gsd"));
|
|
47
47
|
|
|
48
48
|
// Verify the symlink is in place
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
assert.ok(existsSync(join(base, ".gsd")), ".gsd symlink exists");
|
|
50
|
+
assert.ok(
|
|
51
51
|
realpathSync(join(base, ".gsd")) === externalState,
|
|
52
52
|
".gsd resolves to external state dir",
|
|
53
53
|
);
|
|
@@ -57,28 +57,28 @@ writeFileSync(join(base, "README.md"), "# Test\n", "utf-8");
|
|
|
57
57
|
run("git add .", base);
|
|
58
58
|
run('git commit -m "init"', base);
|
|
59
59
|
|
|
60
|
-
async
|
|
60
|
+
describe('worktree-symlink-removal', async () => {
|
|
61
61
|
console.log("\n=== #1852: removeWorktree with symlinked .gsd/ ===");
|
|
62
62
|
|
|
63
63
|
// Create a worktree — git will resolve the symlink and register
|
|
64
64
|
// the worktree at the external path
|
|
65
65
|
const info = createWorktree(base, "M002", { branch: "milestone/M002" });
|
|
66
|
-
|
|
66
|
+
assert.ok(info.exists, "worktree created");
|
|
67
67
|
|
|
68
68
|
// Verify worktree was created at the resolved (external) path
|
|
69
69
|
const realWtPath = realpathSync(info.path);
|
|
70
|
-
|
|
70
|
+
assert.ok(
|
|
71
71
|
realWtPath.startsWith(externalState),
|
|
72
72
|
`worktree real path (${realWtPath}) is under external state dir`,
|
|
73
73
|
);
|
|
74
74
|
|
|
75
75
|
// Verify git registered the worktree
|
|
76
76
|
const gitList = run("git worktree list", base);
|
|
77
|
-
|
|
77
|
+
assert.ok(gitList.includes("M002"), "git worktree list shows M002");
|
|
78
78
|
|
|
79
79
|
// The computed path via worktreePath uses the symlink path
|
|
80
80
|
const computedPath = worktreePath(base, "M002");
|
|
81
|
-
|
|
81
|
+
assert.ok(existsSync(computedPath), "computed path exists (via symlink)");
|
|
82
82
|
|
|
83
83
|
// Simulate what syncStateToProjectRoot does: replace the .gsd symlink with
|
|
84
84
|
// a real directory containing stale worktree data. This causes worktreePath()
|
|
@@ -93,8 +93,8 @@ async function main(): Promise<void> {
|
|
|
93
93
|
// Now worktreePath(base, "M002") points to the LOCAL stale dir, not the
|
|
94
94
|
// external path where git actually registered the worktree.
|
|
95
95
|
const stalePath = worktreePath(base, "M002");
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
assert.ok(existsSync(stalePath), "stale local worktree dir exists");
|
|
97
|
+
assert.ok(
|
|
98
98
|
stalePath !== realWtPath,
|
|
99
99
|
`computed path (${stalePath}) differs from git-registered path (${realWtPath})`,
|
|
100
100
|
);
|
|
@@ -105,36 +105,29 @@ async function main(): Promise<void> {
|
|
|
105
105
|
|
|
106
106
|
// After removal, the worktree should be gone from git's list
|
|
107
107
|
const gitListAfter = run("git worktree list", base);
|
|
108
|
-
|
|
108
|
+
assert.ok(
|
|
109
109
|
!gitListAfter.includes("M002"),
|
|
110
110
|
"worktree removed from git worktree list after removeWorktree",
|
|
111
111
|
);
|
|
112
112
|
|
|
113
113
|
// The branch should be deleted
|
|
114
114
|
const branches = run("git branch", base);
|
|
115
|
-
|
|
115
|
+
assert.ok(
|
|
116
116
|
!branches.includes("milestone/M002"),
|
|
117
117
|
"milestone/M002 branch deleted after removeWorktree",
|
|
118
118
|
);
|
|
119
119
|
|
|
120
120
|
// The worktree directory should be gone
|
|
121
|
-
|
|
121
|
+
assert.ok(
|
|
122
122
|
!existsSync(realWtPath),
|
|
123
123
|
"worktree directory removed from disk",
|
|
124
124
|
);
|
|
125
125
|
|
|
126
126
|
// List should be empty
|
|
127
127
|
const listed = listWorktrees(base);
|
|
128
|
-
|
|
128
|
+
assert.deepStrictEqual(listed.length, 0, "no worktrees listed after removal");
|
|
129
129
|
|
|
130
130
|
// Cleanup
|
|
131
131
|
rmSync(base, { recursive: true, force: true });
|
|
132
132
|
rmSync(externalState, { recursive: true, force: true });
|
|
133
|
-
|
|
134
|
-
report();
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
main().catch((error) => {
|
|
138
|
-
console.error(error);
|
|
139
|
-
process.exit(1);
|
|
140
133
|
});
|
|
@@ -29,9 +29,9 @@ import { tmpdir } from 'node:os';
|
|
|
29
29
|
|
|
30
30
|
import { syncProjectRootToWorktree } from '../auto-worktree-sync.ts';
|
|
31
31
|
import { syncGsdStateToWorktree, syncWorktreeStateBack } from '../auto-worktree.ts';
|
|
32
|
-
import {
|
|
32
|
+
import { describe, test } from 'node:test';
|
|
33
|
+
import assert from 'node:assert/strict';
|
|
33
34
|
|
|
34
|
-
const { assertTrue, report } = createTestContext();
|
|
35
35
|
|
|
36
36
|
function createBase(name: string): string {
|
|
37
37
|
const base = mkdtempSync(join(tmpdir(), `gsd-wt-sync-${name}-`));
|
|
@@ -43,7 +43,7 @@ function cleanup(base: string): void {
|
|
|
43
43
|
rmSync(base, { recursive: true, force: true });
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
async
|
|
46
|
+
describe('worktree-sync-milestones', async () => {
|
|
47
47
|
|
|
48
48
|
// ─── 1. Milestone directory synced from main to worktree ──────────────
|
|
49
49
|
console.log('\n=== 1. milestone directory synced from main to worktree ===');
|
|
@@ -58,13 +58,13 @@ async function main(): Promise<void> {
|
|
|
58
58
|
writeFileSync(join(m001Dir, 'M001-ROADMAP.md'), '# Roadmap');
|
|
59
59
|
|
|
60
60
|
// Worktree has no M001
|
|
61
|
-
|
|
61
|
+
assert.ok(!existsSync(join(wtBase, '.gsd', 'milestones', 'M001')), 'M001 missing before sync');
|
|
62
62
|
|
|
63
63
|
syncProjectRootToWorktree(mainBase, wtBase, 'M001');
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
assert.ok(existsSync(join(wtBase, '.gsd', 'milestones', 'M001')), '#1311: M001 synced to worktree');
|
|
66
|
+
assert.ok(existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'M001-CONTEXT.md')), 'M001 CONTEXT synced');
|
|
67
|
+
assert.ok(existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'M001-ROADMAP.md')), 'M001 ROADMAP synced');
|
|
68
68
|
} finally {
|
|
69
69
|
cleanup(mainBase);
|
|
70
70
|
cleanup(wtBase);
|
|
@@ -92,8 +92,8 @@ async function main(): Promise<void> {
|
|
|
92
92
|
|
|
93
93
|
syncProjectRootToWorktree(mainBase, wtBase, 'M001');
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
assert.ok(existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'slices', 'S02')), '#1311: S02 synced');
|
|
96
|
+
assert.ok(existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'slices', 'S02', 'S02-PLAN.md')), 'S02 PLAN synced');
|
|
97
97
|
} finally {
|
|
98
98
|
cleanup(mainBase);
|
|
99
99
|
cleanup(wtBase);
|
|
@@ -113,11 +113,11 @@ async function main(): Promise<void> {
|
|
|
113
113
|
|
|
114
114
|
// Worktree has a stale gsd.db
|
|
115
115
|
writeFileSync(join(wtBase, '.gsd', 'gsd.db'), 'stale data');
|
|
116
|
-
|
|
116
|
+
assert.ok(existsSync(join(wtBase, '.gsd', 'gsd.db')), 'gsd.db exists before sync');
|
|
117
117
|
|
|
118
118
|
syncProjectRootToWorktree(mainBase, wtBase, 'M001');
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
assert.ok(!existsSync(join(wtBase, '.gsd', 'gsd.db')), '#853: gsd.db deleted after sync');
|
|
121
121
|
} finally {
|
|
122
122
|
cleanup(mainBase);
|
|
123
123
|
cleanup(wtBase);
|
|
@@ -131,7 +131,7 @@ async function main(): Promise<void> {
|
|
|
131
131
|
try {
|
|
132
132
|
// Should not throw
|
|
133
133
|
syncProjectRootToWorktree(base, base, 'M001');
|
|
134
|
-
|
|
134
|
+
assert.ok(true, 'no crash when paths are equal');
|
|
135
135
|
} finally {
|
|
136
136
|
cleanup(base);
|
|
137
137
|
}
|
|
@@ -144,7 +144,7 @@ async function main(): Promise<void> {
|
|
|
144
144
|
const wtBase = createBase('wt');
|
|
145
145
|
try {
|
|
146
146
|
syncProjectRootToWorktree(mainBase, wtBase, null);
|
|
147
|
-
|
|
147
|
+
assert.ok(true, 'no crash when milestoneId is null');
|
|
148
148
|
} finally {
|
|
149
149
|
cleanup(mainBase);
|
|
150
150
|
cleanup(wtBase);
|
|
@@ -155,7 +155,7 @@ async function main(): Promise<void> {
|
|
|
155
155
|
console.log('\n=== 6. non-existent directories → no-op ===');
|
|
156
156
|
{
|
|
157
157
|
syncProjectRootToWorktree('/tmp/does-not-exist-main', '/tmp/does-not-exist-wt', 'M001');
|
|
158
|
-
|
|
158
|
+
assert.ok(true, 'no crash on missing directories');
|
|
159
159
|
}
|
|
160
160
|
|
|
161
161
|
// ─── 7. milestones/ directory created in worktree when missing ────────
|
|
@@ -174,15 +174,15 @@ async function main(): Promise<void> {
|
|
|
174
174
|
writeFileSync(join(m001Dir, 'M001-CONTEXT.md'), '# M001 Context');
|
|
175
175
|
writeFileSync(join(m001Dir, 'M001-ROADMAP.md'), '# M001 Roadmap');
|
|
176
176
|
|
|
177
|
-
|
|
177
|
+
assert.ok(!existsSync(join(wtBase, '.gsd', 'milestones')), 'milestones/ missing before sync');
|
|
178
178
|
|
|
179
179
|
const result = syncGsdStateToWorktree(mainBase, wtBase);
|
|
180
180
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
181
|
+
assert.ok(existsSync(join(wtBase, '.gsd', 'milestones')), 'milestones/ created in worktree');
|
|
182
|
+
assert.ok(existsSync(join(wtBase, '.gsd', 'milestones', 'M001')), 'M001 synced to worktree');
|
|
183
|
+
assert.ok(existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'M001-CONTEXT.md')), 'M001 CONTEXT synced');
|
|
184
|
+
assert.ok(existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'M001-ROADMAP.md')), 'M001 ROADMAP synced');
|
|
185
|
+
assert.ok(result.synced.length > 0, 'sync reported files');
|
|
186
186
|
} finally {
|
|
187
187
|
cleanup(mainBase);
|
|
188
188
|
rmSync(wtBase, { recursive: true, force: true });
|
|
@@ -212,19 +212,19 @@ async function main(): Promise<void> {
|
|
|
212
212
|
const mainSliceDir = join(mainBase, '.gsd', 'milestones', 'M001', 'slices', 'S01');
|
|
213
213
|
const mainTasksDir = join(mainSliceDir, 'tasks');
|
|
214
214
|
|
|
215
|
-
|
|
215
|
+
assert.ok(
|
|
216
216
|
existsSync(join(mainSliceDir, 'S01-SUMMARY.md')),
|
|
217
217
|
'#1678: slice SUMMARY synced to project root',
|
|
218
218
|
);
|
|
219
|
-
|
|
219
|
+
assert.ok(
|
|
220
220
|
existsSync(join(mainTasksDir, 'T01-SUMMARY.md')),
|
|
221
221
|
'#1678: task T01-SUMMARY synced to project root',
|
|
222
222
|
);
|
|
223
|
-
|
|
223
|
+
assert.ok(
|
|
224
224
|
existsSync(join(mainTasksDir, 'T02-SUMMARY.md')),
|
|
225
225
|
'#1678: task T02-SUMMARY synced to project root',
|
|
226
226
|
);
|
|
227
|
-
|
|
227
|
+
assert.ok(
|
|
228
228
|
synced.some((p) => p.includes('tasks/T01-SUMMARY.md')),
|
|
229
229
|
'#1678: task summary appears in synced list',
|
|
230
230
|
);
|
|
@@ -257,27 +257,27 @@ async function main(): Promise<void> {
|
|
|
257
257
|
|
|
258
258
|
// Root-level files should be overwritten with worktree versions
|
|
259
259
|
const reqContent = readFileSync(join(mainBase, '.gsd', 'REQUIREMENTS.md'), 'utf-8');
|
|
260
|
-
|
|
260
|
+
assert.ok(
|
|
261
261
|
reqContent.includes('R002'),
|
|
262
262
|
'REQUIREMENTS.md updated with worktree content',
|
|
263
263
|
);
|
|
264
264
|
|
|
265
265
|
const projContent = readFileSync(join(mainBase, '.gsd', 'PROJECT.md'), 'utf-8');
|
|
266
|
-
|
|
266
|
+
assert.ok(
|
|
267
267
|
projContent.includes('M002'),
|
|
268
268
|
'PROJECT.md updated with worktree content',
|
|
269
269
|
);
|
|
270
270
|
|
|
271
|
-
|
|
271
|
+
assert.ok(
|
|
272
272
|
existsSync(join(mainBase, '.gsd', 'KNOWLEDGE.md')),
|
|
273
273
|
'KNOWLEDGE.md synced from worktree',
|
|
274
274
|
);
|
|
275
275
|
|
|
276
|
-
|
|
276
|
+
assert.ok(
|
|
277
277
|
synced.includes('REQUIREMENTS.md'),
|
|
278
278
|
'REQUIREMENTS.md appears in synced list',
|
|
279
279
|
);
|
|
280
|
-
|
|
280
|
+
assert.ok(
|
|
281
281
|
synced.includes('PROJECT.md'),
|
|
282
282
|
'PROJECT.md appears in synced list',
|
|
283
283
|
);
|
|
@@ -308,11 +308,11 @@ async function main(): Promise<void> {
|
|
|
308
308
|
writeFileSync(join(wtM002Dir, 'M002-abc123-ROADMAP.md'), '# M002 Roadmap');
|
|
309
309
|
|
|
310
310
|
// Main has neither
|
|
311
|
-
|
|
311
|
+
assert.ok(
|
|
312
312
|
!existsSync(join(mainBase, '.gsd', 'milestones', 'M001')),
|
|
313
313
|
'M001 missing in main before sync',
|
|
314
314
|
);
|
|
315
|
-
|
|
315
|
+
assert.ok(
|
|
316
316
|
!existsSync(join(mainBase, '.gsd', 'milestones', 'M002-abc123')),
|
|
317
317
|
'M002 missing in main before sync',
|
|
318
318
|
);
|
|
@@ -321,22 +321,22 @@ async function main(): Promise<void> {
|
|
|
321
321
|
const { synced } = syncWorktreeStateBack(mainBase, wtBase, 'M001');
|
|
322
322
|
|
|
323
323
|
// M001 should be synced (current milestone — always synced)
|
|
324
|
-
|
|
324
|
+
assert.ok(
|
|
325
325
|
existsSync(join(mainBase, '.gsd', 'milestones', 'M001', 'M001-SUMMARY.md')),
|
|
326
326
|
'M001 SUMMARY synced to main',
|
|
327
327
|
);
|
|
328
328
|
|
|
329
329
|
// M002 should ALSO be synced (next milestone — the fix)
|
|
330
|
-
|
|
330
|
+
assert.ok(
|
|
331
331
|
existsSync(join(mainBase, '.gsd', 'milestones', 'M002-abc123', 'M002-abc123-CONTEXT.md')),
|
|
332
332
|
'M002 CONTEXT synced to main (next-milestone fix)',
|
|
333
333
|
);
|
|
334
|
-
|
|
334
|
+
assert.ok(
|
|
335
335
|
existsSync(join(mainBase, '.gsd', 'milestones', 'M002-abc123', 'M002-abc123-ROADMAP.md')),
|
|
336
336
|
'M002 ROADMAP synced to main (next-milestone fix)',
|
|
337
337
|
);
|
|
338
338
|
|
|
339
|
-
|
|
339
|
+
assert.ok(
|
|
340
340
|
synced.some((p) => p.includes('M002-abc123')),
|
|
341
341
|
'M002 appears in synced list',
|
|
342
342
|
);
|
|
@@ -387,34 +387,34 @@ async function main(): Promise<void> {
|
|
|
387
387
|
const { synced } = syncWorktreeStateBack(mainBase, wtBase, 'M006-589wvh');
|
|
388
388
|
|
|
389
389
|
// Verify M006 artifacts synced
|
|
390
|
-
|
|
390
|
+
assert.ok(
|
|
391
391
|
existsSync(join(mainBase, '.gsd', 'milestones', 'M006-589wvh', 'M006-589wvh-SUMMARY.md')),
|
|
392
392
|
'M006 SUMMARY synced',
|
|
393
393
|
);
|
|
394
|
-
|
|
394
|
+
assert.ok(
|
|
395
395
|
existsSync(join(mainBase, '.gsd', 'milestones', 'M006-589wvh', 'slices', 'S01', 'S01-SUMMARY.md')),
|
|
396
396
|
'M006 S01 SUMMARY synced',
|
|
397
397
|
);
|
|
398
398
|
|
|
399
399
|
// Verify M007 artifacts synced (the critical fix)
|
|
400
|
-
|
|
400
|
+
assert.ok(
|
|
401
401
|
existsSync(join(mainBase, '.gsd', 'milestones', 'M007-wortc8', 'M007-wortc8-CONTEXT.md')),
|
|
402
402
|
'M007 CONTEXT synced to main (next-milestone)',
|
|
403
403
|
);
|
|
404
|
-
|
|
404
|
+
assert.ok(
|
|
405
405
|
existsSync(join(mainBase, '.gsd', 'milestones', 'M007-wortc8', 'M007-wortc8-ROADMAP.md')),
|
|
406
406
|
'M007 ROADMAP synced to main (next-milestone)',
|
|
407
407
|
);
|
|
408
408
|
|
|
409
409
|
// Verify root-level files updated
|
|
410
410
|
const reqContent = readFileSync(join(mainBase, '.gsd', 'REQUIREMENTS.md'), 'utf-8');
|
|
411
|
-
|
|
411
|
+
assert.ok(
|
|
412
412
|
reqContent.includes('R090'),
|
|
413
413
|
'REQUIREMENTS.md has R090 from worktree',
|
|
414
414
|
);
|
|
415
415
|
|
|
416
416
|
const projContent = readFileSync(join(mainBase, '.gsd', 'PROJECT.md'), 'utf-8');
|
|
417
|
-
|
|
417
|
+
assert.ok(
|
|
418
418
|
projContent.includes('M007'),
|
|
419
419
|
'PROJECT.md has M007 from worktree',
|
|
420
420
|
);
|
|
@@ -441,11 +441,11 @@ async function main(): Promise<void> {
|
|
|
441
441
|
|
|
442
442
|
// Main's REQUIREMENTS should be untouched (worktree had nothing to sync)
|
|
443
443
|
const content = readFileSync(join(mainBase, '.gsd', 'REQUIREMENTS.md'), 'utf-8');
|
|
444
|
-
|
|
444
|
+
assert.ok(
|
|
445
445
|
content === '# Original',
|
|
446
446
|
'REQUIREMENTS.md unchanged when worktree has no copy',
|
|
447
447
|
);
|
|
448
|
-
|
|
448
|
+
assert.ok(
|
|
449
449
|
!synced.includes('REQUIREMENTS.md'),
|
|
450
450
|
'REQUIREMENTS.md not in synced list',
|
|
451
451
|
);
|
|
@@ -473,11 +473,11 @@ async function main(): Promise<void> {
|
|
|
473
473
|
);
|
|
474
474
|
|
|
475
475
|
// Main has neither
|
|
476
|
-
|
|
476
|
+
assert.ok(
|
|
477
477
|
!existsSync(join(mainBase, '.gsd', 'QUEUE.md')),
|
|
478
478
|
'QUEUE.md missing in main before sync',
|
|
479
479
|
);
|
|
480
|
-
|
|
480
|
+
assert.ok(
|
|
481
481
|
!existsSync(join(mainBase, '.gsd', 'completed-units.json')),
|
|
482
482
|
'completed-units.json missing in main before sync',
|
|
483
483
|
);
|
|
@@ -485,31 +485,31 @@ async function main(): Promise<void> {
|
|
|
485
485
|
const { synced } = syncWorktreeStateBack(mainBase, wtBase, 'M001');
|
|
486
486
|
|
|
487
487
|
// QUEUE.md should be synced
|
|
488
|
-
|
|
488
|
+
assert.ok(
|
|
489
489
|
existsSync(join(mainBase, '.gsd', 'QUEUE.md')),
|
|
490
490
|
'#1787: QUEUE.md synced from worktree to main',
|
|
491
491
|
);
|
|
492
492
|
const queueContent = readFileSync(join(mainBase, '.gsd', 'QUEUE.md'), 'utf-8');
|
|
493
|
-
|
|
493
|
+
assert.ok(
|
|
494
494
|
queueContent.includes('M002 next'),
|
|
495
495
|
'#1787: QUEUE.md has correct content',
|
|
496
496
|
);
|
|
497
|
-
|
|
497
|
+
assert.ok(
|
|
498
498
|
synced.includes('QUEUE.md'),
|
|
499
499
|
'#1787: QUEUE.md appears in synced list',
|
|
500
500
|
);
|
|
501
501
|
|
|
502
502
|
// completed-units.json should be synced
|
|
503
|
-
|
|
503
|
+
assert.ok(
|
|
504
504
|
existsSync(join(mainBase, '.gsd', 'completed-units.json')),
|
|
505
505
|
'#1787: completed-units.json synced from worktree to main',
|
|
506
506
|
);
|
|
507
507
|
const cuContent = readFileSync(join(mainBase, '.gsd', 'completed-units.json'), 'utf-8');
|
|
508
|
-
|
|
508
|
+
assert.ok(
|
|
509
509
|
cuContent.includes('M001-S01-T01'),
|
|
510
510
|
'#1787: completed-units.json has correct content',
|
|
511
511
|
);
|
|
512
|
-
|
|
512
|
+
assert.ok(
|
|
513
513
|
synced.includes('completed-units.json'),
|
|
514
514
|
'#1787: completed-units.json appears in synced list',
|
|
515
515
|
);
|
|
@@ -535,20 +535,20 @@ async function main(): Promise<void> {
|
|
|
535
535
|
mkdirSync(suffixDir, { recursive: true });
|
|
536
536
|
writeFileSync(join(suffixDir, 'M001-abc123-CONTEXT.md'), '# M001 Context');
|
|
537
537
|
|
|
538
|
-
|
|
539
|
-
|
|
538
|
+
assert.ok(!existsSync(join(wtBase, '.gsd', 'milestones', 'sprint-alpha')), 'sprint-alpha missing before sync');
|
|
539
|
+
assert.ok(!existsSync(join(wtBase, '.gsd', 'milestones', 'M001-abc123')), 'M001-abc123 missing before sync');
|
|
540
540
|
|
|
541
541
|
const result = syncGsdStateToWorktree(mainBase, wtBase);
|
|
542
542
|
|
|
543
|
-
|
|
543
|
+
assert.ok(
|
|
544
544
|
existsSync(join(wtBase, '.gsd', 'milestones', 'sprint-alpha', 'CONTEXT.md')),
|
|
545
545
|
'#1547: non-standard milestone dir "sprint-alpha" synced to worktree',
|
|
546
546
|
);
|
|
547
|
-
|
|
547
|
+
assert.ok(
|
|
548
548
|
existsSync(join(wtBase, '.gsd', 'milestones', 'M001-abc123', 'M001-abc123-CONTEXT.md')),
|
|
549
549
|
'#1547: suffixed milestone dir "M001-abc123" synced to worktree',
|
|
550
550
|
);
|
|
551
|
-
|
|
551
|
+
assert.ok(result.synced.length > 0, 'sync reported files');
|
|
552
552
|
} finally {
|
|
553
553
|
cleanup(mainBase);
|
|
554
554
|
cleanup(wtBase);
|
|
@@ -570,18 +570,18 @@ async function main(): Promise<void> {
|
|
|
570
570
|
mkdirSync(wtCustomDir, { recursive: true });
|
|
571
571
|
writeFileSync(join(wtCustomDir, 'SUMMARY.md'), '# Sprint Beta Summary');
|
|
572
572
|
|
|
573
|
-
|
|
573
|
+
assert.ok(
|
|
574
574
|
!existsSync(join(mainBase, '.gsd', 'milestones', 'sprint-beta')),
|
|
575
575
|
'sprint-beta missing in main before sync',
|
|
576
576
|
);
|
|
577
577
|
|
|
578
578
|
const { synced } = syncWorktreeStateBack(mainBase, wtBase, 'M001');
|
|
579
579
|
|
|
580
|
-
|
|
580
|
+
assert.ok(
|
|
581
581
|
existsSync(join(mainBase, '.gsd', 'milestones', 'sprint-beta', 'SUMMARY.md')),
|
|
582
582
|
'#1547: non-standard milestone dir "sprint-beta" synced back to main',
|
|
583
583
|
);
|
|
584
|
-
|
|
584
|
+
assert.ok(
|
|
585
585
|
synced.some((p) => p.includes('sprint-beta')),
|
|
586
586
|
'#1547: sprint-beta appears in synced list',
|
|
587
587
|
);
|
|
@@ -590,11 +590,4 @@ async function main(): Promise<void> {
|
|
|
590
590
|
rmSync(wtBase, { recursive: true, force: true });
|
|
591
591
|
}
|
|
592
592
|
}
|
|
593
|
-
|
|
594
|
-
report();
|
|
595
|
-
}
|
|
596
|
-
|
|
597
|
-
main().catch((error) => {
|
|
598
|
-
console.error(error);
|
|
599
|
-
process.exit(1);
|
|
600
593
|
});
|