@productbrain/cli 0.1.0-beta.984 → 0.1.0-beta.9860
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 +11 -2
- package/dist/__tests__/adapters.test.js +79 -53
- package/dist/__tests__/adapters.test.js.map +1 -1
- package/dist/__tests__/adminConfig.test.d.ts +18 -0
- package/dist/__tests__/adminConfig.test.d.ts.map +1 -0
- package/dist/__tests__/adminConfig.test.js +221 -0
- package/dist/__tests__/adminConfig.test.js.map +1 -0
- package/dist/__tests__/batch-transformations.test.js +2 -26
- package/dist/__tests__/batch-transformations.test.js.map +1 -1
- package/dist/__tests__/capture-receipt-coaching.test.d.ts +2 -0
- package/dist/__tests__/capture-receipt-coaching.test.d.ts.map +1 -0
- package/dist/__tests__/capture-receipt-coaching.test.js +109 -0
- package/dist/__tests__/capture-receipt-coaching.test.js.map +1 -0
- package/dist/__tests__/capture-receipt-role-hint.test.d.ts +2 -0
- package/dist/__tests__/capture-receipt-role-hint.test.d.ts.map +1 -0
- package/dist/__tests__/capture-receipt-role-hint.test.js +67 -0
- package/dist/__tests__/capture-receipt-role-hint.test.js.map +1 -0
- package/dist/__tests__/capture-receipt-spine-floor.test.d.ts +2 -0
- package/dist/__tests__/capture-receipt-spine-floor.test.d.ts.map +1 -0
- package/dist/__tests__/capture-receipt-spine-floor.test.js +45 -0
- package/dist/__tests__/capture-receipt-spine-floor.test.js.map +1 -0
- package/dist/__tests__/capture.test.js +1337 -181
- package/dist/__tests__/capture.test.js.map +1 -1
- package/dist/__tests__/client-binding-guard.test.d.ts +2 -0
- package/dist/__tests__/client-binding-guard.test.d.ts.map +1 -0
- package/dist/__tests__/client-binding-guard.test.js +84 -0
- package/dist/__tests__/client-binding-guard.test.js.map +1 -0
- package/dist/__tests__/coaching-mirror-drift.test.d.ts +2 -0
- package/dist/__tests__/coaching-mirror-drift.test.d.ts.map +1 -0
- package/dist/__tests__/coaching-mirror-drift.test.js +47 -0
- package/dist/__tests__/coaching-mirror-drift.test.js.map +1 -0
- package/dist/__tests__/codex-prep-parity.test.d.ts +2 -0
- package/dist/__tests__/codex-prep-parity.test.d.ts.map +1 -0
- package/dist/__tests__/codex-prep-parity.test.js +84 -0
- package/dist/__tests__/codex-prep-parity.test.js.map +1 -0
- package/dist/__tests__/collection-registry-seed-drift.test.d.ts +2 -0
- package/dist/__tests__/collection-registry-seed-drift.test.d.ts.map +1 -0
- package/dist/__tests__/collection-registry-seed-drift.test.js +102 -0
- package/dist/__tests__/collection-registry-seed-drift.test.js.map +1 -0
- package/dist/__tests__/config-prod-fallthrough.test.d.ts +2 -0
- package/dist/__tests__/config-prod-fallthrough.test.d.ts.map +1 -0
- package/dist/__tests__/config-prod-fallthrough.test.js +93 -0
- package/dist/__tests__/config-prod-fallthrough.test.js.map +1 -0
- package/dist/__tests__/config.test.js +559 -40
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/constellation.test.js +26 -14
- package/dist/__tests__/constellation.test.js.map +1 -1
- package/dist/__tests__/conversation.test.d.ts +2 -0
- package/dist/__tests__/conversation.test.d.ts.map +1 -0
- package/dist/__tests__/conversation.test.js +113 -0
- package/dist/__tests__/conversation.test.js.map +1 -0
- package/dist/__tests__/entry-formatter.test.d.ts +2 -0
- package/dist/__tests__/entry-formatter.test.d.ts.map +1 -0
- package/dist/__tests__/entry-formatter.test.js +159 -0
- package/dist/__tests__/entry-formatter.test.js.map +1 -0
- package/dist/__tests__/entry-preflight.test.d.ts +2 -0
- package/dist/__tests__/entry-preflight.test.d.ts.map +1 -0
- package/dist/__tests__/entry-preflight.test.js +58 -0
- package/dist/__tests__/entry-preflight.test.js.map +1 -0
- package/dist/__tests__/entryAccept-batch.test.d.ts +2 -0
- package/dist/__tests__/entryAccept-batch.test.d.ts.map +1 -0
- package/dist/__tests__/entryAccept-batch.test.js +305 -0
- package/dist/__tests__/entryAccept-batch.test.js.map +1 -0
- package/dist/__tests__/entryAccept.test.d.ts +2 -0
- package/dist/__tests__/entryAccept.test.d.ts.map +1 -0
- package/dist/__tests__/entryAccept.test.js +513 -0
- package/dist/__tests__/entryAccept.test.js.map +1 -0
- package/dist/__tests__/entryDiscardResolve.test.d.ts +2 -0
- package/dist/__tests__/entryDiscardResolve.test.d.ts.map +1 -0
- package/dist/__tests__/entryDiscardResolve.test.js +28 -0
- package/dist/__tests__/entryDiscardResolve.test.js.map +1 -0
- package/dist/__tests__/entryOwn.test.d.ts +2 -0
- package/dist/__tests__/entryOwn.test.d.ts.map +1 -0
- package/dist/__tests__/entryOwn.test.js +50 -0
- package/dist/__tests__/entryOwn.test.js.map +1 -0
- package/dist/__tests__/entryTick.test.d.ts +2 -0
- package/dist/__tests__/entryTick.test.d.ts.map +1 -0
- package/dist/__tests__/entryTick.test.js +40 -0
- package/dist/__tests__/entryTick.test.js.map +1 -0
- package/dist/__tests__/envelope-contract.test.js +2 -0
- package/dist/__tests__/envelope-contract.test.js.map +1 -1
- package/dist/__tests__/errors.test.js +41 -0
- package/dist/__tests__/errors.test.js.map +1 -1
- package/dist/__tests__/fields.test.js +14 -3
- package/dist/__tests__/fields.test.js.map +1 -1
- package/dist/__tests__/gateway-dry-run-timeout.test.d.ts +2 -0
- package/dist/__tests__/gateway-dry-run-timeout.test.d.ts.map +1 -0
- package/dist/__tests__/gateway-dry-run-timeout.test.js +70 -0
- package/dist/__tests__/gateway-dry-run-timeout.test.js.map +1 -0
- package/dist/__tests__/gateway-timeout-body-phase.test.d.ts +2 -0
- package/dist/__tests__/gateway-timeout-body-phase.test.d.ts.map +1 -0
- package/dist/__tests__/gateway-timeout-body-phase.test.js +121 -0
- package/dist/__tests__/gateway-timeout-body-phase.test.js.map +1 -0
- package/dist/__tests__/handshake-augment.test.js +4 -20
- package/dist/__tests__/handshake-augment.test.js.map +1 -1
- package/dist/__tests__/handshake-dormancy.test.js +10 -193
- package/dist/__tests__/handshake-dormancy.test.js.map +1 -1
- package/dist/__tests__/handshake-formatter.test.js +44 -0
- package/dist/__tests__/handshake-formatter.test.js.map +1 -1
- package/dist/__tests__/handshake-preview.test.js +271 -612
- package/dist/__tests__/handshake-preview.test.js.map +1 -1
- package/dist/__tests__/handshake-session-threading.test.d.ts +2 -0
- package/dist/__tests__/handshake-session-threading.test.d.ts.map +1 -0
- package/dist/__tests__/handshake-session-threading.test.js +185 -0
- package/dist/__tests__/handshake-session-threading.test.js.map +1 -0
- package/dist/__tests__/handshake.e2e.test.js +7 -1033
- package/dist/__tests__/handshake.e2e.test.js.map +1 -1
- package/dist/__tests__/handshake.test.js +523 -308
- package/dist/__tests__/handshake.test.js.map +1 -1
- package/dist/__tests__/health-gap-kinds-drift.test.d.ts +2 -0
- package/dist/__tests__/health-gap-kinds-drift.test.d.ts.map +1 -0
- package/dist/__tests__/health-gap-kinds-drift.test.js +43 -0
- package/dist/__tests__/health-gap-kinds-drift.test.js.map +1 -0
- package/dist/__tests__/hook-intents.test.js +3 -3
- package/dist/__tests__/hook-intents.test.js.map +1 -1
- package/dist/__tests__/ingest.test.js +9 -0
- package/dist/__tests__/ingest.test.js.map +1 -1
- package/dist/__tests__/init.test.js +51 -14
- package/dist/__tests__/init.test.js.map +1 -1
- package/dist/__tests__/kernel-value-sets-drift.test.d.ts +2 -0
- package/dist/__tests__/kernel-value-sets-drift.test.d.ts.map +1 -0
- package/dist/__tests__/kernel-value-sets-drift.test.js +46 -0
- package/dist/__tests__/kernel-value-sets-drift.test.js.map +1 -0
- package/dist/__tests__/kernel-value-sets-generator.test.d.ts +2 -0
- package/dist/__tests__/kernel-value-sets-generator.test.d.ts.map +1 -0
- package/dist/__tests__/kernel-value-sets-generator.test.js +108 -0
- package/dist/__tests__/kernel-value-sets-generator.test.js.map +1 -0
- package/dist/__tests__/login.test.js +18 -1
- package/dist/__tests__/login.test.js.map +1 -1
- package/dist/__tests__/method-registry.integration.test.js +2 -3
- package/dist/__tests__/method-registry.integration.test.js.map +1 -1
- package/dist/__tests__/method-registry.test.d.ts +6 -8
- package/dist/__tests__/method-registry.test.d.ts.map +1 -1
- package/dist/__tests__/method-registry.test.js +22 -70
- package/dist/__tests__/method-registry.test.js.map +1 -1
- package/dist/__tests__/missingPin.test.d.ts +11 -0
- package/dist/__tests__/missingPin.test.d.ts.map +1 -0
- package/dist/__tests__/missingPin.test.js +232 -0
- package/dist/__tests__/missingPin.test.js.map +1 -0
- package/dist/__tests__/notice-marker.test.js +146 -11
- package/dist/__tests__/notice-marker.test.js.map +1 -1
- package/dist/__tests__/onboarding.test.js +29 -5
- package/dist/__tests__/onboarding.test.js.map +1 -1
- package/dist/__tests__/onboardingFallback.test.d.ts +2 -0
- package/dist/__tests__/onboardingFallback.test.d.ts.map +1 -0
- package/dist/__tests__/onboardingFallback.test.js +74 -0
- package/dist/__tests__/onboardingFallback.test.js.map +1 -0
- package/dist/__tests__/orient.test.js +380 -39
- package/dist/__tests__/orient.test.js.map +1 -1
- package/dist/__tests__/perimeter.test.js +1 -1
- package/dist/__tests__/perimeter.test.js.map +1 -1
- package/dist/__tests__/preview-key-refresh.test.d.ts +2 -0
- package/dist/__tests__/preview-key-refresh.test.d.ts.map +1 -0
- package/dist/__tests__/preview-key-refresh.test.js +126 -0
- package/dist/__tests__/preview-key-refresh.test.js.map +1 -0
- package/dist/__tests__/profiles.test.js +498 -8
- package/dist/__tests__/profiles.test.js.map +1 -1
- package/dist/__tests__/prompts.test.js +18 -1
- package/dist/__tests__/prompts.test.js.map +1 -1
- package/dist/__tests__/proof-run.test.d.ts +2 -0
- package/dist/__tests__/proof-run.test.d.ts.map +1 -0
- package/dist/__tests__/proof-run.test.js +255 -0
- package/dist/__tests__/proof-run.test.js.map +1 -0
- package/dist/__tests__/rate-limit-resilience.test.d.ts +7 -0
- package/dist/__tests__/rate-limit-resilience.test.d.ts.map +1 -0
- package/dist/__tests__/rate-limit-resilience.test.js +209 -0
- package/dist/__tests__/rate-limit-resilience.test.js.map +1 -0
- package/dist/__tests__/read-target-notice.test.d.ts +2 -0
- package/dist/__tests__/read-target-notice.test.d.ts.map +1 -0
- package/dist/__tests__/read-target-notice.test.js +129 -0
- package/dist/__tests__/read-target-notice.test.js.map +1 -0
- package/dist/__tests__/relate.test.js +246 -14
- package/dist/__tests__/relate.test.js.map +1 -1
- package/dist/__tests__/reply-commands-registered.test.d.ts +2 -0
- package/dist/__tests__/reply-commands-registered.test.d.ts.map +1 -0
- package/dist/__tests__/reply-commands-registered.test.js +81 -0
- package/dist/__tests__/reply-commands-registered.test.js.map +1 -0
- package/dist/__tests__/repo-detect.test.js +18 -38
- package/dist/__tests__/repo-detect.test.js.map +1 -1
- package/dist/__tests__/reportedProfile.test.d.ts +2 -0
- package/dist/__tests__/reportedProfile.test.d.ts.map +1 -0
- package/dist/__tests__/reportedProfile.test.js +328 -0
- package/dist/__tests__/reportedProfile.test.js.map +1 -0
- package/dist/__tests__/restore.test.d.ts +2 -0
- package/dist/__tests__/restore.test.d.ts.map +1 -0
- package/dist/__tests__/restore.test.js +85 -0
- package/dist/__tests__/restore.test.js.map +1 -0
- package/dist/__tests__/route-latency-budget.test.d.ts +2 -0
- package/dist/__tests__/route-latency-budget.test.d.ts.map +1 -0
- package/dist/__tests__/route-latency-budget.test.js +106 -0
- package/dist/__tests__/route-latency-budget.test.js.map +1 -0
- package/dist/__tests__/runner.test.js +59 -44
- package/dist/__tests__/runner.test.js.map +1 -1
- package/dist/__tests__/session-binding-refusal-tenant.test.d.ts +2 -0
- package/dist/__tests__/session-binding-refusal-tenant.test.d.ts.map +1 -0
- package/dist/__tests__/session-binding-refusal-tenant.test.js +112 -0
- package/dist/__tests__/session-binding-refusal-tenant.test.js.map +1 -0
- package/dist/__tests__/session-close-loop.test.d.ts +2 -0
- package/dist/__tests__/session-close-loop.test.d.ts.map +1 -0
- package/dist/__tests__/session-close-loop.test.js +213 -0
- package/dist/__tests__/session-close-loop.test.js.map +1 -0
- package/dist/__tests__/session-label.test.d.ts +2 -0
- package/dist/__tests__/session-label.test.d.ts.map +1 -0
- package/dist/__tests__/session-label.test.js +46 -0
- package/dist/__tests__/session-label.test.js.map +1 -0
- package/dist/__tests__/session-list-show.test.d.ts +2 -0
- package/dist/__tests__/session-list-show.test.d.ts.map +1 -0
- package/dist/__tests__/session-list-show.test.js +173 -0
- package/dist/__tests__/session-list-show.test.js.map +1 -0
- package/dist/__tests__/session-pinned-role.test.d.ts +2 -0
- package/dist/__tests__/session-pinned-role.test.d.ts.map +1 -0
- package/dist/__tests__/session-pinned-role.test.js +257 -0
- package/dist/__tests__/session-pinned-role.test.js.map +1 -0
- package/dist/__tests__/session-reset.test.d.ts +2 -0
- package/dist/__tests__/session-reset.test.d.ts.map +1 -0
- package/dist/__tests__/session-reset.test.js +138 -0
- package/dist/__tests__/session-reset.test.js.map +1 -0
- package/dist/__tests__/session-resume-backstop.test.d.ts +2 -0
- package/dist/__tests__/session-resume-backstop.test.d.ts.map +1 -0
- package/dist/__tests__/session-resume-backstop.test.js +139 -0
- package/dist/__tests__/session-resume-backstop.test.js.map +1 -0
- package/dist/__tests__/session-role-name-sanitize.test.d.ts +2 -0
- package/dist/__tests__/session-role-name-sanitize.test.d.ts.map +1 -0
- package/dist/__tests__/session-role-name-sanitize.test.js +129 -0
- package/dist/__tests__/session-role-name-sanitize.test.js.map +1 -0
- package/dist/__tests__/session-start-key-refresh.test.d.ts +2 -0
- package/dist/__tests__/session-start-key-refresh.test.d.ts.map +1 -0
- package/dist/__tests__/session-start-key-refresh.test.js +197 -0
- package/dist/__tests__/session-start-key-refresh.test.js.map +1 -0
- package/dist/__tests__/session-state-machine.test.js +190 -9
- package/dist/__tests__/session-state-machine.test.js.map +1 -1
- package/dist/__tests__/session-switch.test.js +218 -4
- package/dist/__tests__/session-switch.test.js.map +1 -1
- package/dist/__tests__/session-touch.test.js +6 -1
- package/dist/__tests__/session-touch.test.js.map +1 -1
- package/dist/__tests__/sessionBinding.test.d.ts +2 -0
- package/dist/__tests__/sessionBinding.test.d.ts.map +1 -0
- package/dist/__tests__/sessionBinding.test.js +118 -0
- package/dist/__tests__/sessionBinding.test.js.map +1 -0
- package/dist/__tests__/sessionByIdLookup.test.d.ts +2 -0
- package/dist/__tests__/sessionByIdLookup.test.d.ts.map +1 -0
- package/dist/__tests__/sessionByIdLookup.test.js +63 -0
- package/dist/__tests__/sessionByIdLookup.test.js.map +1 -0
- package/dist/__tests__/skill-vocabulary.test.d.ts +1 -1
- package/dist/__tests__/skill-vocabulary.test.js +7 -2
- package/dist/__tests__/skill-vocabulary.test.js.map +1 -1
- package/dist/__tests__/state.test.js +21 -1
- package/dist/__tests__/state.test.js.map +1 -1
- package/dist/__tests__/stillTrue.test.d.ts +2 -0
- package/dist/__tests__/stillTrue.test.d.ts.map +1 -0
- package/dist/__tests__/stillTrue.test.js +52 -0
- package/dist/__tests__/stillTrue.test.js.map +1 -0
- package/dist/__tests__/strip.test.js +57 -3
- package/dist/__tests__/strip.test.js.map +1 -1
- package/dist/__tests__/tenant-notice-write-path.test.d.ts +2 -0
- package/dist/__tests__/tenant-notice-write-path.test.d.ts.map +1 -0
- package/dist/__tests__/tenant-notice-write-path.test.js +169 -0
- package/dist/__tests__/tenant-notice-write-path.test.js.map +1 -0
- package/dist/__tests__/update.test.js +458 -8
- package/dist/__tests__/update.test.js.map +1 -1
- package/dist/__tests__/verify-formatter.test.d.ts +2 -0
- package/dist/__tests__/verify-formatter.test.d.ts.map +1 -0
- package/dist/__tests__/verify-formatter.test.js +85 -0
- package/dist/__tests__/verify-formatter.test.js.map +1 -0
- package/dist/__tests__/vocabulary-leak.test.d.ts +1 -7
- package/dist/__tests__/vocabulary-leak.test.d.ts.map +1 -1
- package/dist/__tests__/vocabulary-leak.test.js +7 -114
- package/dist/__tests__/vocabulary-leak.test.js.map +1 -1
- package/dist/__tests__/workspace.test.js +11 -72
- package/dist/__tests__/workspace.test.js.map +1 -1
- package/dist/__tests__/workspaceNotice.test.d.ts +2 -0
- package/dist/__tests__/workspaceNotice.test.d.ts.map +1 -0
- package/dist/__tests__/workspaceNotice.test.js +571 -0
- package/dist/__tests__/workspaceNotice.test.js.map +1 -0
- package/dist/commands/__tests__/quality.test.d.ts +2 -0
- package/dist/commands/__tests__/quality.test.d.ts.map +1 -0
- package/dist/commands/__tests__/quality.test.js +156 -0
- package/dist/commands/__tests__/quality.test.js.map +1 -0
- package/dist/commands/__tests__/rework.test.d.ts +2 -0
- package/dist/commands/__tests__/rework.test.d.ts.map +1 -0
- package/dist/commands/__tests__/rework.test.js +149 -0
- package/dist/commands/__tests__/rework.test.js.map +1 -0
- package/dist/commands/__tests__/tensionsList.test.d.ts +2 -0
- package/dist/commands/__tests__/tensionsList.test.d.ts.map +1 -0
- package/dist/commands/__tests__/tensionsList.test.js +63 -0
- package/dist/commands/__tests__/tensionsList.test.js.map +1 -0
- package/dist/commands/accept-policy.d.ts +10 -0
- package/dist/commands/accept-policy.d.ts.map +1 -0
- package/dist/commands/accept-policy.js +107 -0
- package/dist/commands/accept-policy.js.map +1 -0
- package/dist/commands/admin/cockpit.d.ts +2 -13
- package/dist/commands/admin/cockpit.d.ts.map +1 -1
- package/dist/commands/admin/cockpit.js +5 -5
- package/dist/commands/admin/cockpit.js.map +1 -1
- package/dist/commands/admin/index.d.ts +49 -0
- package/dist/commands/admin/index.d.ts.map +1 -1
- package/dist/commands/admin/index.js +148 -29
- package/dist/commands/admin/index.js.map +1 -1
- package/dist/commands/admin/index.test.d.ts +2 -0
- package/dist/commands/admin/index.test.d.ts.map +1 -0
- package/dist/commands/admin/index.test.js +94 -0
- package/dist/commands/admin/index.test.js.map +1 -0
- package/dist/commands/admin/inspect.d.ts.map +1 -1
- package/dist/commands/admin/inspect.js +2 -7
- package/dist/commands/admin/inspect.js.map +1 -1
- package/dist/commands/admin/probe.d.ts +75 -0
- package/dist/commands/admin/probe.d.ts.map +1 -0
- package/dist/commands/admin/probe.js +224 -0
- package/dist/commands/admin/probe.js.map +1 -0
- package/dist/commands/admin/probe.test.d.ts +2 -0
- package/dist/commands/admin/probe.test.d.ts.map +1 -0
- package/dist/commands/admin/probe.test.js +193 -0
- package/dist/commands/admin/probe.test.js.map +1 -0
- package/dist/commands/admin/run.d.ts +43 -0
- package/dist/commands/admin/run.d.ts.map +1 -0
- package/dist/commands/admin/run.js +78 -0
- package/dist/commands/admin/run.js.map +1 -0
- package/dist/commands/admin/run.test.d.ts +18 -0
- package/dist/commands/admin/run.test.d.ts.map +1 -0
- package/dist/commands/admin/run.test.js +168 -0
- package/dist/commands/admin/run.test.js.map +1 -0
- package/dist/commands/admin/seed.d.ts +6 -21
- package/dist/commands/admin/seed.d.ts.map +1 -1
- package/dist/commands/admin/seed.js +41 -310
- package/dist/commands/admin/seed.js.map +1 -1
- package/dist/commands/admin/seed.test.d.ts +3 -4
- package/dist/commands/admin/seed.test.d.ts.map +1 -1
- package/dist/commands/admin/seed.test.js +26 -76
- package/dist/commands/admin/seed.test.js.map +1 -1
- package/dist/commands/admin/seedRegistryEntries.generated.d.ts.map +1 -1
- package/dist/commands/admin/seedRegistryEntries.generated.js +3 -84
- package/dist/commands/admin/seedRegistryEntries.generated.js.map +1 -1
- package/dist/commands/admin/seedRegistryEntries.test.d.ts +5 -3
- package/dist/commands/admin/seedRegistryEntries.test.d.ts.map +1 -1
- package/dist/commands/admin/seedRegistryEntries.test.js +60 -26
- package/dist/commands/admin/seedRegistryEntries.test.js.map +1 -1
- package/dist/commands/admin/seedRowType.d.ts +22 -0
- package/dist/commands/admin/seedRowType.d.ts.map +1 -0
- package/dist/commands/admin/seedRowType.js +2 -0
- package/dist/commands/admin/seedRowType.js.map +1 -0
- package/dist/commands/admin/seedStatusColor.d.ts +9 -0
- package/dist/commands/admin/seedStatusColor.d.ts.map +1 -0
- package/dist/commands/admin/seedStatusColor.js +19 -0
- package/dist/commands/admin/seedStatusColor.js.map +1 -0
- package/dist/commands/admin/seedStatusColor.test.d.ts +2 -0
- package/dist/commands/admin/seedStatusColor.test.d.ts.map +1 -0
- package/dist/commands/admin/seedStatusColor.test.js +31 -0
- package/dist/commands/admin/seedStatusColor.test.js.map +1 -0
- package/dist/commands/brief.d.ts.map +1 -1
- package/dist/commands/brief.js +24 -2
- package/dist/commands/brief.js.map +1 -1
- package/dist/commands/capture.d.ts +17 -9
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +173 -228
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/chain-walk.d.ts.map +1 -1
- package/dist/commands/chain-walk.js.map +1 -1
- package/dist/commands/changes.d.ts.map +1 -1
- package/dist/commands/changes.js.map +1 -1
- package/dist/commands/codex-prep.d.ts +11 -1
- package/dist/commands/codex-prep.d.ts.map +1 -1
- package/dist/commands/codex-prep.js +14 -83
- package/dist/commands/codex-prep.js.map +1 -1
- package/dist/commands/collections.d.ts +1 -1
- package/dist/commands/collections.d.ts.map +1 -1
- package/dist/commands/collections.js +1 -1
- package/dist/commands/collections.js.map +1 -1
- package/dist/commands/conflicts.d.ts +35 -0
- package/dist/commands/conflicts.d.ts.map +1 -0
- package/dist/commands/conflicts.js +194 -0
- package/dist/commands/conflicts.js.map +1 -0
- package/dist/commands/conflicts.test.d.ts +2 -0
- package/dist/commands/conflicts.test.d.ts.map +1 -0
- package/dist/commands/conflicts.test.js +179 -0
- package/dist/commands/conflicts.test.js.map +1 -0
- package/dist/commands/connect-config.test.js +11 -3
- package/dist/commands/connect-config.test.js.map +1 -1
- package/dist/commands/connect-context.d.ts +27 -17
- package/dist/commands/connect-context.d.ts.map +1 -1
- package/dist/commands/connect-context.js +45 -31
- package/dist/commands/connect-context.js.map +1 -1
- package/dist/commands/connect-context.test.js +91 -53
- package/dist/commands/connect-context.test.js.map +1 -1
- package/dist/commands/connect-decline.test.d.ts +2 -0
- package/dist/commands/connect-decline.test.d.ts.map +1 -0
- package/dist/commands/connect-decline.test.js +70 -0
- package/dist/commands/connect-decline.test.js.map +1 -0
- package/dist/commands/connect-integration.test.js +24 -7
- package/dist/commands/connect-integration.test.js.map +1 -1
- package/dist/commands/connect-legacy-migration.test.d.ts +2 -0
- package/dist/commands/connect-legacy-migration.test.d.ts.map +1 -0
- package/dist/commands/connect-legacy-migration.test.js +109 -0
- package/dist/commands/connect-legacy-migration.test.js.map +1 -0
- package/dist/commands/connect-redeem-failure.test.d.ts +2 -0
- package/dist/commands/connect-redeem-failure.test.d.ts.map +1 -0
- package/dist/commands/connect-redeem-failure.test.js +134 -0
- package/dist/commands/connect-redeem-failure.test.js.map +1 -0
- package/dist/commands/connect-screens.d.ts +14 -3
- package/dist/commands/connect-screens.d.ts.map +1 -1
- package/dist/commands/connect-screens.js +62 -9
- package/dist/commands/connect-screens.js.map +1 -1
- package/dist/commands/connect-seal.test.d.ts +2 -0
- package/dist/commands/connect-seal.test.d.ts.map +1 -0
- package/dist/commands/connect-seal.test.js +55 -0
- package/dist/commands/connect-seal.test.js.map +1 -0
- package/dist/commands/connect.d.ts +14 -11
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +236 -69
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connect.test.js +226 -23
- package/dist/commands/connect.test.js.map +1 -1
- package/dist/commands/constellation.d.ts.map +1 -1
- package/dist/commands/constellation.js.map +1 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/cross-cut.d.ts.map +1 -1
- package/dist/commands/cross-cut.js.map +1 -1
- package/dist/commands/digest.d.ts +17 -0
- package/dist/commands/digest.d.ts.map +1 -0
- package/dist/commands/digest.js +58 -0
- package/dist/commands/digest.js.map +1 -0
- package/dist/commands/digest.test.d.ts +2 -0
- package/dist/commands/digest.test.d.ts.map +1 -0
- package/dist/commands/digest.test.js +36 -0
- package/dist/commands/digest.test.js.map +1 -0
- package/dist/commands/direction.d.ts +10 -0
- package/dist/commands/direction.d.ts.map +1 -0
- package/dist/commands/direction.js +79 -0
- package/dist/commands/direction.js.map +1 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +105 -35
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctor.test.js +202 -6
- package/dist/commands/doctor.test.js.map +1 -1
- package/dist/commands/entryAccept.d.ts +26 -0
- package/dist/commands/entryAccept.d.ts.map +1 -0
- package/dist/commands/entryAccept.js +309 -0
- package/dist/commands/entryAccept.js.map +1 -0
- package/dist/commands/entryDiscardResolve.d.ts +9 -0
- package/dist/commands/entryDiscardResolve.d.ts.map +1 -0
- package/dist/commands/entryDiscardResolve.js +27 -0
- package/dist/commands/entryDiscardResolve.js.map +1 -0
- package/dist/commands/entryOwn.d.ts +5 -0
- package/dist/commands/entryOwn.d.ts.map +1 -0
- package/dist/commands/entryOwn.js +17 -0
- package/dist/commands/entryOwn.js.map +1 -0
- package/dist/commands/entryPreflight.d.ts +8 -0
- package/dist/commands/entryPreflight.d.ts.map +1 -0
- package/dist/commands/entryPreflight.js +48 -0
- package/dist/commands/entryPreflight.js.map +1 -0
- package/dist/commands/entryTick.d.ts +8 -0
- package/dist/commands/entryTick.d.ts.map +1 -0
- package/dist/commands/entryTick.js +43 -0
- package/dist/commands/entryTick.js.map +1 -0
- package/dist/commands/feedback.d.ts +36 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +174 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/feedback.test.d.ts +2 -0
- package/dist/commands/feedback.test.d.ts.map +1 -0
- package/dist/commands/feedback.test.js +110 -0
- package/dist/commands/feedback.test.js.map +1 -0
- package/dist/commands/fields.d.ts.map +1 -1
- package/dist/commands/fields.js +1 -1
- package/dist/commands/fields.js.map +1 -1
- package/dist/commands/files.d.ts +26 -0
- package/dist/commands/files.d.ts.map +1 -0
- package/dist/commands/files.js +160 -0
- package/dist/commands/files.js.map +1 -0
- package/dist/commands/files.test.d.ts +2 -0
- package/dist/commands/files.test.d.ts.map +1 -0
- package/dist/commands/files.test.js +278 -0
- package/dist/commands/files.test.js.map +1 -0
- package/dist/commands/handshake.d.ts +42 -186
- package/dist/commands/handshake.d.ts.map +1 -1
- package/dist/commands/handshake.js +469 -1539
- package/dist/commands/handshake.js.map +1 -1
- package/dist/commands/handshakeCursorSkillCleanup.d.ts +36 -0
- package/dist/commands/handshakeCursorSkillCleanup.d.ts.map +1 -0
- package/dist/commands/handshakeCursorSkillCleanup.js +110 -0
- package/dist/commands/handshakeCursorSkillCleanup.js.map +1 -0
- package/dist/commands/handshakeDriftClassification.d.ts +33 -0
- package/dist/commands/handshakeDriftClassification.d.ts.map +1 -0
- package/dist/commands/handshakeDriftClassification.js +62 -0
- package/dist/commands/handshakeDriftClassification.js.map +1 -0
- package/dist/commands/history.d.ts +30 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +62 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/history.test.d.ts +2 -0
- package/dist/commands/history.test.d.ts.map +1 -0
- package/dist/commands/history.test.js +106 -0
- package/dist/commands/history.test.js.map +1 -0
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +9 -0
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +22 -13
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +15 -11
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/organisation.d.ts +12 -0
- package/dist/commands/organisation.d.ts.map +1 -0
- package/dist/commands/organisation.js +147 -0
- package/dist/commands/organisation.js.map +1 -0
- package/dist/commands/organisation.test.d.ts +2 -0
- package/dist/commands/organisation.test.d.ts.map +1 -0
- package/dist/commands/organisation.test.js +116 -0
- package/dist/commands/organisation.test.js.map +1 -0
- package/dist/commands/organisationHierarchy.d.ts +8 -0
- package/dist/commands/organisationHierarchy.d.ts.map +1 -0
- package/dist/commands/organisationHierarchy.js +75 -0
- package/dist/commands/organisationHierarchy.js.map +1 -0
- package/dist/commands/organisationHierarchy.test.d.ts +2 -0
- package/dist/commands/organisationHierarchy.test.d.ts.map +1 -0
- package/dist/commands/organisationHierarchy.test.js +72 -0
- package/dist/commands/organisationHierarchy.test.js.map +1 -0
- package/dist/commands/organisationWrite.d.ts +18 -0
- package/dist/commands/organisationWrite.d.ts.map +1 -0
- package/dist/commands/organisationWrite.js +71 -0
- package/dist/commands/organisationWrite.js.map +1 -0
- package/dist/commands/orient.d.ts +49 -96
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +135 -29
- package/dist/commands/orient.js.map +1 -1
- package/dist/commands/outcome.d.ts +91 -0
- package/dist/commands/outcome.d.ts.map +1 -0
- package/dist/commands/outcome.js +204 -0
- package/dist/commands/outcome.js.map +1 -0
- package/dist/commands/outcome.test.d.ts +2 -0
- package/dist/commands/outcome.test.d.ts.map +1 -0
- package/dist/commands/outcome.test.js +308 -0
- package/dist/commands/outcome.test.js.map +1 -0
- package/dist/commands/people.d.ts +6 -0
- package/dist/commands/people.d.ts.map +1 -0
- package/dist/commands/people.js +22 -0
- package/dist/commands/people.js.map +1 -0
- package/dist/commands/people.test.d.ts +2 -0
- package/dist/commands/people.test.d.ts.map +1 -0
- package/dist/commands/people.test.js +61 -0
- package/dist/commands/people.test.js.map +1 -0
- package/dist/commands/profile.d.ts +23 -2
- package/dist/commands/profile.d.ts.map +1 -1
- package/dist/commands/profile.js +192 -35
- package/dist/commands/profile.js.map +1 -1
- package/dist/commands/proof-run.d.ts +51 -0
- package/dist/commands/proof-run.d.ts.map +1 -0
- package/dist/commands/proof-run.js +209 -0
- package/dist/commands/proof-run.js.map +1 -0
- package/dist/commands/quality.d.ts +16 -0
- package/dist/commands/quality.d.ts.map +1 -0
- package/dist/commands/quality.js +29 -0
- package/dist/commands/quality.js.map +1 -0
- package/dist/commands/questions.d.ts +23 -0
- package/dist/commands/questions.d.ts.map +1 -0
- package/dist/commands/questions.js +238 -0
- package/dist/commands/questions.js.map +1 -0
- package/dist/commands/questions.test.d.ts +2 -0
- package/dist/commands/questions.test.d.ts.map +1 -0
- package/dist/commands/questions.test.js +159 -0
- package/dist/commands/questions.test.js.map +1 -0
- package/dist/commands/relate.d.ts +1 -0
- package/dist/commands/relate.d.ts.map +1 -1
- package/dist/commands/relate.js +89 -15
- package/dist/commands/relate.js.map +1 -1
- package/dist/commands/restore.d.ts +2 -0
- package/dist/commands/restore.d.ts.map +1 -0
- package/dist/commands/restore.js +83 -0
- package/dist/commands/restore.js.map +1 -0
- package/dist/commands/rework.d.ts +24 -0
- package/dist/commands/rework.d.ts.map +1 -0
- package/dist/commands/rework.js +97 -0
- package/dist/commands/rework.js.map +1 -0
- package/dist/commands/role.d.ts +67 -0
- package/dist/commands/role.d.ts.map +1 -0
- package/dist/commands/role.js +164 -0
- package/dist/commands/role.js.map +1 -0
- package/dist/commands/role.test.d.ts +2 -0
- package/dist/commands/role.test.d.ts.map +1 -0
- package/dist/commands/role.test.js +290 -0
- package/dist/commands/role.test.js.map +1 -0
- package/dist/commands/scoreboard.d.ts +26 -0
- package/dist/commands/scoreboard.d.ts.map +1 -0
- package/dist/commands/scoreboard.js +40 -0
- package/dist/commands/scoreboard.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +7 -1
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/session.d.ts +60 -7
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +409 -98
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/shape.d.ts +16 -0
- package/dist/commands/shape.d.ts.map +1 -0
- package/dist/commands/shape.js +149 -0
- package/dist/commands/shape.js.map +1 -0
- package/dist/commands/shape.test.d.ts +2 -0
- package/dist/commands/shape.test.d.ts.map +1 -0
- package/dist/commands/shape.test.js +148 -0
- package/dist/commands/shape.test.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +102 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/status.test.d.ts +2 -0
- package/dist/commands/status.test.d.ts.map +1 -0
- package/dist/commands/status.test.js +75 -0
- package/dist/commands/status.test.js.map +1 -0
- package/dist/commands/stillTrue.d.ts +14 -0
- package/dist/commands/stillTrue.d.ts.map +1 -0
- package/dist/commands/stillTrue.js +48 -0
- package/dist/commands/stillTrue.js.map +1 -0
- package/dist/commands/tensionsList.d.ts +5 -0
- package/dist/commands/tensionsList.d.ts.map +1 -0
- package/dist/commands/tensionsList.js +27 -0
- package/dist/commands/tensionsList.js.map +1 -0
- package/dist/commands/update.d.ts +21 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +157 -42
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/usage.d.ts.map +1 -1
- package/dist/commands/usage.js +0 -18
- package/dist/commands/usage.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +7 -1
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/welcome.d.ts.map +1 -1
- package/dist/commands/welcome.js +5 -2
- package/dist/commands/welcome.js.map +1 -1
- package/dist/commands/whoami.d.ts +10 -2
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +76 -20
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/whoami.test.js +86 -6
- package/dist/commands/whoami.test.js.map +1 -1
- package/dist/commands/workspace.d.ts +7 -74
- package/dist/commands/workspace.d.ts.map +1 -1
- package/dist/commands/workspace.js +9 -70
- package/dist/commands/workspace.js.map +1 -1
- package/dist/formatters/__tests__/orient-plannedWorkCut.test.d.ts +2 -0
- package/dist/formatters/__tests__/orient-plannedWorkCut.test.d.ts.map +1 -0
- package/dist/formatters/__tests__/orient-plannedWorkCut.test.js +49 -0
- package/dist/formatters/__tests__/orient-plannedWorkCut.test.js.map +1 -0
- package/dist/formatters/__tests__/orient-provenance.test.d.ts +2 -3
- package/dist/formatters/__tests__/orient-provenance.test.d.ts.map +1 -1
- package/dist/formatters/__tests__/orient-provenance.test.js +39 -174
- package/dist/formatters/__tests__/orient-provenance.test.js.map +1 -1
- package/dist/formatters/__tests__/orient-ruleLists.test.d.ts +2 -0
- package/dist/formatters/__tests__/orient-ruleLists.test.d.ts.map +1 -0
- package/dist/formatters/__tests__/orient-ruleLists.test.js +93 -0
- package/dist/formatters/__tests__/orient-ruleLists.test.js.map +1 -0
- package/dist/formatters/__tests__/session-list-show.test.d.ts +2 -0
- package/dist/formatters/__tests__/session-list-show.test.d.ts.map +1 -0
- package/dist/formatters/__tests__/session-list-show.test.js +195 -0
- package/dist/formatters/__tests__/session-list-show.test.js.map +1 -0
- package/dist/formatters/__tests__/session.test.d.ts +2 -0
- package/dist/formatters/__tests__/session.test.d.ts.map +1 -0
- package/dist/formatters/__tests__/session.test.js +193 -0
- package/dist/formatters/__tests__/session.test.js.map +1 -0
- package/dist/formatters/__tests__/tensionsList.test.d.ts +2 -0
- package/dist/formatters/__tests__/tensionsList.test.d.ts.map +1 -0
- package/dist/formatters/__tests__/tensionsList.test.js +30 -0
- package/dist/formatters/__tests__/tensionsList.test.js.map +1 -0
- package/dist/formatters/brief.d.ts +6 -15
- package/dist/formatters/brief.d.ts.map +1 -1
- package/dist/formatters/brief.js +16 -14
- package/dist/formatters/brief.js.map +1 -1
- package/dist/formatters/brief.test.d.ts +2 -0
- package/dist/formatters/brief.test.d.ts.map +1 -0
- package/dist/formatters/brief.test.js +21 -0
- package/dist/formatters/brief.test.js.map +1 -0
- package/dist/formatters/capture.d.ts +17 -10
- package/dist/formatters/capture.d.ts.map +1 -1
- package/dist/formatters/capture.js +33 -10
- package/dist/formatters/capture.js.map +1 -1
- package/dist/formatters/coaching.d.ts +53 -0
- package/dist/formatters/coaching.d.ts.map +1 -0
- package/dist/formatters/coaching.js +51 -0
- package/dist/formatters/coaching.js.map +1 -0
- package/dist/formatters/collections.d.ts +0 -1
- package/dist/formatters/collections.d.ts.map +1 -1
- package/dist/formatters/collections.js +14 -5
- package/dist/formatters/collections.js.map +1 -1
- package/dist/formatters/conflicts.d.ts +69 -0
- package/dist/formatters/conflicts.d.ts.map +1 -0
- package/dist/formatters/conflicts.js +87 -0
- package/dist/formatters/conflicts.js.map +1 -0
- package/dist/formatters/conflicts.test.d.ts +2 -0
- package/dist/formatters/conflicts.test.d.ts.map +1 -0
- package/dist/formatters/conflicts.test.js +136 -0
- package/dist/formatters/conflicts.test.js.map +1 -0
- package/dist/formatters/context.d.ts +1 -1
- package/dist/formatters/context.d.ts.map +1 -1
- package/dist/formatters/context.js.map +1 -1
- package/dist/formatters/digest.d.ts +13 -0
- package/dist/formatters/digest.d.ts.map +1 -0
- package/dist/formatters/digest.js +98 -0
- package/dist/formatters/digest.js.map +1 -0
- package/dist/formatters/digest.test.d.ts +2 -0
- package/dist/formatters/digest.test.d.ts.map +1 -0
- package/dist/formatters/digest.test.js +166 -0
- package/dist/formatters/digest.test.js.map +1 -0
- package/dist/formatters/direction.d.ts +48 -0
- package/dist/formatters/direction.d.ts.map +1 -0
- package/dist/formatters/direction.js +75 -0
- package/dist/formatters/direction.js.map +1 -0
- package/dist/formatters/direction.test.d.ts +2 -0
- package/dist/formatters/direction.test.d.ts.map +1 -0
- package/dist/formatters/direction.test.js +70 -0
- package/dist/formatters/direction.test.js.map +1 -0
- package/dist/formatters/entry.d.ts +46 -3
- package/dist/formatters/entry.d.ts.map +1 -1
- package/dist/formatters/entry.js +57 -7
- package/dist/formatters/entry.js.map +1 -1
- package/dist/formatters/entryAccept.d.ts +77 -0
- package/dist/formatters/entryAccept.d.ts.map +1 -0
- package/dist/formatters/entryAccept.js +76 -0
- package/dist/formatters/entryAccept.js.map +1 -0
- package/dist/formatters/feedback.d.ts +58 -0
- package/dist/formatters/feedback.d.ts.map +1 -0
- package/dist/formatters/feedback.js +91 -0
- package/dist/formatters/feedback.js.map +1 -0
- package/dist/formatters/feedback.test.d.ts +2 -0
- package/dist/formatters/feedback.test.d.ts.map +1 -0
- package/dist/formatters/feedback.test.js +123 -0
- package/dist/formatters/feedback.test.js.map +1 -0
- package/dist/formatters/fields.d.ts +7 -1
- package/dist/formatters/fields.d.ts.map +1 -1
- package/dist/formatters/fields.js +9 -3
- package/dist/formatters/fields.js.map +1 -1
- package/dist/formatters/fields.test.d.ts +2 -0
- package/dist/formatters/fields.test.d.ts.map +1 -0
- package/dist/formatters/fields.test.js +42 -0
- package/dist/formatters/fields.test.js.map +1 -0
- package/dist/formatters/handshake.d.ts +24 -6
- package/dist/formatters/handshake.d.ts.map +1 -1
- package/dist/formatters/handshake.js +34 -15
- package/dist/formatters/handshake.js.map +1 -1
- package/dist/formatters/orient.coherencyCheckTag.test.d.ts +2 -0
- package/dist/formatters/orient.coherencyCheckTag.test.d.ts.map +1 -0
- package/dist/formatters/orient.coherencyCheckTag.test.js +22 -0
- package/dist/formatters/orient.coherencyCheckTag.test.js.map +1 -0
- package/dist/formatters/orient.d.ts +108 -144
- package/dist/formatters/orient.d.ts.map +1 -1
- package/dist/formatters/orient.js +157 -181
- package/dist/formatters/orient.js.map +1 -1
- package/dist/formatters/orient.rcrtMiss.test.d.ts +2 -0
- package/dist/formatters/orient.rcrtMiss.test.d.ts.map +1 -0
- package/dist/formatters/orient.rcrtMiss.test.js +77 -0
- package/dist/formatters/orient.rcrtMiss.test.js.map +1 -0
- package/dist/formatters/orient.rituals.test.d.ts +2 -0
- package/dist/formatters/orient.rituals.test.d.ts.map +1 -0
- package/dist/formatters/orient.rituals.test.js +73 -0
- package/dist/formatters/orient.rituals.test.js.map +1 -0
- package/dist/formatters/orient.shapeAdvisorySummary.test.d.ts +2 -0
- package/dist/formatters/orient.shapeAdvisorySummary.test.d.ts.map +1 -0
- package/dist/formatters/orient.shapeAdvisorySummary.test.js +59 -0
- package/dist/formatters/orient.shapeAdvisorySummary.test.js.map +1 -0
- package/dist/formatters/orientDegradation.d.ts +38 -0
- package/dist/formatters/orientDegradation.d.ts.map +1 -0
- package/dist/formatters/orientDegradation.js +50 -0
- package/dist/formatters/orientDegradation.js.map +1 -0
- package/dist/formatters/orientDegradation.test.d.ts +2 -0
- package/dist/formatters/orientDegradation.test.d.ts.map +1 -0
- package/dist/formatters/orientDegradation.test.js +28 -0
- package/dist/formatters/orientDegradation.test.js.map +1 -0
- package/dist/formatters/orientDirection.d.ts +47 -0
- package/dist/formatters/orientDirection.d.ts.map +1 -0
- package/dist/formatters/orientDirection.js +23 -0
- package/dist/formatters/orientDirection.js.map +1 -0
- package/dist/formatters/orientDirection.test.d.ts +2 -0
- package/dist/formatters/orientDirection.test.d.ts.map +1 -0
- package/dist/formatters/orientDirection.test.js +70 -0
- package/dist/formatters/orientDirection.test.js.map +1 -0
- package/dist/formatters/orientRetrievalMiss.d.ts +22 -0
- package/dist/formatters/orientRetrievalMiss.d.ts.map +1 -0
- package/dist/formatters/orientRetrievalMiss.js +17 -0
- package/dist/formatters/orientRetrievalMiss.js.map +1 -0
- package/dist/formatters/plannedWorkCounts.d.ts +19 -0
- package/dist/formatters/plannedWorkCounts.d.ts.map +1 -0
- package/dist/formatters/plannedWorkCounts.js +17 -0
- package/dist/formatters/plannedWorkCounts.js.map +1 -0
- package/dist/formatters/questions.d.ts +72 -0
- package/dist/formatters/questions.d.ts.map +1 -0
- package/dist/formatters/questions.js +116 -0
- package/dist/formatters/questions.js.map +1 -0
- package/dist/formatters/questions.test.d.ts +2 -0
- package/dist/formatters/questions.test.d.ts.map +1 -0
- package/dist/formatters/questions.test.js +144 -0
- package/dist/formatters/questions.test.js.map +1 -0
- package/dist/formatters/relate.d.ts +13 -2
- package/dist/formatters/relate.d.ts.map +1 -1
- package/dist/formatters/relate.js +15 -5
- package/dist/formatters/relate.js.map +1 -1
- package/dist/formatters/relate.test.d.ts +2 -0
- package/dist/formatters/relate.test.d.ts.map +1 -0
- package/dist/formatters/relate.test.js +91 -0
- package/dist/formatters/relate.test.js.map +1 -0
- package/dist/formatters/scoreboard.d.ts +11 -0
- package/dist/formatters/scoreboard.d.ts.map +1 -0
- package/dist/formatters/scoreboard.js +162 -0
- package/dist/formatters/scoreboard.js.map +1 -0
- package/dist/formatters/scoreboard.test.d.ts +2 -0
- package/dist/formatters/scoreboard.test.d.ts.map +1 -0
- package/dist/formatters/scoreboard.test.js +301 -0
- package/dist/formatters/scoreboard.test.js.map +1 -0
- package/dist/formatters/search.d.ts +3 -0
- package/dist/formatters/search.d.ts.map +1 -1
- package/dist/formatters/search.js +15 -1
- package/dist/formatters/search.js.map +1 -1
- package/dist/formatters/search.test.d.ts +2 -0
- package/dist/formatters/search.test.d.ts.map +1 -0
- package/dist/formatters/search.test.js +76 -0
- package/dist/formatters/search.test.js.map +1 -0
- package/dist/formatters/session-feedback.test.d.ts +2 -0
- package/dist/formatters/session-feedback.test.d.ts.map +1 -0
- package/dist/formatters/session-feedback.test.js +146 -0
- package/dist/formatters/session-feedback.test.js.map +1 -0
- package/dist/formatters/session.d.ts +122 -5
- package/dist/formatters/session.d.ts.map +1 -1
- package/dist/formatters/session.js +312 -21
- package/dist/formatters/session.js.map +1 -1
- package/dist/formatters/shape.d.ts +54 -0
- package/dist/formatters/shape.d.ts.map +1 -0
- package/dist/formatters/shape.js +97 -0
- package/dist/formatters/shape.js.map +1 -0
- package/dist/formatters/shape.test.d.ts +2 -0
- package/dist/formatters/shape.test.d.ts.map +1 -0
- package/dist/formatters/shape.test.js +80 -0
- package/dist/formatters/shape.test.js.map +1 -0
- package/dist/formatters/spineCheck.d.ts +14 -0
- package/dist/formatters/spineCheck.d.ts.map +1 -0
- package/dist/formatters/spineCheck.js +113 -0
- package/dist/formatters/spineCheck.js.map +1 -0
- package/dist/formatters/spineCheck.test.d.ts +2 -0
- package/dist/formatters/spineCheck.test.d.ts.map +1 -0
- package/dist/formatters/spineCheck.test.js +76 -0
- package/dist/formatters/spineCheck.test.js.map +1 -0
- package/dist/formatters/tensionsList.d.ts +17 -0
- package/dist/formatters/tensionsList.d.ts.map +1 -0
- package/dist/formatters/tensionsList.js +33 -0
- package/dist/formatters/tensionsList.js.map +1 -0
- package/dist/formatters/update.d.ts +22 -0
- package/dist/formatters/update.d.ts.map +1 -1
- package/dist/formatters/update.js +36 -7
- package/dist/formatters/update.js.map +1 -1
- package/dist/formatters/update.test.d.ts +2 -0
- package/dist/formatters/update.test.d.ts.map +1 -0
- package/dist/formatters/update.test.js +59 -0
- package/dist/formatters/update.test.js.map +1 -0
- package/dist/formatters/verify.d.ts +12 -4
- package/dist/formatters/verify.d.ts.map +1 -1
- package/dist/formatters/verify.js +20 -2
- package/dist/formatters/verify.js.map +1 -1
- package/dist/generated/healthGapKinds.generated.d.ts +12 -0
- package/dist/generated/healthGapKinds.generated.d.ts.map +1 -0
- package/dist/generated/healthGapKinds.generated.js +16 -0
- package/dist/generated/healthGapKinds.generated.js.map +1 -0
- package/dist/generated/organisationalAuthorityRefusalCodes.generated.d.ts +12 -0
- package/dist/generated/organisationalAuthorityRefusalCodes.generated.d.ts.map +1 -0
- package/dist/generated/organisationalAuthorityRefusalCodes.generated.js +11 -0
- package/dist/generated/organisationalAuthorityRefusalCodes.generated.js.map +1 -0
- package/dist/generated/relationTypes.generated.d.ts +12 -0
- package/dist/generated/relationTypes.generated.d.ts.map +1 -0
- package/dist/generated/relationTypes.generated.js +11 -0
- package/dist/generated/relationTypes.generated.js.map +1 -0
- package/dist/generated/routeLatencyBudget.generated.d.ts +56 -0
- package/dist/generated/routeLatencyBudget.generated.d.ts.map +1 -0
- package/dist/generated/routeLatencyBudget.generated.js +278 -0
- package/dist/generated/routeLatencyBudget.generated.js.map +1 -0
- package/dist/generated/sourceSurfaces.generated.d.ts +12 -0
- package/dist/generated/sourceSurfaces.generated.d.ts.map +1 -0
- package/dist/generated/sourceSurfaces.generated.js +11 -0
- package/dist/generated/sourceSurfaces.generated.js.map +1 -0
- package/dist/generators/adapters.d.ts +39 -6
- package/dist/generators/adapters.d.ts.map +1 -1
- package/dist/generators/adapters.js +88 -89
- package/dist/generators/adapters.js.map +1 -1
- package/dist/generators/adapters.test.js +14 -6
- package/dist/generators/adapters.test.js.map +1 -1
- package/dist/generators/boundary-manifest.real-file.test.d.ts +2 -0
- package/dist/generators/boundary-manifest.real-file.test.d.ts.map +1 -0
- package/dist/generators/boundary-manifest.real-file.test.js +70 -0
- package/dist/generators/boundary-manifest.real-file.test.js.map +1 -0
- package/dist/generators/briefing-projections.test.d.ts +2 -0
- package/dist/generators/briefing-projections.test.d.ts.map +1 -0
- package/dist/generators/briefing-projections.test.js +98 -0
- package/dist/generators/briefing-projections.test.js.map +1 -0
- package/dist/generators/context-md.d.ts +7 -2
- package/dist/generators/context-md.d.ts.map +1 -1
- package/dist/generators/context-md.js +14 -53
- package/dist/generators/context-md.js.map +1 -1
- package/dist/generators/everyone-rules-md.d.ts +9 -0
- package/dist/generators/everyone-rules-md.d.ts.map +1 -0
- package/dist/generators/everyone-rules-md.js +21 -0
- package/dist/generators/everyone-rules-md.js.map +1 -0
- package/dist/generators/noProjectionAssets.d.ts +15 -0
- package/dist/generators/noProjectionAssets.d.ts.map +1 -0
- package/dist/generators/noProjectionAssets.js +6 -0
- package/dist/generators/noProjectionAssets.js.map +1 -0
- package/dist/generators/portable-knowledge.d.ts +9 -26
- package/dist/generators/portable-knowledge.d.ts.map +1 -1
- package/dist/generators/portable-knowledge.js +11 -125
- package/dist/generators/portable-knowledge.js.map +1 -1
- package/dist/generators/portable-knowledge.test.js +82 -267
- package/dist/generators/portable-knowledge.test.js.map +1 -1
- package/dist/generators/region-projections.d.ts +0 -1
- package/dist/generators/region-projections.d.ts.map +1 -1
- package/dist/generators/region-projections.js +7 -5
- package/dist/generators/region-projections.js.map +1 -1
- package/dist/generators/region-projections.test.js +10 -15
- package/dist/generators/region-projections.test.js.map +1 -1
- package/dist/generators/retired-projections.d.ts +12 -0
- package/dist/generators/retired-projections.d.ts.map +1 -0
- package/dist/generators/retired-projections.js +75 -0
- package/dist/generators/retired-projections.js.map +1 -0
- package/dist/generators/retired-projections.test.d.ts +2 -0
- package/dist/generators/retired-projections.test.d.ts.map +1 -0
- package/dist/generators/retired-projections.test.js +64 -0
- package/dist/generators/retired-projections.test.js.map +1 -0
- package/dist/handleCliError.d.ts +2 -0
- package/dist/handleCliError.d.ts.map +1 -0
- package/dist/handleCliError.js +56 -0
- package/dist/handleCliError.js.map +1 -0
- package/dist/index.d.ts +0 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +185 -541
- package/dist/index.js.map +1 -1
- package/dist/lib/__tests__/legalRelationTypes.test.d.ts +2 -0
- package/dist/lib/__tests__/legalRelationTypes.test.d.ts.map +1 -0
- package/dist/lib/__tests__/legalRelationTypes.test.js +61 -0
- package/dist/lib/__tests__/legalRelationTypes.test.js.map +1 -0
- package/dist/lib/__tests__/parseFields.test.d.ts +2 -0
- package/dist/lib/__tests__/parseFields.test.d.ts.map +1 -0
- package/dist/lib/__tests__/parseFields.test.js +40 -0
- package/dist/lib/__tests__/parseFields.test.js.map +1 -0
- package/dist/lib/adminConfig.d.ts +48 -0
- package/dist/lib/adminConfig.d.ts.map +1 -0
- package/dist/lib/adminConfig.js +130 -0
- package/dist/lib/adminConfig.js.map +1 -0
- package/dist/lib/canonicalRefs.d.ts +27 -8
- package/dist/lib/canonicalRefs.d.ts.map +1 -1
- package/dist/lib/canonicalRefs.js +25 -6
- package/dist/lib/canonicalRefs.js.map +1 -1
- package/dist/lib/captureGrounding.d.ts +48 -0
- package/dist/lib/captureGrounding.d.ts.map +1 -0
- package/dist/lib/captureGrounding.js +54 -0
- package/dist/lib/captureGrounding.js.map +1 -0
- package/dist/lib/captureGrounding.test.d.ts +2 -0
- package/dist/lib/captureGrounding.test.d.ts.map +1 -0
- package/dist/lib/captureGrounding.test.js +74 -0
- package/dist/lib/captureGrounding.test.js.map +1 -0
- package/dist/lib/captureLink.d.ts +26 -0
- package/dist/lib/captureLink.d.ts.map +1 -0
- package/dist/lib/captureLink.js +110 -0
- package/dist/lib/captureLink.js.map +1 -0
- package/dist/lib/checklist.d.ts +32 -0
- package/dist/lib/checklist.d.ts.map +1 -0
- package/dist/lib/checklist.js +77 -0
- package/dist/lib/checklist.js.map +1 -0
- package/dist/lib/client.d.ts +47 -19
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +223 -66
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/collectionRegistry.d.ts +40 -5
- package/dist/lib/collectionRegistry.d.ts.map +1 -1
- package/dist/lib/collectionRegistry.js +71 -48
- package/dist/lib/collectionRegistry.js.map +1 -1
- package/dist/lib/commanderOptions.d.ts +8 -0
- package/dist/lib/commanderOptions.d.ts.map +1 -0
- package/dist/lib/commanderOptions.js +10 -0
- package/dist/lib/commanderOptions.js.map +1 -0
- package/dist/lib/compose-wrapup-view.d.ts +48 -0
- package/dist/lib/compose-wrapup-view.d.ts.map +1 -0
- package/dist/lib/compose-wrapup-view.js +37 -0
- package/dist/lib/compose-wrapup-view.js.map +1 -0
- package/dist/lib/config.d.ts +65 -102
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +164 -286
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/configResult.d.ts +102 -0
- package/dist/lib/configResult.d.ts.map +1 -0
- package/dist/lib/configResult.js +179 -0
- package/dist/lib/configResult.js.map +1 -0
- package/dist/lib/connectProfileName.d.ts +36 -0
- package/dist/lib/connectProfileName.d.ts.map +1 -0
- package/dist/lib/connectProfileName.js +72 -0
- package/dist/lib/connectProfileName.js.map +1 -0
- package/dist/lib/connectProfileName.test.d.ts +2 -0
- package/dist/lib/connectProfileName.test.d.ts.map +1 -0
- package/dist/lib/connectProfileName.test.js +100 -0
- package/dist/lib/connectProfileName.test.js.map +1 -0
- package/dist/lib/constants.d.ts +3 -1
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +6 -1
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/conversation.d.ts +36 -0
- package/dist/lib/conversation.d.ts.map +1 -0
- package/dist/lib/conversation.js +66 -0
- package/dist/lib/conversation.js.map +1 -0
- package/dist/lib/createEntryResult.d.ts +34 -0
- package/dist/lib/createEntryResult.d.ts.map +1 -0
- package/dist/lib/createEntryResult.js +12 -0
- package/dist/lib/createEntryResult.js.map +1 -0
- package/dist/lib/deployment.js +2 -2
- package/dist/lib/deployment.js.map +1 -1
- package/dist/lib/deployment.test.js +20 -1
- package/dist/lib/deployment.test.js.map +1 -1
- package/dist/lib/envKeySnapshot.d.ts +10 -0
- package/dist/lib/envKeySnapshot.d.ts.map +1 -0
- package/dist/lib/envKeySnapshot.js +30 -0
- package/dist/lib/envKeySnapshot.js.map +1 -0
- package/dist/lib/errors.d.ts +90 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +83 -0
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/frontmatter.d.ts +55 -0
- package/dist/lib/frontmatter.d.ts.map +1 -0
- package/dist/lib/frontmatter.js +92 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/frontmatter.test.d.ts +15 -0
- package/dist/lib/frontmatter.test.d.ts.map +1 -0
- package/dist/lib/frontmatter.test.js +98 -0
- package/dist/lib/frontmatter.test.js.map +1 -0
- package/dist/lib/gatewayTimeout.d.ts +88 -0
- package/dist/lib/gatewayTimeout.d.ts.map +1 -0
- package/dist/lib/gatewayTimeout.js +118 -0
- package/dist/lib/gatewayTimeout.js.map +1 -0
- package/dist/lib/gitEnvLeakKeysParity.test.d.ts +2 -0
- package/dist/lib/gitEnvLeakKeysParity.test.d.ts.map +1 -0
- package/dist/lib/gitEnvLeakKeysParity.test.js +73 -0
- package/dist/lib/gitEnvLeakKeysParity.test.js.map +1 -0
- package/dist/lib/glossary.js +1 -1
- package/dist/lib/glossary.js.map +1 -1
- package/dist/lib/hook-intents.js +3 -3
- package/dist/lib/hook-intents.js.map +1 -1
- package/dist/lib/judgeWait.d.ts +50 -0
- package/dist/lib/judgeWait.d.ts.map +1 -0
- package/dist/lib/judgeWait.js +64 -0
- package/dist/lib/judgeWait.js.map +1 -0
- package/dist/lib/kernelEnvelope.d.ts +42 -0
- package/dist/lib/kernelEnvelope.d.ts.map +1 -0
- package/dist/lib/kernelEnvelope.js +67 -0
- package/dist/lib/kernelEnvelope.js.map +1 -0
- package/dist/lib/legalRelationTypes.d.ts +19 -0
- package/dist/lib/legalRelationTypes.d.ts.map +1 -0
- package/dist/lib/legalRelationTypes.js +64 -0
- package/dist/lib/legalRelationTypes.js.map +1 -0
- package/dist/lib/localBinding.d.ts +86 -0
- package/dist/lib/localBinding.d.ts.map +1 -0
- package/dist/lib/localBinding.js +173 -0
- package/dist/lib/localBinding.js.map +1 -0
- package/dist/lib/method-registry.d.ts +16 -11
- package/dist/lib/method-registry.d.ts.map +1 -1
- package/dist/lib/method-registry.js +13 -25
- package/dist/lib/method-registry.js.map +1 -1
- package/dist/lib/missingFields.d.ts +5 -0
- package/dist/lib/missingFields.d.ts.map +1 -0
- package/dist/lib/missingFields.js +27 -0
- package/dist/lib/missingFields.js.map +1 -0
- package/dist/lib/normalizeMaterializedFilename.d.ts +3 -3
- package/dist/lib/normalizeMaterializedFilename.js +3 -3
- package/dist/lib/notice-marker.d.ts.map +1 -1
- package/dist/lib/notice-marker.js +186 -16
- package/dist/lib/notice-marker.js.map +1 -1
- package/dist/lib/onboarding-path-b.d.ts.map +1 -1
- package/dist/lib/onboarding-path-b.js +39 -14
- package/dist/lib/onboarding-path-b.js.map +1 -1
- package/dist/lib/onboarding-shared.d.ts +27 -4
- package/dist/lib/onboarding-shared.d.ts.map +1 -1
- package/dist/lib/onboarding-shared.js +54 -20
- package/dist/lib/onboarding-shared.js.map +1 -1
- package/dist/lib/onboarding-shared.test.d.ts +2 -0
- package/dist/lib/onboarding-shared.test.d.ts.map +1 -0
- package/dist/lib/onboarding-shared.test.js +131 -0
- package/dist/lib/onboarding-shared.test.js.map +1 -0
- package/dist/lib/onboarding-topics.js +1 -1
- package/dist/lib/onboarding.d.ts +5 -1
- package/dist/lib/onboarding.d.ts.map +1 -1
- package/dist/lib/onboarding.js +62 -25
- package/dist/lib/onboarding.js.map +1 -1
- package/dist/lib/ownerLine.d.ts +73 -0
- package/dist/lib/ownerLine.d.ts.map +1 -0
- package/dist/lib/ownerLine.js +57 -0
- package/dist/lib/ownerLine.js.map +1 -0
- package/dist/lib/parseFields.d.ts +19 -0
- package/dist/lib/parseFields.d.ts.map +1 -0
- package/dist/lib/parseFields.js +49 -0
- package/dist/lib/parseFields.js.map +1 -0
- package/dist/lib/pinnedRole.d.ts +28 -0
- package/dist/lib/pinnedRole.d.ts.map +1 -0
- package/dist/lib/pinnedRole.js +105 -0
- package/dist/lib/pinnedRole.js.map +1 -0
- package/dist/lib/platformGlossary.d.ts +19 -0
- package/dist/lib/platformGlossary.d.ts.map +1 -0
- package/dist/lib/platformGlossary.js +21 -0
- package/dist/lib/platformGlossary.js.map +1 -0
- package/dist/lib/previewBanner.d.ts +9 -0
- package/dist/lib/previewBanner.d.ts.map +1 -0
- package/dist/lib/previewBanner.js +37 -0
- package/dist/lib/previewBanner.js.map +1 -0
- package/dist/lib/productbrain-files.d.ts +108 -0
- package/dist/lib/productbrain-files.d.ts.map +1 -0
- package/dist/lib/productbrain-files.js +240 -0
- package/dist/lib/productbrain-files.js.map +1 -0
- package/dist/lib/productbrain-files.test.d.ts +2 -0
- package/dist/lib/productbrain-files.test.d.ts.map +1 -0
- package/dist/lib/productbrain-files.test.js +518 -0
- package/dist/lib/productbrain-files.test.js.map +1 -0
- package/dist/lib/profiles.d.ts +52 -4
- package/dist/lib/profiles.d.ts.map +1 -1
- package/dist/lib/profiles.js +72 -21
- package/dist/lib/profiles.js.map +1 -1
- package/dist/lib/projectConfig.d.ts +96 -0
- package/dist/lib/projectConfig.d.ts.map +1 -0
- package/dist/lib/projectConfig.js +185 -0
- package/dist/lib/projectConfig.js.map +1 -0
- package/dist/lib/prompts.d.ts +2 -0
- package/dist/lib/prompts.d.ts.map +1 -1
- package/dist/lib/prompts.js +2 -0
- package/dist/lib/prompts.js.map +1 -1
- package/dist/lib/proseBody.d.ts +14 -0
- package/dist/lib/proseBody.d.ts.map +1 -0
- package/dist/lib/proseBody.js +25 -0
- package/dist/lib/proseBody.js.map +1 -0
- package/dist/lib/rate-limit.d.ts +38 -0
- package/dist/lib/rate-limit.d.ts.map +1 -0
- package/dist/lib/rate-limit.js +83 -0
- package/dist/lib/rate-limit.js.map +1 -0
- package/dist/lib/readinessNotices.d.ts +12 -0
- package/dist/lib/readinessNotices.d.ts.map +1 -0
- package/dist/lib/readinessNotices.js +15 -0
- package/dist/lib/readinessNotices.js.map +1 -0
- package/dist/lib/repo-detect.d.ts +8 -2
- package/dist/lib/repo-detect.d.ts.map +1 -1
- package/dist/lib/repo-detect.js +11 -6
- package/dist/lib/repo-detect.js.map +1 -1
- package/dist/lib/reportedProfile.d.ts +18 -0
- package/dist/lib/reportedProfile.d.ts.map +1 -0
- package/dist/lib/reportedProfile.js +144 -0
- package/dist/lib/reportedProfile.js.map +1 -0
- package/dist/lib/ruleListRender.d.ts +193 -0
- package/dist/lib/ruleListRender.d.ts.map +1 -0
- package/dist/lib/ruleListRender.js +274 -0
- package/dist/lib/ruleListRender.js.map +1 -0
- package/dist/lib/runner.d.ts +9 -1
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/lib/runner.js +30 -4
- package/dist/lib/runner.js.map +1 -1
- package/dist/lib/seatSentence.d.ts +42 -0
- package/dist/lib/seatSentence.d.ts.map +1 -0
- package/dist/lib/seatSentence.js +25 -0
- package/dist/lib/seatSentence.js.map +1 -0
- package/dist/lib/session.d.ts +86 -12
- package/dist/lib/session.d.ts.map +1 -1
- package/dist/lib/session.js +255 -25
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/sessionBinding.d.ts +61 -0
- package/dist/lib/sessionBinding.d.ts.map +1 -0
- package/dist/lib/sessionBinding.js +125 -0
- package/dist/lib/sessionBinding.js.map +1 -0
- package/dist/lib/sessionNotices.d.ts +54 -0
- package/dist/lib/sessionNotices.d.ts.map +1 -0
- package/dist/lib/sessionNotices.js +130 -0
- package/dist/lib/sessionNotices.js.map +1 -0
- package/dist/lib/sessionNotices.test.d.ts +2 -0
- package/dist/lib/sessionNotices.test.d.ts.map +1 -0
- package/dist/lib/sessionNotices.test.js +55 -0
- package/dist/lib/sessionNotices.test.js.map +1 -0
- package/dist/lib/spineVerdictRead.d.ts +70 -0
- package/dist/lib/spineVerdictRead.d.ts.map +1 -0
- package/dist/lib/spineVerdictRead.js +73 -0
- package/dist/lib/spineVerdictRead.js.map +1 -0
- package/dist/lib/spinner.js +2 -2
- package/dist/lib/spinner.js.map +1 -1
- package/dist/lib/startup-resolution-signals.d.ts +34 -0
- package/dist/lib/startup-resolution-signals.d.ts.map +1 -0
- package/dist/lib/startup-resolution-signals.js +116 -0
- package/dist/lib/startup-resolution-signals.js.map +1 -0
- package/dist/lib/startup-resolution-signals.test.d.ts +2 -0
- package/dist/lib/startup-resolution-signals.test.d.ts.map +1 -0
- package/dist/lib/startup-resolution-signals.test.js +113 -0
- package/dist/lib/startup-resolution-signals.test.js.map +1 -0
- package/dist/lib/startup-signals.d.ts +12 -0
- package/dist/lib/startup-signals.d.ts.map +1 -0
- package/dist/lib/startup-signals.js +179 -0
- package/dist/lib/startup-signals.js.map +1 -0
- package/dist/lib/startup-signals.test.d.ts +2 -0
- package/dist/lib/startup-signals.test.d.ts.map +1 -0
- package/dist/lib/startup-signals.test.js +165 -0
- package/dist/lib/startup-signals.test.js.map +1 -0
- package/dist/lib/state.d.ts +11 -2
- package/dist/lib/state.d.ts.map +1 -1
- package/dist/lib/state.js +11 -4
- package/dist/lib/state.js.map +1 -1
- package/dist/lib/statusCategories.d.ts +160 -0
- package/dist/lib/statusCategories.d.ts.map +1 -0
- package/dist/lib/statusCategories.js +284 -0
- package/dist/lib/statusCategories.js.map +1 -0
- package/dist/lib/strip.d.ts +17 -0
- package/dist/lib/strip.d.ts.map +1 -1
- package/dist/lib/strip.js +48 -1
- package/dist/lib/strip.js.map +1 -1
- package/dist/lib/style.d.ts +8 -2
- package/dist/lib/style.d.ts.map +1 -1
- package/dist/lib/style.js +24 -17
- package/dist/lib/style.js.map +1 -1
- package/dist/lib/tokenConstants.d.ts +2 -0
- package/dist/lib/tokenConstants.d.ts.map +1 -1
- package/dist/lib/tokenConstants.js +2 -0
- package/dist/lib/tokenConstants.js.map +1 -1
- package/dist/lib/workspaceNotice.d.ts +202 -0
- package/dist/lib/workspaceNotice.d.ts.map +1 -0
- package/dist/lib/workspaceNotice.js +345 -0
- package/dist/lib/workspaceNotice.js.map +1 -0
- package/dist/{setup/perimeter.d.ts → lib/writePerimeter.d.ts} +11 -11
- package/dist/lib/writePerimeter.d.ts.map +1 -0
- package/dist/{setup/perimeter.js → lib/writePerimeter.js} +11 -11
- package/dist/lib/writePerimeter.js.map +1 -0
- package/dist/registerEntryCommands.d.ts +18 -0
- package/dist/registerEntryCommands.d.ts.map +1 -0
- package/dist/registerEntryCommands.js +123 -0
- package/dist/registerEntryCommands.js.map +1 -0
- package/dist/registerHistoryCommand.d.ts +8 -0
- package/dist/registerHistoryCommand.d.ts.map +1 -0
- package/dist/registerHistoryCommand.js +14 -0
- package/dist/registerHistoryCommand.js.map +1 -0
- package/dist/registerOutcomeCommands.d.ts +27 -0
- package/dist/registerOutcomeCommands.d.ts.map +1 -0
- package/dist/registerOutcomeCommands.js +27 -0
- package/dist/registerOutcomeCommands.js.map +1 -0
- package/dist/registerRoleCommands.d.ts +11 -0
- package/dist/registerRoleCommands.d.ts.map +1 -0
- package/dist/registerRoleCommands.js +38 -0
- package/dist/registerRoleCommands.js.map +1 -0
- package/dist/registerTensionsCommands.d.ts +10 -0
- package/dist/registerTensionsCommands.d.ts.map +1 -0
- package/dist/registerTensionsCommands.js +15 -0
- package/dist/registerTensionsCommands.js.map +1 -0
- package/dist/scoreboard/diagnose.d.ts +190 -0
- package/dist/scoreboard/diagnose.d.ts.map +1 -0
- package/dist/scoreboard/diagnose.js +282 -0
- package/dist/scoreboard/diagnose.js.map +1 -0
- package/dist/scoreboard/diagnose.test.d.ts +15 -0
- package/dist/scoreboard/diagnose.test.d.ts.map +1 -0
- package/dist/scoreboard/diagnose.test.js +288 -0
- package/dist/scoreboard/diagnose.test.js.map +1 -0
- package/dist/scoreboard/floors.d.ts +47 -0
- package/dist/scoreboard/floors.d.ts.map +1 -0
- package/dist/scoreboard/floors.js +33 -0
- package/dist/scoreboard/floors.js.map +1 -0
- package/dist/scoreboard/localDrift.d.ts +23 -0
- package/dist/scoreboard/localDrift.d.ts.map +1 -0
- package/dist/scoreboard/localDrift.js +111 -0
- package/dist/scoreboard/localDrift.js.map +1 -0
- package/dist/scoreboard/localDrift.test.d.ts +9 -0
- package/dist/scoreboard/localDrift.test.d.ts.map +1 -0
- package/dist/scoreboard/localDrift.test.js +82 -0
- package/dist/scoreboard/localDrift.test.js.map +1 -0
- package/dist/surfaces/__tests__/adapter.test.js +2 -6
- package/dist/surfaces/__tests__/adapter.test.js.map +1 -1
- package/dist/surfaces/__tests__/claude-skill-pointer-drift.test.d.ts +2 -0
- package/dist/surfaces/__tests__/claude-skill-pointer-drift.test.d.ts.map +1 -0
- package/dist/surfaces/__tests__/claude-skill-pointer-drift.test.js +179 -0
- package/dist/surfaces/__tests__/claude-skill-pointer-drift.test.js.map +1 -0
- package/dist/surfaces/adapters/claude.d.ts.map +1 -1
- package/dist/surfaces/adapters/claude.js +30 -25
- package/dist/surfaces/adapters/claude.js.map +1 -1
- package/package.json +9 -7
- package/dist/__tests__/audit.test.d.ts +0 -2
- package/dist/__tests__/audit.test.d.ts.map +0 -1
- package/dist/__tests__/audit.test.js +0 -399
- package/dist/__tests__/audit.test.js.map +0 -1
- package/dist/__tests__/authority-domains.test.d.ts +0 -2
- package/dist/__tests__/authority-domains.test.d.ts.map +0 -1
- package/dist/__tests__/authority-domains.test.js +0 -48
- package/dist/__tests__/authority-domains.test.js.map +0 -1
- package/dist/__tests__/promote.test.d.ts +0 -2
- package/dist/__tests__/promote.test.d.ts.map +0 -1
- package/dist/__tests__/promote.test.js +0 -230
- package/dist/__tests__/promote.test.js.map +0 -1
- package/dist/__tests__/proposals.test.d.ts +0 -2
- package/dist/__tests__/proposals.test.d.ts.map +0 -1
- package/dist/__tests__/proposals.test.js +0 -167
- package/dist/__tests__/proposals.test.js.map +0 -1
- package/dist/__tests__/setup-ingest.test.d.ts +0 -2
- package/dist/__tests__/setup-ingest.test.d.ts.map +0 -1
- package/dist/__tests__/setup-ingest.test.js +0 -71
- package/dist/__tests__/setup-ingest.test.js.map +0 -1
- package/dist/__tests__/setup-resolver.test.d.ts +0 -14
- package/dist/__tests__/setup-resolver.test.d.ts.map +0 -1
- package/dist/__tests__/setup-resolver.test.js +0 -228
- package/dist/__tests__/setup-resolver.test.js.map +0 -1
- package/dist/commands/__tests__/setup-detect-surfaces.test.d.ts +0 -15
- package/dist/commands/__tests__/setup-detect-surfaces.test.d.ts.map +0 -1
- package/dist/commands/__tests__/setup-detect-surfaces.test.js +0 -149
- package/dist/commands/__tests__/setup-detect-surfaces.test.js.map +0 -1
- package/dist/commands/__tests__/setup-state.test.d.ts +0 -2
- package/dist/commands/__tests__/setup-state.test.d.ts.map +0 -1
- package/dist/commands/__tests__/setup-state.test.js +0 -194
- package/dist/commands/__tests__/setup-state.test.js.map +0 -1
- package/dist/commands/accept.d.ts +0 -18
- package/dist/commands/accept.d.ts.map +0 -1
- package/dist/commands/accept.js +0 -76
- package/dist/commands/accept.js.map +0 -1
- package/dist/commands/audit.d.ts +0 -25
- package/dist/commands/audit.d.ts.map +0 -1
- package/dist/commands/audit.js +0 -215
- package/dist/commands/audit.js.map +0 -1
- package/dist/commands/authority-domains.d.ts +0 -146
- package/dist/commands/authority-domains.d.ts.map +0 -1
- package/dist/commands/authority-domains.js +0 -282
- package/dist/commands/authority-domains.js.map +0 -1
- package/dist/commands/method.d.ts +0 -99
- package/dist/commands/method.d.ts.map +0 -1
- package/dist/commands/method.js +0 -784
- package/dist/commands/method.js.map +0 -1
- package/dist/commands/migrate-setup.d.ts +0 -18
- package/dist/commands/migrate-setup.d.ts.map +0 -1
- package/dist/commands/migrate-setup.js +0 -198
- package/dist/commands/migrate-setup.js.map +0 -1
- package/dist/commands/promote.d.ts +0 -12
- package/dist/commands/promote.d.ts.map +0 -1
- package/dist/commands/promote.js +0 -113
- package/dist/commands/promote.js.map +0 -1
- package/dist/commands/proposals.d.ts +0 -9
- package/dist/commands/proposals.d.ts.map +0 -1
- package/dist/commands/proposals.js +0 -24
- package/dist/commands/proposals.js.map +0 -1
- package/dist/commands/reject.d.ts +0 -14
- package/dist/commands/reject.d.ts.map +0 -1
- package/dist/commands/reject.js +0 -43
- package/dist/commands/reject.js.map +0 -1
- package/dist/commands/setup-audit.d.ts +0 -59
- package/dist/commands/setup-audit.d.ts.map +0 -1
- package/dist/commands/setup-audit.js +0 -250
- package/dist/commands/setup-audit.js.map +0 -1
- package/dist/commands/setup-detect-surfaces.d.ts +0 -38
- package/dist/commands/setup-detect-surfaces.d.ts.map +0 -1
- package/dist/commands/setup-detect-surfaces.js +0 -76
- package/dist/commands/setup-detect-surfaces.js.map +0 -1
- package/dist/commands/setup-ingest.d.ts +0 -17
- package/dist/commands/setup-ingest.d.ts.map +0 -1
- package/dist/commands/setup-ingest.js +0 -226
- package/dist/commands/setup-ingest.js.map +0 -1
- package/dist/commands/setup-resolver.d.ts +0 -58
- package/dist/commands/setup-resolver.d.ts.map +0 -1
- package/dist/commands/setup-resolver.js +0 -150
- package/dist/commands/setup-resolver.js.map +0 -1
- package/dist/commands/setup-state.d.ts +0 -42
- package/dist/commands/setup-state.d.ts.map +0 -1
- package/dist/commands/setup-state.js +0 -93
- package/dist/commands/setup-state.js.map +0 -1
- package/dist/commands/setup.d.ts +0 -23
- package/dist/commands/setup.d.ts.map +0 -1
- package/dist/commands/setup.js +0 -69
- package/dist/commands/setup.js.map +0 -1
- package/dist/formatters/audit.d.ts +0 -52
- package/dist/formatters/audit.d.ts.map +0 -1
- package/dist/formatters/audit.js +0 -81
- package/dist/formatters/audit.js.map +0 -1
- package/dist/formatters/promote.d.ts +0 -30
- package/dist/formatters/promote.d.ts.map +0 -1
- package/dist/formatters/promote.js +0 -39
- package/dist/formatters/promote.js.map +0 -1
- package/dist/formatters/proposals.d.ts +0 -45
- package/dist/formatters/proposals.d.ts.map +0 -1
- package/dist/formatters/proposals.js +0 -62
- package/dist/formatters/proposals.js.map +0 -1
- package/dist/generators/archetypes.d.ts +0 -52
- package/dist/generators/archetypes.d.ts.map +0 -1
- package/dist/generators/archetypes.js +0 -153
- package/dist/generators/archetypes.js.map +0 -1
- package/dist/generators/archetypes.test.d.ts +0 -2
- package/dist/generators/archetypes.test.d.ts.map +0 -1
- package/dist/generators/archetypes.test.js +0 -237
- package/dist/generators/archetypes.test.js.map +0 -1
- package/dist/generators/chain-classifier.d.ts +0 -49
- package/dist/generators/chain-classifier.d.ts.map +0 -1
- package/dist/generators/chain-classifier.js +0 -180
- package/dist/generators/chain-classifier.js.map +0 -1
- package/dist/generators/chain-classifier.test.d.ts +0 -2
- package/dist/generators/chain-classifier.test.d.ts.map +0 -1
- package/dist/generators/chain-classifier.test.js +0 -257
- package/dist/generators/chain-classifier.test.js.map +0 -1
- package/dist/generators/chain-rules.d.ts +0 -42
- package/dist/generators/chain-rules.d.ts.map +0 -1
- package/dist/generators/chain-rules.js +0 -144
- package/dist/generators/chain-rules.js.map +0 -1
- package/dist/generators/chain-rules.test.d.ts +0 -2
- package/dist/generators/chain-rules.test.d.ts.map +0 -1
- package/dist/generators/chain-rules.test.js +0 -179
- package/dist/generators/chain-rules.test.js.map +0 -1
- package/dist/generators/handshake-diff.d.ts +0 -67
- package/dist/generators/handshake-diff.d.ts.map +0 -1
- package/dist/generators/handshake-diff.js +0 -183
- package/dist/generators/handshake-diff.js.map +0 -1
- package/dist/generators/handshake-diff.test.d.ts +0 -2
- package/dist/generators/handshake-diff.test.d.ts.map +0 -1
- package/dist/generators/handshake-diff.test.js +0 -264
- package/dist/generators/handshake-diff.test.js.map +0 -1
- package/dist/lib/activation.d.ts +0 -28
- package/dist/lib/activation.d.ts.map +0 -1
- package/dist/lib/activation.js +0 -57
- package/dist/lib/activation.js.map +0 -1
- package/dist/lib/activation.test.d.ts +0 -6
- package/dist/lib/activation.test.d.ts.map +0 -1
- package/dist/lib/activation.test.js +0 -121
- package/dist/lib/activation.test.js.map +0 -1
- package/dist/lib/inferSourceDate.d.ts +0 -12
- package/dist/lib/inferSourceDate.d.ts.map +0 -1
- package/dist/lib/inferSourceDate.js +0 -44
- package/dist/lib/inferSourceDate.js.map +0 -1
- package/dist/setup/__tests__/coach-traces.test.d.ts +0 -2
- package/dist/setup/__tests__/coach-traces.test.d.ts.map +0 -1
- package/dist/setup/__tests__/coach-traces.test.js +0 -189
- package/dist/setup/__tests__/coach-traces.test.js.map +0 -1
- package/dist/setup/__tests__/setup-commands.test.d.ts +0 -2
- package/dist/setup/__tests__/setup-commands.test.d.ts.map +0 -1
- package/dist/setup/__tests__/setup-commands.test.js +0 -177
- package/dist/setup/__tests__/setup-commands.test.js.map +0 -1
- package/dist/setup/__tests__/state-machine.test.d.ts +0 -2
- package/dist/setup/__tests__/state-machine.test.d.ts.map +0 -1
- package/dist/setup/__tests__/state-machine.test.js +0 -341
- package/dist/setup/__tests__/state-machine.test.js.map +0 -1
- package/dist/setup/detect-surfaces.d.ts +0 -21
- package/dist/setup/detect-surfaces.d.ts.map +0 -1
- package/dist/setup/detect-surfaces.js +0 -39
- package/dist/setup/detect-surfaces.js.map +0 -1
- package/dist/setup/manifest-writer.d.ts +0 -17
- package/dist/setup/manifest-writer.d.ts.map +0 -1
- package/dist/setup/manifest-writer.js +0 -153
- package/dist/setup/manifest-writer.js.map +0 -1
- package/dist/setup/perimeter.d.ts.map +0 -1
- package/dist/setup/perimeter.js.map +0 -1
- package/dist/setup/state-machine.d.ts +0 -67
- package/dist/setup/state-machine.d.ts.map +0 -1
- package/dist/setup/state-machine.js +0 -124
- package/dist/setup/state-machine.js.map +0 -1
- package/dist/surfaces/__tests__/pb-setup-passthrough.test.d.ts +0 -2
- package/dist/surfaces/__tests__/pb-setup-passthrough.test.d.ts.map +0 -1
- package/dist/surfaces/__tests__/pb-setup-passthrough.test.js +0 -132
- package/dist/surfaces/__tests__/pb-setup-passthrough.test.js.map +0 -1
- package/templates/archetypes/boundary.md +0 -23
- package/templates/archetypes/constraint.md +0 -23
- package/templates/archetypes/convention.md +0 -23
- package/templates/archetypes/policy.md +0 -23
- package/templates/archetypes/quality-gate.md +0 -23
- package/templates/archetypes/workflow.md +0 -23
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* pb handshake --init — unit tests.
|
|
3
3
|
* DEC-271: two-file split (team vs personal). DEC-272: permission whitelist.
|
|
4
|
-
* TEN-712:
|
|
5
|
-
*
|
|
6
|
-
* WP-379 S3b: probeStarterSetupSeeded + pollUntilSeedsReady tests.
|
|
4
|
+
* TEN-712: every hook command must end with '|| true' so it never blocks Claude Code from starting.
|
|
7
5
|
*/
|
|
8
6
|
import { beforeEach, afterEach, describe, expect, it, vi } from 'vitest';
|
|
9
7
|
import { join } from 'path';
|
|
@@ -11,10 +9,23 @@ import { join } from 'path';
|
|
|
11
9
|
// vi.mock('fs', ...) below hoists this mock, so these imports resolve to the mocked versions.
|
|
12
10
|
import { readdirSync as readdirSyncMock } from 'fs';
|
|
13
11
|
// vi.mock calls are hoisted — use vi.hoisted() for constants referenced inside factories.
|
|
14
|
-
const { vfs, vfsMtimes, MOCK_CWD, MOCK_HOME } = vi.hoisted(() => ({
|
|
12
|
+
const { vfs, vfsMtimes, vfsDirs, vfsSymlinks, vfsRealpaths, vfsInodes, MOCK_CWD, MOCK_HOME } = vi.hoisted(() => ({
|
|
15
13
|
vfs: {},
|
|
16
14
|
// WP-379 S5b: mtime map used by statSync mock for case-collision ordering tests.
|
|
17
15
|
vfsMtimes: {},
|
|
16
|
+
// PR #912 follow-up: lstatSync needs dir-vs-file-vs-symlink distinction, which the flat
|
|
17
|
+
// `vfs` content map doesn't carry (a directory marker is stored as `vfs[dir] = ''`, same
|
|
18
|
+
// shape as an empty file) — these two sets disambiguate for the Cursor nested-skills tests.
|
|
19
|
+
vfsDirs: new Set(),
|
|
20
|
+
vfsSymlinks: new Set(),
|
|
21
|
+
// PR #912 follow-up (Cursor security review): explicit path→realpath overrides so a test can
|
|
22
|
+
// simulate an INTERMEDIATE symlinked component (e.g. .cursor/skills itself) resolving outside
|
|
23
|
+
// the repo, distinct from vfsSymlinks which only marks the final path component as a link.
|
|
24
|
+
vfsRealpaths: new Map(),
|
|
25
|
+
// Round 13: explicit path→ino override so a test can make two case-variant paths resolve to
|
|
26
|
+
// the SAME filesystem entry (case-insensitive FS simulation). Unset paths fall back to a
|
|
27
|
+
// deterministic per-path hash in the statSync mock below.
|
|
28
|
+
vfsInodes: new Map(),
|
|
18
29
|
MOCK_CWD: '/tmp/pb-test-cwd',
|
|
19
30
|
MOCK_HOME: '/tmp/pb-test-home',
|
|
20
31
|
}));
|
|
@@ -43,10 +54,51 @@ vi.mock('fs', () => ({
|
|
|
43
54
|
// Return a fake stat with an incrementing mtime based on path hash (deterministic).
|
|
44
55
|
// Tests that need specific mtime ordering should set vfs[path] before calling.
|
|
45
56
|
const mtimeMs = vfsMtimes[path] ?? 1000;
|
|
46
|
-
|
|
57
|
+
// Round 13: dev/ino for case-insensitive-alias detection. dev is constant (single fake
|
|
58
|
+
// filesystem); ino defaults to a deterministic per-path hash unless a test overrides it
|
|
59
|
+
// via vfsInodes to make two case-variant paths resolve to the same entry.
|
|
60
|
+
let ino = vfsInodes.get(path);
|
|
61
|
+
if (ino === undefined) {
|
|
62
|
+
let h = 0;
|
|
63
|
+
for (let i = 0; i < path.length; i++)
|
|
64
|
+
h = (h * 31 + path.charCodeAt(i)) | 0;
|
|
65
|
+
ino = h;
|
|
66
|
+
}
|
|
67
|
+
return { mtimeMs, dev: 1, ino };
|
|
47
68
|
}
|
|
48
69
|
throw Object.assign(new Error(`ENOENT: stat '${path}'`), { code: 'ENOENT' });
|
|
49
70
|
}),
|
|
71
|
+
// PR #912 follow-up: lstatSync backs the Cursor nested-skills symlink refusal — never
|
|
72
|
+
// follows a link, so a path marked in vfsSymlinks reports neither isDirectory() nor isFile().
|
|
73
|
+
lstatSync: vi.fn((path) => {
|
|
74
|
+
const isSymlink = vfsSymlinks.has(path);
|
|
75
|
+
const isDir = vfsDirs.has(path);
|
|
76
|
+
const isFile = !isSymlink && !isDir && path in vfs;
|
|
77
|
+
if (!isSymlink && !isDir && !isFile) {
|
|
78
|
+
throw Object.assign(new Error(`ENOENT: lstat '${path}'`), { code: 'ENOENT' });
|
|
79
|
+
}
|
|
80
|
+
// Round 15: dev/ino for directory-entry-identity comparisons (findLeftoverCursorSkills'
|
|
81
|
+
// live-alias check). Same default-hash-or-vfsInodes-override scheme as statSync below.
|
|
82
|
+
let ino = vfsInodes.get(path);
|
|
83
|
+
if (ino === undefined) {
|
|
84
|
+
let h = 0;
|
|
85
|
+
for (let i = 0; i < path.length; i++)
|
|
86
|
+
h = (h * 31 + path.charCodeAt(i)) | 0;
|
|
87
|
+
ino = h;
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
isDirectory: () => isDir,
|
|
91
|
+
isFile: () => isFile,
|
|
92
|
+
isSymbolicLink: () => isSymlink,
|
|
93
|
+
dev: 1,
|
|
94
|
+
ino,
|
|
95
|
+
};
|
|
96
|
+
}),
|
|
97
|
+
// PR #912 follow-up: realpathSync backs the Cursor-skills-root containment check — an explicit
|
|
98
|
+
// vfsRealpaths override simulates an intermediate symlinked component; otherwise identity.
|
|
99
|
+
// Identity by default (a real fs resolves an ordinary path, including MOCK_CWD itself, to
|
|
100
|
+
// itself) — vfsRealpaths overrides model a specific symlinked path resolving elsewhere.
|
|
101
|
+
realpathSync: vi.fn((path) => vfsRealpaths.get(path) ?? path),
|
|
50
102
|
}));
|
|
51
103
|
vi.mock('os', () => ({
|
|
52
104
|
homedir: vi.fn(() => MOCK_HOME),
|
|
@@ -59,8 +111,11 @@ vi.mock('../lib/prompts.js', () => ({
|
|
|
59
111
|
password: () => Promise.resolve(''),
|
|
60
112
|
isInteractive: () => true,
|
|
61
113
|
}));
|
|
62
|
-
import { runHandshakeInit, normalizeHandshakeContentForComparison,
|
|
114
|
+
import { runHandshakeInit, normalizeHandshakeContentForComparison, findLeftoverProjections, classifyDriftBucket, deriveHandshakeStartupSignals, dereferencePrRefToPaths } from '../commands/handshake.js';
|
|
115
|
+
import { findLeftoverCursorSkills, LEFTOVER_FILES_MAX } from '../commands/handshakeCursorSkillCleanup.js';
|
|
63
116
|
import { MARKER } from '../generators/adapters.js';
|
|
117
|
+
/** PR #911 review (Codex P2): findLeftoverProjections scopes reporting to allowedTargets — tests that want every surface scanned pass this. */
|
|
118
|
+
const ALL_SURFACES = new Set(['cursor', 'claude', 'codex', 'copilot']);
|
|
64
119
|
import { createHash } from 'crypto';
|
|
65
120
|
const TEAM_PATH = join(MOCK_CWD, '.claude', 'settings.json');
|
|
66
121
|
const PERSONAL_PATH = join(MOCK_HOME, '.claude', 'settings.json');
|
|
@@ -176,7 +231,7 @@ describe('runHandshakeInit', () => {
|
|
|
176
231
|
await runHandshakeInit({ level: 'work', dryRun: false });
|
|
177
232
|
const team = JSON.parse(vfs[TEAM_PATH]);
|
|
178
233
|
const cmd = team.hooks.SessionStart[0].hooks[0].command;
|
|
179
|
-
expect(cmd).toBe(
|
|
234
|
+
expect(cmd).toBe("pb session start 2>&1 || true");
|
|
180
235
|
});
|
|
181
236
|
it('pb session close hook command is exact', async () => {
|
|
182
237
|
await runHandshakeInit({ level: 'work', dryRun: false });
|
|
@@ -220,337 +275,321 @@ describe('normalizeHandshakeContentForComparison', () => {
|
|
|
220
275
|
expect(normalizeHandshakeContentForComparison(a)).not.toBe(normalizeHandshakeContentForComparison(b));
|
|
221
276
|
});
|
|
222
277
|
});
|
|
223
|
-
//
|
|
224
|
-
//
|
|
225
|
-
//
|
|
226
|
-
//
|
|
227
|
-
//
|
|
228
|
-
describe('probeStarterSetupSeeded (WP-379 S3b)', () => {
|
|
229
|
-
beforeEach(() => {
|
|
230
|
-
vi.resetModules();
|
|
231
|
-
});
|
|
232
|
-
afterEach(() => {
|
|
233
|
-
vi.restoreAllMocks();
|
|
234
|
-
});
|
|
235
|
-
it('returns seeds-ready when health.starterSetupSeeded is true', async () => {
|
|
236
|
-
vi.doMock('../lib/client.js', () => ({
|
|
237
|
-
kernelCall: vi.fn().mockResolvedValue({
|
|
238
|
-
starterSetupSeeded: true,
|
|
239
|
-
gaps: [],
|
|
240
|
-
status: 'healthy',
|
|
241
|
-
}),
|
|
242
|
-
}));
|
|
243
|
-
const { probeStarterSetupSeeded } = await import('../commands/handshake.js');
|
|
244
|
-
const result = await probeStarterSetupSeeded();
|
|
245
|
-
expect(result.status).toBe('seeds-ready');
|
|
246
|
-
});
|
|
247
|
-
it('returns seeds-pending with starter-setup-missing gap when starterSetupSeeded is false', async () => {
|
|
248
|
-
vi.doMock('../lib/client.js', () => ({
|
|
249
|
-
kernelCall: vi.fn().mockResolvedValue({
|
|
250
|
-
starterSetupSeeded: false,
|
|
251
|
-
gaps: [
|
|
252
|
-
{
|
|
253
|
-
kind: 'starter-setup-missing',
|
|
254
|
-
severity: 'error',
|
|
255
|
-
message: 'Starter setup seeds are still running.',
|
|
256
|
-
},
|
|
257
|
-
],
|
|
258
|
-
status: 'incomplete',
|
|
259
|
-
}),
|
|
260
|
-
}));
|
|
261
|
-
const { probeStarterSetupSeeded } = await import('../commands/handshake.js');
|
|
262
|
-
const result = await probeStarterSetupSeeded();
|
|
263
|
-
expect(result.status).toBe('seeds-pending');
|
|
264
|
-
if (result.status === 'seeds-pending') {
|
|
265
|
-
expect(result.gaps.length).toBeGreaterThan(0);
|
|
266
|
-
expect(result.gaps[0]?.kind).toBe('starter-setup-missing');
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
it('returns probe-failed when kernelCall throws', async () => {
|
|
270
|
-
vi.doMock('../lib/client.js', () => ({
|
|
271
|
-
kernelCall: vi.fn().mockRejectedValue(new Error('Network unreachable')),
|
|
272
|
-
}));
|
|
273
|
-
const { probeStarterSetupSeeded } = await import('../commands/handshake.js');
|
|
274
|
-
const result = await probeStarterSetupSeeded();
|
|
275
|
-
expect(result.status).toBe('probe-failed');
|
|
276
|
-
if (result.status === 'probe-failed') {
|
|
277
|
-
expect(result.error).toContain('Network unreachable');
|
|
278
|
-
}
|
|
279
|
-
});
|
|
280
|
-
it('synthesizes a default starter-setup-missing gap when health.gaps is empty but starterSetupSeeded is false', async () => {
|
|
281
|
-
vi.doMock('../lib/client.js', () => ({
|
|
282
|
-
kernelCall: vi.fn().mockResolvedValue({
|
|
283
|
-
starterSetupSeeded: false,
|
|
284
|
-
gaps: [], // no gap details from server
|
|
285
|
-
status: 'incomplete',
|
|
286
|
-
}),
|
|
287
|
-
}));
|
|
288
|
-
const { probeStarterSetupSeeded } = await import('../commands/handshake.js');
|
|
289
|
-
const result = await probeStarterSetupSeeded();
|
|
290
|
-
expect(result.status).toBe('seeds-pending');
|
|
291
|
-
if (result.status === 'seeds-pending') {
|
|
292
|
-
expect(result.gaps.length).toBe(1);
|
|
293
|
-
expect(result.gaps[0]?.kind).toBe('starter-setup-missing');
|
|
294
|
-
}
|
|
295
|
-
});
|
|
296
|
-
});
|
|
297
|
-
describe('pollUntilSeedsReady (WP-379 S3b)', () => {
|
|
298
|
-
beforeEach(() => {
|
|
299
|
-
vi.resetModules();
|
|
300
|
-
vi.useFakeTimers();
|
|
301
|
-
});
|
|
302
|
-
afterEach(() => {
|
|
303
|
-
vi.restoreAllMocks();
|
|
304
|
-
vi.useRealTimers();
|
|
305
|
-
});
|
|
306
|
-
it('returns seeds-ready immediately when first probe succeeds', async () => {
|
|
307
|
-
vi.doMock('../lib/client.js', () => ({
|
|
308
|
-
kernelCall: vi.fn().mockResolvedValue({
|
|
309
|
-
starterSetupSeeded: true,
|
|
310
|
-
gaps: [],
|
|
311
|
-
status: 'healthy',
|
|
312
|
-
}),
|
|
313
|
-
}));
|
|
314
|
-
const { pollUntilSeedsReady } = await import('../commands/handshake.js');
|
|
315
|
-
const resultPromise = pollUntilSeedsReady();
|
|
316
|
-
// Advance timers past any initial delays
|
|
317
|
-
await vi.runAllTimersAsync();
|
|
318
|
-
const result = await resultPromise;
|
|
319
|
-
expect(result.status).toBe('seeds-ready');
|
|
320
|
-
});
|
|
321
|
-
it('returns seeds-pending after MAX_POLLS when seeds never become ready', async () => {
|
|
322
|
-
// kernelCall always returns starterSetupSeeded: false
|
|
323
|
-
vi.doMock('../lib/client.js', () => ({
|
|
324
|
-
kernelCall: vi.fn().mockResolvedValue({
|
|
325
|
-
starterSetupSeeded: false,
|
|
326
|
-
gaps: [
|
|
327
|
-
{
|
|
328
|
-
kind: 'starter-setup-missing',
|
|
329
|
-
severity: 'error',
|
|
330
|
-
message: 'Starter setup seeds are still running.',
|
|
331
|
-
},
|
|
332
|
-
],
|
|
333
|
-
status: 'incomplete',
|
|
334
|
-
}),
|
|
335
|
-
}));
|
|
336
|
-
const { pollUntilSeedsReady } = await import('../commands/handshake.js');
|
|
337
|
-
const resultPromise = pollUntilSeedsReady();
|
|
338
|
-
await vi.runAllTimersAsync();
|
|
339
|
-
const result = await resultPromise;
|
|
340
|
-
expect(result.status).toBe('seeds-pending');
|
|
341
|
-
if (result.status === 'seeds-pending') {
|
|
342
|
-
expect(result.gaps[0]?.kind).toBe('starter-setup-missing');
|
|
343
|
-
}
|
|
344
|
-
});
|
|
345
|
-
it('stops polling immediately on probe-failed (no retry on network error)', async () => {
|
|
346
|
-
const kernelCallMock = vi.fn().mockRejectedValue(new Error('auth failed'));
|
|
347
|
-
vi.doMock('../lib/client.js', () => ({
|
|
348
|
-
kernelCall: kernelCallMock,
|
|
349
|
-
}));
|
|
350
|
-
const { pollUntilSeedsReady } = await import('../commands/handshake.js');
|
|
351
|
-
const resultPromise = pollUntilSeedsReady();
|
|
352
|
-
await vi.runAllTimersAsync();
|
|
353
|
-
const result = await resultPromise;
|
|
354
|
-
expect(result.status).toBe('probe-failed');
|
|
355
|
-
// Should have called exactly once — no retry on failure
|
|
356
|
-
expect(kernelCallMock).toHaveBeenCalledTimes(1);
|
|
357
|
-
});
|
|
358
|
-
});
|
|
359
|
-
// ── WP-379 S4: DORMANT_MARKER constant + writeDormantMarkerToFile ─────────────
|
|
360
|
-
describe('DORMANT_MARKER (WP-379 S4)', () => {
|
|
361
|
-
it('is the expected HTML comment string', () => {
|
|
362
|
-
expect(DORMANT_MARKER).toBe('<!-- pb-status: dormant -->');
|
|
363
|
-
});
|
|
364
|
-
it('does not contain newlines (clean single-line marker)', () => {
|
|
365
|
-
expect(DORMANT_MARKER).not.toContain('\n');
|
|
366
|
-
});
|
|
367
|
-
});
|
|
368
|
-
describe('writeDormantMarkerToFile (WP-379 S4)', () => {
|
|
369
|
-
// Use the hoisted vfs + mocked fs from the top of this file.
|
|
370
|
-
// vfs is already set up by vi.hoisted() and vi.mock('fs', ...) above.
|
|
371
|
-
beforeEach(() => {
|
|
372
|
-
Object.keys(vfs).forEach((k) => delete vfs[k]);
|
|
373
|
-
vi.clearAllMocks();
|
|
374
|
-
});
|
|
375
|
-
const AUTO_GEN_FILE = join(MOCK_CWD, '.claude', 'rules', 'test-rule.md');
|
|
376
|
-
it('returns "skipped" when the file does not exist', () => {
|
|
377
|
-
// File is not in vfs
|
|
378
|
-
const result = writeDormantMarkerToFile(AUTO_GEN_FILE);
|
|
379
|
-
expect(result).toBe('skipped');
|
|
380
|
-
});
|
|
381
|
-
it('returns "skipped" when the file exists but has no auto-gen MARKER', () => {
|
|
382
|
-
vfs[AUTO_GEN_FILE] = '# Manual rule\nSome content.\n';
|
|
383
|
-
const result = writeDormantMarkerToFile(AUTO_GEN_FILE);
|
|
384
|
-
expect(result).toBe('skipped');
|
|
385
|
-
// File must be unchanged (no append)
|
|
386
|
-
expect(vfs[AUTO_GEN_FILE]).toBe('# Manual rule\nSome content.\n');
|
|
387
|
-
});
|
|
388
|
-
it('appends DORMANT_MARKER and returns "written" for an auto-gen file without the marker', () => {
|
|
389
|
-
// Simulate a previously-projected file: has the auto-gen MARKER, no dormant marker yet.
|
|
390
|
-
vfs[AUTO_GEN_FILE] = `${MARKER}\n# Test Rule\nContent.\n`;
|
|
391
|
-
const result = writeDormantMarkerToFile(AUTO_GEN_FILE);
|
|
392
|
-
expect(result).toBe('written');
|
|
393
|
-
expect(vfs[AUTO_GEN_FILE]).toContain(DORMANT_MARKER);
|
|
394
|
-
// Original content preserved — marker is appended, not a replacement.
|
|
395
|
-
expect(vfs[AUTO_GEN_FILE]).toContain('# Test Rule');
|
|
396
|
-
expect(vfs[AUTO_GEN_FILE]).toContain(MARKER);
|
|
397
|
-
});
|
|
398
|
-
it('returns "already-dormant" when DORMANT_MARKER is already present (idempotent)', () => {
|
|
399
|
-
// File already has the dormant marker from a previous handshake.
|
|
400
|
-
vfs[AUTO_GEN_FILE] = `${MARKER}\n# Test Rule\nContent.\n\n${DORMANT_MARKER}\n`;
|
|
401
|
-
const result = writeDormantMarkerToFile(AUTO_GEN_FILE);
|
|
402
|
-
expect(result).toBe('already-dormant');
|
|
403
|
-
// File must be unchanged — no second append.
|
|
404
|
-
const occurrences = (vfs[AUTO_GEN_FILE].match(new RegExp(DORMANT_MARKER.replace(/[<>!-]/g, '\\$&'), 'g')) ?? []).length;
|
|
405
|
-
expect(occurrences).toBe(1);
|
|
406
|
-
});
|
|
407
|
-
it('second call on a dormant-marked file produces no duplicate markers (no drift TEN semantics)', () => {
|
|
408
|
-
// Simulate: first handshake wrote the dormant marker, second handshake is called again.
|
|
409
|
-
vfs[AUTO_GEN_FILE] = `${MARKER}\n# Test Rule\n\n${DORMANT_MARKER}\n`;
|
|
410
|
-
writeDormantMarkerToFile(AUTO_GEN_FILE); // first call — already-dormant
|
|
411
|
-
writeDormantMarkerToFile(AUTO_GEN_FILE); // second call — still already-dormant
|
|
412
|
-
const occurrences = (vfs[AUTO_GEN_FILE].match(new RegExp(DORMANT_MARKER.replace(/[<>!-]/g, '\\$&'), 'g')) ?? []).length;
|
|
413
|
-
expect(occurrences).toBe(1);
|
|
414
|
-
});
|
|
415
|
-
});
|
|
416
|
-
// ── WP-379 S5b: resolveProjectionCollision ─────────────────────────────────────
|
|
278
|
+
// WP-379 S3b's probeStarterSetupSeeded + pollUntilSeedsReady tests deleted at WP-776 S0
|
|
279
|
+
// round-1 review (Codex P1, verified regression): nothing seeds setup-assets any more, so
|
|
280
|
+
// the functions they tested (whose readiness gate was keyed on starterSetupSeeded alone)
|
|
281
|
+
// are deleted from packages/cli/src/commands/handshake.ts.
|
|
282
|
+
// ── WP-379 S5b: findLeftoverProjections + findLeftoverCursorSkills — REPORT-ONLY ────────────
|
|
417
283
|
//
|
|
418
|
-
//
|
|
419
|
-
//
|
|
420
|
-
|
|
421
|
-
|
|
284
|
+
// Coordinator ruling (PR #912 round 10): nine review rounds on the same unlink mechanism —
|
|
285
|
+
// symlinks, case collisions, empty-DB states, tamper preservation — is the signal that a
|
|
286
|
+
// deletion mechanism over a user's filesystem is defensive machinery whose edge cases never
|
|
287
|
+
// end. pb handshake no longer unlinks, renames, or recreates any leftover file; these tests
|
|
288
|
+
// assert survival AND report inclusion for each stale class. All file system operations go
|
|
289
|
+
// through the vfs mock defined at the top of this file.
|
|
290
|
+
describe('findLeftoverProjections (WP-379 S5b, report-only)', () => {
|
|
422
291
|
beforeEach(() => {
|
|
423
|
-
// Clear vfs and mtimes before each test.
|
|
424
292
|
Object.keys(vfs).forEach((k) => delete vfs[k]);
|
|
425
293
|
Object.keys(vfsMtimes).forEach((k) => delete vfsMtimes[k]);
|
|
294
|
+
vfsDirs.clear();
|
|
295
|
+
vfsSymlinks.clear();
|
|
296
|
+
vfsRealpaths.clear();
|
|
297
|
+
vfsInodes.clear();
|
|
426
298
|
vi.clearAllMocks();
|
|
427
299
|
});
|
|
428
|
-
// Helper: write a file to vfs with the auto-gen MARKER.
|
|
429
|
-
// Also marks the parent directory as existing in vfs so existsSync(dir) returns true.
|
|
430
300
|
function writeMarkedFile(path, extra = '') {
|
|
431
301
|
const dir = path.substring(0, path.lastIndexOf('/'));
|
|
432
|
-
vfs[dir] = '';
|
|
302
|
+
vfs[dir] = '';
|
|
433
303
|
vfs[path] = `${MARKER}\n# Rule\n${extra}`;
|
|
434
304
|
}
|
|
435
|
-
// Helper: write a file without auto-gen MARKER (user-forked).
|
|
436
|
-
// Also marks the parent directory as existing in vfs so existsSync(dir) returns true.
|
|
437
305
|
function writeUserFile(path) {
|
|
438
306
|
const dir = path.substring(0, path.lastIndexOf('/'));
|
|
439
|
-
vfs[dir] = '';
|
|
307
|
+
vfs[dir] = '';
|
|
440
308
|
vfs[path] = '# My user rule — no marker here\n';
|
|
441
309
|
}
|
|
442
|
-
|
|
443
|
-
it('case-collision: exact-match file survives, case-variant with marker is unlinked', () => {
|
|
310
|
+
it('an exact-match file is not reported; a case-variant with the same stem is reported as leftover and survives', () => {
|
|
444
311
|
const dir = `${MOCK_CWD}/.cursor/rules`;
|
|
445
|
-
const exact = `${dir}/setup-productbrain.mdc`;
|
|
446
|
-
const variant = `${dir}/Setup-ProductBrain.mdc`;
|
|
447
|
-
// Both have the auto-gen MARKER.
|
|
312
|
+
const exact = `${dir}/setup-productbrain.mdc`;
|
|
313
|
+
const variant = `${dir}/Setup-ProductBrain.mdc`;
|
|
448
314
|
writeMarkedFile(exact);
|
|
449
315
|
writeMarkedFile(variant);
|
|
450
|
-
// Simulate readdirSync returning both files for the .cursor/rules dir.
|
|
451
316
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
452
|
-
readdirSyncMock.mockImplementation((d) =>
|
|
453
|
-
|
|
454
|
-
return ['setup-productbrain.mdc', 'Setup-ProductBrain.mdc'];
|
|
455
|
-
return [];
|
|
456
|
-
});
|
|
457
|
-
// Both are known canonical (same normalized stem).
|
|
458
|
-
const assetNames = ['setup-productbrain'];
|
|
459
|
-
const { results, collisionTens } = resolveProjectionCollision(MOCK_CWD, assetNames, noop, noop);
|
|
460
|
-
// Exact match survives.
|
|
317
|
+
readdirSyncMock.mockImplementation((d) => (d === dir ? ['setup-productbrain.mdc', 'Setup-ProductBrain.mdc'] : []));
|
|
318
|
+
const { files: leftovers } = findLeftoverProjections(MOCK_CWD, ['setup-productbrain'], ALL_SURFACES);
|
|
461
319
|
expect(exact in vfs).toBe(true);
|
|
462
|
-
//
|
|
463
|
-
expect(
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
expect(results.some((r) => r.filePath === variant && r.action === 'unlinked')).toBe(true);
|
|
468
|
-
// No collision TEN — exact match was found.
|
|
469
|
-
expect(collisionTens).toHaveLength(0);
|
|
470
|
-
});
|
|
471
|
-
// ── Test 2: ambiguous case (no exact match, two case-variants) ────────────
|
|
472
|
-
it('ambiguous case: zero exact match, two case-variants → newest mtime wins + TEN captured', () => {
|
|
320
|
+
expect(variant in vfs).toBe(true); // survives — never unlinked
|
|
321
|
+
expect(leftovers.some((l) => l.path === exact)).toBe(false); // current — not reported
|
|
322
|
+
expect(leftovers.some((l) => l.path === variant && l.reason.includes('stale case'))).toBe(true);
|
|
323
|
+
});
|
|
324
|
+
it('a marker-bearing file with no canonical match is reported as an orphan and survives', () => {
|
|
473
325
|
const dir = `${MOCK_CWD}/.cursor/rules`;
|
|
474
|
-
const
|
|
475
|
-
|
|
476
|
-
writeMarkedFile(variant1);
|
|
477
|
-
writeMarkedFile(variant2);
|
|
478
|
-
// Set mtimes: variant2 is newer (higher ms).
|
|
479
|
-
vfsMtimes[variant1] = 1000;
|
|
480
|
-
vfsMtimes[variant2] = 9000; // newer
|
|
326
|
+
const orphan = `${dir}/old-orphaned-rule.mdc`;
|
|
327
|
+
writeMarkedFile(orphan);
|
|
481
328
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
482
|
-
readdirSyncMock.mockImplementation((d) =>
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
const
|
|
489
|
-
const
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
//
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
expect(
|
|
498
|
-
expect(
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
// (no MARKER) are left untouched by the main write loop in runHandshake (TEN-2150).
|
|
503
|
-
// This test confirms that user-owned files are NEVER unlinked by
|
|
504
|
-
// resolveProjectionCollision regardless of name.
|
|
505
|
-
it('first-run: user file (no marker) in target dir is preserved (never unlinked)', () => {
|
|
329
|
+
readdirSyncMock.mockImplementation((d) => (d === dir ? ['old-orphaned-rule.mdc'] : []));
|
|
330
|
+
const { files: leftovers } = findLeftoverProjections(MOCK_CWD, ['some-other-rule'], ALL_SURFACES);
|
|
331
|
+
expect(orphan in vfs).toBe(true); // survives — never unlinked
|
|
332
|
+
expect(leftovers.some((l) => l.path === orphan && l.reason.includes('orphan'))).toBe(true);
|
|
333
|
+
});
|
|
334
|
+
it('a leftover .dormant file is reported and survives, regardless of content match with its live sibling', () => {
|
|
335
|
+
const dir = `${MOCK_CWD}/.claude/rules`;
|
|
336
|
+
const live = `${dir}/setup-productbrain.md`;
|
|
337
|
+
const dormant = `${dir}/setup-productbrain.md.dormant`;
|
|
338
|
+
writeMarkedFile(live, 'Same body');
|
|
339
|
+
writeMarkedFile(dormant, 'Same body');
|
|
340
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
341
|
+
readdirSyncMock.mockImplementation((d) => (d === dir ? ['setup-productbrain.md', 'setup-productbrain.md.dormant'] : []));
|
|
342
|
+
const { files: leftovers } = findLeftoverProjections(MOCK_CWD, ['setup-productbrain'], ALL_SURFACES);
|
|
343
|
+
expect(live in vfs).toBe(true);
|
|
344
|
+
expect(dormant in vfs).toBe(true); // survives, even though content matches the live file
|
|
345
|
+
expect(leftovers.some((l) => l.path === live)).toBe(false);
|
|
346
|
+
expect(leftovers.some((l) => l.path === dormant && l.reason.includes('.dormant'))).toBe(true);
|
|
347
|
+
});
|
|
348
|
+
it('a user-owned file (no marker) is never reported and never touched', () => {
|
|
506
349
|
const dir = `${MOCK_CWD}/.cursor/rules`;
|
|
507
350
|
const userFile = `${dir}/foo.mdc`;
|
|
508
|
-
writeUserFile(userFile);
|
|
351
|
+
writeUserFile(userFile);
|
|
509
352
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
510
|
-
readdirSyncMock.mockImplementation((d) =>
|
|
511
|
-
|
|
512
|
-
return ['foo.mdc'];
|
|
513
|
-
return [];
|
|
514
|
-
});
|
|
515
|
-
// 'foo' is NOT a canonical asset name — it would be an orphan if it had a marker.
|
|
516
|
-
const assetNames = [];
|
|
517
|
-
const { results } = resolveProjectionCollision(MOCK_CWD, assetNames, noop, noop);
|
|
518
|
-
// User file untouched.
|
|
353
|
+
readdirSyncMock.mockImplementation((d) => (d === dir ? ['foo.mdc'] : []));
|
|
354
|
+
const { files: leftovers } = findLeftoverProjections(MOCK_CWD, [], ALL_SURFACES);
|
|
519
355
|
expect(userFile in vfs).toBe(true);
|
|
520
|
-
|
|
521
|
-
expect(results.filter((r) => r.action === 'unlinked')).toHaveLength(0);
|
|
356
|
+
expect(leftovers.some((l) => l.path === userFile)).toBe(false);
|
|
522
357
|
});
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
const
|
|
526
|
-
const orphan = `${dir}/old-orphaned-rule.mdc`;
|
|
358
|
+
it('an unselected surface is left unreported entirely', () => {
|
|
359
|
+
const dir = `${MOCK_CWD}/.codex/skills`;
|
|
360
|
+
const orphan = `${dir}/old-skill.md`;
|
|
527
361
|
writeMarkedFile(orphan);
|
|
528
362
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
529
|
-
readdirSyncMock.mockImplementation((d) =>
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
const
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
363
|
+
readdirSyncMock.mockImplementation((d) => (d === dir ? ['old-skill.md'] : []));
|
|
364
|
+
const claudeOnly = new Set(['claude']);
|
|
365
|
+
const { files: leftovers } = findLeftoverProjections(MOCK_CWD, [], claudeOnly);
|
|
366
|
+
expect(orphan in vfs).toBe(true);
|
|
367
|
+
expect(leftovers.some((l) => l.path === orphan)).toBe(false);
|
|
368
|
+
});
|
|
369
|
+
it('PR #912 round 11 (Codex P2): a generated router/index file (no matching asset name) is not reported when its exact path is in the write plan', () => {
|
|
370
|
+
const dir = `${MOCK_CWD}/.codex/skills`;
|
|
371
|
+
const indexFile = `${dir}/README.md`;
|
|
372
|
+
writeMarkedFile(indexFile);
|
|
373
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
374
|
+
readdirSyncMock.mockImplementation((d) => (d === dir ? ['README.md'] : []));
|
|
375
|
+
// No asset name matches "readme" — the old asset-name-only comparison would call this an
|
|
376
|
+
// orphan even though the write plan legitimately (re)generates it every run.
|
|
377
|
+
const exactRelativePaths = new Set(['.codex/skills/README.md']);
|
|
378
|
+
const { files: leftovers } = findLeftoverProjections(MOCK_CWD, ['setup-productbrain'], ALL_SURFACES, undefined, exactRelativePaths);
|
|
379
|
+
expect(leftovers.some((l) => l.path === indexFile)).toBe(false);
|
|
380
|
+
});
|
|
381
|
+
it('PR #912 round 11 (Codex P2): a canonical raw name not already in normalized form is not reported as a stale variant when it is the exact write-plan path', () => {
|
|
543
382
|
const dir = `${MOCK_CWD}/.claude/rules`;
|
|
544
|
-
const
|
|
545
|
-
|
|
383
|
+
const rawNameFile = `${dir}/Setup Skill.md`;
|
|
384
|
+
writeMarkedFile(rawNameFile);
|
|
546
385
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
547
|
-
readdirSyncMock.mockImplementation((d) =>
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
const {
|
|
553
|
-
expect(
|
|
386
|
+
readdirSyncMock.mockImplementation((d) => (d === dir ? ['Setup Skill.md'] : []));
|
|
387
|
+
// "Setup Skill" normalizes to "setup-skill", so the raw filename's stem !== its normalized
|
|
388
|
+
// form — without the exact-path carve-out this reads as a stale case/punctuation variant
|
|
389
|
+
// even though the writer emits this exact raw name every run.
|
|
390
|
+
const exactRelativePaths = new Set(['.claude/rules/Setup Skill.md']);
|
|
391
|
+
const { files: leftovers } = findLeftoverProjections(MOCK_CWD, ['Setup Skill'], ALL_SURFACES, undefined, exactRelativePaths);
|
|
392
|
+
expect(leftovers.some((l) => l.path === rawNameFile)).toBe(false);
|
|
393
|
+
});
|
|
394
|
+
it('PR #912 round 11 (Codex P2): without the exact-path carve-out, that same raw-name file is still (wrongly) reported as a stale variant — pins the failure mode the fix closes', () => {
|
|
395
|
+
const dir = `${MOCK_CWD}/.claude/rules`;
|
|
396
|
+
const rawNameFile = `${dir}/Setup Skill.md`;
|
|
397
|
+
writeMarkedFile(rawNameFile);
|
|
398
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
399
|
+
readdirSyncMock.mockImplementation((d) => (d === dir ? ['Setup Skill.md'] : []));
|
|
400
|
+
const { files: leftovers } = findLeftoverProjections(MOCK_CWD, ['Setup Skill'], ALL_SURFACES);
|
|
401
|
+
expect(leftovers.some((l) => l.path === rawNameFile && l.reason.includes('stale case'))).toBe(true);
|
|
402
|
+
});
|
|
403
|
+
it('PR #912 round 13 (Codex P2): stops scanning after LEFTOVER_FILES_MAX + 1 matches, reporting truncated=true and a capped list', () => {
|
|
404
|
+
const dir = `${MOCK_CWD}/.cursor/rules`;
|
|
405
|
+
const count = LEFTOVER_FILES_MAX + 5;
|
|
406
|
+
const filenames = Array.from({ length: count }, (_, i) => `orphan-${i}.mdc`);
|
|
407
|
+
for (const f of filenames)
|
|
408
|
+
writeMarkedFile(`${dir}/${f}`);
|
|
409
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
410
|
+
readdirSyncMock.mockImplementation((d) => (d === dir ? filenames : []));
|
|
411
|
+
const { files: leftovers, truncated } = findLeftoverProjections(MOCK_CWD, [], ALL_SURFACES);
|
|
412
|
+
expect(truncated).toBe(true);
|
|
413
|
+
expect(leftovers).toHaveLength(LEFTOVER_FILES_MAX);
|
|
414
|
+
// Every file still survives on disk — this is I/O and reporting bound, never deletion.
|
|
415
|
+
for (const f of filenames)
|
|
416
|
+
expect(`${dir}/${f}` in vfs).toBe(true);
|
|
417
|
+
});
|
|
418
|
+
it('a count at exactly the cap is NOT reported as truncated', () => {
|
|
419
|
+
const dir = `${MOCK_CWD}/.cursor/rules`;
|
|
420
|
+
const filenames = Array.from({ length: LEFTOVER_FILES_MAX }, (_, i) => `orphan-${i}.mdc`);
|
|
421
|
+
for (const f of filenames)
|
|
422
|
+
writeMarkedFile(`${dir}/${f}`);
|
|
423
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
424
|
+
readdirSyncMock.mockImplementation((d) => (d === dir ? filenames : []));
|
|
425
|
+
const { files: leftovers, truncated } = findLeftoverProjections(MOCK_CWD, [], ALL_SURFACES);
|
|
426
|
+
expect(truncated).toBe(false);
|
|
427
|
+
expect(leftovers).toHaveLength(LEFTOVER_FILES_MAX);
|
|
428
|
+
});
|
|
429
|
+
});
|
|
430
|
+
describe('findLeftoverCursorSkills (WP-379 S5b nested layout, report-only)', () => {
|
|
431
|
+
beforeEach(() => {
|
|
432
|
+
Object.keys(vfs).forEach((k) => delete vfs[k]);
|
|
433
|
+
vfsDirs.clear();
|
|
434
|
+
vfsSymlinks.clear();
|
|
435
|
+
vfsRealpaths.clear();
|
|
436
|
+
vfsInodes.clear();
|
|
437
|
+
vi.clearAllMocks();
|
|
438
|
+
});
|
|
439
|
+
it('an orphan nested Cursor skill is reported as leftover and survives', () => {
|
|
440
|
+
const skillsDir = `${MOCK_CWD}/.cursor/skills`;
|
|
441
|
+
const orphanDir = `${skillsDir}/old-skill`;
|
|
442
|
+
const orphanMd = `${orphanDir}/SKILL.md`;
|
|
443
|
+
vfs[skillsDir] = '';
|
|
444
|
+
vfsDirs.add(skillsDir);
|
|
445
|
+
vfsDirs.add(orphanDir);
|
|
446
|
+
vfs[orphanMd] = `${MARKER}\n# Old skill\n`;
|
|
447
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
448
|
+
readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['old-skill'] : []));
|
|
449
|
+
const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, []);
|
|
450
|
+
expect(orphanMd in vfs).toBe(true); // survives — never unlinked
|
|
451
|
+
expect(leftovers.some((l) => l.path === orphanMd && l.reason.includes('orphan'))).toBe(true);
|
|
452
|
+
});
|
|
453
|
+
it('a Title-Cased canonical Cursor skill directory is not reported (correctly current) — the write loop emits the raw canonical name', () => {
|
|
454
|
+
const skillsDir = `${MOCK_CWD}/.cursor/skills`;
|
|
455
|
+
const activeDir = `${skillsDir}/Setup Skill`;
|
|
456
|
+
const activeMd = `${activeDir}/SKILL.md`;
|
|
457
|
+
vfs[skillsDir] = '';
|
|
458
|
+
vfsDirs.add(skillsDir);
|
|
459
|
+
vfsDirs.add(activeDir);
|
|
460
|
+
vfs[activeMd] = `${MARKER}\n# Active\n`;
|
|
461
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
462
|
+
readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['Setup Skill'] : []));
|
|
463
|
+
const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, ['Setup Skill']);
|
|
464
|
+
expect(activeMd in vfs).toBe(true);
|
|
465
|
+
expect(leftovers.some((l) => l.path === activeMd)).toBe(false);
|
|
466
|
+
});
|
|
467
|
+
it('a stale case/punctuation-variant Cursor skill directory is reported as leftover and survives — normalized stem alone is not the canonical name', () => {
|
|
468
|
+
const skillsDir = `${MOCK_CWD}/.cursor/skills`;
|
|
469
|
+
const staleDir = `${skillsDir}/setup-skill`; // normalized stem, NOT the raw canonical name
|
|
470
|
+
const staleMd = `${staleDir}/SKILL.md`;
|
|
471
|
+
vfs[skillsDir] = '';
|
|
472
|
+
vfsDirs.add(skillsDir);
|
|
473
|
+
vfsDirs.add(staleDir);
|
|
474
|
+
vfs[staleMd] = `${MARKER}\n# Stale cased\n`;
|
|
475
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
476
|
+
readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['setup-skill'] : []));
|
|
477
|
+
// Canonical raw name is Title-Cased ("Setup Skill"), never the lowercase-slug ("setup-skill").
|
|
478
|
+
const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, ['Setup Skill']);
|
|
479
|
+
expect(staleMd in vfs).toBe(true); // survives — never unlinked
|
|
480
|
+
expect(leftovers.some((l) => l.path === staleMd && l.reason.includes('stale case'))).toBe(true);
|
|
481
|
+
});
|
|
482
|
+
it('a user-owned Cursor skill (no marker) is never reported and never touched', () => {
|
|
483
|
+
const skillsDir = `${MOCK_CWD}/.cursor/skills`;
|
|
484
|
+
const userDir = `${skillsDir}/my-skill`;
|
|
485
|
+
const userMd = `${userDir}/SKILL.md`;
|
|
486
|
+
vfs[skillsDir] = '';
|
|
487
|
+
vfsDirs.add(skillsDir);
|
|
488
|
+
vfsDirs.add(userDir);
|
|
489
|
+
vfs[userMd] = '# My own skill — no marker\n';
|
|
490
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
491
|
+
readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['my-skill'] : []));
|
|
492
|
+
const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, []);
|
|
493
|
+
expect(userMd in vfs).toBe(true);
|
|
494
|
+
expect(leftovers.some((l) => l.path === userMd)).toBe(false);
|
|
495
|
+
});
|
|
496
|
+
it('PR #912 round 15 (Codex P2): a case-only alias that resolves to the SAME directory entry as the canonical path is not reported as stale (case-insensitive filesystem)', () => {
|
|
497
|
+
const skillsDir = `${MOCK_CWD}/.cursor/skills`;
|
|
498
|
+
// On a case-insensitive FS, the directory literally on disk is "setup-skill" but the OS
|
|
499
|
+
// also resolves "Setup Skill" to that SAME entry — simulate that by giving both DIRECTORY
|
|
500
|
+
// paths' lstat() the same dev+ino, exactly like a real case-insensitive filesystem would.
|
|
501
|
+
const aliasDir = `${skillsDir}/setup-skill`;
|
|
502
|
+
const canonicalDir = `${skillsDir}/Setup Skill`;
|
|
503
|
+
const aliasMd = `${aliasDir}/SKILL.md`;
|
|
504
|
+
vfs[skillsDir] = '';
|
|
505
|
+
vfsDirs.add(skillsDir);
|
|
506
|
+
vfsDirs.add(aliasDir);
|
|
507
|
+
vfsDirs.add(canonicalDir); // same physical entry, reachable under either spelling
|
|
508
|
+
vfs[aliasMd] = `${MARKER}\n# Active (case-insensitive alias)\n`;
|
|
509
|
+
vfsInodes.set(aliasDir, 777);
|
|
510
|
+
vfsInodes.set(canonicalDir, 777); // same entry on a case-insensitive FS
|
|
511
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
512
|
+
readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['setup-skill'] : []));
|
|
513
|
+
const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, ['Setup Skill']);
|
|
514
|
+
expect(aliasMd in vfs).toBe(true); // survives — was never a candidate for removal anyway
|
|
515
|
+
expect(leftovers.some((l) => l.path === aliasMd)).toBe(false);
|
|
516
|
+
});
|
|
517
|
+
it('PR #912 round 15 (Codex P2): the SOLE on-disk entry being itself a symlink is still a live alias, not a leftover, when both case spellings resolve to it', () => {
|
|
518
|
+
const skillsDir = `${MOCK_CWD}/.cursor/skills`;
|
|
519
|
+
// "setup-skill" is the ONLY directory entry, and it happens to be a symlink (e.g. to some
|
|
520
|
+
// external skill store) — but on a case-insensitive FS, "Setup Skill" resolves to that SAME
|
|
521
|
+
// entry too. Round 14's "never exempt a symlink" rule wrongly flagged this as stale; round 15
|
|
522
|
+
// compares lstat identity instead, which correctly treats "same entry" as a live alias
|
|
523
|
+
// regardless of whether that shared entry happens to be a symlink.
|
|
524
|
+
const aliasDir = `${skillsDir}/setup-skill`;
|
|
525
|
+
const canonicalDir = `${skillsDir}/Setup Skill`;
|
|
526
|
+
const aliasMd = `${aliasDir}/SKILL.md`;
|
|
527
|
+
vfs[skillsDir] = '';
|
|
528
|
+
vfsDirs.add(skillsDir);
|
|
529
|
+
vfsSymlinks.add(aliasDir);
|
|
530
|
+
vfsSymlinks.add(canonicalDir); // same physical symlink, addressed by either spelling
|
|
531
|
+
vfs[aliasMd] = `${MARKER}\n# Active (sole entry is a symlink)\n`;
|
|
532
|
+
vfsInodes.set(aliasDir, 999);
|
|
533
|
+
vfsInodes.set(canonicalDir, 999); // identical lstat identity — one real entry
|
|
534
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
535
|
+
readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['setup-skill'] : []));
|
|
536
|
+
const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, ['Setup Skill']);
|
|
537
|
+
expect(aliasMd in vfs).toBe(true);
|
|
538
|
+
expect(leftovers.some((l) => l.path === aliasMd)).toBe(false);
|
|
539
|
+
});
|
|
540
|
+
it('PR #912 round 15 (Codex P2): a SYMLINKED case-only alias pointing AT a distinct canonical directory is still reported as stale (case-sensitive filesystem, two real entries)', () => {
|
|
541
|
+
const skillsDir = `${MOCK_CWD}/.cursor/skills`;
|
|
542
|
+
// "setup-skill" is a SYMLINK pointing AT the canonical "Setup Skill" directory — TWO
|
|
543
|
+
// distinct, separately-readdirSync-visible entries. lstat (never follows) on each gives a
|
|
544
|
+
// DIFFERENT identity: the symlink's own inode vs. the real target directory's inode.
|
|
545
|
+
const aliasDir = `${skillsDir}/setup-skill`;
|
|
546
|
+
const canonicalDir = `${skillsDir}/Setup Skill`;
|
|
547
|
+
const aliasMd = `${aliasDir}/SKILL.md`;
|
|
548
|
+
vfs[skillsDir] = '';
|
|
549
|
+
vfsDirs.add(skillsDir);
|
|
550
|
+
vfsSymlinks.add(aliasDir); // the discovered directory entry IS a symlink
|
|
551
|
+
vfsDirs.add(canonicalDir); // the canonical directory is a real, distinct entry
|
|
552
|
+
vfs[aliasMd] = `${MARKER}\n# Symlinked alias\n`;
|
|
553
|
+
// No vfsInodes override — default per-path hash means aliasDir and canonicalDir get
|
|
554
|
+
// DIFFERENT inos, matching two genuinely distinct filesystem objects.
|
|
555
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
556
|
+
readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['setup-skill'] : []));
|
|
557
|
+
const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, ['Setup Skill']);
|
|
558
|
+
expect(aliasMd in vfs).toBe(true); // survives — report-only, never unlinked
|
|
559
|
+
expect(leftovers.some((l) => l.path === aliasMd && l.reason.includes('stale case'))).toBe(true);
|
|
560
|
+
});
|
|
561
|
+
it('PR #912 round 13 (Codex P2): a genuinely distinct stale directory (different inode) is still reported, even with the same normalized stem', () => {
|
|
562
|
+
const skillsDir = `${MOCK_CWD}/.cursor/skills`;
|
|
563
|
+
const staleDir = `${skillsDir}/setup-skill`;
|
|
564
|
+
const staleMd = `${staleDir}/SKILL.md`;
|
|
565
|
+
vfs[skillsDir] = '';
|
|
566
|
+
vfsDirs.add(skillsDir);
|
|
567
|
+
vfsDirs.add(staleDir);
|
|
568
|
+
vfs[staleMd] = `${MARKER}\n# Genuinely stale\n`;
|
|
569
|
+
// The canonical "Setup Skill" directory doesn't exist in this test at all (lstatSync on it
|
|
570
|
+
// throws ENOENT, caught, treated as no match) — a real, distinct stale directory, not an alias.
|
|
571
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
572
|
+
readdirSyncMock.mockImplementation((d) => (d === skillsDir ? ['setup-skill'] : []));
|
|
573
|
+
const { files: leftovers } = findLeftoverCursorSkills(MOCK_CWD, ['Setup Skill']);
|
|
574
|
+
expect(staleMd in vfs).toBe(true); // survives — never unlinked
|
|
575
|
+
expect(leftovers.some((l) => l.path === staleMd && l.reason.includes('stale case'))).toBe(true);
|
|
576
|
+
});
|
|
577
|
+
it('PR #912 round 13 (Codex P2): stops scanning after maxResults + 1 matches, reporting truncated=true and a capped list', () => {
|
|
578
|
+
const skillsDir = `${MOCK_CWD}/.cursor/skills`;
|
|
579
|
+
const count = 8;
|
|
580
|
+
const dirNames = Array.from({ length: count }, (_, i) => `old-skill-${i}`);
|
|
581
|
+
vfs[skillsDir] = '';
|
|
582
|
+
vfsDirs.add(skillsDir);
|
|
583
|
+
for (const name of dirNames) {
|
|
584
|
+
const dir = `${skillsDir}/${name}`;
|
|
585
|
+
vfsDirs.add(dir);
|
|
586
|
+
vfs[`${dir}/SKILL.md`] = `${MARKER}\n# Orphan\n`;
|
|
587
|
+
}
|
|
588
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
589
|
+
readdirSyncMock.mockImplementation((d) => (d === skillsDir ? dirNames : []));
|
|
590
|
+
const { files: leftovers, truncated } = findLeftoverCursorSkills(MOCK_CWD, [], 5);
|
|
591
|
+
expect(truncated).toBe(true);
|
|
592
|
+
expect(leftovers).toHaveLength(5);
|
|
554
593
|
});
|
|
555
594
|
});
|
|
556
595
|
// ── WP-421 S3: classifyDriftBucket — three-bucket drift report (doneWhen #17) ──
|
|
@@ -802,4 +841,180 @@ describe('handshake vocab projector primitive (WP-436 S3)', () => {
|
|
|
802
841
|
expect(tokenizedSource).toContain('{{vocab:work_package.plural}}');
|
|
803
842
|
});
|
|
804
843
|
});
|
|
844
|
+
// ── WP-462 RCRT: deriveHandshakeStartupSignals — startup signal derivation ────
|
|
845
|
+
//
|
|
846
|
+
// Covers four findings:
|
|
847
|
+
// F4 — PR refs dereference to diff paths (spec: "PR refs must
|
|
848
|
+
// dereference to diff paths when available").
|
|
849
|
+
// Codex@665 — changedPaths derive from the committed branch delta (merge-base
|
|
850
|
+
// with origin/main), not just the dirty worktree.
|
|
851
|
+
// Codex@704 — empty-evidence handshake still yields an attribution envelope,
|
|
852
|
+
// not {} (so the domain-unresolved startup row stays queryable —
|
|
853
|
+
// spec "Loud Unresolved State", AC #4).
|
|
854
|
+
// Codex@677 — a context.md with >=25 IDs does not starve a distinct
|
|
855
|
+
// briefing.md ref (per-source quota + briefing-first ordering).
|
|
856
|
+
//
|
|
857
|
+
// The git/gh side effects are injected via HandshakeStartupSignalDeps so the
|
|
858
|
+
// tests never touch a real subprocess. The mocked fs (vfs at the top of this
|
|
859
|
+
// file) drives the .productbrain/context.md + briefing.md reads.
|
|
860
|
+
describe('deriveHandshakeStartupSignals (WP-462 RCRT)', () => {
|
|
861
|
+
const CWD = MOCK_CWD;
|
|
862
|
+
// A deps object whose git runner returns canned output keyed by command, and
|
|
863
|
+
// whose prDiff returns canned paths keyed by PR number. Anything unspecified
|
|
864
|
+
// returns undefined / [] (the "command failed / no output" path).
|
|
865
|
+
function makeDeps(opts) {
|
|
866
|
+
return {
|
|
867
|
+
runGit: (_cwd, command) => opts.git?.[command],
|
|
868
|
+
prDiff: (_cwd, prNumber) => opts.prDiff?.[prNumber] ?? [],
|
|
869
|
+
};
|
|
870
|
+
}
|
|
871
|
+
beforeEach(() => {
|
|
872
|
+
Object.keys(vfs).forEach((k) => delete vfs[k]);
|
|
873
|
+
vi.clearAllMocks();
|
|
874
|
+
});
|
|
875
|
+
// ── F4: PR-ref dereference ──────────────────────────────────────────────────
|
|
876
|
+
it('F4: a "PR #177" ref dereferences to that PR\'s changed paths in the emitted signals', () => {
|
|
877
|
+
// Branch name carries the ref so collectLocalRefs picks up "PR #177".
|
|
878
|
+
const deps = makeDeps({
|
|
879
|
+
git: {
|
|
880
|
+
'git branch --show-current': 'review-pr-177',
|
|
881
|
+
'git rev-parse --short HEAD': 'abc1234',
|
|
882
|
+
// No merge-base, no dirty paths — the ONLY path source is the PR deref.
|
|
883
|
+
},
|
|
884
|
+
prDiff: { 177: ['convex/agentKnowledge/startupResolver.ts', 'kernel/telemetry/contextServed.ts'] },
|
|
885
|
+
});
|
|
886
|
+
// Pass the ref explicitly via reviewedArtifactRefs so the PR number is in `refs`.
|
|
887
|
+
const signals = deriveHandshakeStartupSignals(CWD, { reviewedArtifactRefs: ['PR #177'] }, deps);
|
|
888
|
+
expect(signals.changedPaths).toEqual(expect.arrayContaining([
|
|
889
|
+
'convex/agentKnowledge/startupResolver.ts',
|
|
890
|
+
'kernel/telemetry/contextServed.ts',
|
|
891
|
+
]));
|
|
892
|
+
expect(signals.reviewedArtifactRefs).toContain('PR #177');
|
|
893
|
+
});
|
|
894
|
+
it('F4: absent/unauthed gh (prDiff returns []) is a graceful no-op — no PR paths, existing behavior intact', () => {
|
|
895
|
+
const deps = makeDeps({
|
|
896
|
+
git: {
|
|
897
|
+
'git branch --show-current': 'main',
|
|
898
|
+
'git rev-parse --short HEAD': 'deadbee',
|
|
899
|
+
'git diff --name-only HEAD': 'src/local-dirty.ts',
|
|
900
|
+
},
|
|
901
|
+
prDiff: {}, // every PR deref yields [] — gh absent
|
|
902
|
+
});
|
|
903
|
+
const signals = deriveHandshakeStartupSignals(CWD, { reviewedArtifactRefs: ['PR #999'] }, deps);
|
|
904
|
+
// The dirty-worktree path survives; no PR-derived paths leaked in.
|
|
905
|
+
expect(signals.changedPaths).toContain('src/local-dirty.ts');
|
|
906
|
+
expect(signals.changedPaths).not.toContain('PR #999');
|
|
907
|
+
});
|
|
908
|
+
it('F4: dereferencePrRefToPaths runs the gh command and splits name-only output', () => {
|
|
909
|
+
const calls = [];
|
|
910
|
+
const run = (_cwd, command, _timeout) => {
|
|
911
|
+
calls.push(command);
|
|
912
|
+
return 'a/one.ts\nb/two.ts\n';
|
|
913
|
+
};
|
|
914
|
+
const paths = dereferencePrRefToPaths(CWD, 177, run);
|
|
915
|
+
expect(paths).toEqual(['a/one.ts', 'b/two.ts']);
|
|
916
|
+
expect(calls[0]).toBe('gh pr diff 177 --name-only');
|
|
917
|
+
});
|
|
918
|
+
it('F4: dereferencePrRefToPaths returns [] for an invalid PR number (no gh call)', () => {
|
|
919
|
+
let called = false;
|
|
920
|
+
const run = () => {
|
|
921
|
+
called = true;
|
|
922
|
+
return undefined;
|
|
923
|
+
};
|
|
924
|
+
expect(dereferencePrRefToPaths(CWD, 0, run)).toEqual([]);
|
|
925
|
+
expect(called).toBe(false);
|
|
926
|
+
});
|
|
927
|
+
// ── Codex@665: committed branch delta, not just dirty worktree ──────────────
|
|
928
|
+
it('Codex@665: clean worktree but branch ahead of merge-base → changedPaths is non-empty', () => {
|
|
929
|
+
const deps = makeDeps({
|
|
930
|
+
git: {
|
|
931
|
+
'git branch --show-current': 'wp462-rcrt-activation',
|
|
932
|
+
'git rev-parse --short HEAD': 'feedface',
|
|
933
|
+
// Worktree is CLEAN — dirty diff returns nothing.
|
|
934
|
+
'git diff --name-only HEAD': undefined,
|
|
935
|
+
'git merge-base HEAD origin/main': 'base000',
|
|
936
|
+
// The committed branch delta vs the merge-base.
|
|
937
|
+
'git diff --name-only base000 HEAD': 'packages/cli/src/commands/handshake.ts\nconvex/schema.ts',
|
|
938
|
+
},
|
|
939
|
+
});
|
|
940
|
+
const signals = deriveHandshakeStartupSignals(CWD, {}, deps);
|
|
941
|
+
expect(signals.changedPaths).toEqual(expect.arrayContaining(['packages/cli/src/commands/handshake.ts', 'convex/schema.ts']));
|
|
942
|
+
});
|
|
943
|
+
it('Codex@665: dirty + committed deltas union and dedupe', () => {
|
|
944
|
+
const deps = makeDeps({
|
|
945
|
+
git: {
|
|
946
|
+
'git branch --show-current': 'b',
|
|
947
|
+
'git rev-parse --short HEAD': 'c',
|
|
948
|
+
'git diff --name-only HEAD': 'shared.ts\ndirty-only.ts',
|
|
949
|
+
'git merge-base HEAD origin/main': 'mb',
|
|
950
|
+
'git diff --name-only mb HEAD': 'shared.ts\ncommitted-only.ts',
|
|
951
|
+
},
|
|
952
|
+
});
|
|
953
|
+
const signals = deriveHandshakeStartupSignals(CWD, {}, deps);
|
|
954
|
+
const paths = signals.changedPaths ?? [];
|
|
955
|
+
expect(paths).toContain('dirty-only.ts');
|
|
956
|
+
expect(paths).toContain('committed-only.ts');
|
|
957
|
+
// 'shared.ts' appears in BOTH sources but only once after dedupe.
|
|
958
|
+
expect(paths.filter((p) => p === 'shared.ts')).toHaveLength(1);
|
|
959
|
+
});
|
|
960
|
+
it('Codex@665: missing origin/main merge-base falls back gracefully to dirty paths only', () => {
|
|
961
|
+
const deps = makeDeps({
|
|
962
|
+
git: {
|
|
963
|
+
'git branch --show-current': 'b',
|
|
964
|
+
'git rev-parse --short HEAD': 'c',
|
|
965
|
+
'git diff --name-only HEAD': 'only-dirty.ts',
|
|
966
|
+
'git merge-base HEAD origin/main': undefined, // no origin/main
|
|
967
|
+
},
|
|
968
|
+
});
|
|
969
|
+
const signals = deriveHandshakeStartupSignals(CWD, {}, deps);
|
|
970
|
+
expect(signals.changedPaths).toEqual(['only-dirty.ts']);
|
|
971
|
+
});
|
|
972
|
+
// ── Codex@704: empty-evidence still yields an attribution envelope ──────────
|
|
973
|
+
it('Codex@704: empty-evidence handshake still returns a signals object with attribution fields', () => {
|
|
974
|
+
// No task, no scope, no refs, no changed paths — but git still attributes.
|
|
975
|
+
const deps = makeDeps({
|
|
976
|
+
git: {
|
|
977
|
+
'git branch --show-current': 'lonely-branch',
|
|
978
|
+
'git rev-parse --short HEAD': 'cafef00d',
|
|
979
|
+
// no dirty paths, no merge-base
|
|
980
|
+
},
|
|
981
|
+
});
|
|
982
|
+
const signals = deriveHandshakeStartupSignals(CWD, {}, deps);
|
|
983
|
+
// NOT {} — the envelope must carry attribution so a domain-unresolved
|
|
984
|
+
// startup row is emitted and queryable.
|
|
985
|
+
expect(Object.keys(signals).length).toBeGreaterThan(0);
|
|
986
|
+
expect(signals.resolverVersion).toBeDefined();
|
|
987
|
+
expect(signals.branchName).toBe('lonely-branch');
|
|
988
|
+
expect(signals.commitSha).toBe('cafef00d');
|
|
989
|
+
// No fabricated evidence — there is genuinely none.
|
|
990
|
+
expect(signals.changedPaths ?? []).toHaveLength(0);
|
|
991
|
+
expect(signals.reviewedArtifactRefs ?? []).toHaveLength(0);
|
|
992
|
+
expect(signals.taskText).toBeUndefined();
|
|
993
|
+
});
|
|
994
|
+
it('Codex@704: even with zero git facts the envelope still carries resolverVersion + sourceSurface', () => {
|
|
995
|
+
const deps = makeDeps({ git: {} }); // every git command fails
|
|
996
|
+
const signals = deriveHandshakeStartupSignals(CWD, {}, deps);
|
|
997
|
+
expect(signals.resolverVersion).toBeDefined();
|
|
998
|
+
expect(signals.sourceSurface).toBe('cli');
|
|
999
|
+
});
|
|
1000
|
+
// ── Codex@677: briefing refs not starved by broad context cap ───────────────
|
|
1001
|
+
it('Codex@677: a context.md with >=25 IDs still lets a distinct briefing.md ref through', () => {
|
|
1002
|
+
// 25 distinct DEC ids in the broad context file.
|
|
1003
|
+
const contextIds = Array.from({ length: 30 }, (_, i) => `DEC-${1000 + i}`).join(' ');
|
|
1004
|
+
vfs[join(CWD, '.productbrain', 'context.md')] = `Context: ${contextIds}\n`;
|
|
1005
|
+
// A task-specific briefing carrying a ref that does NOT appear in context.
|
|
1006
|
+
vfs[join(CWD, '.productbrain', 'briefing.md')] = 'Briefing for WP-462 — see DEC-9999.\n';
|
|
1007
|
+
const deps = makeDeps({
|
|
1008
|
+
git: {
|
|
1009
|
+
'git branch --show-current': 'wp462-rcrt-activation',
|
|
1010
|
+
'git rev-parse --short HEAD': 'abc',
|
|
1011
|
+
},
|
|
1012
|
+
});
|
|
1013
|
+
const signals = deriveHandshakeStartupSignals(CWD, {}, deps);
|
|
1014
|
+
const refs = signals.reviewedArtifactRefs ?? [];
|
|
1015
|
+
// The briefing-specific refs survive despite the flood of context IDs.
|
|
1016
|
+
expect(refs).toContain('WP-462');
|
|
1017
|
+
expect(refs).toContain('DEC-9999');
|
|
1018
|
+
});
|
|
1019
|
+
});
|
|
805
1020
|
//# sourceMappingURL=handshake.test.js.map
|