gsd-pi 2.44.0-dev.848dd4c → 2.44.0
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 +12 -30
- package/dist/resources/extensions/gsd/auto-start.js +0 -10
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +0 -5
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
- package/dist/web/standalone/.next/build-manifest.json +3 -3
- package/dist/web/standalone/.next/prerender-manifest.json +3 -3
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- 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 +3 -3
- 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 +1 -1
- 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 +4 -4
- 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 +4 -4
- 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 +3 -3
- package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- 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 +14 -14
- 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.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/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/app/page-7e9530a7122506c5.js +1 -0
- package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
- package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
- package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
- package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
- package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
- package/dist/web/standalone/server.js +1 -1
- package/package.json +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +8 -6
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +26 -24
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js +48 -29
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +44 -34
- 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 +34 -30
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +12 -10
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +47 -43
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +43 -31
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +45 -40
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
- package/src/resources/extensions/gsd/auto-start.ts +0 -14
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +0 -8
- 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 +16 -14
- package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +57 -43
- package/src/resources/extensions/gsd/tests/auto-preflight.test.ts +13 -11
- package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +523 -465
- package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +75 -73
- package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +56 -34
- package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +656 -533
- package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +143 -165
- package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +52 -29
- package/src/resources/extensions/gsd/tests/captures.test.ts +176 -148
- package/src/resources/extensions/gsd/tests/claude-import-tui.test.ts +33 -32
- package/src/resources/extensions/gsd/tests/collect-from-manifest.test.ts +143 -141
- 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 +59 -38
- package/src/resources/extensions/gsd/tests/complete-slice.test.ts +263 -228
- package/src/resources/extensions/gsd/tests/complete-task.test.ts +302 -250
- package/src/resources/extensions/gsd/tests/context-store.test.ts +367 -354
- package/src/resources/extensions/gsd/tests/continue-here.test.ts +72 -68
- package/src/resources/extensions/gsd/tests/cost-projection.test.ts +106 -92
- package/src/resources/extensions/gsd/tests/crash-recovery.test.ts +35 -27
- package/src/resources/extensions/gsd/tests/dashboard-budget.test.ts +237 -220
- package/src/resources/extensions/gsd/tests/db-writer.test.ts +420 -390
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +92 -76
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +83 -68
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +183 -152
- package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +101 -78
- package/src/resources/extensions/gsd/tests/derive-state.test.ts +227 -192
- package/src/resources/extensions/gsd/tests/detection.test.ts +278 -232
- package/src/resources/extensions/gsd/tests/dev-engine-wrapper.test.ts +34 -30
- package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +180 -164
- package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +49 -43
- package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +32 -28
- package/src/resources/extensions/gsd/tests/doctor-completion-deferral.test.ts +29 -27
- package/src/resources/extensions/gsd/tests/doctor-delimiter-fix.test.ts +38 -34
- package/src/resources/extensions/gsd/tests/doctor-enhancements.test.ts +75 -54
- package/src/resources/extensions/gsd/tests/doctor-environment-worktree.test.ts +32 -21
- package/src/resources/extensions/gsd/tests/doctor-environment.test.ts +97 -72
- package/src/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +44 -38
- package/src/resources/extensions/gsd/tests/doctor-git.test.ts +145 -104
- package/src/resources/extensions/gsd/tests/doctor-proactive.test.ts +106 -84
- package/src/resources/extensions/gsd/tests/doctor-roadmap-summary-atomicity.test.ts +60 -54
- package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +93 -72
- package/src/resources/extensions/gsd/tests/doctor.test.ts +134 -104
- package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +131 -123
- package/src/resources/extensions/gsd/tests/exit-command.test.ts +24 -20
- package/src/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +57 -48
- package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +7 -5
- package/src/resources/extensions/gsd/tests/flag-file-db.test.ts +42 -30
- package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +206 -198
- package/src/resources/extensions/gsd/tests/git-locale.test.ts +27 -13
- package/src/resources/extensions/gsd/tests/git-service.test.ts +388 -285
- package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +39 -31
- package/src/resources/extensions/gsd/tests/graph-operations.test.ts +69 -63
- package/src/resources/extensions/gsd/tests/gsd-db.test.ts +264 -255
- package/src/resources/extensions/gsd/tests/gsd-inspect.test.ts +119 -108
- package/src/resources/extensions/gsd/tests/gsd-recover.test.ts +103 -81
- package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +262 -229
- package/src/resources/extensions/gsd/tests/headless-answers.test.ts +13 -13
- package/src/resources/extensions/gsd/tests/health-widget.test.ts +37 -29
- package/src/resources/extensions/gsd/tests/idle-recovery.test.ts +102 -81
- package/src/resources/extensions/gsd/tests/init-wizard.test.ts +18 -16
- package/src/resources/extensions/gsd/tests/integration-edge.test.ts +46 -41
- package/src/resources/extensions/gsd/tests/integration-lifecycle.test.ts +53 -42
- package/src/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +91 -75
- package/src/resources/extensions/gsd/tests/integration-proof.test.ts +18 -18
- package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +194 -150
- package/src/resources/extensions/gsd/tests/md-importer.test.ts +125 -101
- package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +54 -45
- package/src/resources/extensions/gsd/tests/memory-store.test.ts +93 -80
- package/src/resources/extensions/gsd/tests/migrate-command.test.ts +66 -57
- package/src/resources/extensions/gsd/tests/migrate-hierarchy.test.ts +93 -83
- package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +170 -161
- package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +141 -125
- package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +131 -107
- package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +96 -87
- package/src/resources/extensions/gsd/tests/migrate-writer.test.ts +164 -125
- package/src/resources/extensions/gsd/tests/must-have-parser.test.ts +94 -81
- package/src/resources/extensions/gsd/tests/none-mode-gates.test.ts +36 -35
- package/src/resources/extensions/gsd/tests/overrides.test.ts +106 -99
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +47 -40
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +28 -25
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +83 -66
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +77 -54
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +115 -68
- package/src/resources/extensions/gsd/tests/parsers.test.ts +611 -546
- package/src/resources/extensions/gsd/tests/paths.test.ts +87 -72
- package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +117 -77
- package/src/resources/extensions/gsd/tests/prompt-db.test.ts +56 -56
- package/src/resources/extensions/gsd/tests/queue-draft-detection.test.ts +119 -93
- package/src/resources/extensions/gsd/tests/queue-order.test.ts +82 -70
- package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +55 -42
- package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +73 -45
- package/src/resources/extensions/gsd/tests/reassess-prompt.test.ts +38 -28
- package/src/resources/extensions/gsd/tests/replan-slice.test.ts +80 -73
- package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +74 -71
- package/src/resources/extensions/gsd/tests/requirements.test.ts +75 -70
- package/src/resources/extensions/gsd/tests/retry-state-reset.test.ts +66 -44
- package/src/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +181 -114
- package/src/resources/extensions/gsd/tests/rule-registry.test.ts +65 -63
- package/src/resources/extensions/gsd/tests/run-uat.test.ts +128 -66
- package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +25 -18
- package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +44 -37
- package/src/resources/extensions/gsd/tests/shared-wal.test.ts +26 -19
- package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +8 -6
- package/src/resources/extensions/gsd/tests/symlink-numbered-variants.test.ts +28 -22
- package/src/resources/extensions/gsd/tests/token-savings.test.ts +56 -54
- package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +25 -23
- package/src/resources/extensions/gsd/tests/tool-naming.test.ts +11 -9
- package/src/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +82 -66
- package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +47 -46
- package/src/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +22 -20
- package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +86 -84
- package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +43 -41
- package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +96 -94
- package/src/resources/extensions/gsd/tests/windows-path-normalization.test.ts +13 -11
- package/src/resources/extensions/gsd/tests/worker-registry.test.ts +29 -27
- package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +52 -50
- package/src/resources/extensions/gsd/tests/worktree-bugfix.test.ts +13 -10
- package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +18 -14
- package/src/resources/extensions/gsd/tests/worktree-db.test.ts +39 -38
- package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +21 -17
- package/src/resources/extensions/gsd/tests/worktree-health.test.ts +30 -25
- package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +37 -30
- package/src/resources/extensions/gsd/tests/worktree-symlink-removal.test.ts +22 -15
- package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +66 -59
- package/src/resources/extensions/gsd/tests/worktree.test.ts +50 -44
- package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +0 -1
- package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
- package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +0 -100
- package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +0 -63
- /package/dist/web/standalone/.next/static/{-zps1Q9mQmioAKLcQiCr8 → mgkxN0mGP6gSUmGPEzbk_}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{-zps1Q9mQmioAKLcQiCr8 → mgkxN0mGP6gSUmGPEzbk_}/_ssgManifest.js +0 -0
|
@@ -20,9 +20,9 @@ import {
|
|
|
20
20
|
listWorktrees,
|
|
21
21
|
worktreePath,
|
|
22
22
|
} from "../worktree-manager.ts";
|
|
23
|
-
import {
|
|
24
|
-
import assert from 'node:assert/strict';
|
|
23
|
+
import { createTestContext } from './test-helpers.ts';
|
|
25
24
|
|
|
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
|
+
assertTrue(existsSync(join(base, ".gsd")), ".gsd symlink exists");
|
|
50
|
+
assertTrue(
|
|
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
|
-
|
|
60
|
+
async function main(): Promise<void> {
|
|
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
|
+
assertTrue(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
|
+
assertTrue(
|
|
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
|
+
assertTrue(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
|
+
assertTrue(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 @@ describe('worktree-symlink-removal', async () => {
|
|
|
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
|
+
assertTrue(existsSync(stalePath), "stale local worktree dir exists");
|
|
97
|
+
assertTrue(
|
|
98
98
|
stalePath !== realWtPath,
|
|
99
99
|
`computed path (${stalePath}) differs from git-registered path (${realWtPath})`,
|
|
100
100
|
);
|
|
@@ -105,29 +105,36 @@ describe('worktree-symlink-removal', async () => {
|
|
|
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
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
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
|
+
assertEq(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);
|
|
133
140
|
});
|
|
@@ -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 {
|
|
33
|
-
import assert from 'node:assert/strict';
|
|
32
|
+
import { createTestContext } from './test-helpers.ts';
|
|
34
33
|
|
|
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
|
-
|
|
46
|
+
async function main(): Promise<void> {
|
|
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 @@ describe('worktree-sync-milestones', async () => {
|
|
|
58
58
|
writeFileSync(join(m001Dir, 'M001-ROADMAP.md'), '# Roadmap');
|
|
59
59
|
|
|
60
60
|
// Worktree has no M001
|
|
61
|
-
|
|
61
|
+
assertTrue(!existsSync(join(wtBase, '.gsd', 'milestones', 'M001')), 'M001 missing before sync');
|
|
62
62
|
|
|
63
63
|
syncProjectRootToWorktree(mainBase, wtBase, 'M001');
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
assertTrue(existsSync(join(wtBase, '.gsd', 'milestones', 'M001')), '#1311: M001 synced to worktree');
|
|
66
|
+
assertTrue(existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'M001-CONTEXT.md')), 'M001 CONTEXT synced');
|
|
67
|
+
assertTrue(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 @@ describe('worktree-sync-milestones', async () => {
|
|
|
92
92
|
|
|
93
93
|
syncProjectRootToWorktree(mainBase, wtBase, 'M001');
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
assertTrue(existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'slices', 'S02')), '#1311: S02 synced');
|
|
96
|
+
assertTrue(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 @@ describe('worktree-sync-milestones', async () => {
|
|
|
113
113
|
|
|
114
114
|
// Worktree has a stale gsd.db
|
|
115
115
|
writeFileSync(join(wtBase, '.gsd', 'gsd.db'), 'stale data');
|
|
116
|
-
|
|
116
|
+
assertTrue(existsSync(join(wtBase, '.gsd', 'gsd.db')), 'gsd.db exists before sync');
|
|
117
117
|
|
|
118
118
|
syncProjectRootToWorktree(mainBase, wtBase, 'M001');
|
|
119
119
|
|
|
120
|
-
|
|
120
|
+
assertTrue(!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 @@ describe('worktree-sync-milestones', async () => {
|
|
|
131
131
|
try {
|
|
132
132
|
// Should not throw
|
|
133
133
|
syncProjectRootToWorktree(base, base, 'M001');
|
|
134
|
-
|
|
134
|
+
assertTrue(true, 'no crash when paths are equal');
|
|
135
135
|
} finally {
|
|
136
136
|
cleanup(base);
|
|
137
137
|
}
|
|
@@ -144,7 +144,7 @@ describe('worktree-sync-milestones', async () => {
|
|
|
144
144
|
const wtBase = createBase('wt');
|
|
145
145
|
try {
|
|
146
146
|
syncProjectRootToWorktree(mainBase, wtBase, null);
|
|
147
|
-
|
|
147
|
+
assertTrue(true, 'no crash when milestoneId is null');
|
|
148
148
|
} finally {
|
|
149
149
|
cleanup(mainBase);
|
|
150
150
|
cleanup(wtBase);
|
|
@@ -155,7 +155,7 @@ describe('worktree-sync-milestones', async () => {
|
|
|
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
|
+
assertTrue(true, 'no crash on missing directories');
|
|
159
159
|
}
|
|
160
160
|
|
|
161
161
|
// ─── 7. milestones/ directory created in worktree when missing ────────
|
|
@@ -174,15 +174,15 @@ describe('worktree-sync-milestones', async () => {
|
|
|
174
174
|
writeFileSync(join(m001Dir, 'M001-CONTEXT.md'), '# M001 Context');
|
|
175
175
|
writeFileSync(join(m001Dir, 'M001-ROADMAP.md'), '# M001 Roadmap');
|
|
176
176
|
|
|
177
|
-
|
|
177
|
+
assertTrue(!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
|
+
assertTrue(existsSync(join(wtBase, '.gsd', 'milestones')), 'milestones/ created in worktree');
|
|
182
|
+
assertTrue(existsSync(join(wtBase, '.gsd', 'milestones', 'M001')), 'M001 synced to worktree');
|
|
183
|
+
assertTrue(existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'M001-CONTEXT.md')), 'M001 CONTEXT synced');
|
|
184
|
+
assertTrue(existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'M001-ROADMAP.md')), 'M001 ROADMAP synced');
|
|
185
|
+
assertTrue(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 @@ describe('worktree-sync-milestones', async () => {
|
|
|
212
212
|
const mainSliceDir = join(mainBase, '.gsd', 'milestones', 'M001', 'slices', 'S01');
|
|
213
213
|
const mainTasksDir = join(mainSliceDir, 'tasks');
|
|
214
214
|
|
|
215
|
-
|
|
215
|
+
assertTrue(
|
|
216
216
|
existsSync(join(mainSliceDir, 'S01-SUMMARY.md')),
|
|
217
217
|
'#1678: slice SUMMARY synced to project root',
|
|
218
218
|
);
|
|
219
|
-
|
|
219
|
+
assertTrue(
|
|
220
220
|
existsSync(join(mainTasksDir, 'T01-SUMMARY.md')),
|
|
221
221
|
'#1678: task T01-SUMMARY synced to project root',
|
|
222
222
|
);
|
|
223
|
-
|
|
223
|
+
assertTrue(
|
|
224
224
|
existsSync(join(mainTasksDir, 'T02-SUMMARY.md')),
|
|
225
225
|
'#1678: task T02-SUMMARY synced to project root',
|
|
226
226
|
);
|
|
227
|
-
|
|
227
|
+
assertTrue(
|
|
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 @@ describe('worktree-sync-milestones', async () => {
|
|
|
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
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
267
267
|
projContent.includes('M002'),
|
|
268
268
|
'PROJECT.md updated with worktree content',
|
|
269
269
|
);
|
|
270
270
|
|
|
271
|
-
|
|
271
|
+
assertTrue(
|
|
272
272
|
existsSync(join(mainBase, '.gsd', 'KNOWLEDGE.md')),
|
|
273
273
|
'KNOWLEDGE.md synced from worktree',
|
|
274
274
|
);
|
|
275
275
|
|
|
276
|
-
|
|
276
|
+
assertTrue(
|
|
277
277
|
synced.includes('REQUIREMENTS.md'),
|
|
278
278
|
'REQUIREMENTS.md appears in synced list',
|
|
279
279
|
);
|
|
280
|
-
|
|
280
|
+
assertTrue(
|
|
281
281
|
synced.includes('PROJECT.md'),
|
|
282
282
|
'PROJECT.md appears in synced list',
|
|
283
283
|
);
|
|
@@ -308,11 +308,11 @@ describe('worktree-sync-milestones', async () => {
|
|
|
308
308
|
writeFileSync(join(wtM002Dir, 'M002-abc123-ROADMAP.md'), '# M002 Roadmap');
|
|
309
309
|
|
|
310
310
|
// Main has neither
|
|
311
|
-
|
|
311
|
+
assertTrue(
|
|
312
312
|
!existsSync(join(mainBase, '.gsd', 'milestones', 'M001')),
|
|
313
313
|
'M001 missing in main before sync',
|
|
314
314
|
);
|
|
315
|
-
|
|
315
|
+
assertTrue(
|
|
316
316
|
!existsSync(join(mainBase, '.gsd', 'milestones', 'M002-abc123')),
|
|
317
317
|
'M002 missing in main before sync',
|
|
318
318
|
);
|
|
@@ -321,22 +321,22 @@ describe('worktree-sync-milestones', async () => {
|
|
|
321
321
|
const { synced } = syncWorktreeStateBack(mainBase, wtBase, 'M001');
|
|
322
322
|
|
|
323
323
|
// M001 should be synced (current milestone — always synced)
|
|
324
|
-
|
|
324
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
340
340
|
synced.some((p) => p.includes('M002-abc123')),
|
|
341
341
|
'M002 appears in synced list',
|
|
342
342
|
);
|
|
@@ -387,34 +387,34 @@ describe('worktree-sync-milestones', async () => {
|
|
|
387
387
|
const { synced } = syncWorktreeStateBack(mainBase, wtBase, 'M006-589wvh');
|
|
388
388
|
|
|
389
389
|
// Verify M006 artifacts synced
|
|
390
|
-
|
|
390
|
+
assertTrue(
|
|
391
391
|
existsSync(join(mainBase, '.gsd', 'milestones', 'M006-589wvh', 'M006-589wvh-SUMMARY.md')),
|
|
392
392
|
'M006 SUMMARY synced',
|
|
393
393
|
);
|
|
394
|
-
|
|
394
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
418
418
|
projContent.includes('M007'),
|
|
419
419
|
'PROJECT.md has M007 from worktree',
|
|
420
420
|
);
|
|
@@ -441,11 +441,11 @@ describe('worktree-sync-milestones', async () => {
|
|
|
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
|
+
assertTrue(
|
|
445
445
|
content === '# Original',
|
|
446
446
|
'REQUIREMENTS.md unchanged when worktree has no copy',
|
|
447
447
|
);
|
|
448
|
-
|
|
448
|
+
assertTrue(
|
|
449
449
|
!synced.includes('REQUIREMENTS.md'),
|
|
450
450
|
'REQUIREMENTS.md not in synced list',
|
|
451
451
|
);
|
|
@@ -473,11 +473,11 @@ describe('worktree-sync-milestones', async () => {
|
|
|
473
473
|
);
|
|
474
474
|
|
|
475
475
|
// Main has neither
|
|
476
|
-
|
|
476
|
+
assertTrue(
|
|
477
477
|
!existsSync(join(mainBase, '.gsd', 'QUEUE.md')),
|
|
478
478
|
'QUEUE.md missing in main before sync',
|
|
479
479
|
);
|
|
480
|
-
|
|
480
|
+
assertTrue(
|
|
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 @@ describe('worktree-sync-milestones', async () => {
|
|
|
485
485
|
const { synced } = syncWorktreeStateBack(mainBase, wtBase, 'M001');
|
|
486
486
|
|
|
487
487
|
// QUEUE.md should be synced
|
|
488
|
-
|
|
488
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
494
494
|
queueContent.includes('M002 next'),
|
|
495
495
|
'#1787: QUEUE.md has correct content',
|
|
496
496
|
);
|
|
497
|
-
|
|
497
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
509
509
|
cuContent.includes('M001-S01-T01'),
|
|
510
510
|
'#1787: completed-units.json has correct content',
|
|
511
511
|
);
|
|
512
|
-
|
|
512
|
+
assertTrue(
|
|
513
513
|
synced.includes('completed-units.json'),
|
|
514
514
|
'#1787: completed-units.json appears in synced list',
|
|
515
515
|
);
|
|
@@ -535,20 +535,20 @@ describe('worktree-sync-milestones', async () => {
|
|
|
535
535
|
mkdirSync(suffixDir, { recursive: true });
|
|
536
536
|
writeFileSync(join(suffixDir, 'M001-abc123-CONTEXT.md'), '# M001 Context');
|
|
537
537
|
|
|
538
|
-
|
|
539
|
-
|
|
538
|
+
assertTrue(!existsSync(join(wtBase, '.gsd', 'milestones', 'sprint-alpha')), 'sprint-alpha missing before sync');
|
|
539
|
+
assertTrue(!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
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
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
|
+
assertTrue(result.synced.length > 0, 'sync reported files');
|
|
552
552
|
} finally {
|
|
553
553
|
cleanup(mainBase);
|
|
554
554
|
cleanup(wtBase);
|
|
@@ -570,18 +570,18 @@ describe('worktree-sync-milestones', async () => {
|
|
|
570
570
|
mkdirSync(wtCustomDir, { recursive: true });
|
|
571
571
|
writeFileSync(join(wtCustomDir, 'SUMMARY.md'), '# Sprint Beta Summary');
|
|
572
572
|
|
|
573
|
-
|
|
573
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
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
|
+
assertTrue(
|
|
585
585
|
synced.some((p) => p.includes('sprint-beta')),
|
|
586
586
|
'#1547: sprint-beta appears in synced list',
|
|
587
587
|
);
|
|
@@ -590,4 +590,11 @@ describe('worktree-sync-milestones', async () => {
|
|
|
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);
|
|
593
600
|
});
|