@productbrain/cli 0.1.0-beta.49 → 0.1.0-beta.4902
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 +3 -1
- package/dist/__tests__/adapters.test.js +54 -1
- 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 +161 -0
- package/dist/__tests__/adminConfig.test.js.map +1 -0
- package/dist/__tests__/audit.test.js +65 -44
- package/dist/__tests__/audit.test.js.map +1 -1
- package/dist/__tests__/authority-domains-queue.test.d.ts +2 -0
- package/dist/__tests__/authority-domains-queue.test.d.ts.map +1 -0
- package/dist/__tests__/authority-domains-queue.test.js +169 -0
- package/dist/__tests__/authority-domains-queue.test.js.map +1 -0
- package/dist/__tests__/authority-domains.test.d.ts +2 -0
- package/dist/__tests__/authority-domains.test.d.ts.map +1 -0
- package/dist/__tests__/authority-domains.test.js +48 -0
- package/dist/__tests__/authority-domains.test.js.map +1 -0
- package/dist/__tests__/canonicalRefs.vocab.test.d.ts +2 -0
- package/dist/__tests__/canonicalRefs.vocab.test.d.ts.map +1 -0
- package/dist/__tests__/canonicalRefs.vocab.test.js +251 -0
- package/dist/__tests__/canonicalRefs.vocab.test.js.map +1 -0
- 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 +89 -0
- package/dist/__tests__/capture-receipt-coaching.test.js.map +1 -0
- package/dist/__tests__/capture-receipt-domain.test.d.ts +2 -0
- package/dist/__tests__/capture-receipt-domain.test.d.ts.map +1 -0
- package/dist/__tests__/capture-receipt-domain.test.js +29 -0
- package/dist/__tests__/capture-receipt-domain.test.js.map +1 -0
- package/dist/__tests__/capture.test.js +1086 -44
- package/dist/__tests__/capture.test.js.map +1 -1
- 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 +107 -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 +58 -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.d.ts +1 -1
- package/dist/__tests__/config.test.js +839 -11
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/constants.test.js +6 -1
- package/dist/__tests__/constants.test.js.map +1 -1
- package/dist/__tests__/constellation.test.js +14 -14
- package/dist/__tests__/constellation.test.js.map +1 -1
- package/dist/__tests__/context-strategy.test.js +8 -8
- package/dist/__tests__/context-strategy.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 +82 -0
- package/dist/__tests__/entry-formatter.test.js.map +1 -0
- package/dist/__tests__/entryArchive.test.d.ts +2 -0
- package/dist/__tests__/entryArchive.test.d.ts.map +1 -0
- package/dist/__tests__/entryArchive.test.js +35 -0
- package/dist/__tests__/entryArchive.test.js.map +1 -0
- package/dist/__tests__/envelope-contract.test.d.ts +15 -0
- package/dist/__tests__/envelope-contract.test.d.ts.map +1 -0
- package/dist/__tests__/envelope-contract.test.js +154 -0
- package/dist/__tests__/envelope-contract.test.js.map +1 -0
- package/dist/__tests__/errors.test.js +26 -0
- package/dist/__tests__/errors.test.js.map +1 -1
- package/dist/__tests__/fields.test.js +20 -20
- 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.d.ts +2 -0
- package/dist/__tests__/handshake-augment.test.d.ts.map +1 -0
- package/dist/__tests__/handshake-augment.test.js +424 -0
- package/dist/__tests__/handshake-augment.test.js.map +1 -0
- package/dist/__tests__/handshake-dormancy.test.d.ts +2 -0
- package/dist/__tests__/handshake-dormancy.test.d.ts.map +1 -0
- package/dist/__tests__/handshake-dormancy.test.js +207 -0
- package/dist/__tests__/handshake-dormancy.test.js.map +1 -0
- package/dist/__tests__/handshake-formatter.test.d.ts +2 -0
- package/dist/__tests__/handshake-formatter.test.d.ts.map +1 -0
- package/dist/__tests__/handshake-formatter.test.js +67 -0
- package/dist/__tests__/handshake-formatter.test.js.map +1 -0
- package/dist/__tests__/handshake-preview.test.d.ts +2 -0
- package/dist/__tests__/handshake-preview.test.d.ts.map +1 -0
- package/dist/__tests__/handshake-preview.test.js +950 -0
- package/dist/__tests__/handshake-preview.test.js.map +1 -0
- package/dist/__tests__/handshake.e2e.test.d.ts +2 -0
- package/dist/__tests__/handshake.e2e.test.d.ts.map +1 -0
- package/dist/__tests__/handshake.e2e.test.js +1255 -0
- package/dist/__tests__/handshake.e2e.test.js.map +1 -0
- package/dist/__tests__/handshake.test.js +787 -2
- 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 +41 -0
- package/dist/__tests__/health-gap-kinds-drift.test.js.map +1 -0
- package/dist/__tests__/hook-intents.test.d.ts +2 -0
- package/dist/__tests__/hook-intents.test.d.ts.map +1 -0
- package/dist/__tests__/hook-intents.test.js +184 -0
- package/dist/__tests__/hook-intents.test.js.map +1 -0
- package/dist/__tests__/ingest.test.js +37 -28
- 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__/manifest.test.d.ts +6 -0
- package/dist/__tests__/manifest.test.d.ts.map +1 -0
- package/dist/__tests__/manifest.test.js +255 -0
- package/dist/__tests__/manifest.test.js.map +1 -0
- package/dist/__tests__/method-publish-coherency.test.d.ts +9 -0
- package/dist/__tests__/method-publish-coherency.test.d.ts.map +1 -0
- package/dist/__tests__/method-publish-coherency.test.js +71 -0
- package/dist/__tests__/method-publish-coherency.test.js.map +1 -0
- package/dist/__tests__/method-registry.integration.test.d.ts +6 -0
- package/dist/__tests__/method-registry.integration.test.d.ts.map +1 -0
- package/dist/__tests__/method-registry.integration.test.js +17 -0
- package/dist/__tests__/method-registry.integration.test.js.map +1 -0
- package/dist/__tests__/method-registry.test.d.ts +12 -0
- package/dist/__tests__/method-registry.test.d.ts.map +1 -0
- package/dist/__tests__/method-registry.test.js +86 -0
- package/dist/__tests__/method-registry.test.js.map +1 -0
- package/dist/__tests__/notice-marker.test.d.ts +2 -0
- package/dist/__tests__/notice-marker.test.d.ts.map +1 -0
- package/dist/__tests__/notice-marker.test.js +41 -0
- package/dist/__tests__/notice-marker.test.js.map +1 -0
- package/dist/__tests__/onboarding-path-b.test.js +4 -4
- package/dist/__tests__/onboarding-path-b.test.js.map +1 -1
- package/dist/__tests__/orient.test.js +503 -13
- package/dist/__tests__/orient.test.js.map +1 -1
- package/dist/__tests__/perimeter.test.d.ts +2 -0
- package/dist/__tests__/perimeter.test.d.ts.map +1 -0
- package/dist/__tests__/perimeter.test.js +165 -0
- package/dist/__tests__/perimeter.test.js.map +1 -0
- package/dist/__tests__/personal-layer.test.d.ts +11 -0
- package/dist/__tests__/personal-layer.test.d.ts.map +1 -0
- package/dist/__tests__/personal-layer.test.js +268 -0
- package/dist/__tests__/personal-layer.test.js.map +1 -0
- 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 +257 -10
- package/dist/__tests__/profiles.test.js.map +1 -1
- package/dist/__tests__/promote-batch.test.d.ts +2 -0
- package/dist/__tests__/promote-batch.test.d.ts.map +1 -0
- package/dist/__tests__/promote-batch.test.js +185 -0
- package/dist/__tests__/promote-batch.test.js.map +1 -0
- package/dist/__tests__/promote.test.js +292 -23
- package/dist/__tests__/promote.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__/proposals.test.js +19 -19
- package/dist/__tests__/proposals.test.js.map +1 -1
- 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__/relate.test.js +146 -14
- package/dist/__tests__/relate.test.js.map +1 -1
- 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 +103 -0
- package/dist/__tests__/route-latency-budget.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 +231 -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 +174 -0
- package/dist/__tests__/session-list-show.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 +99 -0
- package/dist/__tests__/session-resume-backstop.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 +183 -0
- package/dist/__tests__/session-start-key-refresh.test.js.map +1 -0
- package/dist/__tests__/session-state-machine.test.d.ts +2 -0
- package/dist/__tests__/session-state-machine.test.d.ts.map +1 -0
- package/dist/__tests__/session-state-machine.test.js +379 -0
- package/dist/__tests__/session-state-machine.test.js.map +1 -0
- package/dist/__tests__/session-switch.test.d.ts +2 -0
- package/dist/__tests__/session-switch.test.d.ts.map +1 -0
- package/dist/__tests__/session-switch.test.js +160 -0
- package/dist/__tests__/session-switch.test.js.map +1 -0
- package/dist/__tests__/session-touch.test.js +16 -11
- package/dist/__tests__/session-touch.test.js.map +1 -1
- package/dist/__tests__/session.test.js +2 -2
- package/dist/__tests__/session.test.js.map +1 -1
- package/dist/__tests__/setup-ingest.test.d.ts +2 -0
- package/dist/__tests__/setup-ingest.test.d.ts.map +1 -0
- package/dist/__tests__/setup-ingest.test.js +71 -0
- package/dist/__tests__/setup-ingest.test.js.map +1 -0
- package/dist/__tests__/setup-resolver.test.d.ts +14 -0
- package/dist/__tests__/setup-resolver.test.d.ts.map +1 -0
- package/dist/__tests__/setup-resolver.test.js +228 -0
- package/dist/__tests__/setup-resolver.test.js.map +1 -0
- package/dist/__tests__/skill-vocabulary.test.d.ts +21 -0
- package/dist/__tests__/skill-vocabulary.test.d.ts.map +1 -0
- package/dist/__tests__/skill-vocabulary.test.js +192 -0
- package/dist/__tests__/skill-vocabulary.test.js.map +1 -0
- package/dist/__tests__/state.test.d.ts +6 -0
- package/dist/__tests__/state.test.d.ts.map +1 -0
- package/dist/__tests__/state.test.js +117 -0
- package/dist/__tests__/state.test.js.map +1 -0
- package/dist/__tests__/strip.test.js +31 -3
- package/dist/__tests__/strip.test.js.map +1 -1
- package/dist/__tests__/surfaces.test.d.ts +2 -0
- package/dist/__tests__/surfaces.test.d.ts.map +1 -0
- package/dist/__tests__/surfaces.test.js +46 -0
- package/dist/__tests__/surfaces.test.js.map +1 -0
- package/dist/__tests__/update-check.test.d.ts +2 -0
- package/dist/__tests__/update-check.test.d.ts.map +1 -0
- package/dist/__tests__/update-check.test.js +215 -0
- package/dist/__tests__/update-check.test.js.map +1 -0
- package/dist/__tests__/update.test.js +263 -22
- package/dist/__tests__/update.test.js.map +1 -1
- package/dist/__tests__/upgrade-runner.test.d.ts +2 -0
- package/dist/__tests__/upgrade-runner.test.d.ts.map +1 -0
- package/dist/__tests__/upgrade-runner.test.js +54 -0
- package/dist/__tests__/upgrade-runner.test.js.map +1 -0
- package/dist/__tests__/upgrade.test.d.ts +2 -0
- package/dist/__tests__/upgrade.test.d.ts.map +1 -0
- package/dist/__tests__/upgrade.test.js +56 -0
- package/dist/__tests__/upgrade.test.js.map +1 -0
- 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 +39 -0
- package/dist/__tests__/vocabulary-leak.test.d.ts.map +1 -0
- package/dist/__tests__/vocabulary-leak.test.js +539 -0
- package/dist/__tests__/vocabulary-leak.test.js.map +1 -0
- package/dist/__tests__/workspace.test.js +52 -32
- 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 +356 -0
- package/dist/__tests__/workspaceNotice.test.js.map +1 -0
- package/dist/commands/__tests__/connect-handoff.test.d.ts +11 -0
- package/dist/commands/__tests__/connect-handoff.test.d.ts.map +1 -0
- package/dist/commands/__tests__/connect-handoff.test.js +111 -0
- package/dist/commands/__tests__/connect-handoff.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__/setup-detect-surfaces.test.d.ts +15 -0
- package/dist/commands/__tests__/setup-detect-surfaces.test.d.ts.map +1 -0
- package/dist/commands/__tests__/setup-detect-surfaces.test.js +149 -0
- package/dist/commands/__tests__/setup-detect-surfaces.test.js.map +1 -0
- package/dist/commands/__tests__/setup-state.test.d.ts +2 -0
- package/dist/commands/__tests__/setup-state.test.d.ts.map +1 -0
- package/dist/commands/__tests__/setup-state.test.js +194 -0
- package/dist/commands/__tests__/setup-state.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/accept.d.ts.map +1 -1
- package/dist/commands/accept.js +5 -5
- package/dist/commands/accept.js.map +1 -1
- package/dist/commands/admin/cockpit.d.ts +91 -0
- package/dist/commands/admin/cockpit.d.ts.map +1 -0
- package/dist/commands/admin/cockpit.js +617 -0
- package/dist/commands/admin/cockpit.js.map +1 -0
- package/dist/commands/admin/index.d.ts +54 -1
- package/dist/commands/admin/index.d.ts.map +1 -1
- package/dist/commands/admin/index.js +286 -16
- 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 +68 -0
- package/dist/commands/admin/index.test.js.map +1 -0
- package/dist/commands/admin/inspect.d.ts +21 -3
- package/dist/commands/admin/inspect.d.ts.map +1 -1
- package/dist/commands/admin/inspect.js +69 -20
- package/dist/commands/admin/inspect.js.map +1 -1
- package/dist/commands/admin/inspect.test.d.ts +2 -0
- package/dist/commands/admin/inspect.test.d.ts.map +1 -1
- package/dist/commands/admin/inspect.test.js +63 -13
- package/dist/commands/admin/inspect.test.js.map +1 -1
- package/dist/commands/admin/manage.d.ts +8 -0
- package/dist/commands/admin/manage.d.ts.map +1 -0
- package/dist/commands/admin/manage.js +260 -0
- package/dist/commands/admin/manage.js.map +1 -0
- package/dist/commands/admin/manage.test.d.ts +16 -0
- package/dist/commands/admin/manage.test.d.ts.map +1 -0
- package/dist/commands/admin/manage.test.js +159 -0
- package/dist/commands/admin/manage.test.js.map +1 -0
- package/dist/commands/admin/probe.d.ts +48 -0
- package/dist/commands/admin/probe.d.ts.map +1 -0
- package/dist/commands/admin/probe.js +191 -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 +146 -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 +46 -3
- package/dist/commands/admin/seed.d.ts.map +1 -1
- package/dist/commands/admin/seed.js +502 -82
- package/dist/commands/admin/seed.js.map +1 -1
- package/dist/commands/admin/seed.test.d.ts +5 -0
- package/dist/commands/admin/seed.test.d.ts.map +1 -1
- package/dist/commands/admin/seed.test.js +90 -8
- package/dist/commands/admin/seed.test.js.map +1 -1
- package/dist/commands/admin/seedRegistryEntries.generated.d.ts +14 -0
- package/dist/commands/admin/seedRegistryEntries.generated.d.ts.map +1 -0
- package/dist/commands/admin/seedRegistryEntries.generated.js +153 -0
- package/dist/commands/admin/seedRegistryEntries.generated.js.map +1 -0
- package/dist/commands/admin/seedRegistryEntries.test.d.ts +13 -0
- package/dist/commands/admin/seedRegistryEntries.test.d.ts.map +1 -0
- package/dist/commands/admin/seedRegistryEntries.test.js +91 -0
- package/dist/commands/admin/seedRegistryEntries.test.js.map +1 -0
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +42 -7
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/authority-domains.d.ts +157 -0
- package/dist/commands/authority-domains.d.ts.map +1 -0
- package/dist/commands/authority-domains.js +387 -0
- package/dist/commands/authority-domains.js.map +1 -0
- package/dist/commands/brief.d.ts.map +1 -1
- package/dist/commands/brief.js +9 -5
- package/dist/commands/brief.js.map +1 -1
- package/dist/commands/capture.d.ts +16 -3
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +268 -98
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/chain-walk.d.ts.map +1 -1
- package/dist/commands/chain-walk.js +2 -2
- package/dist/commands/chain-walk.js.map +1 -1
- package/dist/commands/changes.d.ts.map +1 -1
- package/dist/commands/changes.js +2 -2
- package/dist/commands/changes.js.map +1 -1
- package/dist/commands/codex-prep.d.ts +12 -1
- package/dist/commands/codex-prep.d.ts.map +1 -1
- package/dist/commands/codex-prep.js +19 -85
- package/dist/commands/codex-prep.js.map +1 -1
- package/dist/commands/collections.d.ts.map +1 -1
- package/dist/commands/collections.js +5 -5
- package/dist/commands/collections.js.map +1 -1
- package/dist/commands/conflicts.d.ts +40 -0
- package/dist/commands/conflicts.d.ts.map +1 -0
- package/dist/commands/conflicts.js +267 -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 +219 -0
- package/dist/commands/conflicts.test.js.map +1 -0
- package/dist/commands/connect-config.test.d.ts +2 -0
- package/dist/commands/connect-config.test.d.ts.map +1 -0
- package/dist/commands/connect-config.test.js +44 -0
- package/dist/commands/connect-config.test.js.map +1 -0
- package/dist/commands/connect-context.d.ts +45 -0
- package/dist/commands/connect-context.d.ts.map +1 -0
- package/dist/commands/connect-context.js +83 -0
- package/dist/commands/connect-context.js.map +1 -0
- package/dist/commands/connect-context.test.d.ts +2 -0
- package/dist/commands/connect-context.test.d.ts.map +1 -0
- package/dist/commands/connect-context.test.js +158 -0
- package/dist/commands/connect-context.test.js.map +1 -0
- package/dist/commands/connect-handoff.d.ts +51 -0
- package/dist/commands/connect-handoff.d.ts.map +1 -0
- package/dist/commands/connect-handoff.js +70 -0
- package/dist/commands/connect-handoff.js.map +1 -0
- package/dist/commands/connect-integration.test.js +58 -35
- 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-screens.d.ts +33 -0
- package/dist/commands/connect-screens.d.ts.map +1 -0
- package/dist/commands/connect-screens.js +124 -0
- package/dist/commands/connect-screens.js.map +1 -0
- package/dist/commands/connect.d.ts +27 -6
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +256 -119
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connect.test.js +348 -7
- package/dist/commands/connect.test.js.map +1 -1
- package/dist/commands/constellation.d.ts.map +1 -1
- package/dist/commands/constellation.js +2 -2
- package/dist/commands/constellation.js.map +1 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +2 -2
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/cross-cut.d.ts.map +1 -1
- package/dist/commands/cross-cut.js +2 -2
- package/dist/commands/cross-cut.js.map +1 -1
- 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 +171 -39
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctor.test.js +333 -7
- package/dist/commands/doctor.test.js.map +1 -1
- package/dist/commands/entryArchive.d.ts +8 -0
- package/dist/commands/entryArchive.d.ts.map +1 -0
- package/dist/commands/entryArchive.js +37 -0
- package/dist/commands/entryArchive.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 +193 -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 +125 -0
- package/dist/commands/feedback.test.js.map +1 -0
- package/dist/commands/fields.d.ts.map +1 -1
- package/dist/commands/fields.js +3 -3
- 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/get.js +3 -3
- package/dist/commands/get.js.map +1 -1
- package/dist/commands/handshake.d.ts +223 -2
- package/dist/commands/handshake.d.ts.map +1 -1
- package/dist/commands/handshake.js +2106 -62
- package/dist/commands/handshake.js.map +1 -1
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +15 -6
- 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 +20 -17
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +6 -5
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/method.d.ts +99 -0
- package/dist/commands/method.d.ts.map +1 -0
- package/dist/commands/method.js +804 -0
- package/dist/commands/method.js.map +1 -0
- package/dist/commands/migrate-setup.d.ts +18 -0
- package/dist/commands/migrate-setup.d.ts.map +1 -0
- package/dist/commands/migrate-setup.js +148 -0
- package/dist/commands/migrate-setup.js.map +1 -0
- package/dist/commands/organisation.d.ts +41 -0
- package/dist/commands/organisation.d.ts.map +1 -0
- package/dist/commands/organisation.js +353 -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 +233 -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 +67 -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 +55 -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 +50 -0
- package/dist/commands/organisationWrite.js.map +1 -0
- package/dist/commands/orient.d.ts +132 -2
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +223 -7
- package/dist/commands/orient.js.map +1 -1
- package/dist/commands/profile.d.ts +11 -1
- package/dist/commands/profile.d.ts.map +1 -1
- package/dist/commands/profile.js +114 -26
- package/dist/commands/profile.js.map +1 -1
- package/dist/commands/promote.d.ts +12 -1
- package/dist/commands/promote.d.ts.map +1 -1
- package/dist/commands/promote.js +243 -57
- package/dist/commands/promote.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/proposals.d.ts.map +1 -1
- package/dist/commands/proposals.js +2 -2
- package/dist/commands/proposals.js.map +1 -1
- 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 +33 -0
- package/dist/commands/questions.d.ts.map +1 -0
- package/dist/commands/questions.js +300 -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 +175 -0
- package/dist/commands/questions.test.js.map +1 -0
- package/dist/commands/reject.d.ts.map +1 -1
- package/dist/commands/reject.js +5 -4
- package/dist/commands/reject.js.map +1 -1
- package/dist/commands/relate.d.ts +1 -0
- package/dist/commands/relate.d.ts.map +1 -1
- package/dist/commands/relate.js +67 -6
- 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/scoreboard.d.ts +28 -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.map +1 -1
- package/dist/commands/search.js +2 -2
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/session.d.ts +59 -7
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +481 -46
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/setup-audit.d.ts +59 -0
- package/dist/commands/setup-audit.d.ts.map +1 -0
- package/dist/commands/setup-audit.js +250 -0
- package/dist/commands/setup-audit.js.map +1 -0
- package/dist/commands/setup-detect-surfaces.d.ts +38 -0
- package/dist/commands/setup-detect-surfaces.d.ts.map +1 -0
- package/dist/commands/setup-detect-surfaces.js +76 -0
- package/dist/commands/setup-detect-surfaces.js.map +1 -0
- package/dist/commands/setup-ingest.d.ts +17 -0
- package/dist/commands/setup-ingest.d.ts.map +1 -0
- package/dist/commands/setup-ingest.js +174 -0
- package/dist/commands/setup-ingest.js.map +1 -0
- package/dist/commands/setup-resolver.d.ts +58 -0
- package/dist/commands/setup-resolver.d.ts.map +1 -0
- package/dist/commands/setup-resolver.js +150 -0
- package/dist/commands/setup-resolver.js.map +1 -0
- package/dist/commands/setup-state.d.ts +42 -0
- package/dist/commands/setup-state.d.ts.map +1 -0
- package/dist/commands/setup-state.js +93 -0
- package/dist/commands/setup-state.js.map +1 -0
- package/dist/commands/setup.d.ts +17 -9
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +53 -152
- package/dist/commands/setup.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/update.d.ts +20 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +91 -34
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/upgrade.d.ts +5 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +110 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/usage.d.ts +40 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +214 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +9 -3
- package/dist/commands/verify.js.map +1 -1
- package/dist/commands/welcome.d.ts +21 -0
- package/dist/commands/welcome.d.ts.map +1 -0
- package/dist/commands/welcome.js +53 -0
- package/dist/commands/welcome.js.map +1 -0
- package/dist/commands/whoami.d.ts +12 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +73 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/commands/whoami.test.d.ts +2 -0
- package/dist/commands/whoami.test.d.ts.map +1 -0
- package/dist/commands/whoami.test.js +50 -0
- package/dist/commands/whoami.test.js.map +1 -0
- package/dist/commands/workspace.d.ts +76 -2
- package/dist/commands/workspace.d.ts.map +1 -1
- package/dist/commands/workspace.js +30 -6
- package/dist/commands/workspace.js.map +1 -1
- package/dist/formatters/__tests__/orient-possibleConflict.test.d.ts +2 -0
- package/dist/formatters/__tests__/orient-possibleConflict.test.d.ts.map +1 -0
- package/dist/formatters/__tests__/orient-possibleConflict.test.js +68 -0
- package/dist/formatters/__tests__/orient-possibleConflict.test.js.map +1 -0
- package/dist/formatters/__tests__/orient-provenance.test.d.ts +7 -0
- package/dist/formatters/__tests__/orient-provenance.test.d.ts.map +1 -0
- package/dist/formatters/__tests__/orient-provenance.test.js +548 -0
- package/dist/formatters/__tests__/orient-provenance.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 +159 -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 +206 -0
- package/dist/formatters/__tests__/session.test.js.map +1 -0
- package/dist/formatters/audit.d.ts +6 -0
- package/dist/formatters/audit.d.ts.map +1 -1
- package/dist/formatters/audit.js +1 -1
- package/dist/formatters/audit.js.map +1 -1
- package/dist/formatters/brief.d.ts +1 -0
- package/dist/formatters/brief.d.ts.map +1 -1
- package/dist/formatters/brief.js +1 -1
- package/dist/formatters/brief.js.map +1 -1
- package/dist/formatters/capture.d.ts +8 -0
- package/dist/formatters/capture.d.ts.map +1 -1
- package/dist/formatters/capture.js +12 -1
- package/dist/formatters/capture.js.map +1 -1
- package/dist/formatters/coaching.d.ts +55 -0
- package/dist/formatters/coaching.d.ts.map +1 -0
- package/dist/formatters/coaching.js +46 -0
- package/dist/formatters/coaching.js.map +1 -0
- 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/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 +44 -0
- package/dist/formatters/entry.d.ts.map +1 -1
- package/dist/formatters/entry.js +70 -7
- package/dist/formatters/entry.js.map +1 -1
- package/dist/formatters/feedback.d.ts +56 -0
- package/dist/formatters/feedback.d.ts.map +1 -0
- package/dist/formatters/feedback.js +89 -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 +112 -0
- package/dist/formatters/feedback.test.js.map +1 -0
- package/dist/formatters/handshake.d.ts +39 -0
- package/dist/formatters/handshake.d.ts.map +1 -1
- package/dist/formatters/handshake.js +133 -3
- 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 +249 -8
- package/dist/formatters/orient.d.ts.map +1 -1
- package/dist/formatters/orient.js +277 -35
- 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 +146 -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 +70 -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 +62 -0
- package/dist/formatters/orient.shapeAdvisorySummary.test.js.map +1 -0
- package/dist/formatters/orientDegradation.d.ts +21 -0
- package/dist/formatters/orientDegradation.d.ts.map +1 -0
- package/dist/formatters/orientDegradation.js +33 -0
- package/dist/formatters/orientDegradation.js.map +1 -0
- package/dist/formatters/orientDirection.d.ts +77 -0
- package/dist/formatters/orientDirection.d.ts.map +1 -0
- package/dist/formatters/orientDirection.js +94 -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 +193 -0
- package/dist/formatters/orientDirection.test.js.map +1 -0
- package/dist/formatters/orientRetrievalMiss.d.ts +30 -0
- package/dist/formatters/orientRetrievalMiss.d.ts.map +1 -0
- package/dist/formatters/orientRetrievalMiss.js +24 -0
- package/dist/formatters/orientRetrievalMiss.js.map +1 -0
- package/dist/formatters/promote.d.ts +49 -0
- package/dist/formatters/promote.d.ts.map +1 -1
- package/dist/formatters/promote.js +40 -0
- package/dist/formatters/promote.js.map +1 -1
- package/dist/formatters/proposals.js +2 -2
- package/dist/formatters/proposals.js.map +1 -1
- package/dist/formatters/questions.d.ts +100 -0
- package/dist/formatters/questions.d.ts.map +1 -0
- package/dist/formatters/questions.js +146 -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 +184 -0
- package/dist/formatters/questions.test.js.map +1 -0
- package/dist/formatters/relate.d.ts +14 -1
- package/dist/formatters/relate.d.ts.map +1 -1
- package/dist/formatters/relate.js +12 -3
- 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 +81 -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 +164 -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 +303 -0
- package/dist/formatters/scoreboard.test.js.map +1 -0
- package/dist/formatters/search.d.ts.map +1 -1
- package/dist/formatters/search.js +17 -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 +46 -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 +61 -0
- package/dist/formatters/session-feedback.test.js.map +1 -0
- package/dist/formatters/session.d.ts +123 -5
- package/dist/formatters/session.d.ts.map +1 -1
- package/dist/formatters/session.js +317 -12
- 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 +64 -0
- package/dist/formatters/spineCheck.d.ts.map +1 -0
- package/dist/formatters/spineCheck.js +92 -0
- package/dist/formatters/spineCheck.js.map +1 -0
- package/dist/formatters/update.d.ts +3 -0
- package/dist/formatters/update.d.ts.map +1 -1
- package/dist/formatters/update.js +4 -0
- package/dist/formatters/update.js.map +1 -1
- 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 +24 -0
- package/dist/generated/healthGapKinds.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 +55 -0
- package/dist/generated/routeLatencyBudget.generated.d.ts.map +1 -0
- package/dist/generated/routeLatencyBudget.generated.js +348 -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 +33 -0
- package/dist/generators/adapters.d.ts.map +1 -1
- package/dist/generators/adapters.js +68 -8
- package/dist/generators/adapters.js.map +1 -1
- package/dist/generators/archetypes.d.ts.map +1 -1
- package/dist/generators/archetypes.js +46 -9
- package/dist/generators/archetypes.js.map +1 -1
- package/dist/generators/archetypes.test.js +35 -0
- package/dist/generators/archetypes.test.js.map +1 -1
- package/dist/generators/boundary-manifest.d.ts +29 -0
- package/dist/generators/boundary-manifest.d.ts.map +1 -0
- package/dist/generators/boundary-manifest.js +183 -0
- package/dist/generators/boundary-manifest.js.map +1 -0
- 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/boundary-manifest.test.d.ts +2 -0
- package/dist/generators/boundary-manifest.test.d.ts.map +1 -0
- package/dist/generators/boundary-manifest.test.js +91 -0
- package/dist/generators/boundary-manifest.test.js.map +1 -0
- package/dist/generators/chain-classifier-kernel-client-drift.test.d.ts +2 -0
- package/dist/generators/chain-classifier-kernel-client-drift.test.d.ts.map +1 -0
- package/dist/generators/chain-classifier-kernel-client-drift.test.js +41 -0
- package/dist/generators/chain-classifier-kernel-client-drift.test.js.map +1 -0
- package/dist/generators/chain-classifier.d.ts +67 -14
- package/dist/generators/chain-classifier.d.ts.map +1 -1
- package/dist/generators/chain-classifier.js +46 -174
- package/dist/generators/chain-classifier.js.map +1 -1
- package/dist/generators/chain-rules.d.ts +3 -3
- package/dist/generators/chain-rules.d.ts.map +1 -1
- package/dist/generators/chain-rules.js +118 -6
- package/dist/generators/chain-rules.js.map +1 -1
- package/dist/generators/chain-rules.test.js +273 -4
- package/dist/generators/chain-rules.test.js.map +1 -1
- package/dist/generators/context-md.js +7 -7
- package/dist/generators/context-md.js.map +1 -1
- package/dist/generators/manifest.d.ts +115 -0
- package/dist/generators/manifest.d.ts.map +1 -0
- package/dist/generators/manifest.js +277 -0
- package/dist/generators/manifest.js.map +1 -0
- package/dist/generators/portable-knowledge.d.ts +24 -2
- package/dist/generators/portable-knowledge.d.ts.map +1 -1
- package/dist/generators/portable-knowledge.js +97 -2
- package/dist/generators/portable-knowledge.js.map +1 -1
- package/dist/generators/portable-knowledge.test.js +43 -0
- package/dist/generators/portable-knowledge.test.js.map +1 -1
- package/dist/generators/region-projections.d.ts +18 -0
- package/dist/generators/region-projections.d.ts.map +1 -0
- package/dist/generators/region-projections.js +49 -0
- package/dist/generators/region-projections.js.map +1 -0
- package/dist/generators/region-projections.test.d.ts +2 -0
- package/dist/generators/region-projections.test.d.ts.map +1 -0
- package/dist/generators/region-projections.test.js +63 -0
- package/dist/generators/region-projections.test.js.map +1 -0
- package/dist/generators/region.d.ts +24 -0
- package/dist/generators/region.d.ts.map +1 -0
- package/dist/generators/region.js +87 -0
- package/dist/generators/region.js.map +1 -0
- package/dist/generators/region.test.d.ts +2 -0
- package/dist/generators/region.test.d.ts.map +1 -0
- package/dist/generators/region.test.js +126 -0
- package/dist/generators/region.test.js.map +1 -0
- package/dist/generators/surface-profiles.d.ts +1 -2
- package/dist/generators/surface-profiles.d.ts.map +1 -1
- package/dist/generators/surface-profiles.js.map +1 -1
- package/dist/index.d.ts +0 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +421 -186
- 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 +98 -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/activation.d.ts.map +1 -1
- package/dist/lib/activation.js +8 -4
- package/dist/lib/activation.js.map +1 -1
- package/dist/lib/activation.test.js +6 -6
- package/dist/lib/activation.test.js.map +1 -1
- package/dist/lib/adminConfig.d.ts +43 -0
- package/dist/lib/adminConfig.d.ts.map +1 -0
- package/dist/lib/adminConfig.js +132 -0
- package/dist/lib/adminConfig.js.map +1 -0
- package/dist/lib/canonicalRefs.d.ts +160 -0
- package/dist/lib/canonicalRefs.d.ts.map +1 -0
- package/dist/lib/canonicalRefs.js +169 -0
- package/dist/lib/canonicalRefs.js.map +1 -0
- package/dist/lib/captureGrounding.d.ts +53 -0
- package/dist/lib/captureGrounding.d.ts.map +1 -0
- package/dist/lib/captureGrounding.js +108 -0
- package/dist/lib/captureGrounding.js.map +1 -0
- package/dist/lib/client.d.ts +39 -15
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +198 -48
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/collectionRegistry.d.ts +52 -0
- package/dist/lib/collectionRegistry.d.ts.map +1 -0
- package/dist/lib/collectionRegistry.js +118 -0
- package/dist/lib/collectionRegistry.js.map +1 -0
- 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 +103 -53
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +260 -159
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/configResult.d.ts +80 -0
- package/dist/lib/configResult.d.ts.map +1 -0
- package/dist/lib/configResult.js +176 -0
- package/dist/lib/configResult.js.map +1 -0
- package/dist/lib/connectKeyLabel.d.ts +9 -0
- package/dist/lib/connectKeyLabel.d.ts.map +1 -0
- package/dist/lib/connectKeyLabel.js +12 -0
- package/dist/lib/connectKeyLabel.js.map +1 -0
- package/dist/lib/constants.d.ts +5 -1
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +8 -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/errors.d.ts +67 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +67 -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.d.ts +51 -0
- package/dist/lib/hook-intents.d.ts.map +1 -0
- package/dist/lib/hook-intents.js +85 -0
- package/dist/lib/hook-intents.js.map +1 -0
- package/dist/lib/inferSourceDate.d.ts +12 -0
- package/dist/lib/inferSourceDate.d.ts.map +1 -0
- package/dist/lib/inferSourceDate.js +44 -0
- package/dist/lib/inferSourceDate.js.map +1 -0
- package/dist/lib/kernelEnvelope.d.ts +31 -0
- package/dist/lib/kernelEnvelope.d.ts.map +1 -0
- package/dist/lib/kernelEnvelope.js +52 -0
- package/dist/lib/kernelEnvelope.js.map +1 -0
- package/dist/lib/legalRelationTypes.d.ts +25 -0
- package/dist/lib/legalRelationTypes.d.ts.map +1 -0
- package/dist/lib/legalRelationTypes.js +94 -0
- package/dist/lib/legalRelationTypes.js.map +1 -0
- package/dist/lib/localBinding.d.ts +51 -0
- package/dist/lib/localBinding.d.ts.map +1 -0
- package/dist/lib/localBinding.js +90 -0
- package/dist/lib/localBinding.js.map +1 -0
- package/dist/lib/method-registry.d.ts +37 -0
- package/dist/lib/method-registry.d.ts.map +1 -0
- package/dist/lib/method-registry.js +41 -0
- package/dist/lib/method-registry.js.map +1 -0
- package/dist/lib/normalizeMaterializedFilename.d.ts +28 -0
- package/dist/lib/normalizeMaterializedFilename.d.ts.map +1 -0
- package/dist/lib/normalizeMaterializedFilename.js +56 -0
- package/dist/lib/normalizeMaterializedFilename.js.map +1 -0
- package/dist/lib/normalizeMaterializedFilename.test.d.ts +16 -0
- package/dist/lib/normalizeMaterializedFilename.test.d.ts.map +1 -0
- package/dist/lib/normalizeMaterializedFilename.test.js +90 -0
- package/dist/lib/normalizeMaterializedFilename.test.js.map +1 -0
- package/dist/lib/notice-marker.d.ts +3 -0
- package/dist/lib/notice-marker.d.ts.map +1 -0
- package/dist/lib/notice-marker.js +53 -0
- package/dist/lib/notice-marker.js.map +1 -0
- package/dist/lib/onboarding-path-b.d.ts.map +1 -1
- package/dist/lib/onboarding-path-b.js +42 -13
- package/dist/lib/onboarding-path-b.js.map +1 -1
- package/dist/lib/onboarding-shared.d.ts +4 -4
- package/dist/lib/onboarding-shared.d.ts.map +1 -1
- package/dist/lib/onboarding-shared.js +7 -22
- package/dist/lib/onboarding-shared.js.map +1 -1
- package/dist/lib/onboarding.d.ts.map +1 -1
- package/dist/lib/onboarding.js +12 -4
- package/dist/lib/onboarding.js.map +1 -1
- 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/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 +94 -0
- package/dist/lib/productbrain-files.d.ts.map +1 -0
- package/dist/lib/productbrain-files.js +214 -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 +293 -0
- package/dist/lib/productbrain-files.test.js.map +1 -0
- package/dist/lib/profiles.d.ts +53 -5
- package/dist/lib/profiles.d.ts.map +1 -1
- package/dist/lib/profiles.js +82 -23
- package/dist/lib/profiles.js.map +1 -1
- package/dist/lib/projectConfig.d.ts +70 -0
- package/dist/lib/projectConfig.d.ts.map +1 -0
- package/dist/lib/projectConfig.js +141 -0
- package/dist/lib/projectConfig.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/runner.d.ts +8 -0
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/lib/runner.js +23 -0
- package/dist/lib/runner.js.map +1 -1
- package/dist/lib/session.d.ts +85 -4
- package/dist/lib/session.d.ts.map +1 -1
- package/dist/lib/session.js +276 -13
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/sessionNotices.d.ts +57 -0
- package/dist/lib/sessionNotices.d.ts.map +1 -0
- package/dist/lib/sessionNotices.js +128 -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 +48 -0
- package/dist/lib/sessionNotices.test.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 +172 -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 +58 -0
- package/dist/lib/state.d.ts.map +1 -0
- package/dist/lib/state.js +95 -0
- package/dist/lib/state.js.map +1 -0
- package/dist/lib/strip.d.ts +8 -0
- package/dist/lib/strip.d.ts.map +1 -1
- package/dist/lib/strip.js +23 -1
- package/dist/lib/strip.js.map +1 -1
- package/dist/lib/style.d.ts +3 -1
- package/dist/lib/style.d.ts.map +1 -1
- package/dist/lib/style.js +9 -2
- package/dist/lib/style.js.map +1 -1
- package/dist/lib/tokenConstants.d.ts +19 -0
- package/dist/lib/tokenConstants.d.ts.map +1 -0
- package/dist/lib/tokenConstants.js +19 -0
- package/dist/lib/tokenConstants.js.map +1 -0
- package/dist/lib/update-check.d.ts +56 -0
- package/dist/lib/update-check.d.ts.map +1 -0
- package/dist/lib/update-check.js +296 -0
- package/dist/lib/update-check.js.map +1 -0
- package/dist/lib/upgrade-runner.d.ts +22 -0
- package/dist/lib/upgrade-runner.d.ts.map +1 -0
- package/dist/lib/upgrade-runner.js +110 -0
- package/dist/lib/upgrade-runner.js.map +1 -0
- package/dist/lib/workspace-probe.d.ts +3 -0
- package/dist/lib/workspace-probe.d.ts.map +1 -1
- package/dist/lib/workspace-probe.js +8 -14
- package/dist/lib/workspace-probe.js.map +1 -1
- package/dist/lib/workspaceNotice.d.ts +71 -0
- package/dist/lib/workspaceNotice.d.ts.map +1 -0
- package/dist/lib/workspaceNotice.js +90 -0
- package/dist/lib/workspaceNotice.js.map +1 -0
- package/dist/lib/workspaceVocabCache.d.ts +60 -0
- package/dist/lib/workspaceVocabCache.d.ts.map +1 -0
- package/dist/lib/workspaceVocabCache.js +98 -0
- package/dist/lib/workspaceVocabCache.js.map +1 -0
- package/dist/registerEntryCommands.d.ts +17 -0
- package/dist/registerEntryCommands.d.ts.map +1 -0
- package/dist/registerEntryCommands.js +83 -0
- package/dist/registerEntryCommands.js.map +1 -0
- package/dist/registerProposalCommands.d.ts +13 -0
- package/dist/registerProposalCommands.d.ts.map +1 -0
- package/dist/registerProposalCommands.js +76 -0
- package/dist/registerProposalCommands.js.map +1 -0
- package/dist/scoreboard/diagnose.d.ts +226 -0
- package/dist/scoreboard/diagnose.d.ts.map +1 -0
- package/dist/scoreboard/diagnose.js +344 -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 +355 -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/setup/__tests__/coach-traces.test.d.ts +2 -0
- package/dist/setup/__tests__/coach-traces.test.d.ts.map +1 -0
- package/dist/setup/__tests__/coach-traces.test.js +189 -0
- package/dist/setup/__tests__/coach-traces.test.js.map +1 -0
- package/dist/setup/__tests__/setup-commands.test.d.ts +2 -0
- package/dist/setup/__tests__/setup-commands.test.d.ts.map +1 -0
- package/dist/setup/__tests__/setup-commands.test.js +177 -0
- package/dist/setup/__tests__/setup-commands.test.js.map +1 -0
- package/dist/setup/__tests__/state-machine.test.d.ts +2 -0
- package/dist/setup/__tests__/state-machine.test.d.ts.map +1 -0
- package/dist/setup/__tests__/state-machine.test.js +341 -0
- package/dist/setup/__tests__/state-machine.test.js.map +1 -0
- package/dist/setup/detect-surfaces.d.ts +21 -0
- package/dist/setup/detect-surfaces.d.ts.map +1 -0
- package/dist/setup/detect-surfaces.js +39 -0
- package/dist/setup/detect-surfaces.js.map +1 -0
- package/dist/setup/manifest-writer.d.ts +17 -0
- package/dist/setup/manifest-writer.d.ts.map +1 -0
- package/dist/setup/manifest-writer.js +153 -0
- package/dist/setup/manifest-writer.js.map +1 -0
- package/dist/setup/perimeter.d.ts +72 -0
- package/dist/setup/perimeter.d.ts.map +1 -0
- package/dist/setup/perimeter.js +128 -0
- package/dist/setup/perimeter.js.map +1 -0
- package/dist/setup/state-machine.d.ts +67 -0
- package/dist/setup/state-machine.d.ts.map +1 -0
- package/dist/setup/state-machine.js +124 -0
- package/dist/setup/state-machine.js.map +1 -0
- package/dist/surfaces/__tests__/adapter.test.d.ts +2 -0
- package/dist/surfaces/__tests__/adapter.test.d.ts.map +1 -0
- package/dist/surfaces/__tests__/adapter.test.js +90 -0
- package/dist/surfaces/__tests__/adapter.test.js.map +1 -0
- package/dist/surfaces/__tests__/pb-setup-passthrough.test.d.ts +2 -0
- package/dist/surfaces/__tests__/pb-setup-passthrough.test.d.ts.map +1 -0
- package/dist/surfaces/__tests__/pb-setup-passthrough.test.js +132 -0
- package/dist/surfaces/__tests__/pb-setup-passthrough.test.js.map +1 -0
- package/dist/surfaces/__tests__/telemetry.test.d.ts +2 -0
- package/dist/surfaces/__tests__/telemetry.test.d.ts.map +1 -0
- package/dist/surfaces/__tests__/telemetry.test.js +55 -0
- package/dist/surfaces/__tests__/telemetry.test.js.map +1 -0
- package/dist/surfaces/adapter.d.ts +70 -0
- package/dist/surfaces/adapter.d.ts.map +1 -0
- package/dist/surfaces/adapter.js +2 -0
- package/dist/surfaces/adapter.js.map +1 -0
- package/dist/surfaces/adapters/claude.d.ts +3 -0
- package/dist/surfaces/adapters/claude.d.ts.map +1 -0
- package/dist/surfaces/adapters/claude.js +67 -0
- package/dist/surfaces/adapters/claude.js.map +1 -0
- package/dist/surfaces/adapters/codex.d.ts +3 -0
- package/dist/surfaces/adapters/codex.d.ts.map +1 -0
- package/dist/surfaces/adapters/codex.js +61 -0
- package/dist/surfaces/adapters/codex.js.map +1 -0
- package/dist/surfaces/adapters/copilot.d.ts +3 -0
- package/dist/surfaces/adapters/copilot.d.ts.map +1 -0
- package/dist/surfaces/adapters/copilot.js +59 -0
- package/dist/surfaces/adapters/copilot.js.map +1 -0
- package/dist/surfaces/adapters/cursor.d.ts +3 -0
- package/dist/surfaces/adapters/cursor.d.ts.map +1 -0
- package/dist/surfaces/adapters/cursor.js +78 -0
- package/dist/surfaces/adapters/cursor.js.map +1 -0
- package/dist/surfaces/registry.d.ts +76 -0
- package/dist/surfaces/registry.d.ts.map +1 -0
- package/dist/surfaces/registry.js +117 -0
- package/dist/surfaces/registry.js.map +1 -0
- package/dist/surfaces/telemetry.d.ts +17 -0
- package/dist/surfaces/telemetry.d.ts.map +1 -0
- package/dist/surfaces/telemetry.js +31 -0
- package/dist/surfaces/telemetry.js.map +1 -0
- package/package.json +11 -3
- package/templates/method-registry.json +16 -0
- package/dist/__tests__/setup.test.d.ts +0 -2
- package/dist/__tests__/setup.test.d.ts.map +0 -1
- package/dist/__tests__/setup.test.js +0 -141
- package/dist/__tests__/setup.test.js.map +0 -1
- package/dist/generators/__tests__/surface-profiles.test.d.ts +0 -2
- package/dist/generators/__tests__/surface-profiles.test.d.ts.map +0 -1
- package/dist/generators/__tests__/surface-profiles.test.js +0 -89
- package/dist/generators/__tests__/surface-profiles.test.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/lib/onboarding-phases.d.ts +0 -9
- package/dist/lib/onboarding-phases.d.ts.map +0 -1
- package/dist/lib/onboarding-phases.js +0 -120
- package/dist/lib/onboarding-phases.js.map +0 -1
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* pb capture extensions — --link, --json flags.
|
|
2
|
+
* pb capture extensions — --link, --json flags, WP-319 grounding.
|
|
3
3
|
* TEN-341 test contract: capture --link calls createEntryRelation, capture --json outputs JSON.
|
|
4
|
+
* WP-319 S3: grounding fires in parallel, fail-open, --suggest-only, --strict, PB_GROUNDING_MODE.
|
|
4
5
|
*/
|
|
5
6
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
6
7
|
import { runCapture } from '../commands/capture.js';
|
|
7
|
-
|
|
8
|
+
import { CLIError, ErrorCode } from '../lib/errors.js';
|
|
9
|
+
import { setOutputMode } from '../lib/runner.js';
|
|
10
|
+
const kernelCallWithSessionMock = vi.fn();
|
|
8
11
|
vi.mock('../lib/client.js', () => ({
|
|
9
|
-
|
|
12
|
+
kernelCallWithSession: (...args) => kernelCallWithSessionMock(...args),
|
|
10
13
|
}));
|
|
11
14
|
vi.mock('../lib/config.js', () => ({
|
|
12
15
|
getConfigOrGuide: vi.fn(() => Promise.resolve({ apiKey: 'pb_sk_test', siteUrl: 'https://test.convex.site' })),
|
|
@@ -18,55 +21,521 @@ vi.mock('../lib/session.js', () => ({
|
|
|
18
21
|
}));
|
|
19
22
|
describe('runCapture --link', () => {
|
|
20
23
|
beforeEach(() => {
|
|
21
|
-
|
|
24
|
+
kernelCallWithSessionMock.mockReset();
|
|
22
25
|
mockSession = { sessionId: 'sess-test' };
|
|
23
26
|
});
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
27
|
+
// WP-688 S4 (TASK-105, element 11): --link with no --link-type no longer defaults to
|
|
28
|
+
// surfaces_tension_in — it refuses instead. The capture itself still succeeds (createEntry
|
|
29
|
+
// ran for real); only the relation write is skipped, replaced by a PREVIEW probe used to
|
|
30
|
+
// list the source entry's legal verbs in the refusal message.
|
|
31
|
+
it('--link without --link-type refuses (no default), preserving the created entry', async () => {
|
|
32
|
+
kernelCallWithSessionMock.mockImplementation((fn, args) => {
|
|
33
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
34
|
+
return Promise.resolve([]);
|
|
35
|
+
if (fn === 'chain.createEntry')
|
|
36
|
+
return Promise.resolve({ docId: 'doc-1', entryId: 'TEN-710' });
|
|
37
|
+
if (fn === 'chain.getEntry') {
|
|
38
|
+
const entryId = args?.entryId;
|
|
39
|
+
if (entryId === 'TEN-710')
|
|
40
|
+
return Promise.resolve({ entryId: 'TEN-710', name: 'x', status: 'draft', canonicalKey: 'tension' });
|
|
41
|
+
return Promise.resolve(null);
|
|
42
|
+
}
|
|
43
|
+
// bdABL: the type row is resolved by scanning the semantic-types collection and
|
|
44
|
+
// matching on data.canonical_key — NOT by guessing entryId === `TYPE-<key>`. This
|
|
45
|
+
// row deliberately uses a non-conventional entryId (`ST-1`) to prove that.
|
|
46
|
+
if (fn === 'chain.listEntries') {
|
|
47
|
+
return Promise.resolve([{ entryId: 'ST-1', name: 'tension', status: 'active', data: { canonical_key: 'tension', valid_relation_types: ['related_to', 'depends_on', 'surfaces_tension_in'], description: 'x', cardinality_rule: 'multiple' } }]);
|
|
48
|
+
}
|
|
49
|
+
return Promise.resolve({});
|
|
50
|
+
});
|
|
51
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
52
|
+
await expect(runCapture({ text: 'TEN: missing validation', link: 'BET-151' })).rejects.toThrow(CLIError);
|
|
53
|
+
// The entry was created for real — only the LINK is refused.
|
|
54
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.objectContaining({
|
|
35
55
|
collectionSlug: 'tensions',
|
|
36
56
|
name: 'missing validation',
|
|
37
57
|
}));
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
58
|
+
// Legal verbs are READ by scanning the semantic-types collection (chain.listEntries)
|
|
59
|
+
// and matching data.canonical_key — the same resolution loadTypeMap itself uses,
|
|
60
|
+
// never a probe, never a guessed entryId.
|
|
61
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.getEntry', { entryId: 'TEN-710' });
|
|
62
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.listEntries', { collectionSlug: 'semantic-types' });
|
|
63
|
+
// Never a createEntryRelation call at all — a real write, preview, or probe.
|
|
64
|
+
expect(kernelCallWithSessionMock).not.toHaveBeenCalledWith('chain.createEntryRelation', expect.anything());
|
|
65
|
+
writeSpy.mockRestore();
|
|
66
|
+
});
|
|
67
|
+
it('--link without --link-type: refusal message lists the source entry\'s declared relation types', async () => {
|
|
68
|
+
kernelCallWithSessionMock.mockImplementation((fn, args) => {
|
|
69
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
70
|
+
return Promise.resolve([]);
|
|
71
|
+
if (fn === 'chain.createEntry')
|
|
72
|
+
return Promise.resolve({ docId: 'doc-1b', entryId: 'TEN-711' });
|
|
73
|
+
if (fn === 'chain.getEntry') {
|
|
74
|
+
const entryId = args?.entryId;
|
|
75
|
+
if (entryId === 'TEN-711')
|
|
76
|
+
return Promise.resolve({ entryId: 'TEN-711', name: 'x', status: 'draft', canonicalKey: 'tension' });
|
|
77
|
+
// bcRUMR: the target must actually resolve for this test to exercise the
|
|
78
|
+
// pb-relate-guidance branch rather than the target-missing branch.
|
|
79
|
+
if (entryId === 'BET-151')
|
|
80
|
+
return Promise.resolve({ entryId: 'BET-151', name: 'y', status: 'active', canonicalKey: 'work_package' });
|
|
81
|
+
return Promise.resolve(null);
|
|
82
|
+
}
|
|
83
|
+
if (fn === 'chain.listEntries') {
|
|
84
|
+
return Promise.resolve([{ entryId: 'TYPE-tension', name: 'tension', status: 'active', data: { canonical_key: 'tension', valid_relation_types: ['related_to', 'depends_on', 'surfaces_tension_in'], description: 'x', cardinality_rule: 'multiple' } }]);
|
|
85
|
+
}
|
|
86
|
+
return Promise.resolve({});
|
|
42
87
|
});
|
|
88
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
89
|
+
let caught;
|
|
90
|
+
try {
|
|
91
|
+
await runCapture({ text: 'TEN: missing validation', link: 'BET-151' });
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
caught = e;
|
|
95
|
+
}
|
|
43
96
|
writeSpy.mockRestore();
|
|
97
|
+
expect(caught).toBeInstanceOf(CLIError);
|
|
98
|
+
expect(caught?.code).toBe(ErrorCode.VALIDATION_FAILED);
|
|
99
|
+
expect(caught?.message).toContain('related_to, depends_on, surfaces_tension_in');
|
|
100
|
+
expect(caught?.guidance).toContain('TEN-711');
|
|
101
|
+
expect(caught?.guidance).toContain('pb relate TEN-711');
|
|
44
102
|
});
|
|
45
|
-
|
|
103
|
+
// WP-688 S4 review round 5 (bcRUML): a whitespace-only --link must not silently no-op —
|
|
104
|
+
// the entry still gets created, but the link itself must be explicitly refused.
|
|
105
|
+
it('--link " " (whitespace-only) refuses instead of silently dropping the link', async () => {
|
|
106
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
107
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
108
|
+
return Promise.resolve([]);
|
|
109
|
+
if (fn === 'chain.createEntry')
|
|
110
|
+
return Promise.resolve({ docId: 'doc-ws', entryId: 'TEN-720' });
|
|
111
|
+
return Promise.resolve({});
|
|
112
|
+
});
|
|
113
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
114
|
+
let caught;
|
|
115
|
+
try {
|
|
116
|
+
await runCapture({ text: 'TEN: whitespace link', link: ' ' });
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
caught = e;
|
|
120
|
+
}
|
|
121
|
+
writeSpy.mockRestore();
|
|
122
|
+
expect(caught).toBeInstanceOf(CLIError);
|
|
123
|
+
expect(caught?.message).toContain('--link requires a non-empty entry ID');
|
|
124
|
+
// Never a relate/probe call — the target never resolved to anything real.
|
|
125
|
+
expect(kernelCallWithSessionMock).not.toHaveBeenCalledWith('chain.createEntryRelation', expect.anything());
|
|
126
|
+
});
|
|
127
|
+
// WP-688 S4 review round 5 (bcRpJQ): --link "" is falsy at the outer `if (options.link)` —
|
|
128
|
+
// must check `!== undefined` instead, or this whole block (and the bcRUML refusal) never runs.
|
|
129
|
+
it('--link "" (empty string) refuses instead of silently dropping the link', async () => {
|
|
130
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
131
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
132
|
+
return Promise.resolve([]);
|
|
133
|
+
if (fn === 'chain.createEntry')
|
|
134
|
+
return Promise.resolve({ docId: 'doc-empty', entryId: 'TEN-722' });
|
|
135
|
+
return Promise.resolve({});
|
|
136
|
+
});
|
|
137
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
138
|
+
let caught;
|
|
139
|
+
try {
|
|
140
|
+
await runCapture({ text: 'TEN: empty link', link: '' });
|
|
141
|
+
}
|
|
142
|
+
catch (e) {
|
|
143
|
+
caught = e;
|
|
144
|
+
}
|
|
145
|
+
writeSpy.mockRestore();
|
|
146
|
+
expect(caught).toBeInstanceOf(CLIError);
|
|
147
|
+
expect(caught?.message).toContain('--link requires a non-empty entry ID');
|
|
148
|
+
expect(kernelCallWithSessionMock).not.toHaveBeenCalledWith('chain.createEntryRelation', expect.anything());
|
|
149
|
+
});
|
|
150
|
+
// WP-688 S4 review round 5 (bcRUMR): the target entry doesn't exist — the recovery
|
|
151
|
+
// guidance must say so rather than recommending `pb relate <verb> <missing-id>`.
|
|
152
|
+
it('--link <missing-id> without --link-type reports the target was not found, not a verb-recovery command', async () => {
|
|
153
|
+
kernelCallWithSessionMock.mockImplementation((fn, args) => {
|
|
154
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
155
|
+
return Promise.resolve([]);
|
|
156
|
+
if (fn === 'chain.createEntry')
|
|
157
|
+
return Promise.resolve({ docId: 'doc-miss', entryId: 'TEN-721' });
|
|
158
|
+
if (fn === 'chain.getEntry') {
|
|
159
|
+
const entryId = args?.entryId;
|
|
160
|
+
if (entryId === 'TEN-721')
|
|
161
|
+
return Promise.resolve({ entryId: 'TEN-721', name: 'x', status: 'draft', canonicalKey: 'tension' });
|
|
162
|
+
return Promise.resolve(null); // GHOST-1 does not exist
|
|
163
|
+
}
|
|
164
|
+
if (fn === 'chain.listEntries') {
|
|
165
|
+
return Promise.resolve([{ entryId: 'TYPE-tension', name: 'tension', status: 'active', data: { canonical_key: 'tension', valid_relation_types: ['informs'], description: 'x', cardinality_rule: 'multiple' } }]);
|
|
166
|
+
}
|
|
167
|
+
return Promise.resolve({});
|
|
168
|
+
});
|
|
169
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
170
|
+
let caught;
|
|
171
|
+
try {
|
|
172
|
+
await runCapture({ text: 'TEN: bad target', link: 'GHOST-1' });
|
|
173
|
+
}
|
|
174
|
+
catch (e) {
|
|
175
|
+
caught = e;
|
|
176
|
+
}
|
|
177
|
+
writeSpy.mockRestore();
|
|
178
|
+
expect(caught?.guidance).toContain('not found');
|
|
179
|
+
expect(caught?.guidance).toContain('GHOST-1');
|
|
180
|
+
expect(caught?.guidance).not.toContain('pb relate');
|
|
181
|
+
});
|
|
182
|
+
// WP-688 S4 review round 3 (bc4Pj): `replaces`/`do_not_confuse_with` are declared for
|
|
183
|
+
// scoring but hard-refused at the generic relate door with a DIFFERENT recovery command
|
|
184
|
+
// (setSupersededBy / addDoNotConfuseWith, guards.ts:308-321) — listing them as usable via
|
|
185
|
+
// `pb relate` would name a guaranteed-to-fail re-run.
|
|
186
|
+
it('excludes replaces and do_not_confuse_with from the refusal\'s legal-verb list (both are door-blocked)', async () => {
|
|
187
|
+
kernelCallWithSessionMock.mockImplementation((fn, args) => {
|
|
188
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
189
|
+
return Promise.resolve([]);
|
|
190
|
+
if (fn === 'chain.createEntry')
|
|
191
|
+
return Promise.resolve({ docId: 'doc-1c', entryId: 'DEC-1' });
|
|
192
|
+
if (fn === 'chain.getEntry') {
|
|
193
|
+
const entryId = args?.entryId;
|
|
194
|
+
if (entryId === 'DEC-1')
|
|
195
|
+
return Promise.resolve({ entryId: 'DEC-1', name: 'x', status: 'draft', canonicalKey: 'decision' });
|
|
196
|
+
return Promise.resolve(null);
|
|
197
|
+
}
|
|
198
|
+
if (fn === 'chain.listEntries') {
|
|
199
|
+
return Promise.resolve([{ entryId: 'TYPE-decision', name: 'decision', status: 'active', data: { canonical_key: 'decision', valid_relation_types: ['informs', 'governs', 'replaces', 'conflicts_with'], description: 'x', cardinality_rule: 'multiple' } }]);
|
|
200
|
+
}
|
|
201
|
+
return Promise.resolve({});
|
|
202
|
+
});
|
|
203
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
204
|
+
let caught;
|
|
205
|
+
try {
|
|
206
|
+
await runCapture({ text: 'DEC: no link-type', link: 'STD-1' });
|
|
207
|
+
}
|
|
208
|
+
catch (e) {
|
|
209
|
+
caught = e;
|
|
210
|
+
}
|
|
211
|
+
writeSpy.mockRestore();
|
|
212
|
+
expect(caught?.message).toContain('informs, governs, conflicts_with');
|
|
213
|
+
expect(caught?.message).not.toContain('replaces');
|
|
214
|
+
});
|
|
215
|
+
// WP-688 S4 review round 5 (bdB5K): registry reconciliation deliberately preserves a
|
|
216
|
+
// workspace's customized valid_relation_types even when it contains a verb outside the
|
|
217
|
+
// kernel ALLOWED_RELATION_TYPES allowlist (registryReconcile.test.ts:131-147) — a supported
|
|
218
|
+
// persisted state, not malformed data. guardRelation still refuses it (guards.ts:302-307),
|
|
219
|
+
// so it must never be listed as a `pb relate`-usable recovery verb.
|
|
220
|
+
it('excludes a declared verb outside the kernel allowlist from the refusal\'s legal-verb list', async () => {
|
|
221
|
+
kernelCallWithSessionMock.mockImplementation((fn, args) => {
|
|
222
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
223
|
+
return Promise.resolve([]);
|
|
224
|
+
if (fn === 'chain.createEntry')
|
|
225
|
+
return Promise.resolve({ docId: 'doc-1d', entryId: 'GOAL-1' });
|
|
226
|
+
if (fn === 'chain.getEntry') {
|
|
227
|
+
const entryId = args?.entryId;
|
|
228
|
+
if (entryId === 'GOAL-1')
|
|
229
|
+
return Promise.resolve({ entryId: 'GOAL-1', name: 'x', status: 'draft', canonicalKey: 'goal' });
|
|
230
|
+
return Promise.resolve(null);
|
|
231
|
+
}
|
|
232
|
+
if (fn === 'chain.listEntries') {
|
|
233
|
+
return Promise.resolve([{ entryId: 'TYPE-goal', name: 'goal', status: 'active', data: { canonical_key: 'goal', valid_relation_types: ['informs', 'depends_on', 'custom_hand_added'], description: 'x', cardinality_rule: 'multiple' } }]);
|
|
234
|
+
}
|
|
235
|
+
return Promise.resolve({});
|
|
236
|
+
});
|
|
237
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
238
|
+
let caught;
|
|
239
|
+
try {
|
|
240
|
+
await runCapture({ text: 'GOAL: no link-type', link: 'BET-1' });
|
|
241
|
+
}
|
|
242
|
+
catch (e) {
|
|
243
|
+
caught = e;
|
|
244
|
+
}
|
|
245
|
+
writeSpy.mockRestore();
|
|
246
|
+
expect(caught?.message).toContain('informs, depends_on');
|
|
247
|
+
expect(caught?.message).not.toContain('custom_hand_added');
|
|
248
|
+
});
|
|
249
|
+
// WP-688 S4 review round 5 (cQFZ_): belongs_to/authority_domain toward a domain-tagged
|
|
250
|
+
// target require ratification metadata (stagingEntryId + source) that `pb relate` cannot
|
|
251
|
+
// supply (guards.ts:349-363) — never recommend them as recovery verbs for such a target.
|
|
252
|
+
it('excludes domain-tag verbs from the refusal\'s legal-verb list when the target is a domain', async () => {
|
|
253
|
+
kernelCallWithSessionMock.mockImplementation((fn, args) => {
|
|
254
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
255
|
+
return Promise.resolve([]);
|
|
256
|
+
if (fn === 'chain.createEntry')
|
|
257
|
+
return Promise.resolve({ docId: 'doc-1e', entryId: 'INS-1' });
|
|
258
|
+
if (fn === 'chain.getEntry') {
|
|
259
|
+
const entryId = args?.entryId;
|
|
260
|
+
if (entryId === 'INS-1')
|
|
261
|
+
return Promise.resolve({ entryId: 'INS-1', name: 'x', status: 'draft', canonicalKey: 'insight' });
|
|
262
|
+
if (entryId === 'DOM-1')
|
|
263
|
+
return Promise.resolve({ entryId: 'DOM-1', name: 'product-design', status: 'active', canonicalKey: 'domain' });
|
|
264
|
+
return Promise.resolve(null);
|
|
265
|
+
}
|
|
266
|
+
if (fn === 'chain.listEntries') {
|
|
267
|
+
return Promise.resolve([{ entryId: 'TYPE-insight', name: 'insight', status: 'active', data: { canonical_key: 'insight', valid_relation_types: ['informs', 'belongs_to', 'authority_domain'], description: 'x', cardinality_rule: 'multiple' } }]);
|
|
268
|
+
}
|
|
269
|
+
return Promise.resolve({});
|
|
270
|
+
});
|
|
271
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
272
|
+
let caught;
|
|
273
|
+
try {
|
|
274
|
+
await runCapture({ text: 'INS: no link-type', link: 'DOM-1' });
|
|
275
|
+
}
|
|
276
|
+
catch (e) {
|
|
277
|
+
caught = e;
|
|
278
|
+
}
|
|
279
|
+
writeSpy.mockRestore();
|
|
280
|
+
expect(caught?.message).toContain('Legal relation types for this entry: informs.');
|
|
281
|
+
expect(caught?.message).not.toContain('belongs_to');
|
|
282
|
+
expect(caught?.message).not.toContain('authority_domain');
|
|
283
|
+
});
|
|
284
|
+
it('uses the supplied relation type when --link-type provided (no probe, real write)', async () => {
|
|
46
285
|
// Prefix "INS:" is extracted → skips classification, routes directly to insights
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
286
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
287
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
288
|
+
return Promise.resolve([]);
|
|
289
|
+
if (fn === 'chain.createEntry')
|
|
290
|
+
return Promise.resolve({ docId: 'doc-2', entryId: 'INS-50' });
|
|
291
|
+
if (fn === 'chain.createEntryRelation')
|
|
292
|
+
return Promise.resolve({ relationId: 'rel-1' });
|
|
293
|
+
return Promise.resolve({});
|
|
294
|
+
});
|
|
50
295
|
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
51
|
-
await runCapture({ text: 'INS: discovered X', link: 'DEC-264',
|
|
52
|
-
expect(
|
|
53
|
-
|
|
296
|
+
await runCapture({ text: 'INS: discovered X', link: 'DEC-264', linkType: 'informed_by' });
|
|
297
|
+
expect(kernelCallWithSessionMock).not.toHaveBeenCalledWith('chain.resolveCollection', expect.anything());
|
|
298
|
+
// A REAL (non-preview) write — the exact verb supplied, echoed verbatim, no probe call.
|
|
299
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.createEntryRelation', {
|
|
54
300
|
fromEntryId: 'INS-50',
|
|
55
301
|
toEntryId: 'DEC-264',
|
|
56
302
|
type: 'informed_by',
|
|
57
303
|
});
|
|
304
|
+
const previewCalls = kernelCallWithSessionMock.mock.calls.filter(([fn, args]) => fn === 'chain.createEntryRelation' && args?.preview);
|
|
305
|
+
expect(previewCalls).toHaveLength(0);
|
|
306
|
+
writeSpy.mockRestore();
|
|
307
|
+
});
|
|
308
|
+
// WP-688 S4 (element 11): the human receipt prints the REAL verb — no `?? 'surfaces_tension_in'`
|
|
309
|
+
// fallback (formatters/capture.ts:105).
|
|
310
|
+
it('the human-readable receipt prints the real relation type, never the dead surfaces_tension_in fallback', async () => {
|
|
311
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
312
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
313
|
+
return Promise.resolve([]);
|
|
314
|
+
if (fn === 'chain.createEntry')
|
|
315
|
+
return Promise.resolve({ docId: 'doc-2b', entryId: 'INS-51' });
|
|
316
|
+
if (fn === 'chain.createEntryRelation')
|
|
317
|
+
return Promise.resolve({ relationId: 'rel-1' });
|
|
318
|
+
return Promise.resolve({});
|
|
319
|
+
});
|
|
320
|
+
let stdoutOutput = '';
|
|
321
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
322
|
+
stdoutOutput += String(chunk);
|
|
323
|
+
return true;
|
|
324
|
+
});
|
|
325
|
+
setOutputMode('pretty'); // force the human receipt path (test harness's stdout is non-TTY)
|
|
326
|
+
try {
|
|
327
|
+
await runCapture({ text: 'INS: discovered Y', link: 'DEC-265', linkType: 'validates' });
|
|
328
|
+
}
|
|
329
|
+
finally {
|
|
330
|
+
setOutputMode('auto');
|
|
331
|
+
writeSpy.mockRestore();
|
|
332
|
+
}
|
|
333
|
+
expect(stdoutOutput).toContain('Linked: → DEC-265 (validates)');
|
|
334
|
+
expect(stdoutOutput).not.toContain('surfaces_tension_in');
|
|
335
|
+
});
|
|
336
|
+
// WP-688 S4 review round 2 (bc04z): a diverted relation call (chain-debt / governs-consent
|
|
337
|
+
// proposal, or the DEC-1399 auto-link gate) returns WITHOUT a relationId — only a real,
|
|
338
|
+
// persisted write may claim `linkedTo`/`relationType`.
|
|
339
|
+
it('a governs-consent proposal diversion (no relationId) is never reported as a persisted link', async () => {
|
|
340
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
341
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
342
|
+
return Promise.resolve([]);
|
|
343
|
+
if (fn === 'chain.createEntry')
|
|
344
|
+
return Promise.resolve({ docId: 'doc-3', entryId: 'WPKG-1' });
|
|
345
|
+
if (fn === 'chain.createEntryRelation') {
|
|
346
|
+
return Promise.resolve({ status: 'proposal_created', proposalId: 'PROP-1', existing: false });
|
|
347
|
+
}
|
|
348
|
+
return Promise.resolve({});
|
|
349
|
+
});
|
|
350
|
+
let stdoutOutput = '';
|
|
351
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
352
|
+
stdoutOutput += String(chunk);
|
|
353
|
+
return true;
|
|
354
|
+
});
|
|
355
|
+
await runCapture({ text: 'WPKG: governance test', link: 'STD-1', linkType: 'governs', json: true });
|
|
356
|
+
writeSpy.mockRestore();
|
|
357
|
+
const output = JSON.parse(stdoutOutput.split('\n').find((line) => {
|
|
358
|
+
try {
|
|
359
|
+
JSON.parse(line);
|
|
360
|
+
return true;
|
|
361
|
+
}
|
|
362
|
+
catch {
|
|
363
|
+
return false;
|
|
364
|
+
}
|
|
365
|
+
}));
|
|
366
|
+
expect(output.relationType).toBeUndefined();
|
|
367
|
+
// WP-688 S4 review fix (bc7cr): the re-eval call STILL fires — it's the only thing that
|
|
368
|
+
// un-defers the LLM schedule deferLLMSchedule set (a relate WAS attempted) — but its
|
|
369
|
+
// verdict is discarded: no relation landed, so relation-dependent criteria stay unscored.
|
|
370
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('quality.evaluateHeuristicAndSchedule', {
|
|
371
|
+
entryId: 'WPKG-1',
|
|
372
|
+
context: 'capture',
|
|
373
|
+
});
|
|
374
|
+
expect(output.coaching).toBeUndefined();
|
|
375
|
+
});
|
|
376
|
+
// WP-688 S4 review round 2 (bc045): --link without --link-type must not defer the LLM
|
|
377
|
+
// schedule — the refusal branch never runs the re-eval that would un-defer it, so a
|
|
378
|
+
// deferred-then-never-run schedule would leave the entry permanently stuck.
|
|
379
|
+
it('--link without --link-type does NOT defer the LLM schedule (nothing will ever un-defer it)', async () => {
|
|
380
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
381
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
382
|
+
return Promise.resolve([]);
|
|
383
|
+
if (fn === 'chain.createEntry')
|
|
384
|
+
return Promise.resolve({ docId: 'doc-4', entryId: 'TEN-20' });
|
|
385
|
+
if (fn === 'chain.createEntryRelation')
|
|
386
|
+
return Promise.resolve({ preview: true, advisories: [] });
|
|
387
|
+
return Promise.resolve({});
|
|
388
|
+
});
|
|
389
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
390
|
+
await expect(runCapture({ text: 'TEN: refused link, no defer', link: 'BET-1' })).rejects.toThrow(CLIError);
|
|
391
|
+
writeSpy.mockRestore();
|
|
392
|
+
const createCall = kernelCallWithSessionMock.mock.calls.find(([fn]) => fn === 'chain.createEntry');
|
|
393
|
+
expect(createCall?.[1]).not.toHaveProperty('deferLLMSchedule');
|
|
394
|
+
});
|
|
395
|
+
// WP-688 S4 review round 2 (bc049): both a fields-rejection and a --link-type refusal can
|
|
396
|
+
// be true on the SAME capture — the entry was created either way, so both recovery
|
|
397
|
+
// instructions must reach the operator, not just whichever check runs first.
|
|
398
|
+
it('surfaces BOTH the fields-rejected error and the link-type refusal when they co-occur', async () => {
|
|
399
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
400
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
401
|
+
return Promise.resolve([]);
|
|
402
|
+
if (fn === 'chain.createEntry') {
|
|
403
|
+
return Promise.resolve({
|
|
404
|
+
docId: 'doc-5', entryId: 'TEN-21',
|
|
405
|
+
normalization: { remapped: {}, rejected: ['badField'], accepted: [] },
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
if (fn === 'chain.createEntryRelation')
|
|
409
|
+
return Promise.resolve({ preview: true, advisories: [] });
|
|
410
|
+
return Promise.resolve({});
|
|
411
|
+
});
|
|
412
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
413
|
+
let caught;
|
|
414
|
+
try {
|
|
415
|
+
await runCapture({ text: 'TEN: both failures at once', link: 'BET-1' });
|
|
416
|
+
}
|
|
417
|
+
catch (e) {
|
|
418
|
+
caught = e;
|
|
419
|
+
}
|
|
420
|
+
writeSpy.mockRestore();
|
|
421
|
+
expect(caught).toBeInstanceOf(CLIError);
|
|
422
|
+
expect(caught?.message).toContain('Fields rejected: badField');
|
|
423
|
+
expect(caught?.message).toContain('--link requires --link-type');
|
|
424
|
+
expect(caught?.guidance).toContain('pb fields');
|
|
425
|
+
expect(caught?.guidance).toContain('TEN-21');
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
// WP-684 TASK-77 (E1.3): one-step typed create — --entry-type forwards to chain.createEntry's
|
|
429
|
+
// existing `canonicalKey` arg. Named --entry-type since -t/--type is the --link relation type.
|
|
430
|
+
describe('runCapture --entry-type', () => {
|
|
431
|
+
beforeEach(() => {
|
|
432
|
+
kernelCallWithSessionMock.mockReset();
|
|
433
|
+
mockSession = { sessionId: 'sess-test' };
|
|
434
|
+
});
|
|
435
|
+
it('forwards --entry-type as canonicalKey on the chain.createEntry payload', async () => {
|
|
436
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
437
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
438
|
+
return Promise.resolve([]);
|
|
439
|
+
if (fn === 'chain.createEntry')
|
|
440
|
+
return Promise.resolve({ docId: 'doc-3', entryId: 'OBJ-1' });
|
|
441
|
+
return Promise.resolve({});
|
|
442
|
+
});
|
|
443
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
444
|
+
await runCapture({ text: 'the objective', collection: 'key-results', entryType: 'objective' });
|
|
445
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.objectContaining({
|
|
446
|
+
collectionSlug: 'key-results',
|
|
447
|
+
canonicalKey: 'objective',
|
|
448
|
+
}));
|
|
449
|
+
writeSpy.mockRestore();
|
|
450
|
+
});
|
|
451
|
+
it('omits canonicalKey entirely when --entry-type is absent (byte-identical default path)', async () => {
|
|
452
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
453
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
454
|
+
return Promise.resolve([]);
|
|
455
|
+
if (fn === 'chain.createEntry')
|
|
456
|
+
return Promise.resolve({ docId: 'doc-4', entryId: 'KEY-1' });
|
|
457
|
+
return Promise.resolve({});
|
|
458
|
+
});
|
|
459
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
460
|
+
await runCapture({ text: 'a key result', collection: 'key-results' });
|
|
461
|
+
const call = kernelCallWithSessionMock.mock.calls.find(([fn]) => fn === 'chain.createEntry');
|
|
462
|
+
expect(call?.[1]).not.toHaveProperty('canonicalKey');
|
|
463
|
+
writeSpy.mockRestore();
|
|
464
|
+
});
|
|
465
|
+
// Review round 2 (bcI42): --entry-type's help text promises it "bypasses classification",
|
|
466
|
+
// but without an ALSO-explicit --collection, the resolution chain fell through to
|
|
467
|
+
// chain.resolveCollection anyway — objective/key_result text could classify into the wrong
|
|
468
|
+
// collection (e.g. strategy) and then fail the placement guard. --entry-type alone must route
|
|
469
|
+
// straight to the shared Objectives drawer with no classification call at all.
|
|
470
|
+
it('--entry-type objective alone (no --collection) skips classification and routes to the Objectives drawer (bcI42)', async () => {
|
|
471
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
472
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
473
|
+
return Promise.resolve([]);
|
|
474
|
+
if (fn === 'chain.createEntry')
|
|
475
|
+
return Promise.resolve({ docId: 'doc-5', entryId: 'OBJ-2' });
|
|
476
|
+
return Promise.resolve({});
|
|
477
|
+
});
|
|
478
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
479
|
+
await runCapture({ text: 'another objective', entryType: 'objective' });
|
|
480
|
+
expect(kernelCallWithSessionMock).not.toHaveBeenCalledWith('chain.resolveCollection', expect.anything());
|
|
481
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.objectContaining({
|
|
482
|
+
collectionSlug: 'key-results',
|
|
483
|
+
canonicalKey: 'objective',
|
|
484
|
+
}));
|
|
485
|
+
writeSpy.mockRestore();
|
|
486
|
+
});
|
|
487
|
+
it('--entry-type key_result alone (no --collection) also routes to the Objectives drawer (bcI42)', async () => {
|
|
488
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
489
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
490
|
+
return Promise.resolve([]);
|
|
491
|
+
if (fn === 'chain.createEntry')
|
|
492
|
+
return Promise.resolve({ docId: 'doc-6', entryId: 'KEY-2' });
|
|
493
|
+
return Promise.resolve({});
|
|
494
|
+
});
|
|
495
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
496
|
+
await runCapture({ text: 'another key result', entryType: 'key_result' });
|
|
497
|
+
expect(kernelCallWithSessionMock).not.toHaveBeenCalledWith('chain.resolveCollection', expect.anything());
|
|
498
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.objectContaining({
|
|
499
|
+
collectionSlug: 'key-results',
|
|
500
|
+
canonicalKey: 'key_result',
|
|
501
|
+
}));
|
|
502
|
+
writeSpy.mockRestore();
|
|
503
|
+
});
|
|
504
|
+
// Review round 3 (bclZ9): --entry-type Objective (mixed case) or " objective " (whitespace)
|
|
505
|
+
// must route to the drawer too -- the server normalizes explicit keys with
|
|
506
|
+
// toLowerCase().trim() downstream, so client-side routing must match or it falls through to
|
|
507
|
+
// classification (often landing in 'strategy') and the placement guard then rejects it.
|
|
508
|
+
it('--entry-type with mixed case/whitespace still routes to the Objectives drawer, no classification call (bclZ9)', async () => {
|
|
509
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
510
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
511
|
+
return Promise.resolve([]);
|
|
512
|
+
if (fn === 'chain.createEntry')
|
|
513
|
+
return Promise.resolve({ docId: 'doc-7', entryId: 'OBJ-3' });
|
|
514
|
+
return Promise.resolve({});
|
|
515
|
+
});
|
|
516
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
517
|
+
await runCapture({ text: 'a padded objective', entryType: ' Objective ' });
|
|
518
|
+
expect(kernelCallWithSessionMock).not.toHaveBeenCalledWith('chain.resolveCollection', expect.anything());
|
|
519
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.objectContaining({
|
|
520
|
+
collectionSlug: 'key-results',
|
|
521
|
+
}));
|
|
58
522
|
writeSpy.mockRestore();
|
|
59
523
|
});
|
|
60
524
|
});
|
|
61
525
|
describe('runCapture --json', () => {
|
|
62
526
|
beforeEach(() => {
|
|
63
|
-
|
|
527
|
+
kernelCallWithSessionMock.mockReset();
|
|
64
528
|
mockSession = { sessionId: 'sess-test' };
|
|
65
529
|
});
|
|
66
530
|
it('outputs valid JSON with id field and no other stdout', async () => {
|
|
67
531
|
// Prefix "TEN:" is extracted → skips classification
|
|
68
|
-
|
|
69
|
-
|
|
532
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
533
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
534
|
+
return Promise.resolve([]);
|
|
535
|
+
if (fn === 'chain.createEntry')
|
|
536
|
+
return Promise.resolve({ docId: 'doc-1', entryId: 'TEN-711' });
|
|
537
|
+
return Promise.resolve({});
|
|
538
|
+
});
|
|
70
539
|
let stdoutOutput = '';
|
|
71
540
|
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
72
541
|
stdoutOutput += String(chunk);
|
|
@@ -91,20 +560,205 @@ describe('runCapture --json', () => {
|
|
|
91
560
|
expect(output).toHaveProperty('confidence');
|
|
92
561
|
});
|
|
93
562
|
});
|
|
563
|
+
describe('runCapture coaching passthrough (WP-475 E1)', () => {
|
|
564
|
+
beforeEach(() => {
|
|
565
|
+
kernelCallWithSessionMock.mockReset();
|
|
566
|
+
mockSession = { sessionId: 'sess-test' };
|
|
567
|
+
});
|
|
568
|
+
const coaching = {
|
|
569
|
+
source: 'heuristic',
|
|
570
|
+
verdict: {
|
|
571
|
+
entryId: 'DEC-77',
|
|
572
|
+
canonicalKey: 'decision',
|
|
573
|
+
tier: 'assertive',
|
|
574
|
+
context: 'capture',
|
|
575
|
+
passed: false,
|
|
576
|
+
criteria: [
|
|
577
|
+
{ id: 'specificity', passed: false, weight: 2, hint: 'Be specific.', questionTemplate: 'What exactly?' },
|
|
578
|
+
],
|
|
579
|
+
weakest: { criterion: 'specificity', hint: 'Be specific.', questionTemplate: 'What exactly?' },
|
|
580
|
+
overridden: false,
|
|
581
|
+
},
|
|
582
|
+
};
|
|
583
|
+
it('--json output includes the raw coaching object from the write response', async () => {
|
|
584
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
585
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
586
|
+
return Promise.resolve([]);
|
|
587
|
+
if (fn === 'chain.createEntry')
|
|
588
|
+
return Promise.resolve({ docId: 'doc-c1', entryId: 'DEC-77', coaching });
|
|
589
|
+
return Promise.resolve({});
|
|
590
|
+
});
|
|
591
|
+
let stdoutOutput = '';
|
|
592
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
593
|
+
stdoutOutput += String(chunk);
|
|
594
|
+
return true;
|
|
595
|
+
});
|
|
596
|
+
await runCapture({ text: 'DEC: chose something', json: true });
|
|
597
|
+
writeSpy.mockRestore();
|
|
598
|
+
const jsonLines = stdoutOutput.split('\n').filter((line) => {
|
|
599
|
+
try {
|
|
600
|
+
JSON.parse(line);
|
|
601
|
+
return true;
|
|
602
|
+
}
|
|
603
|
+
catch {
|
|
604
|
+
return false;
|
|
605
|
+
}
|
|
606
|
+
});
|
|
607
|
+
expect(jsonLines).toHaveLength(1);
|
|
608
|
+
const output = JSON.parse(jsonLines[0]);
|
|
609
|
+
expect(output.coaching).toEqual(coaching);
|
|
610
|
+
});
|
|
611
|
+
it('--json output omits coaching when the write response has none (backward compat)', async () => {
|
|
612
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
613
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
614
|
+
return Promise.resolve([]);
|
|
615
|
+
if (fn === 'chain.createEntry')
|
|
616
|
+
return Promise.resolve({ docId: 'doc-c2', entryId: 'DEC-78' });
|
|
617
|
+
return Promise.resolve({});
|
|
618
|
+
});
|
|
619
|
+
let stdoutOutput = '';
|
|
620
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
621
|
+
stdoutOutput += String(chunk);
|
|
622
|
+
return true;
|
|
623
|
+
});
|
|
624
|
+
await runCapture({ text: 'DEC: chose another thing', json: true });
|
|
625
|
+
writeSpy.mockRestore();
|
|
626
|
+
const jsonLines = stdoutOutput.split('\n').filter((line) => {
|
|
627
|
+
try {
|
|
628
|
+
JSON.parse(line);
|
|
629
|
+
return true;
|
|
630
|
+
}
|
|
631
|
+
catch {
|
|
632
|
+
return false;
|
|
633
|
+
}
|
|
634
|
+
});
|
|
635
|
+
expect(jsonLines).toHaveLength(1);
|
|
636
|
+
expect(JSON.parse(jsonLines[0])).not.toHaveProperty('coaching');
|
|
637
|
+
});
|
|
638
|
+
// ── WP-475 E1 fix: relation-aware receipt on --link ────────────────────────
|
|
639
|
+
// The create-response verdict is computed BEFORE the --link relation exists,
|
|
640
|
+
// so relation-dependent criteria (wired-in checks) read falsely failed. When
|
|
641
|
+
// the capture created a relation, the CLI re-evaluates AFTER it lands and
|
|
642
|
+
// renders THAT verdict.
|
|
643
|
+
const reEvalCoaching = {
|
|
644
|
+
source: 'heuristic',
|
|
645
|
+
verdict: {
|
|
646
|
+
...coaching.verdict,
|
|
647
|
+
passed: true,
|
|
648
|
+
criteria: [{ id: 'specificity', passed: true, weight: 2, hint: 'Be specific.', questionTemplate: 'What exactly?' }],
|
|
649
|
+
weakest: null,
|
|
650
|
+
},
|
|
651
|
+
};
|
|
652
|
+
it('--link: re-evaluates after the relation lands and renders the post-relation verdict', async () => {
|
|
653
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
654
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
655
|
+
return Promise.resolve([]);
|
|
656
|
+
if (fn === 'chain.createEntry')
|
|
657
|
+
return Promise.resolve({ docId: 'doc-c3', entryId: 'DEC-79', coaching });
|
|
658
|
+
if (fn === 'chain.createEntryRelation')
|
|
659
|
+
return Promise.resolve({ relationId: 'rel-1' });
|
|
660
|
+
if (fn === 'quality.evaluateHeuristicAndSchedule')
|
|
661
|
+
return Promise.resolve(reEvalCoaching);
|
|
662
|
+
return Promise.resolve({});
|
|
663
|
+
});
|
|
664
|
+
let stdoutOutput = '';
|
|
665
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
666
|
+
stdoutOutput += String(chunk);
|
|
667
|
+
return true;
|
|
668
|
+
});
|
|
669
|
+
await runCapture({ text: 'DEC: chose with a link', link: 'TEN-1', linkType: 'informs', json: true });
|
|
670
|
+
writeSpy.mockRestore();
|
|
671
|
+
// Deterministic --link fix: the CREATE call defers the LLM schedule (the
|
|
672
|
+
// post-relation re-eval owns the single LLM run)…
|
|
673
|
+
const createCall = kernelCallWithSessionMock.mock.calls.find(([fn]) => fn === 'chain.createEntry');
|
|
674
|
+
expect(createCall?.[1]).toMatchObject({ deferLLMSchedule: true });
|
|
675
|
+
// …and the re-eval fires with the created entry, AFTER the relation write,
|
|
676
|
+
// WITHOUT the defer flag (it schedules the LLM run as normal).
|
|
677
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('quality.evaluateHeuristicAndSchedule', {
|
|
678
|
+
entryId: 'DEC-79',
|
|
679
|
+
context: 'capture',
|
|
680
|
+
});
|
|
681
|
+
const callOrder = kernelCallWithSessionMock.mock.calls.map(([fn]) => fn);
|
|
682
|
+
expect(callOrder.indexOf('chain.createEntryRelation')).toBeLessThan(callOrder.indexOf('quality.evaluateHeuristicAndSchedule'));
|
|
683
|
+
// The receipt carries the POST-relation verdict, not the create-response one.
|
|
684
|
+
const jsonLines = stdoutOutput.split('\n').filter((line) => {
|
|
685
|
+
try {
|
|
686
|
+
JSON.parse(line);
|
|
687
|
+
return true;
|
|
688
|
+
}
|
|
689
|
+
catch {
|
|
690
|
+
return false;
|
|
691
|
+
}
|
|
692
|
+
});
|
|
693
|
+
expect(jsonLines).toHaveLength(1);
|
|
694
|
+
expect(JSON.parse(jsonLines[0]).coaching).toEqual(reEvalCoaching);
|
|
695
|
+
});
|
|
696
|
+
it('--link: keeps the create-response verdict when the re-eval fails (fail-open, BR-144)', async () => {
|
|
697
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
698
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
699
|
+
return Promise.resolve([]);
|
|
700
|
+
if (fn === 'chain.createEntry')
|
|
701
|
+
return Promise.resolve({ docId: 'doc-c4', entryId: 'DEC-80', coaching });
|
|
702
|
+
if (fn === 'chain.createEntryRelation')
|
|
703
|
+
return Promise.resolve({ relationId: 'rel-1' });
|
|
704
|
+
if (fn === 'quality.evaluateHeuristicAndSchedule')
|
|
705
|
+
return Promise.reject(new Error('network'));
|
|
706
|
+
return Promise.resolve({});
|
|
707
|
+
});
|
|
708
|
+
let stdoutOutput = '';
|
|
709
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
710
|
+
stdoutOutput += String(chunk);
|
|
711
|
+
return true;
|
|
712
|
+
});
|
|
713
|
+
await runCapture({ text: 'DEC: chose with a broken re-eval', link: 'TEN-2', linkType: 'informs', json: true });
|
|
714
|
+
writeSpy.mockRestore();
|
|
715
|
+
const jsonLines = stdoutOutput.split('\n').filter((line) => {
|
|
716
|
+
try {
|
|
717
|
+
JSON.parse(line);
|
|
718
|
+
return true;
|
|
719
|
+
}
|
|
720
|
+
catch {
|
|
721
|
+
return false;
|
|
722
|
+
}
|
|
723
|
+
});
|
|
724
|
+
expect(jsonLines).toHaveLength(1);
|
|
725
|
+
expect(JSON.parse(jsonLines[0]).coaching).toEqual(coaching);
|
|
726
|
+
});
|
|
727
|
+
it('no --link: does NOT call the re-evaluation and does NOT defer the LLM schedule (plain capture unchanged)', async () => {
|
|
728
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
729
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
730
|
+
return Promise.resolve([]);
|
|
731
|
+
if (fn === 'chain.createEntry')
|
|
732
|
+
return Promise.resolve({ docId: 'doc-c5', entryId: 'DEC-81', coaching });
|
|
733
|
+
return Promise.resolve({});
|
|
734
|
+
});
|
|
735
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
736
|
+
await runCapture({ text: 'DEC: chose without a link', json: true });
|
|
737
|
+
writeSpy.mockRestore();
|
|
738
|
+
expect(kernelCallWithSessionMock).not.toHaveBeenCalledWith('quality.evaluateHeuristicAndSchedule', expect.anything());
|
|
739
|
+
const createCall = kernelCallWithSessionMock.mock.calls.find(([fn]) => fn === 'chain.createEntry');
|
|
740
|
+
expect(createCall?.[1]).not.toHaveProperty('deferLLMSchedule');
|
|
741
|
+
});
|
|
742
|
+
});
|
|
94
743
|
describe('runCapture description field routing', () => {
|
|
95
744
|
beforeEach(() => {
|
|
96
|
-
|
|
745
|
+
kernelCallWithSessionMock.mockReset();
|
|
97
746
|
mockSession = { sessionId: 'sess-test' };
|
|
98
747
|
});
|
|
99
748
|
it('passes description key to createEntry for assumptions (TEN-1258 — remap happens in Convex)', async () => {
|
|
100
749
|
// The CLI always sends `description` — the Convex write gate remaps it to `belief`
|
|
101
750
|
// for the assumptions collection (TEN-1258). Verify the CLI routes correctly and
|
|
102
751
|
// sends the text as description so the Convex remap can fire.
|
|
103
|
-
|
|
104
|
-
|
|
752
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
753
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
754
|
+
return Promise.resolve([]);
|
|
755
|
+
if (fn === 'chain.createEntry')
|
|
756
|
+
return Promise.resolve({ docId: 'doc-5', entryId: 'ASM-1' });
|
|
757
|
+
return Promise.resolve({});
|
|
758
|
+
});
|
|
105
759
|
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
106
760
|
await runCapture({ text: 'ASM: users won\'t pay before seeing value' });
|
|
107
|
-
const createCall =
|
|
761
|
+
const createCall = kernelCallWithSessionMock.mock.calls.find(([fn]) => fn === 'chain.createEntry');
|
|
108
762
|
expect(createCall?.[1]).toMatchObject({
|
|
109
763
|
collectionSlug: 'assumptions',
|
|
110
764
|
name: "users won't pay before seeing value",
|
|
@@ -113,28 +767,224 @@ describe('runCapture description field routing', () => {
|
|
|
113
767
|
writeSpy.mockRestore();
|
|
114
768
|
});
|
|
115
769
|
});
|
|
770
|
+
describe('runCapture --field passthrough', () => {
|
|
771
|
+
beforeEach(() => {
|
|
772
|
+
kernelCallWithSessionMock.mockReset();
|
|
773
|
+
mockSession = { sessionId: 'sess-test' };
|
|
774
|
+
});
|
|
775
|
+
it('merges --field pairs into data', async () => {
|
|
776
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
777
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
778
|
+
return Promise.resolve([]);
|
|
779
|
+
if (fn === 'chain.createEntry')
|
|
780
|
+
return Promise.resolve({ docId: 'doc-6', entryId: 'STD-1' });
|
|
781
|
+
return Promise.resolve({});
|
|
782
|
+
});
|
|
783
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
784
|
+
await runCapture({
|
|
785
|
+
text: 'touched-code stewardship',
|
|
786
|
+
collection: 'standards',
|
|
787
|
+
field: ['rationale=signed specs define scope but agents need permission'],
|
|
788
|
+
});
|
|
789
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.objectContaining({
|
|
790
|
+
data: expect.objectContaining({
|
|
791
|
+
description: 'touched-code stewardship',
|
|
792
|
+
rationale: 'signed specs define scope but agents need permission',
|
|
793
|
+
}),
|
|
794
|
+
}));
|
|
795
|
+
writeSpy.mockRestore();
|
|
796
|
+
});
|
|
797
|
+
it('--field description=X overrides the derived description', async () => {
|
|
798
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
799
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
800
|
+
return Promise.resolve([]);
|
|
801
|
+
if (fn === 'chain.createEntry')
|
|
802
|
+
return Promise.resolve({ docId: 'doc-7', entryId: 'TEN-1' });
|
|
803
|
+
return Promise.resolve({});
|
|
804
|
+
});
|
|
805
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
806
|
+
await runCapture({
|
|
807
|
+
text: 'derived',
|
|
808
|
+
collection: 'tensions',
|
|
809
|
+
field: ['description=explicit'],
|
|
810
|
+
});
|
|
811
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.objectContaining({
|
|
812
|
+
data: expect.objectContaining({ description: 'explicit' }),
|
|
813
|
+
}));
|
|
814
|
+
writeSpy.mockRestore();
|
|
815
|
+
});
|
|
816
|
+
});
|
|
817
|
+
describe('runCapture WHY pre-flight', () => {
|
|
818
|
+
beforeEach(() => {
|
|
819
|
+
kernelCallWithSessionMock.mockReset();
|
|
820
|
+
mockSession = { sessionId: 'sess-test' };
|
|
821
|
+
});
|
|
822
|
+
it('blocks with guidance when governed and whyField is missing', async () => {
|
|
823
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
824
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
825
|
+
return Promise.resolve([]);
|
|
826
|
+
if (fn === 'chain.getCollectionFields') {
|
|
827
|
+
return Promise.resolve({ governed: true, whyField: 'rationale', minChars: 12, fields: [] });
|
|
828
|
+
}
|
|
829
|
+
if (fn === 'chain.createEntry')
|
|
830
|
+
return Promise.resolve({ docId: 'doc-8', entryId: 'STD-2' });
|
|
831
|
+
return Promise.resolve({});
|
|
832
|
+
});
|
|
833
|
+
await expect(runCapture({ text: 'x', collection: 'standards' })).rejects.toThrow(/rationale/);
|
|
834
|
+
expect(kernelCallWithSessionMock).not.toHaveBeenCalledWith('chain.createEntry', expect.anything());
|
|
835
|
+
});
|
|
836
|
+
it('does not block when whyField is description', async () => {
|
|
837
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
838
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
839
|
+
return Promise.resolve([]);
|
|
840
|
+
if (fn === 'chain.getCollectionFields') {
|
|
841
|
+
return Promise.resolve({ governed: true, whyField: 'description', minChars: 12, fields: [] });
|
|
842
|
+
}
|
|
843
|
+
if (fn === 'chain.createEntry')
|
|
844
|
+
return Promise.resolve({ docId: 'doc-9', entryId: 'ARCH-1' });
|
|
845
|
+
return Promise.resolve({});
|
|
846
|
+
});
|
|
847
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
848
|
+
await runCapture({ text: 'an architecture note body', collection: 'architecture' });
|
|
849
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.anything());
|
|
850
|
+
writeSpy.mockRestore();
|
|
851
|
+
});
|
|
852
|
+
it('does not block when description remaps to the whyField (descriptionFieldKey === whyField)', async () => {
|
|
853
|
+
// TEN-1258 regression: `decisions` sets descriptionFieldKey='rationale' and the server
|
|
854
|
+
// remaps data.description → rationale before the WHY gate. A bare `pb capture "DEC: …"`
|
|
855
|
+
// (description set, no --field rationale) must NOT be false-blocked client-side.
|
|
856
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
857
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
858
|
+
return Promise.resolve([]);
|
|
859
|
+
if (fn === 'chain.getCollectionFields') {
|
|
860
|
+
return Promise.resolve({
|
|
861
|
+
governed: true,
|
|
862
|
+
whyField: 'rationale',
|
|
863
|
+
minChars: 12,
|
|
864
|
+
descriptionFieldKey: 'rationale',
|
|
865
|
+
fields: [],
|
|
866
|
+
});
|
|
867
|
+
}
|
|
868
|
+
if (fn === 'chain.createEntry')
|
|
869
|
+
return Promise.resolve({ docId: 'doc-12', entryId: 'DEC-5' });
|
|
870
|
+
return Promise.resolve({});
|
|
871
|
+
});
|
|
872
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
873
|
+
await runCapture({ text: 'chose X because it is simpler', collection: 'decisions' });
|
|
874
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.anything());
|
|
875
|
+
writeSpy.mockRestore();
|
|
876
|
+
});
|
|
877
|
+
it('still blocks a governed collection whose descriptionFieldKey does NOT map to the whyField', async () => {
|
|
878
|
+
// proof_governed has whyField='rationale' but no descriptionFieldKey remap, so a bare
|
|
879
|
+
// capture (no --field rationale) is correctly blocked — the description will not satisfy it.
|
|
880
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
881
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
882
|
+
return Promise.resolve([]);
|
|
883
|
+
if (fn === 'chain.getCollectionFields') {
|
|
884
|
+
return Promise.resolve({
|
|
885
|
+
governed: true,
|
|
886
|
+
whyField: 'rationale',
|
|
887
|
+
minChars: 12,
|
|
888
|
+
descriptionFieldKey: null,
|
|
889
|
+
fields: [],
|
|
890
|
+
});
|
|
891
|
+
}
|
|
892
|
+
if (fn === 'chain.createEntry')
|
|
893
|
+
return Promise.resolve({ docId: 'doc-13', entryId: 'PGV-9' });
|
|
894
|
+
return Promise.resolve({});
|
|
895
|
+
});
|
|
896
|
+
await expect(runCapture({ text: 'x', collection: 'proof_governed' })).rejects.toThrow(/rationale/);
|
|
897
|
+
expect(kernelCallWithSessionMock).not.toHaveBeenCalledWith('chain.createEntry', expect.anything());
|
|
898
|
+
});
|
|
899
|
+
it('fails open and proceeds when the contract fetch fails', async () => {
|
|
900
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
901
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
902
|
+
return Promise.resolve([]);
|
|
903
|
+
if (fn === 'chain.getCollectionFields')
|
|
904
|
+
return Promise.reject(new Error('network'));
|
|
905
|
+
if (fn === 'chain.createEntry')
|
|
906
|
+
return Promise.resolve({ docId: 'doc-10', entryId: 'STD-3' });
|
|
907
|
+
return Promise.resolve({});
|
|
908
|
+
});
|
|
909
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
910
|
+
await runCapture({
|
|
911
|
+
text: 'x',
|
|
912
|
+
collection: 'standards',
|
|
913
|
+
field: ['rationale=enough characters here ok'],
|
|
914
|
+
});
|
|
915
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.anything());
|
|
916
|
+
writeSpy.mockRestore();
|
|
917
|
+
});
|
|
918
|
+
it('fails open when the contract fetch rejects with a CLIError (server 4xx/5xx surfaces as McpError, an instanceof CLIError)', async () => {
|
|
919
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
920
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
921
|
+
return Promise.resolve([]);
|
|
922
|
+
if (fn === 'chain.getCollectionFields') {
|
|
923
|
+
return Promise.reject(new CLIError('Could not reach test.convex.site.', {
|
|
924
|
+
code: ErrorCode.NETWORK_UNREACHABLE,
|
|
925
|
+
category: 'network',
|
|
926
|
+
}));
|
|
927
|
+
}
|
|
928
|
+
if (fn === 'chain.createEntry')
|
|
929
|
+
return Promise.resolve({ docId: 'doc-11', entryId: 'STD-4' });
|
|
930
|
+
return Promise.resolve({});
|
|
931
|
+
});
|
|
932
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
933
|
+
await runCapture({
|
|
934
|
+
text: 'x',
|
|
935
|
+
collection: 'standards',
|
|
936
|
+
field: ['rationale=enough characters here ok'],
|
|
937
|
+
});
|
|
938
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.anything());
|
|
939
|
+
writeSpy.mockRestore();
|
|
940
|
+
});
|
|
941
|
+
it('surfaces the server WHY-gate reason on rejection', async () => {
|
|
942
|
+
const serverReason = 'Governance entries (standard) require an explicit WHY before they can be created. Set "rationale" to at least 12 characters.';
|
|
943
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
944
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
945
|
+
return Promise.resolve([]);
|
|
946
|
+
if (fn === 'chain.getCollectionFields') {
|
|
947
|
+
return Promise.resolve({ governed: true, whyField: 'rationale', minChars: 12, fields: [] });
|
|
948
|
+
}
|
|
949
|
+
if (fn === 'chain.createEntry')
|
|
950
|
+
return Promise.reject(new Error(serverReason));
|
|
951
|
+
return Promise.resolve({});
|
|
952
|
+
});
|
|
953
|
+
await expect(runCapture({
|
|
954
|
+
text: 'x',
|
|
955
|
+
collection: 'standards',
|
|
956
|
+
field: ['rationale=short'],
|
|
957
|
+
})).rejects.toThrow(/at least 12 characters/);
|
|
958
|
+
});
|
|
959
|
+
});
|
|
116
960
|
describe('runCapture classification guard', () => {
|
|
117
961
|
beforeEach(() => {
|
|
118
|
-
|
|
962
|
+
kernelCallWithSessionMock.mockReset();
|
|
119
963
|
mockSession = { sessionId: 'sess-test' };
|
|
120
964
|
});
|
|
121
965
|
it('throws CLIError when classification requires review', async () => {
|
|
122
|
-
|
|
966
|
+
kernelCallWithSessionMock.mockResolvedValueOnce(null);
|
|
123
967
|
await expect(runCapture({ text: 'Ambiguous capture' })).rejects.toThrow('Classification needs review before capture can continue.');
|
|
124
968
|
});
|
|
125
969
|
});
|
|
126
970
|
describe('runCapture date inference', () => {
|
|
127
971
|
beforeEach(() => {
|
|
128
|
-
|
|
972
|
+
kernelCallWithSessionMock.mockReset();
|
|
129
973
|
mockSession = { sessionId: 'sess-test' };
|
|
130
974
|
});
|
|
131
975
|
it('does not default date to today when no source date is present', async () => {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
976
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
977
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
978
|
+
return Promise.resolve([]);
|
|
979
|
+
if (fn === 'chain.resolveCollection')
|
|
980
|
+
return Promise.resolve({ collection: 'decisions', confidence: 0.9, tier: 'high' });
|
|
981
|
+
if (fn === 'chain.createEntry')
|
|
982
|
+
return Promise.resolve({ docId: 'doc-3', entryId: 'DEC-10' });
|
|
983
|
+
return Promise.resolve({});
|
|
984
|
+
});
|
|
135
985
|
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
136
986
|
await runCapture({ text: 'Decision without explicit source date' });
|
|
137
|
-
const createCall =
|
|
987
|
+
const createCall = kernelCallWithSessionMock.mock.calls.find(([fn]) => fn === 'chain.createEntry');
|
|
138
988
|
expect(createCall?.[1]).toMatchObject({
|
|
139
989
|
collectionSlug: 'decisions',
|
|
140
990
|
data: { description: 'Decision without explicit source date' },
|
|
@@ -143,14 +993,206 @@ describe('runCapture date inference', () => {
|
|
|
143
993
|
writeSpy.mockRestore();
|
|
144
994
|
});
|
|
145
995
|
it('uses inferred source date when the capture text includes one', async () => {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
996
|
+
kernelCallWithSessionMock.mockImplementation((fn) => {
|
|
997
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
998
|
+
return Promise.resolve([]);
|
|
999
|
+
if (fn === 'chain.resolveCollection')
|
|
1000
|
+
return Promise.resolve({ collection: 'decisions', confidence: 0.9, tier: 'high' });
|
|
1001
|
+
if (fn === 'chain.createEntry')
|
|
1002
|
+
return Promise.resolve({ docId: 'doc-4', entryId: 'DEC-11' });
|
|
1003
|
+
return Promise.resolve({});
|
|
1004
|
+
});
|
|
149
1005
|
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
150
1006
|
await runCapture({ text: 'Decision from April 1, 2026 steering meeting' });
|
|
151
|
-
const createCall =
|
|
1007
|
+
const createCall = kernelCallWithSessionMock.mock.calls.find(([fn]) => fn === 'chain.createEntry');
|
|
152
1008
|
expect((createCall?.[1]).data.date).toBe('2026-04-01');
|
|
153
1009
|
writeSpy.mockRestore();
|
|
154
1010
|
});
|
|
155
1011
|
});
|
|
1012
|
+
// ---------------------------------------------------------------------------
|
|
1013
|
+
// WP-319 S3: Pre-write grounding tests
|
|
1014
|
+
// ---------------------------------------------------------------------------
|
|
1015
|
+
describe('runCapture WP-319 grounding', () => {
|
|
1016
|
+
const emptyGrounding = { index: 0, related: [], duplicates: [], governance: [], v: 1 };
|
|
1017
|
+
const groundingWithDuplicate = {
|
|
1018
|
+
index: 0,
|
|
1019
|
+
related: [],
|
|
1020
|
+
duplicates: [{ entryId: 'TEN-5', name: 'Similar tension', collectionSlug: 'tensions', matchType: 'possible_duplicate', overlapRatio: 0.9 }],
|
|
1021
|
+
governance: [],
|
|
1022
|
+
v: 1,
|
|
1023
|
+
};
|
|
1024
|
+
beforeEach(() => {
|
|
1025
|
+
kernelCallWithSessionMock.mockReset();
|
|
1026
|
+
mockSession = { sessionId: 'sess-test' };
|
|
1027
|
+
delete process.env.PB_GROUNDING_MODE;
|
|
1028
|
+
});
|
|
1029
|
+
it('fires chain.suggestLinksForCapture in parallel and still calls createEntry', async () => {
|
|
1030
|
+
// Prefix-based route skips classification; grounding fires for TEN prefix
|
|
1031
|
+
kernelCallWithSessionMock
|
|
1032
|
+
.mockImplementation((fn) => {
|
|
1033
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
1034
|
+
return Promise.resolve([emptyGrounding]);
|
|
1035
|
+
if (fn === 'chain.createEntry')
|
|
1036
|
+
return Promise.resolve({ docId: 'doc-1', entryId: 'TEN-720' });
|
|
1037
|
+
return Promise.resolve({});
|
|
1038
|
+
});
|
|
1039
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
1040
|
+
const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
|
|
1041
|
+
await runCapture({ text: 'TEN: grounding test tension' });
|
|
1042
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.suggestLinksForCapture', expect.objectContaining({
|
|
1043
|
+
entries: expect.arrayContaining([expect.objectContaining({ name: 'grounding test tension' })]),
|
|
1044
|
+
}));
|
|
1045
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.anything());
|
|
1046
|
+
writeSpy.mockRestore();
|
|
1047
|
+
stderrSpy.mockRestore();
|
|
1048
|
+
});
|
|
1049
|
+
it('does NOT block capture when grounding call fails', async () => {
|
|
1050
|
+
kernelCallWithSessionMock
|
|
1051
|
+
.mockImplementation((fn) => {
|
|
1052
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
1053
|
+
return Promise.reject(new Error('network error'));
|
|
1054
|
+
if (fn === 'chain.createEntry')
|
|
1055
|
+
return Promise.resolve({ docId: 'doc-2', entryId: 'TEN-721' });
|
|
1056
|
+
return Promise.resolve({});
|
|
1057
|
+
});
|
|
1058
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
1059
|
+
const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
|
|
1060
|
+
// Must not throw — grounding failure is fail-open
|
|
1061
|
+
await expect(runCapture({ text: 'TEN: grounding failure test' })).resolves.toBeUndefined();
|
|
1062
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.anything());
|
|
1063
|
+
writeSpy.mockRestore();
|
|
1064
|
+
stderrSpy.mockRestore();
|
|
1065
|
+
});
|
|
1066
|
+
it('--suggest-only does NOT call createEntry and outputs grounding data', async () => {
|
|
1067
|
+
// In test env (non-TTY), isJsonMode() returns true → JSON path is taken.
|
|
1068
|
+
kernelCallWithSessionMock
|
|
1069
|
+
.mockImplementation((fn) => {
|
|
1070
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
1071
|
+
return Promise.resolve([groundingWithDuplicate]);
|
|
1072
|
+
return Promise.resolve({});
|
|
1073
|
+
});
|
|
1074
|
+
let stdoutOutput = '';
|
|
1075
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
1076
|
+
stdoutOutput += String(chunk);
|
|
1077
|
+
return true;
|
|
1078
|
+
});
|
|
1079
|
+
const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
|
|
1080
|
+
await runCapture({ text: 'TEN: duplicate candidate', suggestOnly: true });
|
|
1081
|
+
expect(kernelCallWithSessionMock).not.toHaveBeenCalledWith('chain.createEntry', expect.anything());
|
|
1082
|
+
// JSON output contains suggestOnly flag and grounding report
|
|
1083
|
+
const jsonLines = stdoutOutput.split('\n').filter((l) => { try {
|
|
1084
|
+
JSON.parse(l);
|
|
1085
|
+
return true;
|
|
1086
|
+
}
|
|
1087
|
+
catch {
|
|
1088
|
+
return false;
|
|
1089
|
+
} });
|
|
1090
|
+
expect(jsonLines).toHaveLength(1);
|
|
1091
|
+
const parsed = JSON.parse(jsonLines[0]);
|
|
1092
|
+
expect(parsed.suggestOnly).toBe(true);
|
|
1093
|
+
expect(parsed.groundingReport).toBeDefined();
|
|
1094
|
+
writeSpy.mockRestore();
|
|
1095
|
+
stderrSpy.mockRestore();
|
|
1096
|
+
});
|
|
1097
|
+
it('--suggest-only with --json outputs machine-readable object without calling createEntry', async () => {
|
|
1098
|
+
kernelCallWithSessionMock
|
|
1099
|
+
.mockImplementation((fn) => {
|
|
1100
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
1101
|
+
return Promise.resolve([emptyGrounding]);
|
|
1102
|
+
return Promise.resolve({});
|
|
1103
|
+
});
|
|
1104
|
+
let stdoutOutput = '';
|
|
1105
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
1106
|
+
stdoutOutput += String(chunk);
|
|
1107
|
+
return true;
|
|
1108
|
+
});
|
|
1109
|
+
const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
|
|
1110
|
+
await runCapture({ text: 'TEN: dry run json', json: true, suggestOnly: true });
|
|
1111
|
+
expect(kernelCallWithSessionMock).not.toHaveBeenCalledWith('chain.createEntry', expect.anything());
|
|
1112
|
+
const jsonLines = stdoutOutput.split('\n').filter((l) => { try {
|
|
1113
|
+
JSON.parse(l);
|
|
1114
|
+
return true;
|
|
1115
|
+
}
|
|
1116
|
+
catch {
|
|
1117
|
+
return false;
|
|
1118
|
+
} });
|
|
1119
|
+
expect(jsonLines).toHaveLength(1);
|
|
1120
|
+
const parsed = JSON.parse(jsonLines[0]);
|
|
1121
|
+
expect(parsed.suggestOnly).toBe(true);
|
|
1122
|
+
writeSpy.mockRestore();
|
|
1123
|
+
stderrSpy.mockRestore();
|
|
1124
|
+
});
|
|
1125
|
+
it('banner is suppressed when grounding has no matches (zero-noise floor)', async () => {
|
|
1126
|
+
kernelCallWithSessionMock
|
|
1127
|
+
.mockImplementation((fn) => {
|
|
1128
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
1129
|
+
return Promise.resolve([emptyGrounding]);
|
|
1130
|
+
if (fn === 'chain.createEntry')
|
|
1131
|
+
return Promise.resolve({ docId: 'doc-3', entryId: 'TEN-722' });
|
|
1132
|
+
return Promise.resolve({});
|
|
1133
|
+
});
|
|
1134
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
1135
|
+
const stderrLines = [];
|
|
1136
|
+
const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation((chunk) => {
|
|
1137
|
+
stderrLines.push(String(chunk));
|
|
1138
|
+
return true;
|
|
1139
|
+
});
|
|
1140
|
+
await runCapture({ text: 'TEN: no matches tension' });
|
|
1141
|
+
// No "Grounding" banner in stderr when zero matches
|
|
1142
|
+
const groundingInStderr = stderrLines.some((l) => l.includes('Grounding'));
|
|
1143
|
+
expect(groundingInStderr).toBe(false);
|
|
1144
|
+
writeSpy.mockRestore();
|
|
1145
|
+
stderrSpy.mockRestore();
|
|
1146
|
+
});
|
|
1147
|
+
it('PB_GROUNDING_MODE=off skips grounding call entirely', async () => {
|
|
1148
|
+
process.env.PB_GROUNDING_MODE = 'off';
|
|
1149
|
+
kernelCallWithSessionMock
|
|
1150
|
+
.mockImplementation((fn) => {
|
|
1151
|
+
if (fn === 'chain.createEntry')
|
|
1152
|
+
return Promise.resolve({ docId: 'doc-4', entryId: 'TEN-723' });
|
|
1153
|
+
return Promise.resolve({});
|
|
1154
|
+
});
|
|
1155
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
1156
|
+
const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
|
|
1157
|
+
await runCapture({ text: 'TEN: no grounding env off' });
|
|
1158
|
+
expect(kernelCallWithSessionMock).not.toHaveBeenCalledWith('chain.suggestLinksForCapture', expect.anything());
|
|
1159
|
+
expect(kernelCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.anything());
|
|
1160
|
+
delete process.env.PB_GROUNDING_MODE;
|
|
1161
|
+
writeSpy.mockRestore();
|
|
1162
|
+
stderrSpy.mockRestore();
|
|
1163
|
+
});
|
|
1164
|
+
it('--json output stdout is clean (no grounding on stdout)', async () => {
|
|
1165
|
+
kernelCallWithSessionMock
|
|
1166
|
+
.mockImplementation((fn) => {
|
|
1167
|
+
if (fn === 'chain.suggestLinksForCapture')
|
|
1168
|
+
return Promise.resolve([groundingWithDuplicate]);
|
|
1169
|
+
if (fn === 'chain.createEntry')
|
|
1170
|
+
return Promise.resolve({ docId: 'doc-5', entryId: 'TEN-724' });
|
|
1171
|
+
return Promise.resolve({});
|
|
1172
|
+
});
|
|
1173
|
+
let stdoutOutput = '';
|
|
1174
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
1175
|
+
stdoutOutput += String(chunk);
|
|
1176
|
+
return true;
|
|
1177
|
+
});
|
|
1178
|
+
const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
|
|
1179
|
+
await runCapture({ text: 'TEN: json clean stdout', json: true });
|
|
1180
|
+
// Stdout must be exactly one valid JSON line (jq .id must work)
|
|
1181
|
+
const jsonLines = stdoutOutput.split('\n').filter((l) => { try {
|
|
1182
|
+
JSON.parse(l);
|
|
1183
|
+
return true;
|
|
1184
|
+
}
|
|
1185
|
+
catch {
|
|
1186
|
+
return false;
|
|
1187
|
+
} });
|
|
1188
|
+
expect(jsonLines).toHaveLength(1);
|
|
1189
|
+
const parsed = JSON.parse(jsonLines[0]);
|
|
1190
|
+
expect(parsed.id).toBe('TEN-724');
|
|
1191
|
+
// No grounding content in stdout
|
|
1192
|
+
expect(stdoutOutput).not.toContain('Grounding');
|
|
1193
|
+
expect(stdoutOutput).not.toContain('duplicate');
|
|
1194
|
+
writeSpy.mockRestore();
|
|
1195
|
+
stderrSpy.mockRestore();
|
|
1196
|
+
});
|
|
1197
|
+
});
|
|
156
1198
|
//# sourceMappingURL=capture.test.js.map
|