@productbrain/cli 0.1.0-beta.15 → 0.1.0-beta.1522
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 +76 -115
- package/dist/__tests__/adapters.test.d.ts +2 -0
- package/dist/__tests__/adapters.test.d.ts.map +1 -0
- package/dist/__tests__/adapters.test.js +417 -0
- package/dist/__tests__/adapters.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__/batch-transformations.test.d.ts +2 -0
- package/dist/__tests__/batch-transformations.test.d.ts.map +1 -0
- package/dist/__tests__/batch-transformations.test.js +263 -0
- package/dist/__tests__/batch-transformations.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-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 +309 -18
- package/dist/__tests__/capture.test.js.map +1 -1
- 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__/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 +82 -0
- package/dist/__tests__/config-prod-fallthrough.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +8 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +566 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/constants.test.d.ts +2 -0
- package/dist/__tests__/constants.test.d.ts.map +1 -0
- package/dist/__tests__/constants.test.js +146 -0
- package/dist/__tests__/constants.test.js.map +1 -0
- package/dist/__tests__/constellation.test.js +16 -22
- 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__/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 +152 -0
- package/dist/__tests__/envelope-contract.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +118 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/experiment.test.d.ts +6 -0
- package/dist/__tests__/experiment.test.d.ts.map +1 -0
- package/dist/__tests__/experiment.test.js +69 -0
- package/dist/__tests__/experiment.test.js.map +1 -0
- package/dist/__tests__/fields.test.js +36 -36
- package/dist/__tests__/fields.test.js.map +1 -1
- package/dist/__tests__/glossary.test.d.ts +2 -0
- package/dist/__tests__/glossary.test.d.ts.map +1 -0
- package/dist/__tests__/glossary.test.js +32 -0
- package/dist/__tests__/glossary.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 +423 -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 +949 -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 +1252 -0
- package/dist/__tests__/handshake.e2e.test.js.map +1 -0
- package/dist/__tests__/handshake.test.js +813 -19
- package/dist/__tests__/handshake.test.js.map +1 -1
- 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 +28 -28
- package/dist/__tests__/ingest.test.js.map +1 -1
- package/dist/__tests__/init.test.d.ts +7 -0
- package/dist/__tests__/init.test.d.ts.map +1 -0
- package/dist/__tests__/init.test.js +146 -0
- package/dist/__tests__/init.test.js.map +1 -0
- package/dist/__tests__/login.test.d.ts +2 -0
- package/dist/__tests__/login.test.d.ts.map +1 -0
- package/dist/__tests__/login.test.js +167 -0
- package/dist/__tests__/login.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 +18 -0
- package/dist/__tests__/method-registry.integration.test.js.map +1 -0
- package/dist/__tests__/method-registry.test.d.ts +14 -0
- package/dist/__tests__/method-registry.test.d.ts.map +1 -0
- package/dist/__tests__/method-registry.test.js +134 -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.d.ts +2 -0
- package/dist/__tests__/onboarding-path-b.test.d.ts.map +1 -0
- package/dist/__tests__/onboarding-path-b.test.js +46 -0
- package/dist/__tests__/onboarding-path-b.test.js.map +1 -0
- package/dist/__tests__/onboarding.test.d.ts +6 -0
- package/dist/__tests__/onboarding.test.d.ts.map +1 -0
- package/dist/__tests__/onboarding.test.js +347 -0
- package/dist/__tests__/onboarding.test.js.map +1 -0
- package/dist/__tests__/orient.test.d.ts +2 -0
- package/dist/__tests__/orient.test.d.ts.map +1 -0
- package/dist/__tests__/orient.test.js +424 -0
- package/dist/__tests__/orient.test.js.map +1 -0
- 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.d.ts +2 -0
- package/dist/__tests__/profiles.test.d.ts.map +1 -0
- package/dist/__tests__/profiles.test.js +316 -0
- package/dist/__tests__/profiles.test.js.map +1 -0
- 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 +213 -34
- package/dist/__tests__/promote.test.js.map +1 -1
- package/dist/__tests__/prompts.test.d.ts +6 -0
- package/dist/__tests__/prompts.test.d.ts.map +1 -0
- package/dist/__tests__/prompts.test.js +146 -0
- package/dist/__tests__/prompts.test.js.map +1 -0
- 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 +24 -47
- package/dist/__tests__/proposals.test.js.map +1 -1
- package/dist/__tests__/relate.test.js +34 -36
- package/dist/__tests__/relate.test.js.map +1 -1
- package/dist/__tests__/repo-detect.test.js +97 -1
- package/dist/__tests__/repo-detect.test.js.map +1 -1
- package/dist/__tests__/runner.test.js +19 -15
- package/dist/__tests__/runner.test.js.map +1 -1
- 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-reset.test.d.ts +2 -0
- package/dist/__tests__/session-reset.test.d.ts.map +1 -0
- package/dist/__tests__/session-reset.test.js +122 -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 +97 -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 +179 -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 +198 -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 +130 -0
- package/dist/__tests__/session-switch.test.js.map +1 -0
- package/dist/__tests__/session-touch.test.js +11 -11
- package/dist/__tests__/session-touch.test.js.map +1 -1
- package/dist/__tests__/session.test.js +4 -10
- 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__/spinner-labels.test.d.ts +2 -0
- package/dist/__tests__/spinner-labels.test.d.ts.map +1 -0
- package/dist/__tests__/spinner-labels.test.js +23 -0
- package/dist/__tests__/spinner-labels.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 +97 -0
- package/dist/__tests__/state.test.js.map +1 -0
- package/dist/__tests__/surface-profiles.test.d.ts +2 -0
- package/dist/__tests__/surface-profiles.test.d.ts.map +1 -0
- package/dist/__tests__/surface-profiles.test.js +233 -0
- package/dist/__tests__/surface-profiles.test.js.map +1 -0
- 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 +63 -72
- 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__/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 +534 -0
- package/dist/__tests__/vocabulary-leak.test.js.map +1 -0
- package/dist/__tests__/workspace.test.d.ts +2 -0
- package/dist/__tests__/workspace.test.d.ts.map +1 -0
- package/dist/__tests__/workspace.test.js +328 -0
- package/dist/__tests__/workspace.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__/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.d.ts.map +1 -1
- package/dist/commands/accept.js +10 -6
- package/dist/commands/accept.js.map +1 -1
- package/dist/commands/admin/cockpit.d.ts +90 -0
- package/dist/commands/admin/cockpit.d.ts.map +1 -0
- package/dist/commands/admin/cockpit.js +618 -0
- package/dist/commands/admin/cockpit.js.map +1 -0
- package/dist/commands/admin/index.d.ts +21 -0
- package/dist/commands/admin/index.d.ts.map +1 -0
- package/dist/commands/admin/index.js +256 -0
- package/dist/commands/admin/index.js.map +1 -0
- package/dist/commands/admin/inspect.d.ts +30 -0
- package/dist/commands/admin/inspect.d.ts.map +1 -0
- package/dist/commands/admin/inspect.js +555 -0
- package/dist/commands/admin/inspect.js.map +1 -0
- package/dist/commands/admin/inspect.test.d.ts +7 -0
- package/dist/commands/admin/inspect.test.d.ts.map +1 -0
- package/dist/commands/admin/inspect.test.js +90 -0
- package/dist/commands/admin/inspect.test.js.map +1 -0
- 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/seed.d.ts +75 -0
- package/dist/commands/admin/seed.d.ts.map +1 -0
- package/dist/commands/admin/seed.js +944 -0
- package/dist/commands/admin/seed.js.map +1 -0
- package/dist/commands/admin/seed.test.d.ts +11 -0
- package/dist/commands/admin/seed.test.d.ts.map +1 -0
- package/dist/commands/admin/seed.test.js +127 -0
- package/dist/commands/admin/seed.test.js.map +1 -0
- 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 +144 -0
- package/dist/commands/admin/seedRegistryEntries.generated.js.map +1 -0
- package/dist/commands/admin/seedRegistryEntries.test.d.ts +11 -0
- package/dist/commands/admin/seedRegistryEntries.test.d.ts.map +1 -0
- package/dist/commands/admin/seedRegistryEntries.test.js +70 -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 +356 -0
- package/dist/commands/authority-domains.js.map +1 -0
- package/dist/commands/brief.d.ts.map +1 -1
- package/dist/commands/brief.js +10 -5
- package/dist/commands/brief.js.map +1 -1
- package/dist/commands/capture.d.ts +7 -0
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +266 -19
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/chain-walk.d.ts.map +1 -1
- package/dist/commands/chain-walk.js +8 -3
- package/dist/commands/chain-walk.js.map +1 -1
- package/dist/commands/changes.d.ts.map +1 -1
- package/dist/commands/changes.js +8 -3
- package/dist/commands/changes.js.map +1 -1
- package/dist/commands/codex-prep.d.ts +23 -0
- package/dist/commands/codex-prep.d.ts.map +1 -0
- package/dist/commands/codex-prep.js +56 -0
- package/dist/commands/codex-prep.js.map +1 -0
- package/dist/commands/collections.d.ts +22 -0
- package/dist/commands/collections.d.ts.map +1 -0
- package/dist/commands/collections.js +77 -0
- package/dist/commands/collections.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 +64 -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 +110 -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.d.ts +7 -0
- package/dist/commands/connect-integration.test.d.ts.map +1 -0
- package/dist/commands/connect-integration.test.js +212 -0
- package/dist/commands/connect-integration.test.js.map +1 -0
- package/dist/commands/connect-screens.d.ts +23 -0
- package/dist/commands/connect-screens.d.ts.map +1 -0
- package/dist/commands/connect-screens.js +90 -0
- package/dist/commands/connect-screens.js.map +1 -0
- package/dist/commands/connect.d.ts +36 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +264 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/connect.test.d.ts +6 -0
- package/dist/commands/connect.test.d.ts.map +1 -0
- package/dist/commands/connect.test.js +297 -0
- package/dist/commands/connect.test.js.map +1 -0
- package/dist/commands/constellation.d.ts.map +1 -1
- package/dist/commands/constellation.js +8 -3
- package/dist/commands/constellation.js.map +1 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +8 -3
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/cross-cut.js +2 -2
- package/dist/commands/cross-cut.js.map +1 -1
- package/dist/commands/doctor.d.ts +18 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +297 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/doctor.test.d.ts +8 -0
- package/dist/commands/doctor.test.d.ts.map +1 -0
- package/dist/commands/doctor.test.js +461 -0
- package/dist/commands/doctor.test.js.map +1 -0
- package/dist/commands/fields.d.ts.map +1 -1
- package/dist/commands/fields.js +8 -4
- package/dist/commands/fields.js.map +1 -1
- package/dist/commands/get.d.ts.map +1 -1
- package/dist/commands/get.js +14 -6
- package/dist/commands/get.js.map +1 -1
- package/dist/commands/handshake.d.ts +233 -2
- package/dist/commands/handshake.d.ts.map +1 -1
- package/dist/commands/handshake.js +2338 -81
- package/dist/commands/handshake.js.map +1 -1
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +17 -9
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/init.d.ts +14 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +109 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +4 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +101 -38
- 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 +796 -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/orient.d.ts +197 -3
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +129 -7
- package/dist/commands/orient.js.map +1 -1
- package/dist/commands/profile.d.ts +34 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +165 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/promote.d.ts +12 -1
- package/dist/commands/promote.d.ts.map +1 -1
- package/dist/commands/promote.js +197 -30
- 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.js +2 -2
- package/dist/commands/proposals.js.map +1 -1
- package/dist/commands/reject.d.ts.map +1 -1
- package/dist/commands/reject.js +14 -7
- package/dist/commands/reject.js.map +1 -1
- package/dist/commands/relate.d.ts.map +1 -1
- package/dist/commands/relate.js +49 -16
- package/dist/commands/relate.js.map +1 -1
- 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.js +2 -2
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/session.d.ts +26 -2
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +355 -41
- 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 +23 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +69 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/update.d.ts +9 -0
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +92 -26
- 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 +232 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +14 -7
- 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 +50 -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 +70 -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 +113 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +263 -0
- package/dist/commands/workspace.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 +454 -0
- package/dist/formatters/__tests__/orient-provenance.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 +113 -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.map +1 -1
- package/dist/formatters/capture.d.ts +26 -3
- package/dist/formatters/capture.d.ts.map +1 -1
- package/dist/formatters/capture.js +25 -1
- package/dist/formatters/capture.js.map +1 -1
- package/dist/formatters/collections.d.ts +40 -0
- package/dist/formatters/collections.d.ts.map +1 -0
- package/dist/formatters/collections.js +93 -0
- package/dist/formatters/collections.js.map +1 -0
- package/dist/formatters/entry.d.ts +30 -4
- package/dist/formatters/entry.d.ts.map +1 -1
- package/dist/formatters/entry.js +66 -17
- package/dist/formatters/entry.js.map +1 -1
- package/dist/formatters/handshake.d.ts +45 -0
- package/dist/formatters/handshake.d.ts.map +1 -1
- package/dist/formatters/handshake.js +150 -3
- package/dist/formatters/handshake.js.map +1 -1
- package/dist/formatters/orient.d.ts +268 -5
- package/dist/formatters/orient.d.ts.map +1 -1
- package/dist/formatters/orient.js +381 -34
- package/dist/formatters/orient.js.map +1 -1
- package/dist/formatters/promote.d.ts +6 -0
- package/dist/formatters/promote.d.ts.map +1 -1
- package/dist/formatters/promote.js +8 -0
- package/dist/formatters/promote.js.map +1 -1
- package/dist/formatters/relate.d.ts +2 -0
- package/dist/formatters/relate.d.ts.map +1 -1
- package/dist/formatters/relate.js +3 -0
- package/dist/formatters/relate.js.map +1 -1
- package/dist/formatters/scoreboard.d.ts +11 -0
- package/dist/formatters/scoreboard.d.ts.map +1 -0
- package/dist/formatters/scoreboard.js +48 -0
- package/dist/formatters/scoreboard.js.map +1 -0
- package/dist/formatters/search.d.ts +0 -4
- package/dist/formatters/search.d.ts.map +1 -1
- package/dist/formatters/search.js +4 -1
- package/dist/formatters/search.js.map +1 -1
- package/dist/formatters/session.d.ts +39 -2
- package/dist/formatters/session.d.ts.map +1 -1
- package/dist/formatters/session.js +130 -9
- package/dist/formatters/session.js.map +1 -1
- package/dist/formatters/update.d.ts.map +1 -1
- package/dist/formatters/update.js +2 -0
- package/dist/formatters/update.js.map +1 -1
- package/dist/generators/adapters.d.ts +37 -3
- package/dist/generators/adapters.d.ts.map +1 -1
- package/dist/generators/adapters.js +196 -8
- package/dist/generators/adapters.js.map +1 -1
- package/dist/generators/adapters.test.d.ts +2 -0
- package/dist/generators/adapters.test.d.ts.map +1 -0
- package/dist/generators/adapters.test.js +27 -0
- package/dist/generators/adapters.test.js.map +1 -0
- package/dist/generators/archetypes.d.ts +52 -0
- package/dist/generators/archetypes.d.ts.map +1 -0
- package/dist/generators/archetypes.js +190 -0
- package/dist/generators/archetypes.js.map +1 -0
- package/dist/generators/archetypes.test.d.ts +2 -0
- package/dist/generators/archetypes.test.d.ts.map +1 -0
- package/dist/generators/archetypes.test.js +272 -0
- package/dist/generators/archetypes.test.js.map +1 -0
- 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.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.d.ts +63 -0
- package/dist/generators/chain-classifier.d.ts.map +1 -0
- package/dist/generators/chain-classifier.js +131 -0
- package/dist/generators/chain-classifier.js.map +1 -0
- package/dist/generators/chain-classifier.test.d.ts +2 -0
- package/dist/generators/chain-classifier.test.d.ts.map +1 -0
- package/dist/generators/chain-classifier.test.js +371 -0
- package/dist/generators/chain-classifier.test.js.map +1 -0
- package/dist/generators/chain-rules.d.ts +42 -0
- package/dist/generators/chain-rules.d.ts.map +1 -0
- package/dist/generators/chain-rules.js +152 -0
- package/dist/generators/chain-rules.js.map +1 -0
- package/dist/generators/chain-rules.test.d.ts +2 -0
- package/dist/generators/chain-rules.test.d.ts.map +1 -0
- package/dist/generators/chain-rules.test.js +211 -0
- package/dist/generators/chain-rules.test.js.map +1 -0
- package/dist/generators/context-md.d.ts +1 -1
- package/dist/generators/context-md.d.ts.map +1 -1
- package/dist/generators/context-md.js +18 -7
- package/dist/generators/context-md.js.map +1 -1
- package/dist/generators/handshake-diff.d.ts +67 -0
- package/dist/generators/handshake-diff.d.ts.map +1 -0
- package/dist/generators/handshake-diff.js +183 -0
- package/dist/generators/handshake-diff.js.map +1 -0
- package/dist/generators/handshake-diff.test.d.ts +2 -0
- package/dist/generators/handshake-diff.test.d.ts.map +1 -0
- package/dist/generators/handshake-diff.test.js +264 -0
- package/dist/generators/handshake-diff.test.js.map +1 -0
- 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 +96 -9
- package/dist/generators/portable-knowledge.d.ts.map +1 -1
- package/dist/generators/portable-knowledge.js +367 -17
- package/dist/generators/portable-knowledge.js.map +1 -1
- package/dist/generators/portable-knowledge.test.js +529 -1
- 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 +48 -0
- package/dist/generators/surface-profiles.d.ts.map +1 -0
- package/dist/generators/surface-profiles.js +98 -0
- package/dist/generators/surface-profiles.js.map +1 -0
- package/dist/index.js +800 -252
- package/dist/index.js.map +1 -1
- package/dist/lib/activation.d.ts +28 -0
- package/dist/lib/activation.d.ts.map +1 -0
- package/dist/lib/activation.js +57 -0
- package/dist/lib/activation.js.map +1 -0
- package/dist/lib/activation.test.d.ts +6 -0
- package/dist/lib/activation.test.d.ts.map +1 -0
- package/dist/lib/activation.test.js +121 -0
- package/dist/lib/activation.test.js.map +1 -0
- package/dist/lib/canonicalRefs.d.ts +141 -0
- package/dist/lib/canonicalRefs.d.ts.map +1 -0
- package/dist/lib/canonicalRefs.js +150 -0
- package/dist/lib/canonicalRefs.js.map +1 -0
- package/dist/lib/client.d.ts +33 -6
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +203 -42
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/collectionRegistry.d.ts +40 -0
- package/dist/lib/collectionRegistry.d.ts.map +1 -0
- package/dist/lib/collectionRegistry.js +112 -0
- package/dist/lib/collectionRegistry.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 +204 -4
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +594 -42
- package/dist/lib/config.js.map +1 -1
- 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 +46 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +83 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/conversation-engine.d.ts +45 -0
- package/dist/lib/conversation-engine.d.ts.map +1 -0
- package/dist/lib/conversation-engine.js +112 -0
- package/dist/lib/conversation-engine.js.map +1 -0
- package/dist/lib/conversation-phases.d.ts +59 -0
- package/dist/lib/conversation-phases.d.ts.map +1 -0
- package/dist/lib/conversation-phases.js +11 -0
- package/dist/lib/conversation-phases.js.map +1 -0
- package/dist/lib/conversation-signals.d.ts +30 -0
- package/dist/lib/conversation-signals.d.ts.map +1 -0
- package/dist/lib/conversation-signals.js +64 -0
- package/dist/lib/conversation-signals.js.map +1 -0
- package/dist/lib/deployment.d.ts +23 -0
- package/dist/lib/deployment.d.ts.map +1 -0
- package/dist/lib/deployment.js +78 -0
- package/dist/lib/deployment.js.map +1 -0
- package/dist/lib/deployment.test.d.ts +5 -0
- package/dist/lib/deployment.test.d.ts.map +1 -0
- package/dist/lib/deployment.test.js +54 -0
- package/dist/lib/deployment.test.js.map +1 -0
- package/dist/lib/errors.d.ts +63 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +72 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/experiment.d.ts +18 -0
- package/dist/lib/experiment.d.ts.map +1 -0
- package/dist/lib/experiment.js +28 -0
- package/dist/lib/experiment.js.map +1 -0
- package/dist/lib/format.d.ts +10 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +27 -0
- package/dist/lib/format.js.map +1 -0
- 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/glossary.d.ts +19 -0
- package/dist/lib/glossary.d.ts.map +1 -0
- package/dist/lib/glossary.js +53 -0
- package/dist/lib/glossary.js.map +1 -0
- 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/method-registry.d.ts +32 -0
- package/dist/lib/method-registry.d.ts.map +1 -0
- package/dist/lib/method-registry.js +53 -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 +10 -0
- package/dist/lib/onboarding-path-b.d.ts.map +1 -0
- package/dist/lib/onboarding-path-b.js +213 -0
- package/dist/lib/onboarding-path-b.js.map +1 -0
- package/dist/lib/onboarding-shared.d.ts +80 -0
- package/dist/lib/onboarding-shared.d.ts.map +1 -0
- package/dist/lib/onboarding-shared.js +174 -0
- package/dist/lib/onboarding-shared.js.map +1 -0
- package/dist/lib/onboarding-topics.d.ts +27 -0
- package/dist/lib/onboarding-topics.d.ts.map +1 -0
- package/dist/lib/onboarding-topics.js +57 -0
- package/dist/lib/onboarding-topics.js.map +1 -0
- package/dist/lib/onboarding.d.ts +17 -0
- package/dist/lib/onboarding.d.ts.map +1 -0
- package/dist/lib/onboarding.js +350 -0
- package/dist/lib/onboarding.js.map +1 -0
- package/dist/lib/profiles.d.ts +41 -0
- package/dist/lib/profiles.d.ts.map +1 -0
- package/dist/lib/profiles.js +188 -0
- package/dist/lib/profiles.js.map +1 -0
- package/dist/lib/prompts.d.ts +65 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +132 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/repo-detect.d.ts +19 -0
- package/dist/lib/repo-detect.d.ts.map +1 -1
- package/dist/lib/repo-detect.js +25 -0
- package/dist/lib/repo-detect.js.map +1 -1
- package/dist/lib/runner.d.ts +2 -0
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/lib/runner.js +21 -7
- package/dist/lib/runner.js.map +1 -1
- package/dist/lib/session.d.ts +35 -0
- package/dist/lib/session.d.ts.map +1 -1
- package/dist/lib/session.js +94 -3
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/spinner.d.ts +27 -0
- package/dist/lib/spinner.d.ts.map +1 -0
- package/dist/lib/spinner.js +76 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/lib/spinner.test.d.ts +2 -0
- package/dist/lib/spinner.test.d.ts.map +1 -0
- package/dist/lib/spinner.test.js +39 -0
- package/dist/lib/spinner.test.js.map +1 -0
- 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 +118 -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/state.d.ts +51 -0
- package/dist/lib/state.d.ts.map +1 -0
- package/dist/lib/state.js +90 -0
- package/dist/lib/state.js.map +1 -0
- package/dist/lib/strip.d.ts +1 -0
- package/dist/lib/strip.d.ts.map +1 -1
- package/dist/lib/strip.js +15 -0
- package/dist/lib/strip.js.map +1 -1
- package/dist/lib/style.d.ts +96 -0
- package/dist/lib/style.d.ts.map +1 -0
- package/dist/lib/style.js +169 -0
- package/dist/lib/style.js.map +1 -0
- package/dist/lib/style.test.d.ts +7 -0
- package/dist/lib/style.test.d.ts.map +1 -0
- package/dist/lib/style.test.js +263 -0
- package/dist/lib/style.test.js.map +1 -0
- package/dist/lib/telemetry.d.ts +15 -0
- package/dist/lib/telemetry.d.ts.map +1 -0
- package/dist/lib/telemetry.js +47 -0
- package/dist/lib/telemetry.js.map +1 -0
- 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/wizard-surfaces.d.ts +47 -0
- package/dist/lib/wizard-surfaces.d.ts.map +1 -0
- package/dist/lib/wizard-surfaces.js +176 -0
- package/dist/lib/wizard-surfaces.js.map +1 -0
- package/dist/lib/wizard-surfaces.test.d.ts +2 -0
- package/dist/lib/wizard-surfaces.test.d.ts.map +1 -0
- package/dist/lib/wizard-surfaces.test.js +127 -0
- package/dist/lib/wizard-surfaces.test.js.map +1 -0
- package/dist/lib/wizard-trust.d.ts +31 -0
- package/dist/lib/wizard-trust.d.ts.map +1 -0
- package/dist/lib/wizard-trust.js +66 -0
- package/dist/lib/wizard-trust.js.map +1 -0
- package/dist/lib/wizard-trust.test.d.ts +2 -0
- package/dist/lib/wizard-trust.test.d.ts.map +1 -0
- package/dist/lib/wizard-trust.test.js +32 -0
- package/dist/lib/wizard-trust.test.js.map +1 -0
- package/dist/lib/workspace-probe.d.ts +19 -0
- package/dist/lib/workspace-probe.d.ts.map +1 -0
- package/dist/lib/workspace-probe.js +27 -0
- package/dist/lib/workspace-probe.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/scoreboard/diagnose.d.ts +182 -0
- package/dist/scoreboard/diagnose.d.ts.map +1 -0
- package/dist/scoreboard/diagnose.js +250 -0
- package/dist/scoreboard/diagnose.js.map +1 -0
- package/dist/scoreboard/diagnose.test.d.ts +12 -0
- package/dist/scoreboard/diagnose.test.d.ts.map +1 -0
- package/dist/scoreboard/diagnose.test.js +192 -0
- package/dist/scoreboard/diagnose.test.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 +12 -4
- package/templates/archetypes/boundary.md +23 -0
- package/templates/archetypes/constraint.md +23 -0
- package/templates/archetypes/convention.md +23 -0
- package/templates/archetypes/policy.md +23 -0
- package/templates/archetypes/quality-gate.md +23 -0
- package/templates/archetypes/workflow.md +23 -0
- package/templates/general/code-integrity.md +11 -0
- package/templates/general/getting-started.md +12 -0
- package/templates/method-registry.json +16 -0
- package/templates/node-ts/code-integrity.md +13 -0
- package/templates/node-ts/testing.md +12 -0
- package/templates/python/code-integrity.md +13 -0
- package/templates/python/testing.md +12 -0
package/dist/lib/config.js
CHANGED
|
@@ -1,21 +1,420 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CLI config — reads PRODUCTBRAIN_API_KEY + CONVEX_SITE_URL from:
|
|
3
|
-
* 1. Environment variables
|
|
4
|
-
* 2.
|
|
5
|
-
* 3.
|
|
3
|
+
* 1. Environment variables (always highest priority)
|
|
4
|
+
* 2. Project local config: .productbrain/config.local.json (walked up from CWD, machine-local)
|
|
5
|
+
* 3. Project config: .productbrain/config.json (walked up from CWD, siteUrl only — committed)
|
|
6
|
+
* 4. Profile system (~/.config/productbrain/profiles/{name}.env)
|
|
7
|
+
* 5. Legacy ~/.config/productbrain/.env (auto-migrated to profiles on first use)
|
|
8
|
+
* 6. CWD .env.mcp / packages/mcp-server/.env.mcp / .env
|
|
9
|
+
*
|
|
10
|
+
* Config loading is lazy — loadEnv() runs on first getConfig()/getConfigOrGuide() call.
|
|
11
|
+
* This enables profile switching without import-time side effects (TEN-1276).
|
|
6
12
|
*
|
|
7
13
|
* When key is missing and retry is provided (TTY), runs guided flow per docs/cli-unauthenticated-user-journey.md.
|
|
14
|
+
*
|
|
15
|
+
* Split config design:
|
|
16
|
+
* - config.json (committed): siteUrl only — workspace gateway, safe to share with teammates.
|
|
17
|
+
* - config.local.json (gitignored): profile pin — machine-local, never committed.
|
|
8
18
|
*/
|
|
9
19
|
import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
10
20
|
import { resolve } from 'path';
|
|
11
21
|
import { homedir } from 'os';
|
|
12
|
-
import {
|
|
13
|
-
|
|
22
|
+
import { DEFAULT_SITE_URL, isDevMode } from './constants.js';
|
|
23
|
+
import { API_KEY_PREFIX } from './tokenConstants.js';
|
|
24
|
+
import { resolveProfileConfig, resolveNamedProfileConfig, getGlobalActiveProfile } from './profiles.js';
|
|
25
|
+
import { CLIError, ErrorCode } from './errors.js';
|
|
26
|
+
import { confirm as promptConfirm, password as promptPassword } from './prompts.js';
|
|
14
27
|
const HOME_CONFIG_DIR = resolve(homedir(), '.config', 'productbrain');
|
|
15
28
|
const HOME_ENV_PATH = resolve(HOME_CONFIG_DIR, '.env');
|
|
16
29
|
const CWD_ENV_PATHS = ['.env.mcp', 'packages/mcp-server/.env.mcp', '.env'];
|
|
17
30
|
// Short error when not TTY (scripts/pipes must not hang)
|
|
18
31
|
const NON_TTY_MESSAGE = 'No API key. Set PRODUCTBRAIN_API_KEY or run pb login.';
|
|
32
|
+
/** Track whether env has been loaded to avoid redundant file reads. */
|
|
33
|
+
let envLoaded = false;
|
|
34
|
+
/**
|
|
35
|
+
* Walk up the directory tree (git-style) to find the nearest CLI project root.
|
|
36
|
+
*
|
|
37
|
+
* A `.productbrain/` directory only counts as a CLI project root when it carries
|
|
38
|
+
* CLI configuration — `config.json` (committed siteUrl gateway) or
|
|
39
|
+
* `config.local.json` (machine-local profile pin or preview binding). A
|
|
40
|
+
* projection-only `.productbrain/` written by `pb handshake` (briefing.md,
|
|
41
|
+
* context.md, rules/, etc.) does NOT count — otherwise a subrepo like
|
|
42
|
+
* `packages/cli/.productbrain/` would shadow the real configuring root and
|
|
43
|
+
* `npm run pb:preview` writes (which always land at the repo-root
|
|
44
|
+
* `.productbrain/`) would be invisible to commands run from the subrepo.
|
|
45
|
+
*
|
|
46
|
+
* Stops at home directory or filesystem root. Returns the directory containing
|
|
47
|
+
* a config-bearing `.productbrain/`, or null if not found.
|
|
48
|
+
*/
|
|
49
|
+
export function findProjectRoot(startDir) {
|
|
50
|
+
let dir = startDir;
|
|
51
|
+
const home = homedir();
|
|
52
|
+
while (true) {
|
|
53
|
+
const pbDir = resolve(dir, '.productbrain');
|
|
54
|
+
if (existsSync(pbDir) &&
|
|
55
|
+
(existsSync(resolve(pbDir, 'config.json')) ||
|
|
56
|
+
existsSync(resolve(pbDir, 'config.local.json')))) {
|
|
57
|
+
return dir;
|
|
58
|
+
}
|
|
59
|
+
const parent = resolve(dir, '..');
|
|
60
|
+
if (parent === dir || dir === home)
|
|
61
|
+
return null;
|
|
62
|
+
dir = parent;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Read .productbrain/config.json from the walked-up project root.
|
|
67
|
+
* Only reads siteUrl — profile and apiKey fields are ignored (legacy or misplaced).
|
|
68
|
+
* Returns null if file missing or project root not found.
|
|
69
|
+
* Warns to stderr on invalid JSON but does not throw.
|
|
70
|
+
*/
|
|
71
|
+
function readProjectConfig() {
|
|
72
|
+
const projectRoot = findProjectRoot(process.cwd());
|
|
73
|
+
if (!projectRoot)
|
|
74
|
+
return null;
|
|
75
|
+
const configPath = resolve(projectRoot, '.productbrain', 'config.json');
|
|
76
|
+
if (!existsSync(configPath))
|
|
77
|
+
return null;
|
|
78
|
+
try {
|
|
79
|
+
const raw = readFileSync(configPath, 'utf8');
|
|
80
|
+
const parsed = JSON.parse(raw);
|
|
81
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
82
|
+
process.stderr.write('Warning: .productbrain/config.json is not a JSON object, skipping.\n');
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
const result = {};
|
|
86
|
+
if (typeof parsed.siteUrl === 'string' && parsed.siteUrl) {
|
|
87
|
+
result.siteUrl = parsed.siteUrl;
|
|
88
|
+
}
|
|
89
|
+
// Silently ignore `profile` and `apiKey` in config.json — those must be in config.local.json
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
process.stderr.write('Warning: .productbrain/config.json contains invalid JSON, skipping.\n');
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Read .productbrain/config.local.json from the walked-up project root.
|
|
99
|
+
* Returns the machine-local pin (`profile`) and any preview-binding fields
|
|
100
|
+
* (`apiKey`, `siteUrl`, `preview`, `workspaceName`) written by
|
|
101
|
+
* `npm run pb:preview` — all gitignored, never committed.
|
|
102
|
+
* Returns null if file missing or project root not found.
|
|
103
|
+
* Warns to stderr on invalid JSON but does not throw.
|
|
104
|
+
*/
|
|
105
|
+
export function readLocalProjectConfig() {
|
|
106
|
+
const projectRoot = findProjectRoot(process.cwd());
|
|
107
|
+
if (!projectRoot)
|
|
108
|
+
return null;
|
|
109
|
+
const configPath = resolve(projectRoot, '.productbrain', 'config.local.json');
|
|
110
|
+
if (!existsSync(configPath))
|
|
111
|
+
return null;
|
|
112
|
+
try {
|
|
113
|
+
const raw = readFileSync(configPath, 'utf8');
|
|
114
|
+
const parsed = JSON.parse(raw);
|
|
115
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
116
|
+
process.stderr.write('Warning: .productbrain/config.local.json is not a JSON object, skipping.\n');
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
const result = {};
|
|
120
|
+
if (typeof parsed.profile === 'string' && parsed.profile) {
|
|
121
|
+
result.profile = parsed.profile;
|
|
122
|
+
}
|
|
123
|
+
// Preview binding fields — written by `npm run pb:preview`, cleared by `npm run pb:real`.
|
|
124
|
+
if (typeof parsed.apiKey === 'string' && parsed.apiKey.startsWith(API_KEY_PREFIX)) {
|
|
125
|
+
result.apiKey = parsed.apiKey;
|
|
126
|
+
}
|
|
127
|
+
if (typeof parsed.siteUrl === 'string' && parsed.siteUrl) {
|
|
128
|
+
result.siteUrl = parsed.siteUrl;
|
|
129
|
+
}
|
|
130
|
+
if (parsed.preview === true) {
|
|
131
|
+
result.preview = true;
|
|
132
|
+
}
|
|
133
|
+
if (typeof parsed.workspaceName === 'string' && parsed.workspaceName) {
|
|
134
|
+
result.workspaceName = parsed.workspaceName;
|
|
135
|
+
}
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
process.stderr.write('Warning: .productbrain/config.local.json contains invalid JSON, skipping.\n');
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Returns the preview binding metadata when pb is currently bound to a throwaway preview,
|
|
145
|
+
* or null when bound to the real Chain (the default).
|
|
146
|
+
*
|
|
147
|
+
* Effective-binding mirror: this only reports a preview binding when
|
|
148
|
+
* `resolveConfig()`/`loadEnv()` would actually honor it — `preview === true` AND
|
|
149
|
+
* an atomic apiKey+siteUrl pair (SF-3) AND no `PRODUCTBRAIN_API_KEY` env override
|
|
150
|
+
* (env always wins in resolveConfig step 1). Without these guards the PREVIEW
|
|
151
|
+
* banner could fire while writes still hit the real Chain, defeating the safety
|
|
152
|
+
* warning. Used by the PREVIEW banner (index.ts preAction hook) and the
|
|
153
|
+
* capture/update advisory.
|
|
154
|
+
*
|
|
155
|
+
* Security classification: reads only the gitignored machine-local config.local.json.
|
|
156
|
+
* The preview key in that file is a throwaway preview-scoped key, set by explicit
|
|
157
|
+
* `npm run pb:preview` opt-in and reversed by `npm run pb:real`. Never throws — returns
|
|
158
|
+
* null on any error so the banner/advisory path is never the source of a CLI crash.
|
|
159
|
+
*/
|
|
160
|
+
export function getPreviewBinding() {
|
|
161
|
+
try {
|
|
162
|
+
if (process.env.PRODUCTBRAIN_API_KEY)
|
|
163
|
+
return null;
|
|
164
|
+
const localConfig = readLocalProjectConfig();
|
|
165
|
+
if (localConfig?.preview === true && localConfig.apiKey && localConfig.siteUrl) {
|
|
166
|
+
return { workspaceName: localConfig.workspaceName ?? null };
|
|
167
|
+
}
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Write/merge the profile pin into <projectRoot>/.productbrain/config.local.json,
|
|
176
|
+
* preserving any sibling keys. Single source of truth for the local pin write —
|
|
177
|
+
* used by `pb profile use --local`, the default reconcile path, and `pb connect`.
|
|
178
|
+
*
|
|
179
|
+
* Co-writer note (SF-2): scripts/pb-binding.mjs is the OTHER writer of config.local.json — it
|
|
180
|
+
* merges/strips the preview-binding keys (apiKey, siteUrl, preview, workspaceName) for
|
|
181
|
+
* `npm run pb:preview` / `npm run pb:real`. Both writers preserve the `profile` pin. If you add
|
|
182
|
+
* a preview-scoped key here or in readLocalProjectConfig(), update pb-binding.mjs's PREVIEW_KEYS.
|
|
183
|
+
*/
|
|
184
|
+
export function setLocalProfilePin(projectRoot, profile) {
|
|
185
|
+
const configDir = resolve(projectRoot, '.productbrain');
|
|
186
|
+
const localConfigPath = resolve(configDir, 'config.local.json');
|
|
187
|
+
let existing = {};
|
|
188
|
+
if (existsSync(localConfigPath)) {
|
|
189
|
+
try {
|
|
190
|
+
const parsed = JSON.parse(readFileSync(localConfigPath, 'utf8'));
|
|
191
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
|
|
192
|
+
existing = parsed;
|
|
193
|
+
}
|
|
194
|
+
catch { /* ignore parse errors — we overwrite the pin below */ }
|
|
195
|
+
}
|
|
196
|
+
mkdirSync(configDir, { recursive: true });
|
|
197
|
+
writeFileSync(localConfigPath, JSON.stringify({ ...existing, profile }, null, 2) + '\n');
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* WP-458 E2 — one-shot preview apiKey refresh from disk.
|
|
201
|
+
*
|
|
202
|
+
* After a worktree preview is reseeded, seed-preview.mjs Step 6 mints a NEW apiKey into
|
|
203
|
+
* `.productbrain/preview.json`, but `config.local.json` (and the live `process.env` binding it
|
|
204
|
+
* seeded via loadEnv) still carry the PRE-reseed key — so the next `pb session start` fails auth
|
|
205
|
+
* with an opaque INTERNAL. This re-reads the fresh key from preview.json so the caller can retry
|
|
206
|
+
* ONCE (session.ts). It is deliberately disk-to-disk: it compares preview.json's key against
|
|
207
|
+
* config.local.json's bound key, NOT against process.env (which loadEnv already populated from the
|
|
208
|
+
* stale binding), so it can't be confused by its own prior population. Never throws — any error
|
|
209
|
+
* degrades to 'unavailable'/'not-bound' so it can sit on the session-start path.
|
|
210
|
+
*
|
|
211
|
+
* Co-writer note (SF-2): mirrors pb-binding.mjs / setLocalProfilePin — preserves every sibling key
|
|
212
|
+
* in config.local.json (profile, preview, workspaceName) and only rewrites apiKey + siteUrl.
|
|
213
|
+
*/
|
|
214
|
+
export function refreshPreviewApiKeyFromDisk() {
|
|
215
|
+
try {
|
|
216
|
+
const projectRoot = findProjectRoot(process.cwd());
|
|
217
|
+
if (!projectRoot)
|
|
218
|
+
return 'not-bound';
|
|
219
|
+
const local = readLocalProjectConfig();
|
|
220
|
+
// Only act on a real preview binding (preview:true + atomic apiKey+siteUrl pair, SF-3).
|
|
221
|
+
if (!local?.preview || !local.apiKey || !local.siteUrl)
|
|
222
|
+
return 'not-bound';
|
|
223
|
+
// Never clobber a genuine env override: if the live key is NOT the bound preview key, either
|
|
224
|
+
// the user exported their own PRODUCTBRAIN_API_KEY (env wins in resolveConfig) or a refresh
|
|
225
|
+
// already happened — bail either way. An unset env key is fine (loadEnv may not have run yet).
|
|
226
|
+
const liveKey = process.env.PRODUCTBRAIN_API_KEY;
|
|
227
|
+
if (liveKey && liveKey !== local.apiKey)
|
|
228
|
+
return 'not-bound';
|
|
229
|
+
// Read the freshly-minted key from preview.json (seed-preview.mjs Step 6).
|
|
230
|
+
const previewPath = resolve(projectRoot, '.productbrain', 'preview.json');
|
|
231
|
+
if (!existsSync(previewPath))
|
|
232
|
+
return 'unavailable';
|
|
233
|
+
let fresh;
|
|
234
|
+
try {
|
|
235
|
+
const parsed = JSON.parse(readFileSync(previewPath, 'utf8'));
|
|
236
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed))
|
|
237
|
+
return 'unavailable';
|
|
238
|
+
fresh = parsed;
|
|
239
|
+
}
|
|
240
|
+
catch {
|
|
241
|
+
return 'unavailable';
|
|
242
|
+
}
|
|
243
|
+
const freshKey = typeof fresh.apiKey === 'string' ? fresh.apiKey : '';
|
|
244
|
+
if (!freshKey.startsWith(API_KEY_PREFIX))
|
|
245
|
+
return 'unavailable';
|
|
246
|
+
// Same key as the one already bound — retrying would just fail again; the failure is not a
|
|
247
|
+
// stale key, so the caller surfaces the real error rather than relabelling it.
|
|
248
|
+
if (freshKey === local.apiKey)
|
|
249
|
+
return 'unchanged';
|
|
250
|
+
const freshSite = typeof fresh.siteUrl === 'string' && fresh.siteUrl ? fresh.siteUrl : local.siteUrl;
|
|
251
|
+
// Merge the fresh preview key into config.local.json, preserving siblings.
|
|
252
|
+
const localConfigPath = resolve(projectRoot, '.productbrain', 'config.local.json');
|
|
253
|
+
let existing = {};
|
|
254
|
+
if (existsSync(localConfigPath)) {
|
|
255
|
+
try {
|
|
256
|
+
const parsed = JSON.parse(readFileSync(localConfigPath, 'utf8'));
|
|
257
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
|
|
258
|
+
existing = parsed;
|
|
259
|
+
}
|
|
260
|
+
catch { /* overwrite below */ }
|
|
261
|
+
}
|
|
262
|
+
writeFileSync(localConfigPath, JSON.stringify({ ...existing, apiKey: freshKey, siteUrl: freshSite }, null, 2) + '\n');
|
|
263
|
+
// Update the live binding + drop the load cache so the next getConfig() uses the fresh key.
|
|
264
|
+
process.env.PRODUCTBRAIN_API_KEY = freshKey;
|
|
265
|
+
process.env.CONVEX_SITE_URL = freshSite.replace(/\/$/, '');
|
|
266
|
+
resetConfigCache();
|
|
267
|
+
return 'refreshed';
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
return 'unavailable';
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Resolve the effective profile NAME + where it came from. The SOURCE-PRECEDENCE
|
|
275
|
+
* ORDER matches resolveConfig() (env > local pin > global > default), but unlike
|
|
276
|
+
* resolveConfig() this reports the *configured* pin name even when that profile is
|
|
277
|
+
* unresolvable (deleted / missing key). That divergence is intentional: a dangling
|
|
278
|
+
* repo pin must be surfaced by `pb whoami`, not silently masked by the global
|
|
279
|
+
* profile — masking it is the TEN-2163 silent-drift bug. Used by `pb whoami` and
|
|
280
|
+
* the inline "now using" prints.
|
|
281
|
+
*/
|
|
282
|
+
export function resolveEffectiveProfile() {
|
|
283
|
+
const envProfile = process.env.PB_PROFILE?.trim();
|
|
284
|
+
if (envProfile)
|
|
285
|
+
return { profile: envProfile, source: 'env' };
|
|
286
|
+
const localProfile = readLocalProjectConfig()?.profile;
|
|
287
|
+
if (localProfile)
|
|
288
|
+
return { profile: localProfile, source: 'local' };
|
|
289
|
+
const globalProfile = getGlobalActiveProfile();
|
|
290
|
+
if (globalProfile)
|
|
291
|
+
return { profile: globalProfile, source: 'global' };
|
|
292
|
+
if (resolveNamedProfileConfig('default'))
|
|
293
|
+
return { profile: 'default', source: 'default' };
|
|
294
|
+
return { profile: null, source: 'none' };
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Run the full config resolution cascade and return a typed result.
|
|
298
|
+
* Resolution order:
|
|
299
|
+
* 1. Environment variables (highest priority)
|
|
300
|
+
* 2. config.local.json profile → resolveNamedProfileConfig(profile) for apiKey + siteUrl
|
|
301
|
+
* 2b. config.json siteUrl (gateway override only — no apiKey, no profile)
|
|
302
|
+
* 3. Profile system (~/.config/productbrain/profiles/{name}.env)
|
|
303
|
+
* 4. Legacy home config (~/.config/productbrain/.env)
|
|
304
|
+
* 5. CWD .env files (.env.mcp, packages/mcp-server/.env.mcp, .env)
|
|
305
|
+
*
|
|
306
|
+
* siteUrl always has a value (falls back to DEFAULT_SITE_URL).
|
|
307
|
+
*/
|
|
308
|
+
export function resolveConfig() {
|
|
309
|
+
// 1. Env vars — check directly, don't mutate process.env
|
|
310
|
+
const envKey = process.env.PRODUCTBRAIN_API_KEY;
|
|
311
|
+
const envSite = process.env.CONVEX_SITE_URL;
|
|
312
|
+
if (envKey) {
|
|
313
|
+
return {
|
|
314
|
+
apiKey: envKey,
|
|
315
|
+
siteUrl: (envSite || DEFAULT_SITE_URL).replace(/\/$/, ''),
|
|
316
|
+
source: 'env',
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
// 2. Local project config — check for direct preview binding first, then profile pin.
|
|
320
|
+
const localConfig = readLocalProjectConfig();
|
|
321
|
+
// 2a. Direct preview binding (config.local.json apiKey) — set by `npm run pb:preview`.
|
|
322
|
+
// Security classification: gitignored machine-local file; throwaway preview-scoped key;
|
|
323
|
+
// explicit opt-in via `npm run pb:preview`; reversible via `npm run pb:real`;
|
|
324
|
+
// loud PREVIEW banner on every command makes it un-missable (index.ts preAction hook).
|
|
325
|
+
//
|
|
326
|
+
// Atomic apiKey+siteUrl (SF-3): only honor the preview key when its OWN siteUrl is present.
|
|
327
|
+
// Never let a preview key borrow config.json's (real-dev) siteUrl — that would send a
|
|
328
|
+
// preview credential to a non-preview gateway (STD-261). If siteUrl is absent we skip this
|
|
329
|
+
// branch and fall through to the profile pin / default, so it is impossible by construction
|
|
330
|
+
// for a `preview:true` key to be paired with the committed real-dev gateway.
|
|
331
|
+
if (localConfig?.apiKey && localConfig.siteUrl) {
|
|
332
|
+
return {
|
|
333
|
+
apiKey: localConfig.apiKey,
|
|
334
|
+
siteUrl: localConfig.siteUrl.replace(/\/$/, ''),
|
|
335
|
+
source: 'project',
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
// 2b. Profile pin (config.local.json profile field, gitignored)
|
|
339
|
+
if (localConfig?.profile) {
|
|
340
|
+
const namedConfig = resolveNamedProfileConfig(localConfig.profile);
|
|
341
|
+
if (namedConfig?.apiKey) {
|
|
342
|
+
// siteUrl: local.profile.siteUrl || config.json.siteUrl || env || default
|
|
343
|
+
const projectConfig = readProjectConfig();
|
|
344
|
+
return {
|
|
345
|
+
apiKey: namedConfig.apiKey,
|
|
346
|
+
siteUrl: (namedConfig.siteUrl || projectConfig?.siteUrl || envSite || DEFAULT_SITE_URL).replace(/\/$/, ''),
|
|
347
|
+
source: 'project',
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
// 2b. config.json — siteUrl gateway override only (no apiKey, no profile)
|
|
352
|
+
// Falls through; siteUrl from config.json is used as a tiebreaker below in step 3.
|
|
353
|
+
// 3. Profile system
|
|
354
|
+
const projectConfig = readProjectConfig();
|
|
355
|
+
const profileConfig = resolveProfileConfig();
|
|
356
|
+
if (profileConfig?.apiKey) {
|
|
357
|
+
return {
|
|
358
|
+
apiKey: profileConfig.apiKey,
|
|
359
|
+
siteUrl: (projectConfig?.siteUrl || profileConfig.siteUrl || envSite || DEFAULT_SITE_URL).replace(/\/$/, ''),
|
|
360
|
+
source: 'profile',
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
// 4. Legacy home config
|
|
364
|
+
if (existsSync(HOME_ENV_PATH)) {
|
|
365
|
+
const vars = parseEnvVars(readFileSync(HOME_ENV_PATH, 'utf8'));
|
|
366
|
+
if (vars['PRODUCTBRAIN_API_KEY']) {
|
|
367
|
+
return {
|
|
368
|
+
apiKey: vars['PRODUCTBRAIN_API_KEY'],
|
|
369
|
+
siteUrl: (projectConfig?.siteUrl || vars['CONVEX_SITE_URL'] || envSite || DEFAULT_SITE_URL).replace(/\/$/, ''),
|
|
370
|
+
source: 'profile',
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
// 5. CWD .env files
|
|
375
|
+
for (const p of CWD_ENV_PATHS) {
|
|
376
|
+
const full = resolve(process.cwd(), p);
|
|
377
|
+
if (existsSync(full)) {
|
|
378
|
+
const vars = parseEnvVars(readFileSync(full, 'utf8'));
|
|
379
|
+
if (vars['PRODUCTBRAIN_API_KEY']) {
|
|
380
|
+
return {
|
|
381
|
+
apiKey: vars['PRODUCTBRAIN_API_KEY'],
|
|
382
|
+
siteUrl: (projectConfig?.siteUrl || vars['CONVEX_SITE_URL'] || envSite || DEFAULT_SITE_URL).replace(/\/$/, ''),
|
|
383
|
+
source: 'cwd',
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
break;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
// 6. No API key found anywhere — return with siteUrl default
|
|
390
|
+
const resolvedSiteUrl = (projectConfig?.siteUrl || envSite || DEFAULT_SITE_URL).replace(/\/$/, '');
|
|
391
|
+
// TEN-2382: the published CLI's prod default is intended (WP-301), so we do NOT
|
|
392
|
+
// warn on prod fall-through in general. The ONE exception is the preview-scrub
|
|
393
|
+
// misroute — a preview binding whose apiKey is present but whose siteUrl was
|
|
394
|
+
// scrubbed (the STD-261 atomic guard at step 2a dropped the key), now silently
|
|
395
|
+
// resolving to the production gateway. That single case is a real misroute.
|
|
396
|
+
if (localConfig?.apiKey && resolvedSiteUrl === DEFAULT_SITE_URL.replace(/\/$/, '')) {
|
|
397
|
+
process.stderr.write(`Warning: a preview API key is configured but its deployment URL is missing — ` +
|
|
398
|
+
`defaulting to the production gateway ${DEFAULT_SITE_URL}. Run ` +
|
|
399
|
+
`\`npm run pb:preview\` to rebind the preview, or set CONVEX_SITE_URL.\n`);
|
|
400
|
+
}
|
|
401
|
+
return {
|
|
402
|
+
apiKey: undefined,
|
|
403
|
+
siteUrl: resolvedSiteUrl,
|
|
404
|
+
source: 'default',
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
/** Parse env file content and return key-value pairs (without mutating process.env). */
|
|
408
|
+
function parseEnvVars(content) {
|
|
409
|
+
const vars = {};
|
|
410
|
+
for (const line of content.split('\n')) {
|
|
411
|
+
const m = line.match(/^([^#=]+)=(.*)$/);
|
|
412
|
+
if (m) {
|
|
413
|
+
vars[m[1].trim()] = m[2].trim().replace(/^["']|["']$/g, '');
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
return vars;
|
|
417
|
+
}
|
|
19
418
|
function parseEnvContent(content) {
|
|
20
419
|
for (const line of content.split('\n')) {
|
|
21
420
|
const m = line.match(/^([^#=]+)=(.*)$/);
|
|
@@ -25,9 +424,55 @@ function parseEnvContent(content) {
|
|
|
25
424
|
}
|
|
26
425
|
}
|
|
27
426
|
function loadEnv() {
|
|
427
|
+
if (envLoaded)
|
|
428
|
+
return;
|
|
429
|
+
envLoaded = true;
|
|
430
|
+
// 1. Try local project config first (preview binding or profile pin, config.local.json)
|
|
431
|
+
const localConfig = readLocalProjectConfig();
|
|
432
|
+
// 1a. Direct preview binding — set by `npm run pb:preview`, takes priority over profile pin.
|
|
433
|
+
// Atomic apiKey+siteUrl (SF-3): only bind the preview key when its OWN siteUrl is present —
|
|
434
|
+
// never let it fall through to config.json's (real-dev) siteUrl (STD-261). Mirror of the
|
|
435
|
+
// resolveConfig() 2a guard so loadEnv() and resolveConfig() agree on what counts as a binding.
|
|
436
|
+
if (localConfig?.apiKey && localConfig.siteUrl && !process.env.PRODUCTBRAIN_API_KEY) {
|
|
437
|
+
process.env.PRODUCTBRAIN_API_KEY = localConfig.apiKey;
|
|
438
|
+
// SF-3 atomic pair: when we accept the preview key, we MUST pair it with
|
|
439
|
+
// its OWN siteUrl — even if CONVEX_SITE_URL is already exported. Otherwise
|
|
440
|
+
// a stale/real exported CONVEX_SITE_URL would silently route the preview
|
|
441
|
+
// credential to a non-preview gateway. Mirror of resolveConfig() step 2a,
|
|
442
|
+
// which returns localConfig.siteUrl unconditionally inside this branch.
|
|
443
|
+
process.env.CONVEX_SITE_URL = localConfig.siteUrl.replace(/\/$/, '');
|
|
444
|
+
}
|
|
445
|
+
// 1b. Profile pin
|
|
446
|
+
if (localConfig?.profile && !process.env.PRODUCTBRAIN_API_KEY) {
|
|
447
|
+
const namedConfig = resolveNamedProfileConfig(localConfig.profile);
|
|
448
|
+
if (namedConfig?.apiKey) {
|
|
449
|
+
process.env.PRODUCTBRAIN_API_KEY = namedConfig.apiKey;
|
|
450
|
+
if (!process.env.CONVEX_SITE_URL && namedConfig.siteUrl) {
|
|
451
|
+
process.env.CONVEX_SITE_URL = namedConfig.siteUrl.replace(/\/$/, '');
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
// 1b. Apply siteUrl from config.json (gateway override — no apiKey reading here)
|
|
456
|
+
const projectConfig = readProjectConfig();
|
|
457
|
+
if (projectConfig?.siteUrl && !process.env.CONVEX_SITE_URL) {
|
|
458
|
+
process.env.CONVEX_SITE_URL = projectConfig.siteUrl.replace(/\/$/, '');
|
|
459
|
+
}
|
|
460
|
+
// 2. Try profile system (handles auto-migration from legacy .env)
|
|
461
|
+
const profileConfig = resolveProfileConfig();
|
|
462
|
+
if (profileConfig) {
|
|
463
|
+
// Only set if not already set by env vars or project config
|
|
464
|
+
if (!process.env.PRODUCTBRAIN_API_KEY) {
|
|
465
|
+
process.env.PRODUCTBRAIN_API_KEY = profileConfig.apiKey;
|
|
466
|
+
}
|
|
467
|
+
if (!process.env.CONVEX_SITE_URL && profileConfig.siteUrl) {
|
|
468
|
+
process.env.CONVEX_SITE_URL = profileConfig.siteUrl.replace(/\/$/, '');
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
// 3. Legacy home config (in case profiles didn't find it)
|
|
28
472
|
if (existsSync(HOME_ENV_PATH)) {
|
|
29
473
|
parseEnvContent(readFileSync(HOME_ENV_PATH, 'utf8'));
|
|
30
474
|
}
|
|
475
|
+
// 4. CWD env files
|
|
31
476
|
for (const p of CWD_ENV_PATHS) {
|
|
32
477
|
const full = resolve(process.cwd(), p);
|
|
33
478
|
if (existsSync(full)) {
|
|
@@ -36,49 +481,55 @@ function loadEnv() {
|
|
|
36
481
|
}
|
|
37
482
|
}
|
|
38
483
|
}
|
|
39
|
-
|
|
40
|
-
function
|
|
41
|
-
|
|
42
|
-
rl.question(prompt, (answer) => resolve((answer ?? '').trim().toLowerCase()));
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
function questionRaw(rl, prompt) {
|
|
46
|
-
return new Promise((resolve) => {
|
|
47
|
-
rl.question(prompt, (answer) => resolve((answer ?? '').trim()));
|
|
48
|
-
});
|
|
484
|
+
/** Reset env loaded state — used for profile switching. */
|
|
485
|
+
export function resetConfigCache() {
|
|
486
|
+
envLoaded = false;
|
|
49
487
|
}
|
|
50
488
|
/**
|
|
51
489
|
* Guided flow when key is missing (TTY only). Per docs/cli-unauthenticated-user-journey.md.
|
|
52
490
|
* Returns true if we saved and ran retry; false if user said No (caller should exit).
|
|
53
491
|
*/
|
|
54
492
|
async function runGuidedFlow(retry) {
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
if (hasKey
|
|
493
|
+
const hasKey = await promptConfirm({
|
|
494
|
+
message: 'Do you have an API key from Product Brain?',
|
|
495
|
+
initialValue: false,
|
|
496
|
+
});
|
|
497
|
+
if (!hasKey) {
|
|
60
498
|
console.log('Get your key: Product Brain app → Settings → API Keys. Then run: pb login');
|
|
61
|
-
rl.close();
|
|
62
499
|
process.exit(0);
|
|
63
500
|
}
|
|
64
|
-
let apiKey = await
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
501
|
+
let apiKey = await promptPassword({
|
|
502
|
+
message: `Paste your API key (${API_KEY_PREFIX}...)`,
|
|
503
|
+
validate: (v) => (!v ? 'Key is required' : undefined),
|
|
504
|
+
});
|
|
505
|
+
if (!apiKey.startsWith(API_KEY_PREFIX)) {
|
|
506
|
+
console.log(`Key must start with ${API_KEY_PREFIX}. Try again or run pb login.`);
|
|
507
|
+
apiKey = await promptPassword({
|
|
508
|
+
message: `Paste your API key (${API_KEY_PREFIX}...)`,
|
|
509
|
+
validate: (v) => (!v || !v.startsWith(API_KEY_PREFIX) ? `Key must start with ${API_KEY_PREFIX}` : undefined),
|
|
510
|
+
});
|
|
68
511
|
}
|
|
69
|
-
|
|
70
|
-
if (!apiKey || !apiKey.startsWith('pb_sk_')) {
|
|
512
|
+
if (!apiKey || !apiKey.startsWith(API_KEY_PREFIX)) {
|
|
71
513
|
console.log('Get your key: Product Brain app → Settings → API Keys. Then run: pb login');
|
|
72
514
|
process.exit(0);
|
|
73
515
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
''
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
516
|
+
// Save as a named profile via the profile system
|
|
517
|
+
const { createProfile, getActiveProfile } = await import('./profiles.js');
|
|
518
|
+
const profileName = getActiveProfile() || 'default';
|
|
519
|
+
try {
|
|
520
|
+
createProfile(profileName, apiKey, DEFAULT_SITE_URL.replace(/\/$/, ''));
|
|
521
|
+
}
|
|
522
|
+
catch {
|
|
523
|
+
// Profile already exists — fall back to legacy path
|
|
524
|
+
const content = [
|
|
525
|
+
`# Product Brain CLI — saved by guided setup`,
|
|
526
|
+
`PRODUCTBRAIN_API_KEY=${apiKey}`,
|
|
527
|
+
`CONVEX_SITE_URL=${DEFAULT_SITE_URL.replace(/\/$/, '')}`,
|
|
528
|
+
'',
|
|
529
|
+
].join('\n');
|
|
530
|
+
mkdirSync(HOME_CONFIG_DIR, { recursive: true });
|
|
531
|
+
writeFileSync(HOME_ENV_PATH, content, { mode: 0o600 });
|
|
532
|
+
}
|
|
82
533
|
process.env.PRODUCTBRAIN_API_KEY = apiKey;
|
|
83
534
|
process.env.CONVEX_SITE_URL = DEFAULT_SITE_URL.replace(/\/$/, '');
|
|
84
535
|
console.log('Saved your key. Running your command…\n');
|
|
@@ -86,32 +537,133 @@ async function runGuidedFlow(retry) {
|
|
|
86
537
|
return true;
|
|
87
538
|
}
|
|
88
539
|
export function getConfig() {
|
|
540
|
+
loadEnv();
|
|
89
541
|
const apiKey = process.env.PRODUCTBRAIN_API_KEY ?? '';
|
|
90
542
|
const siteUrl = (process.env.CONVEX_SITE_URL ?? DEFAULT_SITE_URL).replace(/\/$/, '');
|
|
91
|
-
if (!apiKey || !apiKey.startsWith(
|
|
92
|
-
throw new
|
|
543
|
+
if (!apiKey || !apiKey.startsWith(API_KEY_PREFIX)) {
|
|
544
|
+
throw new CLIError(NON_TTY_MESSAGE, {
|
|
545
|
+
code: ErrorCode.AUTH_MISSING,
|
|
546
|
+
category: 'auth',
|
|
547
|
+
guidance: 'Set PRODUCTBRAIN_API_KEY or run `pb login`.',
|
|
548
|
+
});
|
|
93
549
|
}
|
|
94
|
-
|
|
95
|
-
|
|
550
|
+
const allowHttp = isDevMode() && siteUrl.startsWith('http://localhost');
|
|
551
|
+
if (!siteUrl.startsWith('https://') && !allowHttp) {
|
|
552
|
+
throw new CLIError(`CONVEX_SITE_URL must use HTTPS (got "${siteUrl.slice(0, 30)}…"). API keys must not be sent over unencrypted connections.`, {
|
|
553
|
+
code: ErrorCode.CONFIG_INVALID,
|
|
554
|
+
category: 'config',
|
|
555
|
+
guidance: 'Set CONVEX_SITE_URL to an https:// URL.',
|
|
556
|
+
});
|
|
96
557
|
}
|
|
97
558
|
return { apiKey, siteUrl };
|
|
98
559
|
}
|
|
560
|
+
/**
|
|
561
|
+
* Non-throwing alternative to getConfig().
|
|
562
|
+
*
|
|
563
|
+
* Architecture: getConfig() is the primary path for commands that require auth — it
|
|
564
|
+
* throws CLIError when the key is missing, which is correct for API call paths.
|
|
565
|
+
* getConfigSafe() is for status/probe surfaces (no-args dashboard, init) that need
|
|
566
|
+
* to check config availability without crashing. Both paths are intentional and
|
|
567
|
+
* coexist by design — see WP-303 review (DW#5).
|
|
568
|
+
*
|
|
569
|
+
* Uses resolveConfig() directly (no loadEnv) to avoid env var pollution affecting source attribution.
|
|
570
|
+
*/
|
|
571
|
+
export function getConfigSafe() {
|
|
572
|
+
const resolved = resolveConfig();
|
|
573
|
+
if (!resolved.apiKey || !resolved.apiKey.startsWith(API_KEY_PREFIX)) {
|
|
574
|
+
return { ok: false, reason: 'No API key. Run pb login or set PRODUCTBRAIN_API_KEY.' };
|
|
575
|
+
}
|
|
576
|
+
const siteUrl = resolved.siteUrl;
|
|
577
|
+
const allowHttp = isDevMode() && siteUrl.startsWith('http://localhost');
|
|
578
|
+
if (!siteUrl.startsWith('https://') && !allowHttp) {
|
|
579
|
+
return {
|
|
580
|
+
ok: false,
|
|
581
|
+
reason: `CONVEX_SITE_URL must use HTTPS (got "${siteUrl.slice(0, 30)}…"). API keys must not be sent over unencrypted connections.`,
|
|
582
|
+
};
|
|
583
|
+
}
|
|
584
|
+
return { ok: true, apiKey: resolved.apiKey, siteUrl, source: resolved.source };
|
|
585
|
+
}
|
|
99
586
|
/**
|
|
100
587
|
* Get config; if key is missing and stdin is a TTY, run guided flow (y/n → paste key → save → retry).
|
|
101
588
|
* @param retry Called after saving key so the original command runs in-process.
|
|
102
589
|
* @returns Config, or null if we ran retry (caller should return without running again).
|
|
103
590
|
*/
|
|
104
591
|
export async function getConfigOrGuide(retry) {
|
|
592
|
+
loadEnv();
|
|
105
593
|
const apiKey = process.env.PRODUCTBRAIN_API_KEY ?? '';
|
|
106
594
|
const siteUrl = (process.env.CONVEX_SITE_URL ?? DEFAULT_SITE_URL).replace(/\/$/, '');
|
|
107
|
-
|
|
595
|
+
const allowHttp = isDevMode() && siteUrl.startsWith('http://localhost');
|
|
596
|
+
if (apiKey.startsWith(API_KEY_PREFIX) && (siteUrl.startsWith('https://') || allowHttp)) {
|
|
108
597
|
return { apiKey, siteUrl };
|
|
109
598
|
}
|
|
110
599
|
if (!process.stdin.isTTY) {
|
|
111
|
-
throw new
|
|
600
|
+
throw new CLIError(NON_TTY_MESSAGE, {
|
|
601
|
+
code: ErrorCode.AUTH_MISSING,
|
|
602
|
+
category: 'auth',
|
|
603
|
+
guidance: 'Set PRODUCTBRAIN_API_KEY or run `pb login`.',
|
|
604
|
+
});
|
|
112
605
|
}
|
|
113
606
|
const didRetry = await runGuidedFlow(retry);
|
|
114
607
|
return didRetry ? null : null;
|
|
115
608
|
}
|
|
116
|
-
|
|
609
|
+
/**
|
|
610
|
+
* Resolve config for admin operations — profile-only resolution.
|
|
611
|
+
*
|
|
612
|
+
* Admin commands (pb admin ...) must NOT read .productbrain/config.json or CWD env files.
|
|
613
|
+
* The project config intentionally pins the repo to a dev Convex site; admin operations
|
|
614
|
+
* target PROD workspaces via the operator's active profile. Reading project config here
|
|
615
|
+
* would silently route admin calls to the wrong gateway (TEN-1334).
|
|
616
|
+
*
|
|
617
|
+
* Resolution order:
|
|
618
|
+
* 1. Shell env vars (PRODUCTBRAIN_API_KEY / CONVEX_SITE_URL) — always win
|
|
619
|
+
* 2. Active named profile (~/.config/productbrain/profiles/{name}.env)
|
|
620
|
+
* 3. Legacy home config (~/.config/productbrain/.env)
|
|
621
|
+
* 4. DEFAULT_SITE_URL as fallback for siteUrl
|
|
622
|
+
*
|
|
623
|
+
* Throws CLIError with AUTH_MISSING if no API key is found.
|
|
624
|
+
*/
|
|
625
|
+
export function resolveAdminConfig() {
|
|
626
|
+
let apiKey;
|
|
627
|
+
let rawSiteUrl;
|
|
628
|
+
// 1. Shell env vars — always highest priority
|
|
629
|
+
const envKey = process.env.PRODUCTBRAIN_API_KEY;
|
|
630
|
+
if (envKey?.startsWith(API_KEY_PREFIX)) {
|
|
631
|
+
apiKey = envKey;
|
|
632
|
+
rawSiteUrl = process.env.CONVEX_SITE_URL;
|
|
633
|
+
}
|
|
634
|
+
// 2. Active profile (no project config, no CWD files)
|
|
635
|
+
if (!apiKey) {
|
|
636
|
+
const profileConfig = resolveProfileConfig();
|
|
637
|
+
if (profileConfig?.apiKey?.startsWith(API_KEY_PREFIX)) {
|
|
638
|
+
apiKey = profileConfig.apiKey;
|
|
639
|
+
rawSiteUrl = profileConfig.siteUrl;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
// 3. Legacy ~/.config/productbrain/.env
|
|
643
|
+
if (!apiKey && existsSync(HOME_ENV_PATH)) {
|
|
644
|
+
const vars = parseEnvVars(readFileSync(HOME_ENV_PATH, 'utf8'));
|
|
645
|
+
if (vars['PRODUCTBRAIN_API_KEY']?.startsWith(API_KEY_PREFIX)) {
|
|
646
|
+
apiKey = vars['PRODUCTBRAIN_API_KEY'];
|
|
647
|
+
rawSiteUrl = vars['CONVEX_SITE_URL'];
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
if (!apiKey) {
|
|
651
|
+
throw new CLIError('No API key found. Run pb login or set PRODUCTBRAIN_API_KEY.', {
|
|
652
|
+
code: ErrorCode.AUTH_MISSING,
|
|
653
|
+
category: 'auth',
|
|
654
|
+
guidance: 'Run `pb login` to set your API key.',
|
|
655
|
+
});
|
|
656
|
+
}
|
|
657
|
+
const siteUrl = (rawSiteUrl || DEFAULT_SITE_URL).replace(/\/$/, '');
|
|
658
|
+
const allowHttp = isDevMode() && siteUrl.startsWith('http://localhost');
|
|
659
|
+
if (!siteUrl.startsWith('https://') && !allowHttp) {
|
|
660
|
+
throw new CLIError(`CONVEX_SITE_URL must use HTTPS for admin operations (got "${siteUrl.slice(0, 30)}…").`, {
|
|
661
|
+
code: ErrorCode.CONFIG_INVALID,
|
|
662
|
+
category: 'config',
|
|
663
|
+
guidance: 'Set CONVEX_SITE_URL to an https:// URL.',
|
|
664
|
+
});
|
|
665
|
+
}
|
|
666
|
+
return { apiKey, siteUrl };
|
|
667
|
+
}
|
|
668
|
+
export { HOME_CONFIG_DIR, HOME_ENV_PATH, readProjectConfig };
|
|
117
669
|
//# sourceMappingURL=config.js.map
|