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
|
@@ -7,16 +7,17 @@
|
|
|
7
7
|
* Relates to #1269, #1293.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import { describe, test } from 'node:test';
|
|
11
|
-
import assert from 'node:assert/strict';
|
|
12
10
|
import { mkdtempSync, mkdirSync, rmSync, writeFileSync, existsSync, readFileSync } from "node:fs";
|
|
13
11
|
import { join } from "node:path";
|
|
14
12
|
import { tmpdir } from "node:os";
|
|
15
13
|
import { execSync } from "node:child_process";
|
|
16
14
|
|
|
15
|
+
import { createTestContext } from './test-helpers.ts';
|
|
17
16
|
import { captureIntegrationBranch, getCurrentBranch } from "../worktree.ts";
|
|
18
17
|
import { readIntegrationBranch, QUICK_BRANCH_RE } from "../git-service.ts";
|
|
19
18
|
|
|
19
|
+
const { assertEq, assertTrue, report } = createTestContext();
|
|
20
|
+
|
|
20
21
|
function run(command: string, cwd: string): string {
|
|
21
22
|
return execSync(command, { cwd, stdio: ["ignore", "pipe", "pipe"], encoding: "utf-8" }).trim();
|
|
22
23
|
}
|
|
@@ -34,59 +35,68 @@ function createTestRepo(): string {
|
|
|
34
35
|
return repo;
|
|
35
36
|
}
|
|
36
37
|
|
|
38
|
+
async function main(): Promise<void> {
|
|
39
|
+
|
|
37
40
|
// ═══════════════════════════════════════════════════════════════════════
|
|
38
41
|
// QUICK_BRANCH_RE
|
|
39
42
|
// ═══════════════════════════════════════════════════════════════════════
|
|
40
43
|
|
|
44
|
+
console.log("\n=== QUICK_BRANCH_RE: matches quick-task branches ===");
|
|
41
45
|
|
|
42
|
-
|
|
43
|
-
test(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
assertTrue(QUICK_BRANCH_RE.test("gsd/quick/1-fix-typo"), "matches standard quick branch");
|
|
47
|
+
assertTrue(QUICK_BRANCH_RE.test("gsd/quick/42-some-long-slug-name"), "matches multi-digit quick branch");
|
|
48
|
+
assertTrue(!QUICK_BRANCH_RE.test("main"), "rejects main");
|
|
49
|
+
assertTrue(!QUICK_BRANCH_RE.test("gsd/M001/S01"), "rejects slice branch");
|
|
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");
|
|
46
52
|
|
|
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");
|
|
52
53
|
// ═══════════════════════════════════════════════════════════════════════
|
|
53
54
|
// captureIntegrationBranch: guard against quick-task branches
|
|
54
55
|
// ═══════════════════════════════════════════════════════════════════════
|
|
55
|
-
|
|
56
|
+
|
|
57
|
+
console.log("\n=== captureIntegrationBranch: skips quick-task branches ===");
|
|
58
|
+
|
|
59
|
+
{
|
|
56
60
|
const repo = createTestRepo();
|
|
57
61
|
|
|
58
62
|
// Create and checkout a quick-task branch
|
|
59
63
|
run("git checkout -b gsd/quick/1-fix-typo", repo);
|
|
60
|
-
|
|
64
|
+
assertEq(getCurrentBranch(repo), "gsd/quick/1-fix-typo", "on quick branch");
|
|
61
65
|
|
|
62
66
|
captureIntegrationBranch(repo, "M001");
|
|
63
67
|
|
|
64
|
-
|
|
68
|
+
assertEq(readIntegrationBranch(repo, "M001"), null,
|
|
65
69
|
"captureIntegrationBranch is a no-op on quick-task branches");
|
|
66
70
|
|
|
67
71
|
rmSync(repo, { recursive: true, force: true });
|
|
68
|
-
}
|
|
72
|
+
}
|
|
69
73
|
|
|
70
74
|
// ─── Verify main is still recorded correctly ─────────────────────────
|
|
71
|
-
|
|
75
|
+
|
|
76
|
+
console.log("\n=== captureIntegrationBranch: records main correctly ===");
|
|
77
|
+
|
|
78
|
+
{
|
|
72
79
|
const repo = createTestRepo();
|
|
73
80
|
|
|
74
81
|
// Capture from main — should work normally
|
|
75
82
|
captureIntegrationBranch(repo, "M001");
|
|
76
|
-
|
|
83
|
+
assertEq(readIntegrationBranch(repo, "M001"), "main",
|
|
77
84
|
"main is recorded as integration branch");
|
|
78
85
|
|
|
79
86
|
// Switch to quick branch — capture should be no-op (doesn't overwrite main)
|
|
80
87
|
run("git checkout -b gsd/quick/1-fix-typo", repo);
|
|
81
88
|
captureIntegrationBranch(repo, "M001");
|
|
82
|
-
|
|
89
|
+
assertEq(readIntegrationBranch(repo, "M001"), "main",
|
|
83
90
|
"quick branch does not overwrite existing integration branch");
|
|
84
91
|
|
|
85
92
|
rmSync(repo, { recursive: true, force: true });
|
|
86
|
-
}
|
|
93
|
+
}
|
|
87
94
|
|
|
88
95
|
// ─── Sequence: main → quick → back to main → capture ────────────────
|
|
89
|
-
|
|
96
|
+
|
|
97
|
+
console.log("\n=== captureIntegrationBranch: correct after quick branch round-trip ===");
|
|
98
|
+
|
|
99
|
+
{
|
|
90
100
|
const repo = createTestRepo();
|
|
91
101
|
|
|
92
102
|
// Simulate quick-task lifecycle: branch off, do work, return to main
|
|
@@ -101,16 +111,19 @@ test('captureIntegrationBranch: correct after quick branch round-trip', () => {
|
|
|
101
111
|
|
|
102
112
|
// Now capture — should get main, not the deleted quick branch
|
|
103
113
|
captureIntegrationBranch(repo, "M002");
|
|
104
|
-
|
|
114
|
+
assertEq(readIntegrationBranch(repo, "M002"), "main",
|
|
105
115
|
"after quick round-trip, main is captured correctly");
|
|
106
116
|
|
|
107
117
|
rmSync(repo, { recursive: true, force: true });
|
|
108
|
-
}
|
|
118
|
+
}
|
|
109
119
|
|
|
110
120
|
// ═══════════════════════════════════════════════════════════════════════
|
|
111
121
|
// cleanupQuickBranch: in-memory path (same session)
|
|
112
122
|
// ═══════════════════════════════════════════════════════════════════════
|
|
113
|
-
|
|
123
|
+
|
|
124
|
+
console.log("\n=== cleanupQuickBranch: merges back and cleans up (same session) ===");
|
|
125
|
+
|
|
126
|
+
{
|
|
114
127
|
const repo = createTestRepo();
|
|
115
128
|
const origCwd = process.cwd();
|
|
116
129
|
|
|
@@ -142,27 +155,30 @@ test('cleanupQuickBranch: merges back and cleans up (same session)', async () =>
|
|
|
142
155
|
const { cleanupQuickBranch } = await import("../quick.ts");
|
|
143
156
|
const result = cleanupQuickBranch();
|
|
144
157
|
|
|
145
|
-
|
|
146
|
-
|
|
158
|
+
assertTrue(result, "cleanupQuickBranch returns true");
|
|
159
|
+
assertEq(getCurrentBranch(repo), "main", "back on main after cleanup");
|
|
147
160
|
|
|
148
161
|
// Verify merge happened — fix.txt should exist on main
|
|
149
|
-
|
|
162
|
+
assertTrue(existsSync(join(repo, "fix.txt")), "fix.txt merged to main");
|
|
150
163
|
|
|
151
164
|
// Verify quick branch deleted
|
|
152
165
|
const branches = run("git branch", repo);
|
|
153
|
-
|
|
166
|
+
assertTrue(!branches.includes("gsd/quick/1-fix-typo"), "quick branch deleted");
|
|
154
167
|
|
|
155
168
|
// Verify disk state cleaned up
|
|
156
|
-
|
|
169
|
+
assertTrue(!existsSync(join(runtimeDir, "quick-return.json")), "quick-return.json removed");
|
|
157
170
|
|
|
158
171
|
process.chdir(origCwd);
|
|
159
172
|
rmSync(repo, { recursive: true, force: true });
|
|
160
|
-
}
|
|
173
|
+
}
|
|
161
174
|
|
|
162
175
|
// ═══════════════════════════════════════════════════════════════════════
|
|
163
176
|
// cleanupQuickBranch: cross-session recovery from disk
|
|
164
177
|
// ═══════════════════════════════════════════════════════════════════════
|
|
165
|
-
|
|
178
|
+
|
|
179
|
+
console.log("\n=== cleanupQuickBranch: recovers from disk state (cross-session) ===");
|
|
180
|
+
|
|
181
|
+
{
|
|
166
182
|
const repo = createTestRepo();
|
|
167
183
|
const origCwd = process.cwd();
|
|
168
184
|
|
|
@@ -190,19 +206,22 @@ test('cleanupQuickBranch: recovers from disk state (cross-session)', async () =>
|
|
|
190
206
|
const { cleanupQuickBranch } = await import("../quick.ts");
|
|
191
207
|
const result = cleanupQuickBranch();
|
|
192
208
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
209
|
+
assertTrue(result, "cross-session recovery returns true");
|
|
210
|
+
assertEq(getCurrentBranch(repo), "main", "back on main after cross-session recovery");
|
|
211
|
+
assertTrue(existsSync(join(repo, "docs.md")), "docs.md merged to main");
|
|
212
|
+
assertTrue(!existsSync(join(runtimeDir, "quick-return.json")), "disk state cleaned up");
|
|
197
213
|
|
|
198
214
|
process.chdir(origCwd);
|
|
199
215
|
rmSync(repo, { recursive: true, force: true });
|
|
200
|
-
}
|
|
216
|
+
}
|
|
201
217
|
|
|
202
218
|
// ═══════════════════════════════════════════════════════════════════════
|
|
203
219
|
// cleanupQuickBranch: no-op when no pending state
|
|
204
220
|
// ═══════════════════════════════════════════════════════════════════════
|
|
205
|
-
|
|
221
|
+
|
|
222
|
+
console.log("\n=== cleanupQuickBranch: no-op without pending state ===");
|
|
223
|
+
|
|
224
|
+
{
|
|
206
225
|
const repo = createTestRepo();
|
|
207
226
|
const origCwd = process.cwd();
|
|
208
227
|
process.chdir(repo);
|
|
@@ -210,29 +229,32 @@ test('cleanupQuickBranch: no-op without pending state', async () => {
|
|
|
210
229
|
const { cleanupQuickBranch } = await import("../quick.ts");
|
|
211
230
|
const result = cleanupQuickBranch();
|
|
212
231
|
|
|
213
|
-
|
|
214
|
-
|
|
232
|
+
assertTrue(!result, "returns false when no pending state");
|
|
233
|
+
assertEq(getCurrentBranch(repo), "main", "stays on main");
|
|
215
234
|
|
|
216
235
|
process.chdir(origCwd);
|
|
217
236
|
rmSync(repo, { recursive: true, force: true });
|
|
218
|
-
}
|
|
237
|
+
}
|
|
219
238
|
|
|
220
239
|
// ═══════════════════════════════════════════════════════════════════════
|
|
221
240
|
// End-to-end: quick branch does NOT contaminate integration branch
|
|
222
241
|
// ═══════════════════════════════════════════════════════════════════════
|
|
223
|
-
|
|
242
|
+
|
|
243
|
+
console.log("\n=== E2E: quick branch does not contaminate integration branch ===");
|
|
244
|
+
|
|
245
|
+
{
|
|
224
246
|
const repo = createTestRepo();
|
|
225
247
|
|
|
226
248
|
// 1. Record main as integration branch for M001
|
|
227
249
|
captureIntegrationBranch(repo, "M001");
|
|
228
|
-
|
|
250
|
+
assertEq(readIntegrationBranch(repo, "M001"), "main", "M001 integration = main");
|
|
229
251
|
|
|
230
252
|
// 2. Start a quick task (branch off)
|
|
231
253
|
run("git checkout -b gsd/quick/1-fix-typo", repo);
|
|
232
254
|
|
|
233
255
|
// 3. Try to capture integration branch for M002 while on quick branch
|
|
234
256
|
captureIntegrationBranch(repo, "M002");
|
|
235
|
-
|
|
257
|
+
assertEq(readIntegrationBranch(repo, "M002"), null,
|
|
236
258
|
"M002 integration NOT recorded from quick branch");
|
|
237
259
|
|
|
238
260
|
// 4. Return to main (simulate cleanupQuickBranch)
|
|
@@ -240,14 +262,20 @@ test('E2E: quick branch does not contaminate integration branch', () => {
|
|
|
240
262
|
|
|
241
263
|
// 5. Now capture M002 from main — should work
|
|
242
264
|
captureIntegrationBranch(repo, "M002");
|
|
243
|
-
|
|
265
|
+
assertEq(readIntegrationBranch(repo, "M002"), "main",
|
|
244
266
|
"M002 integration = main after returning from quick branch");
|
|
245
267
|
|
|
246
268
|
// 6. Verify M001 still intact
|
|
247
|
-
|
|
269
|
+
assertEq(readIntegrationBranch(repo, "M001"), "main",
|
|
248
270
|
"M001 integration unchanged");
|
|
249
271
|
|
|
250
272
|
rmSync(repo, { recursive: true, force: true });
|
|
251
|
-
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
report();
|
|
276
|
+
}
|
|
252
277
|
|
|
278
|
+
main().catch((error) => {
|
|
279
|
+
console.error(error);
|
|
280
|
+
process.exit(1);
|
|
253
281
|
});
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import { describe, test } from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
1
|
import { readFileSync } from "node:fs";
|
|
4
2
|
import { join, dirname } from "node:path";
|
|
5
3
|
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();
|
|
12
13
|
/**
|
|
13
14
|
* Load a prompt template from the worktree prompts directory
|
|
14
15
|
* and apply variable substitution (mirrors loadPrompt logic).
|
|
@@ -26,10 +27,11 @@ function loadPromptFromWorktree(name: string, vars: Record<string, string> = {})
|
|
|
26
27
|
// Tests
|
|
27
28
|
// ═══════════════════════════════════════════════════════════════════════════
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
async function main(): Promise<void> {
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
// ─── reassess-roadmap prompt loads and substitutes ─────────────────────
|
|
33
|
+
console.log("\n=== reassess-roadmap prompt loads and substitutes ===");
|
|
34
|
+
{
|
|
33
35
|
const testVars = {
|
|
34
36
|
workingDirectory: "/tmp/test-project",
|
|
35
37
|
milestoneId: "M099",
|
|
@@ -49,26 +51,27 @@ test('reassess-roadmap prompt loads and substitutes', () => {
|
|
|
49
51
|
console.error(` ERROR: loadPrompt threw: ${err}`);
|
|
50
52
|
}
|
|
51
53
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
+
assertTrue(!threw, "loadPrompt does not throw for reassess-roadmap");
|
|
55
|
+
assertTrue(typeof result === "string" && result.length > 0, "loadPrompt returns a non-empty string");
|
|
54
56
|
|
|
55
57
|
// Verify all test variables were substituted into the output
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
assertTrue(result.includes("M099"), "prompt contains milestoneId 'M099'");
|
|
59
|
+
assertTrue(result.includes("S03"), "prompt contains completedSliceId 'S03'");
|
|
60
|
+
assertTrue(result.includes(".gsd/milestones/M099/slices/S03/S03-ASSESSMENT.md"), "prompt contains assessmentPath");
|
|
61
|
+
assertTrue(result.includes(".gsd/milestones/M099/M099-ROADMAP.md"), "prompt contains roadmapPath");
|
|
62
|
+
assertTrue(result.includes("--- test inlined context block ---"), "prompt contains inlinedContext");
|
|
61
63
|
|
|
62
64
|
// Verify no un-substituted variables remain
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
65
|
+
assertTrue(!result.includes("{{milestoneId}}"), "no un-substituted {{milestoneId}}");
|
|
66
|
+
assertTrue(!result.includes("{{completedSliceId}}"), "no un-substituted {{completedSliceId}}");
|
|
67
|
+
assertTrue(!result.includes("{{assessmentPath}}"), "no un-substituted {{assessmentPath}}");
|
|
68
|
+
assertTrue(!result.includes("{{roadmapPath}}"), "no un-substituted {{roadmapPath}}");
|
|
69
|
+
assertTrue(!result.includes("{{inlinedContext}}"), "no un-substituted {{inlinedContext}}");
|
|
70
|
+
}
|
|
69
71
|
|
|
70
72
|
// ─── reassess-roadmap contains coverage-check instruction ─────────────
|
|
71
|
-
|
|
73
|
+
console.log("\n=== reassess-roadmap contains coverage-check instruction ===");
|
|
74
|
+
{
|
|
72
75
|
const prompt = loadPromptFromWorktree("reassess-roadmap", {
|
|
73
76
|
workingDirectory: "/tmp/test-project",
|
|
74
77
|
milestoneId: "M001",
|
|
@@ -82,32 +85,33 @@ test('reassess-roadmap contains coverage-check instruction', () => {
|
|
|
82
85
|
const lower = prompt.toLowerCase();
|
|
83
86
|
|
|
84
87
|
// The prompt must mention "each success criterion" or "every success criterion"
|
|
85
|
-
|
|
88
|
+
assertTrue(
|
|
86
89
|
lower.includes("each success criterion") || lower.includes("every success criterion"),
|
|
87
90
|
"prompt contains 'each success criterion' or 'every success criterion'"
|
|
88
91
|
);
|
|
89
92
|
|
|
90
93
|
// The prompt must mention "owning slice" or "remaining slice"
|
|
91
|
-
|
|
94
|
+
assertTrue(
|
|
92
95
|
lower.includes("owning slice") || lower.includes("remaining slice"),
|
|
93
96
|
"prompt contains 'owning slice' or 'remaining slice'"
|
|
94
97
|
);
|
|
95
98
|
|
|
96
99
|
// The prompt must mention "no remaining owner" or "no owner" or "no slice"
|
|
97
|
-
|
|
100
|
+
assertTrue(
|
|
98
101
|
lower.includes("no remaining owner") || lower.includes("no owner") || lower.includes("no slice"),
|
|
99
102
|
"prompt contains 'no remaining owner', 'no owner', or 'no slice'"
|
|
100
103
|
);
|
|
101
104
|
|
|
102
105
|
// The prompt must mention "blocking issue" or "blocking"
|
|
103
|
-
|
|
106
|
+
assertTrue(
|
|
104
107
|
lower.includes("blocking issue") || lower.includes("blocking"),
|
|
105
108
|
"prompt contains 'blocking issue' or 'blocking'"
|
|
106
109
|
);
|
|
107
|
-
}
|
|
110
|
+
}
|
|
108
111
|
|
|
109
112
|
// ─── coverage-check requires at-least-one semantics ───────────────────
|
|
110
|
-
|
|
113
|
+
console.log("\n=== coverage-check requires at-least-one semantics ===");
|
|
114
|
+
{
|
|
111
115
|
const prompt = loadPromptFromWorktree("reassess-roadmap", {
|
|
112
116
|
workingDirectory: "/tmp/test-project",
|
|
113
117
|
milestoneId: "M001",
|
|
@@ -120,16 +124,22 @@ test('coverage-check requires at-least-one semantics', () => {
|
|
|
120
124
|
const lower = prompt.toLowerCase();
|
|
121
125
|
|
|
122
126
|
// The instruction must use "at least one" or equivalent inclusive language
|
|
123
|
-
|
|
127
|
+
assertTrue(
|
|
124
128
|
lower.includes("at least one") || lower.includes("at-least-one") || lower.includes("one or more"),
|
|
125
129
|
"prompt uses 'at least one' or equivalent inclusive language for slice ownership"
|
|
126
130
|
);
|
|
127
131
|
|
|
128
132
|
// The instruction must NOT require "exactly one" — that would be too rigid
|
|
129
|
-
|
|
133
|
+
assertTrue(
|
|
130
134
|
!lower.includes("exactly one owner") && !lower.includes("exactly one slice"),
|
|
131
135
|
"prompt does NOT use 'exactly one' for slice ownership (would be too rigid)"
|
|
132
136
|
);
|
|
133
|
-
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
report();
|
|
140
|
+
}
|
|
134
141
|
|
|
142
|
+
main().catch((error) => {
|
|
143
|
+
console.error(error);
|
|
144
|
+
process.exit(1);
|
|
135
145
|
});
|