gsd-pi 2.43.0-next.8 → 2.44.0-dev.0b97ffd
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -12
- package/dist/cli.js +13 -1
- package/dist/help-text.js +24 -0
- package/dist/resources/extensions/gsd/auto-direct-dispatch.js +21 -8
- package/dist/resources/extensions/gsd/auto-prompts.js +130 -51
- package/dist/resources/extensions/gsd/auto-start.js +10 -0
- package/dist/resources/extensions/gsd/auto-worktree.js +16 -2
- package/dist/resources/extensions/gsd/commands/handlers/workflow.js +5 -0
- package/dist/resources/extensions/gsd/dispatch-guard.js +34 -10
- package/dist/resources/extensions/gsd/markdown-renderer.js +7 -5
- package/dist/resources/extensions/gsd/reactive-graph.js +13 -2
- package/dist/resources/extensions/gsd/skill-health.js +3 -1
- package/dist/resources/extensions/gsd/tools/plan-milestone.js +2 -11
- package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -10
- package/dist/resources/extensions/gsd/visualizer-data.js +45 -13
- package/dist/resources/extensions/gsd/workspace-index.js +46 -15
- package/dist/web/standalone/.next/BUILD_ID +1 -1
- package/dist/web/standalone/.next/app-path-routes-manifest.json +18 -18
- 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 +4 -4
- 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 +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
- package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
- package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
- package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
- package/dist/web/standalone/.next/server/app/index.html +1 -1
- package/dist/web/standalone/.next/server/app/index.rsc +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 +18 -18
- 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 +1 -0
- package/dist/web/standalone/.next/static/chunks/app/layout-a16c7a7ecdf0c2cf.js +1 -0
- package/dist/web/standalone/.next/static/chunks/app/page-b9367c5ae13b99c6.js +1 -0
- package/dist/web/standalone/.next/static/chunks/{main-app-2f2ee7b85712c2bd.js → main-app-fdab67f7802d7832.js} +1 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.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 +4 -4
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts +3 -3
- package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/agent-session.js +11 -34
- package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js +6 -8
- package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +2 -2
- package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +4 -4
- package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/loader.js +18 -0
- package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +24 -26
- package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +37 -0
- package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js +2 -3
- package/packages/pi-coding-agent/dist/core/fallback-resolver.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js +12 -2
- package/packages/pi-coding-agent/dist/core/fallback-resolver.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js +29 -48
- package/packages/pi-coding-agent/dist/core/fs-utils.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts +38 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js +192 -0
- package/packages/pi-coding-agent/dist/core/lifecycle-hooks.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +255 -0
- package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts +15 -0
- package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/model-registry.js +40 -3
- package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts +25 -0
- package/packages/pi-coding-agent/dist/core/package-commands.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js +253 -0
- package/packages/pi-coding-agent/dist/core/package-commands.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts +2 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.d.ts.map +1 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js +225 -0
- package/packages/pi-coding-agent/dist/core/package-commands.test.js.map +1 -0
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js +34 -44
- package/packages/pi-coding-agent/dist/core/resolve-config-value.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/core/sdk.js +4 -0
- package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/session-manager.test.js +30 -34
- package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js +10 -12
- package/packages/pi-coding-agent/dist/core/tools/edit-diff.test.js.map +1 -1
- package/packages/pi-coding-agent/dist/index.d.ts +3 -1
- package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/index.js +1 -0
- package/packages/pi-coding-agent/dist/index.js.map +1 -1
- package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
- package/packages/pi-coding-agent/dist/main.js +11 -199
- package/packages/pi-coding-agent/dist/main.js.map +1 -1
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js +43 -47
- package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.test.js.map +1 -1
- package/packages/pi-coding-agent/package.json +1 -1
- package/packages/pi-coding-agent/src/core/agent-session.ts +13 -37
- package/packages/pi-coding-agent/src/core/auth-storage.test.ts +7 -7
- package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +2 -2
- package/packages/pi-coding-agent/src/core/compaction/compaction.ts +3 -3
- package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +4 -4
- package/packages/pi-coding-agent/src/core/extensions/index.ts +5 -0
- package/packages/pi-coding-agent/src/core/extensions/loader.ts +23 -0
- package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +26 -26
- package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -0
- package/packages/pi-coding-agent/src/core/fallback-resolver.test.ts +15 -2
- package/packages/pi-coding-agent/src/core/fallback-resolver.ts +2 -3
- package/packages/pi-coding-agent/src/core/fs-utils.test.ts +31 -43
- package/packages/pi-coding-agent/src/core/lifecycle-hooks.ts +274 -0
- package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +288 -0
- package/packages/pi-coding-agent/src/core/model-registry.ts +39 -3
- package/packages/pi-coding-agent/src/core/package-commands.test.ts +240 -0
- package/packages/pi-coding-agent/src/core/package-commands.ts +310 -0
- package/packages/pi-coding-agent/src/core/resolve-config-value.test.ts +40 -45
- package/packages/pi-coding-agent/src/core/sdk.ts +4 -0
- package/packages/pi-coding-agent/src/core/session-manager.test.ts +33 -33
- package/packages/pi-coding-agent/src/core/tools/edit-diff.test.ts +17 -17
- package/packages/pi-coding-agent/src/index.ts +7 -0
- package/packages/pi-coding-agent/src/main.ts +11 -232
- package/packages/pi-coding-agent/src/resources/extensions/memory/storage.test.ts +74 -74
- package/pkg/package.json +1 -1
- package/src/resources/extensions/gsd/auto-direct-dispatch.ts +22 -7
- package/src/resources/extensions/gsd/auto-prompts.ts +109 -42
- package/src/resources/extensions/gsd/auto-start.ts +14 -0
- package/src/resources/extensions/gsd/auto-worktree.ts +16 -3
- package/src/resources/extensions/gsd/commands/handlers/workflow.ts +8 -0
- package/src/resources/extensions/gsd/dispatch-guard.ts +28 -10
- package/src/resources/extensions/gsd/markdown-renderer.ts +7 -5
- package/src/resources/extensions/gsd/reactive-graph.ts +12 -2
- package/src/resources/extensions/gsd/skill-health.ts +2 -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-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-stash-merge.test.ts +3 -3
- 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/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 +390 -420
- package/src/resources/extensions/gsd/tests/definition-loader.test.ts +76 -92
- package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +68 -83
- package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +152 -183
- 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/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/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/markdown-renderer.test.ts +150 -194
- 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/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 +35 -36
- package/src/resources/extensions/gsd/tests/overrides.test.ts +99 -106
- package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +40 -47
- package/src/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +25 -28
- package/src/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +66 -83
- package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +54 -77
- package/src/resources/extensions/gsd/tests/park-milestone.test.ts +68 -115
- package/src/resources/extensions/gsd/tests/parsers.test.ts +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/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/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/symlink-numbered-variants.test.ts +22 -28
- 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 +9 -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-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-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-milestone.ts +1 -18
- package/src/resources/extensions/gsd/tools/plan-slice.ts +1 -15
- package/src/resources/extensions/gsd/visualizer-data.ts +46 -14
- package/src/resources/extensions/gsd/workspace-index.ts +49 -18
- package/dist/web/standalone/.next/static/chunks/app/_not-found/page-e07acdb7dd069836.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/layout-745c6ed5fea5fb06.js +0 -1
- package/dist/web/standalone/.next/static/chunks/app/page-801b53eff6e83579.js +0 -1
- package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-e6255954dccfcf0a.js +0 -1
- /package/dist/web/standalone/.next/static/{drUWS0zys9uepCfCwecJv → alS4hoANx0TK4UVZY27da}/_buildManifest.js +0 -0
- /package/dist/web/standalone/.next/static/{drUWS0zys9uepCfCwecJv → alS4hoANx0TK4UVZY27da}/_ssgManifest.js +0 -0
|
@@ -7,17 +7,16 @@
|
|
|
7
7
|
* Relates to #1269, #1293.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
+
import { describe, test } from 'node:test';
|
|
11
|
+
import assert from 'node:assert/strict';
|
|
10
12
|
import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync, readFileSync } from "node:fs";
|
|
11
13
|
import { join } from "node:path";
|
|
12
14
|
import { tmpdir } from "node:os";
|
|
13
15
|
import { execSync } from "node:child_process";
|
|
14
16
|
|
|
15
|
-
import { createTestContext } from './test-helpers.ts';
|
|
16
17
|
import { captureIntegrationBranch, getCurrentBranch } from "../worktree.ts";
|
|
17
18
|
import { readIntegrationBranch, QUICK_BRANCH_RE } from "../git-service.ts";
|
|
18
19
|
|
|
19
|
-
const { assertEq, assertTrue, report } = createTestContext();
|
|
20
|
-
|
|
21
20
|
function run(command: string, cwd: string): string {
|
|
22
21
|
return execSync(command, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
23
22
|
}
|
|
@@ -35,68 +34,59 @@ function createTestRepo(): string {
|
|
|
35
34
|
return repo;
|
|
36
35
|
}
|
|
37
36
|
|
|
38
|
-
async function main(): Promise<void> {
|
|
39
|
-
|
|
40
37
|
// ═══════════════════════════════════════════════════════════════════════
|
|
41
38
|
// QUICK_BRANCH_RE
|
|
42
39
|
// ═══════════════════════════════════════════════════════════════════════
|
|
43
40
|
|
|
44
|
-
console.log("\n=== QUICK_BRANCH_RE: matches quick-task branches ===");
|
|
45
41
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
assertTrue(!QUICK_BRANCH_RE.test("gsd/quickly-something"), "rejects non-quick prefix");
|
|
51
|
-
assertTrue(!QUICK_BRANCH_RE.test("feature/gsd/quick/1"), "rejects nested prefix");
|
|
42
|
+
describe('quick-branch-lifecycle', () => {
|
|
43
|
+
test('QUICK_BRANCH_RE: matches quick-task branches', () => {
|
|
44
|
+
assert.ok(QUICK_BRANCH_RE.test("gsd/quick/1-fix-typo"), "matches standard quick branch");
|
|
45
|
+
});
|
|
52
46
|
|
|
47
|
+
assert.ok(QUICK_BRANCH_RE.test("gsd/quick/42-some-long-slug-name"), "matches multi-digit quick branch");
|
|
48
|
+
assert.ok(!QUICK_BRANCH_RE.test("main"), "rejects main");
|
|
49
|
+
assert.ok(!QUICK_BRANCH_RE.test("gsd/M001/S01"), "rejects slice branch");
|
|
50
|
+
assert.ok(!QUICK_BRANCH_RE.test("gsd/quickly-something"), "rejects non-quick prefix");
|
|
51
|
+
assert.ok(!QUICK_BRANCH_RE.test("feature/gsd/quick/1"), "rejects nested prefix");
|
|
53
52
|
// ═══════════════════════════════════════════════════════════════════════
|
|
54
53
|
// captureIntegrationBranch: guard against quick-task branches
|
|
55
54
|
// ═══════════════════════════════════════════════════════════════════════
|
|
56
|
-
|
|
57
|
-
console.log("\n=== captureIntegrationBranch: skips quick-task branches ===");
|
|
58
|
-
|
|
59
|
-
{
|
|
55
|
+
test('captureIntegrationBranch: skips quick-task branches', () => {
|
|
60
56
|
const repo = createTestRepo();
|
|
61
57
|
|
|
62
58
|
// Create and checkout a quick-task branch
|
|
63
59
|
run("git checkout -b gsd/quick/1-fix-typo", repo);
|
|
64
|
-
|
|
60
|
+
assert.deepStrictEqual(getCurrentBranch(repo), "gsd/quick/1-fix-typo", "on quick branch");
|
|
65
61
|
|
|
66
62
|
captureIntegrationBranch(repo, "M001");
|
|
67
63
|
|
|
68
|
-
|
|
64
|
+
assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), null,
|
|
69
65
|
"captureIntegrationBranch is a no-op on quick-task branches");
|
|
70
66
|
|
|
71
67
|
rmSync(repo, { recursive: true, force: true });
|
|
72
|
-
|
|
68
|
+
});
|
|
73
69
|
|
|
74
70
|
// ─── Verify main is still recorded correctly ─────────────────────────
|
|
75
|
-
|
|
76
|
-
console.log("\n=== captureIntegrationBranch: records main correctly ===");
|
|
77
|
-
|
|
78
|
-
{
|
|
71
|
+
test('captureIntegrationBranch: records main correctly', () => {
|
|
79
72
|
const repo = createTestRepo();
|
|
80
73
|
|
|
81
74
|
// Capture from main — should work normally
|
|
82
75
|
captureIntegrationBranch(repo, "M001");
|
|
83
|
-
|
|
76
|
+
assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "main",
|
|
84
77
|
"main is recorded as integration branch");
|
|
85
78
|
|
|
86
79
|
// Switch to quick branch — capture should be no-op (doesn't overwrite main)
|
|
87
80
|
run("git checkout -b gsd/quick/1-fix-typo", repo);
|
|
88
81
|
captureIntegrationBranch(repo, "M001");
|
|
89
|
-
|
|
82
|
+
assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "main",
|
|
90
83
|
"quick branch does not overwrite existing integration branch");
|
|
91
84
|
|
|
92
85
|
rmSync(repo, { recursive: true, force: true });
|
|
93
|
-
|
|
86
|
+
});
|
|
94
87
|
|
|
95
88
|
// ─── Sequence: main → quick → back to main → capture ────────────────
|
|
96
|
-
|
|
97
|
-
console.log("\n=== captureIntegrationBranch: correct after quick branch round-trip ===");
|
|
98
|
-
|
|
99
|
-
{
|
|
89
|
+
test('captureIntegrationBranch: correct after quick branch round-trip', () => {
|
|
100
90
|
const repo = createTestRepo();
|
|
101
91
|
|
|
102
92
|
// Simulate quick-task lifecycle: branch off, do work, return to main
|
|
@@ -111,19 +101,16 @@ async function main(): Promise<void> {
|
|
|
111
101
|
|
|
112
102
|
// Now capture — should get main, not the deleted quick branch
|
|
113
103
|
captureIntegrationBranch(repo, "M002");
|
|
114
|
-
|
|
104
|
+
assert.deepStrictEqual(readIntegrationBranch(repo, "M002"), "main",
|
|
115
105
|
"after quick round-trip, main is captured correctly");
|
|
116
106
|
|
|
117
107
|
rmSync(repo, { recursive: true, force: true });
|
|
118
|
-
|
|
108
|
+
});
|
|
119
109
|
|
|
120
110
|
// ═══════════════════════════════════════════════════════════════════════
|
|
121
111
|
// cleanupQuickBranch: in-memory path (same session)
|
|
122
112
|
// ═══════════════════════════════════════════════════════════════════════
|
|
123
|
-
|
|
124
|
-
console.log("\n=== cleanupQuickBranch: merges back and cleans up (same session) ===");
|
|
125
|
-
|
|
126
|
-
{
|
|
113
|
+
test('cleanupQuickBranch: merges back and cleans up (same session)', async () => {
|
|
127
114
|
const repo = createTestRepo();
|
|
128
115
|
const origCwd = process.cwd();
|
|
129
116
|
|
|
@@ -155,30 +142,27 @@ async function main(): Promise<void> {
|
|
|
155
142
|
const { cleanupQuickBranch } = await import("../quick.ts");
|
|
156
143
|
const result = cleanupQuickBranch();
|
|
157
144
|
|
|
158
|
-
|
|
159
|
-
|
|
145
|
+
assert.ok(result, "cleanupQuickBranch returns true");
|
|
146
|
+
assert.deepStrictEqual(getCurrentBranch(repo), "main", "back on main after cleanup");
|
|
160
147
|
|
|
161
148
|
// Verify merge happened — fix.txt should exist on main
|
|
162
|
-
|
|
149
|
+
assert.ok(existsSync(join(repo, "fix.txt")), "fix.txt merged to main");
|
|
163
150
|
|
|
164
151
|
// Verify quick branch deleted
|
|
165
152
|
const branches = run("git branch", repo);
|
|
166
|
-
|
|
153
|
+
assert.ok(!branches.includes("gsd/quick/1-fix-typo"), "quick branch deleted");
|
|
167
154
|
|
|
168
155
|
// Verify disk state cleaned up
|
|
169
|
-
|
|
156
|
+
assert.ok(!existsSync(join(runtimeDir, "quick-return.json")), "quick-return.json removed");
|
|
170
157
|
|
|
171
158
|
process.chdir(origCwd);
|
|
172
159
|
rmSync(repo, { recursive: true, force: true });
|
|
173
|
-
|
|
160
|
+
});
|
|
174
161
|
|
|
175
162
|
// ═══════════════════════════════════════════════════════════════════════
|
|
176
163
|
// cleanupQuickBranch: cross-session recovery from disk
|
|
177
164
|
// ═══════════════════════════════════════════════════════════════════════
|
|
178
|
-
|
|
179
|
-
console.log("\n=== cleanupQuickBranch: recovers from disk state (cross-session) ===");
|
|
180
|
-
|
|
181
|
-
{
|
|
165
|
+
test('cleanupQuickBranch: recovers from disk state (cross-session)', async () => {
|
|
182
166
|
const repo = createTestRepo();
|
|
183
167
|
const origCwd = process.cwd();
|
|
184
168
|
|
|
@@ -206,22 +190,19 @@ async function main(): Promise<void> {
|
|
|
206
190
|
const { cleanupQuickBranch } = await import("../quick.ts");
|
|
207
191
|
const result = cleanupQuickBranch();
|
|
208
192
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
193
|
+
assert.ok(result, "cross-session recovery returns true");
|
|
194
|
+
assert.deepStrictEqual(getCurrentBranch(repo), "main", "back on main after cross-session recovery");
|
|
195
|
+
assert.ok(existsSync(join(repo, "docs.md")), "docs.md merged to main");
|
|
196
|
+
assert.ok(!existsSync(join(runtimeDir, "quick-return.json")), "disk state cleaned up");
|
|
213
197
|
|
|
214
198
|
process.chdir(origCwd);
|
|
215
199
|
rmSync(repo, { recursive: true, force: true });
|
|
216
|
-
|
|
200
|
+
});
|
|
217
201
|
|
|
218
202
|
// ═══════════════════════════════════════════════════════════════════════
|
|
219
203
|
// cleanupQuickBranch: no-op when no pending state
|
|
220
204
|
// ═══════════════════════════════════════════════════════════════════════
|
|
221
|
-
|
|
222
|
-
console.log("\n=== cleanupQuickBranch: no-op without pending state ===");
|
|
223
|
-
|
|
224
|
-
{
|
|
205
|
+
test('cleanupQuickBranch: no-op without pending state', async () => {
|
|
225
206
|
const repo = createTestRepo();
|
|
226
207
|
const origCwd = process.cwd();
|
|
227
208
|
process.chdir(repo);
|
|
@@ -229,32 +210,29 @@ async function main(): Promise<void> {
|
|
|
229
210
|
const { cleanupQuickBranch } = await import("../quick.ts");
|
|
230
211
|
const result = cleanupQuickBranch();
|
|
231
212
|
|
|
232
|
-
|
|
233
|
-
|
|
213
|
+
assert.ok(!result, "returns false when no pending state");
|
|
214
|
+
assert.deepStrictEqual(getCurrentBranch(repo), "main", "stays on main");
|
|
234
215
|
|
|
235
216
|
process.chdir(origCwd);
|
|
236
217
|
rmSync(repo, { recursive: true, force: true });
|
|
237
|
-
|
|
218
|
+
});
|
|
238
219
|
|
|
239
220
|
// ═══════════════════════════════════════════════════════════════════════
|
|
240
221
|
// End-to-end: quick branch does NOT contaminate integration branch
|
|
241
222
|
// ═══════════════════════════════════════════════════════════════════════
|
|
242
|
-
|
|
243
|
-
console.log("\n=== E2E: quick branch does not contaminate integration branch ===");
|
|
244
|
-
|
|
245
|
-
{
|
|
223
|
+
test('E2E: quick branch does not contaminate integration branch', () => {
|
|
246
224
|
const repo = createTestRepo();
|
|
247
225
|
|
|
248
226
|
// 1. Record main as integration branch for M001
|
|
249
227
|
captureIntegrationBranch(repo, "M001");
|
|
250
|
-
|
|
228
|
+
assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "main", "M001 integration = main");
|
|
251
229
|
|
|
252
230
|
// 2. Start a quick task (branch off)
|
|
253
231
|
run("git checkout -b gsd/quick/1-fix-typo", repo);
|
|
254
232
|
|
|
255
233
|
// 3. Try to capture integration branch for M002 while on quick branch
|
|
256
234
|
captureIntegrationBranch(repo, "M002");
|
|
257
|
-
|
|
235
|
+
assert.deepStrictEqual(readIntegrationBranch(repo, "M002"), null,
|
|
258
236
|
"M002 integration NOT recorded from quick branch");
|
|
259
237
|
|
|
260
238
|
// 4. Return to main (simulate cleanupQuickBranch)
|
|
@@ -262,20 +240,14 @@ async function main(): Promise<void> {
|
|
|
262
240
|
|
|
263
241
|
// 5. Now capture M002 from main — should work
|
|
264
242
|
captureIntegrationBranch(repo, "M002");
|
|
265
|
-
|
|
243
|
+
assert.deepStrictEqual(readIntegrationBranch(repo, "M002"), "main",
|
|
266
244
|
"M002 integration = main after returning from quick branch");
|
|
267
245
|
|
|
268
246
|
// 6. Verify M001 still intact
|
|
269
|
-
|
|
247
|
+
assert.deepStrictEqual(readIntegrationBranch(repo, "M001"), "main",
|
|
270
248
|
"M001 integration unchanged");
|
|
271
249
|
|
|
272
250
|
rmSync(repo, { recursive: true, force: true });
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
report();
|
|
276
|
-
}
|
|
251
|
+
});
|
|
277
252
|
|
|
278
|
-
main().catch((error) => {
|
|
279
|
-
console.error(error);
|
|
280
|
-
process.exit(1);
|
|
281
253
|
});
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
+
import { describe, test } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
1
3
|
import { readFileSync } from "node:fs";
|
|
2
4
|
import { join, dirname } from "node:path";
|
|
3
5
|
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { createTestContext } from './test-helpers.ts';
|
|
5
|
-
|
|
6
6
|
// loadPrompt reads from ~/.gsd/agent/extensions/gsd/prompts/ (main checkout).
|
|
7
7
|
// In a worktree the file may not exist there yet, so we resolve prompts
|
|
8
8
|
// relative to this test file's location (the worktree copy).
|
|
9
9
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
10
10
|
const worktreePromptsDir = join(__dirname, "..", "prompts");
|
|
11
11
|
|
|
12
|
-
const { assertTrue, report } = createTestContext();
|
|
13
12
|
/**
|
|
14
13
|
* Load a prompt template from the worktree prompts directory
|
|
15
14
|
* and apply variable substitution (mirrors loadPrompt logic).
|
|
@@ -27,11 +26,10 @@ function loadPromptFromWorktree(name: string, vars: Record<string, string> = {})
|
|
|
27
26
|
// Tests
|
|
28
27
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
29
28
|
|
|
30
|
-
async function main(): Promise<void> {
|
|
31
|
-
|
|
32
29
|
// ─── reassess-roadmap prompt loads and substitutes ─────────────────────
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
|
|
31
|
+
describe('reassess-prompt', () => {
|
|
32
|
+
test('reassess-roadmap prompt loads and substitutes', () => {
|
|
35
33
|
const testVars = {
|
|
36
34
|
workingDirectory: "/tmp/test-project",
|
|
37
35
|
milestoneId: "M099",
|
|
@@ -51,27 +49,26 @@ async function main(): Promise<void> {
|
|
|
51
49
|
console.error(` ERROR: loadPrompt threw: ${err}`);
|
|
52
50
|
}
|
|
53
51
|
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
assert.ok(!threw, "loadPrompt does not throw for reassess-roadmap");
|
|
53
|
+
assert.ok(typeof result === "string" && result.length > 0, "loadPrompt returns a non-empty string");
|
|
56
54
|
|
|
57
55
|
// Verify all test variables were substituted into the output
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
56
|
+
assert.ok(result.includes("M099"), "prompt contains milestoneId 'M099'");
|
|
57
|
+
assert.ok(result.includes("S03"), "prompt contains completedSliceId 'S03'");
|
|
58
|
+
assert.ok(result.includes(".gsd/milestones/M099/slices/S03/S03-ASSESSMENT.md"), "prompt contains assessmentPath");
|
|
59
|
+
assert.ok(result.includes(".gsd/milestones/M099/M099-ROADMAP.md"), "prompt contains roadmapPath");
|
|
60
|
+
assert.ok(result.includes("--- test inlined context block ---"), "prompt contains inlinedContext");
|
|
63
61
|
|
|
64
62
|
// Verify no un-substituted variables remain
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
63
|
+
assert.ok(!result.includes("{{milestoneId}}"), "no un-substituted {{milestoneId}}");
|
|
64
|
+
assert.ok(!result.includes("{{completedSliceId}}"), "no un-substituted {{completedSliceId}}");
|
|
65
|
+
assert.ok(!result.includes("{{assessmentPath}}"), "no un-substituted {{assessmentPath}}");
|
|
66
|
+
assert.ok(!result.includes("{{roadmapPath}}"), "no un-substituted {{roadmapPath}}");
|
|
67
|
+
assert.ok(!result.includes("{{inlinedContext}}"), "no un-substituted {{inlinedContext}}");
|
|
68
|
+
});
|
|
71
69
|
|
|
72
70
|
// ─── reassess-roadmap contains coverage-check instruction ─────────────
|
|
73
|
-
|
|
74
|
-
{
|
|
71
|
+
test('reassess-roadmap contains coverage-check instruction', () => {
|
|
75
72
|
const prompt = loadPromptFromWorktree("reassess-roadmap", {
|
|
76
73
|
workingDirectory: "/tmp/test-project",
|
|
77
74
|
milestoneId: "M001",
|
|
@@ -85,33 +82,32 @@ async function main(): Promise<void> {
|
|
|
85
82
|
const lower = prompt.toLowerCase();
|
|
86
83
|
|
|
87
84
|
// The prompt must mention "each success criterion" or "every success criterion"
|
|
88
|
-
|
|
85
|
+
assert.ok(
|
|
89
86
|
lower.includes("each success criterion") || lower.includes("every success criterion"),
|
|
90
87
|
"prompt contains 'each success criterion' or 'every success criterion'"
|
|
91
88
|
);
|
|
92
89
|
|
|
93
90
|
// The prompt must mention "owning slice" or "remaining slice"
|
|
94
|
-
|
|
91
|
+
assert.ok(
|
|
95
92
|
lower.includes("owning slice") || lower.includes("remaining slice"),
|
|
96
93
|
"prompt contains 'owning slice' or 'remaining slice'"
|
|
97
94
|
);
|
|
98
95
|
|
|
99
96
|
// The prompt must mention "no remaining owner" or "no owner" or "no slice"
|
|
100
|
-
|
|
97
|
+
assert.ok(
|
|
101
98
|
lower.includes("no remaining owner") || lower.includes("no owner") || lower.includes("no slice"),
|
|
102
99
|
"prompt contains 'no remaining owner', 'no owner', or 'no slice'"
|
|
103
100
|
);
|
|
104
101
|
|
|
105
102
|
// The prompt must mention "blocking issue" or "blocking"
|
|
106
|
-
|
|
103
|
+
assert.ok(
|
|
107
104
|
lower.includes("blocking issue") || lower.includes("blocking"),
|
|
108
105
|
"prompt contains 'blocking issue' or 'blocking'"
|
|
109
106
|
);
|
|
110
|
-
|
|
107
|
+
});
|
|
111
108
|
|
|
112
109
|
// ─── coverage-check requires at-least-one semantics ───────────────────
|
|
113
|
-
|
|
114
|
-
{
|
|
110
|
+
test('coverage-check requires at-least-one semantics', () => {
|
|
115
111
|
const prompt = loadPromptFromWorktree("reassess-roadmap", {
|
|
116
112
|
workingDirectory: "/tmp/test-project",
|
|
117
113
|
milestoneId: "M001",
|
|
@@ -124,22 +120,16 @@ async function main(): Promise<void> {
|
|
|
124
120
|
const lower = prompt.toLowerCase();
|
|
125
121
|
|
|
126
122
|
// The instruction must use "at least one" or equivalent inclusive language
|
|
127
|
-
|
|
123
|
+
assert.ok(
|
|
128
124
|
lower.includes("at least one") || lower.includes("at-least-one") || lower.includes("one or more"),
|
|
129
125
|
"prompt uses 'at least one' or equivalent inclusive language for slice ownership"
|
|
130
126
|
);
|
|
131
127
|
|
|
132
128
|
// The instruction must NOT require "exactly one" — that would be too rigid
|
|
133
|
-
|
|
129
|
+
assert.ok(
|
|
134
130
|
!lower.includes("exactly one owner") && !lower.includes("exactly one slice"),
|
|
135
131
|
"prompt does NOT use 'exactly one' for slice ownership (would be too rigid)"
|
|
136
132
|
);
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
report();
|
|
140
|
-
}
|
|
133
|
+
});
|
|
141
134
|
|
|
142
|
-
main().catch((error) => {
|
|
143
|
-
console.error(error);
|
|
144
|
-
process.exit(1);
|
|
145
135
|
});
|