@productbrain/cli 0.1.0-beta.92 → 0.1.0-beta.925
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/dist/__tests__/audit.test.js +5 -0
- package/dist/__tests__/audit.test.js.map +1 -1
- 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__/config.test.d.ts +1 -1
- package/dist/__tests__/config.test.js +410 -10
- 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__/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.js +1 -0
- package/dist/__tests__/errors.test.js.map +1 -1
- 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.js +688 -3
- package/dist/__tests__/handshake-preview.test.js.map +1 -1
- 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 +611 -2
- package/dist/__tests__/handshake.test.js.map +1 -1
- package/dist/__tests__/manifest.test.js +118 -1
- package/dist/__tests__/manifest.test.js.map +1 -1
- 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 +135 -8
- 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 +1 -2
- package/dist/__tests__/personal-layer.test.d.ts.map +1 -1
- package/dist/__tests__/personal-layer.test.js +12 -48
- package/dist/__tests__/personal-layer.test.js.map +1 -1
- package/dist/__tests__/profiles.test.js +153 -5
- package/dist/__tests__/profiles.test.js.map +1 -1
- package/dist/__tests__/promote.test.js +71 -2
- package/dist/__tests__/promote.test.js.map +1 -1
- package/dist/__tests__/session-state-machine.test.js +45 -1
- package/dist/__tests__/session-state-machine.test.js.map +1 -1
- 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 +129 -0
- package/dist/__tests__/session-switch.test.js.map +1 -0
- 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 +187 -0
- package/dist/__tests__/skill-vocabulary.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 +56 -0
- package/dist/__tests__/update-check.test.js.map +1 -0
- 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 +42 -0
- package/dist/__tests__/upgrade-runner.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.js +32 -12
- package/dist/__tests__/workspace.test.js.map +1 -1
- 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/admin/seed.d.ts +46 -2
- package/dist/commands/admin/seed.d.ts.map +1 -1
- package/dist/commands/admin/seed.js +475 -33
- 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 +67 -2
- 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 +117 -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 +67 -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 +30 -3
- package/dist/commands/audit.js.map +1 -1
- package/dist/commands/authority-domains.d.ts +146 -0
- package/dist/commands/authority-domains.d.ts.map +1 -0
- package/dist/commands/authority-domains.js +282 -0
- package/dist/commands/authority-domains.js.map +1 -0
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +3 -2
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/codex-prep.d.ts +1 -0
- package/dist/commands/codex-prep.d.ts.map +1 -1
- package/dist/commands/codex-prep.js +10 -7
- package/dist/commands/codex-prep.js.map +1 -1
- 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.js +29 -12
- package/dist/commands/connect-integration.test.js.map +1 -1
- package/dist/commands/connect-screens.d.ts +6 -4
- package/dist/commands/connect-screens.d.ts.map +1 -1
- package/dist/commands/connect-screens.js +30 -19
- package/dist/commands/connect-screens.js.map +1 -1
- package/dist/commands/connect.d.ts +21 -6
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +78 -51
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/connect.test.js +64 -1
- package/dist/commands/connect.test.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +68 -3
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctor.test.js +131 -0
- package/dist/commands/doctor.test.js.map +1 -1
- package/dist/commands/handshake.d.ts +194 -2
- package/dist/commands/handshake.d.ts.map +1 -1
- package/dist/commands/handshake.js +1738 -44
- package/dist/commands/handshake.js.map +1 -1
- package/dist/commands/method.d.ts.map +1 -1
- package/dist/commands/method.js +3 -0
- package/dist/commands/method.js.map +1 -1
- 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 +198 -0
- package/dist/commands/migrate-setup.js.map +1 -0
- package/dist/commands/orient.d.ts +15 -2
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +86 -4
- 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 +109 -26
- package/dist/commands/profile.js.map +1 -1
- package/dist/commands/promote.d.ts.map +1 -1
- package/dist/commands/promote.js +25 -2
- package/dist/commands/promote.js.map +1 -1
- package/dist/commands/relate.d.ts.map +1 -1
- package/dist/commands/relate.js +13 -0
- package/dist/commands/relate.js.map +1 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +55 -18
- 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 +226 -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 +52 -131
- package/dist/commands/setup.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 +89 -0
- package/dist/commands/upgrade.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 +74 -2
- package/dist/commands/workspace.d.ts.map +1 -1
- package/dist/commands/workspace.js +26 -2
- package/dist/commands/workspace.js.map +1 -1
- 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/handshake.d.ts +19 -3
- package/dist/formatters/handshake.d.ts.map +1 -1
- package/dist/formatters/handshake.js +48 -13
- package/dist/formatters/handshake.js.map +1 -1
- package/dist/formatters/orient.d.ts +50 -4
- package/dist/formatters/orient.d.ts.map +1 -1
- package/dist/formatters/orient.js +64 -16
- package/dist/formatters/orient.js.map +1 -1
- package/dist/formatters/session.js +1 -1
- package/dist/formatters/session.js.map +1 -1
- package/dist/generators/adapters.js +2 -2
- 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/context-md.js +6 -6
- package/dist/generators/context-md.js.map +1 -1
- package/dist/generators/manifest.d.ts +78 -0
- package/dist/generators/manifest.d.ts.map +1 -1
- package/dist/generators/manifest.js +125 -14
- package/dist/generators/manifest.js.map +1 -1
- package/dist/generators/portable-knowledge.d.ts +6 -12
- package/dist/generators/portable-knowledge.d.ts.map +1 -1
- package/dist/generators/portable-knowledge.js +2 -19
- package/dist/generators/portable-knowledge.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.js +242 -26
- package/dist/index.js.map +1 -1
- package/dist/lib/activation.d.ts.map +1 -1
- package/dist/lib/activation.js +3 -3
- package/dist/lib/activation.js.map +1 -1
- package/dist/lib/activation.test.js +3 -3
- package/dist/lib/activation.test.js.map +1 -1
- 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.map +1 -1
- package/dist/lib/client.js +27 -17
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/config.d.ts +98 -9
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +231 -44
- 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 +2 -0
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +2 -0
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/errors.d.ts +3 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +3 -0
- package/dist/lib/errors.js.map +1 -1
- 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/onboarding-path-b.d.ts.map +1 -1
- package/dist/lib/onboarding-path-b.js +0 -1
- package/dist/lib/onboarding-path-b.js.map +1 -1
- package/dist/lib/onboarding-shared.d.ts +0 -1
- package/dist/lib/onboarding-shared.d.ts.map +1 -1
- package/dist/lib/onboarding-shared.js +1 -17
- package/dist/lib/onboarding-shared.js.map +1 -1
- package/dist/lib/profiles.d.ts +3 -1
- package/dist/lib/profiles.d.ts.map +1 -1
- package/dist/lib/profiles.js +9 -6
- package/dist/lib/profiles.js.map +1 -1
- package/dist/lib/session.d.ts +10 -0
- package/dist/lib/session.d.ts.map +1 -1
- package/dist/lib/session.js +14 -0
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/update-check.d.ts +20 -0
- package/dist/lib/update-check.d.ts.map +1 -1
- package/dist/lib/update-check.js +122 -21
- package/dist/lib/update-check.js.map +1 -1
- package/dist/lib/upgrade-runner.d.ts +21 -0
- package/dist/lib/upgrade-runner.d.ts.map +1 -0
- package/dist/lib/upgrade-runner.js +109 -0
- package/dist/lib/upgrade-runner.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/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 +58 -2
- package/dist/surfaces/registry.d.ts.map +1 -1
- package/dist/surfaces/registry.js +82 -7
- package/dist/surfaces/registry.js.map +1 -1
- 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 +3 -1
- 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/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
package/dist/lib/update-check.js
CHANGED
|
@@ -11,16 +11,59 @@
|
|
|
11
11
|
* - JSON mode: suppress notification entirely
|
|
12
12
|
* - Does NOT use undici/fetch directly; uses Node.js built-in https
|
|
13
13
|
*/
|
|
14
|
-
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
14
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync, unlinkSync } from 'node:fs';
|
|
15
15
|
import { request } from 'node:https';
|
|
16
16
|
import { homedir } from 'node:os';
|
|
17
|
-
import { join } from 'node:path';
|
|
17
|
+
import { dirname, join } from 'node:path';
|
|
18
|
+
import { fileURLToPath } from 'node:url';
|
|
19
|
+
import { UPGRADE_COMMAND } from './constants.js';
|
|
18
20
|
import { isJsonMode } from './runner.js';
|
|
19
21
|
import { dim, yellow } from './style.js';
|
|
22
|
+
import { trackEvent } from './telemetry.js';
|
|
20
23
|
const PKG_NAME = '@productbrain/cli';
|
|
21
24
|
const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
22
25
|
const CONFIG_DIR = join(homedir(), '.config', 'productbrain');
|
|
23
26
|
const CACHE_PATH = join(CONFIG_DIR, 'update-check.json');
|
|
27
|
+
const UPGRADE_PENDING_PATH = join(CONFIG_DIR, 'upgrade-pending');
|
|
28
|
+
const NPM_BETA_URL = `https://registry.npmjs.org/${PKG_NAME}/beta`;
|
|
29
|
+
const CHANNEL_RANK = { alpha: -3, beta: -2, rc: -1 };
|
|
30
|
+
let cacheWrittenThisProcess = false;
|
|
31
|
+
let pendingUpgradeClearedThisProcess = false;
|
|
32
|
+
let versionSkewReportedThisProcess = false;
|
|
33
|
+
let cachedRunningCliVersion;
|
|
34
|
+
/** Read the running CLI version from the package's package.json (cached after first read). */
|
|
35
|
+
function readRunningCliVersion() {
|
|
36
|
+
if (cachedRunningCliVersion !== undefined)
|
|
37
|
+
return cachedRunningCliVersion;
|
|
38
|
+
try {
|
|
39
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
40
|
+
const pkgPath = join(here, '..', '..', 'package.json');
|
|
41
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
|
42
|
+
cachedRunningCliVersion = pkg.version ?? null;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
cachedRunningCliVersion = null;
|
|
46
|
+
}
|
|
47
|
+
return cachedRunningCliVersion;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Emit `cli.version_skew.detected` at most once per process when a strictly newer
|
|
51
|
+
* version has been observed. Exported so callers (e.g. doctor's freshness check)
|
|
52
|
+
* can fire it from their own discovery path while sharing the dedup guard.
|
|
53
|
+
*/
|
|
54
|
+
export function reportVersionSkewIfNew(latest, current) {
|
|
55
|
+
if (versionSkewReportedThisProcess)
|
|
56
|
+
return;
|
|
57
|
+
if (!latest)
|
|
58
|
+
return;
|
|
59
|
+
const running = current ?? readRunningCliVersion();
|
|
60
|
+
if (!running)
|
|
61
|
+
return;
|
|
62
|
+
if (!isNewer(running, latest))
|
|
63
|
+
return;
|
|
64
|
+
versionSkewReportedThisProcess = true;
|
|
65
|
+
trackEvent('cli.version_skew.detected', { current: running, latest });
|
|
66
|
+
}
|
|
24
67
|
/** Read the cached latest version if it is still fresh (< 24h). */
|
|
25
68
|
function readCache() {
|
|
26
69
|
try {
|
|
@@ -37,23 +80,62 @@ function readCache() {
|
|
|
37
80
|
}
|
|
38
81
|
return null;
|
|
39
82
|
}
|
|
83
|
+
export function readCachedLatestVersion() {
|
|
84
|
+
if (isVersionCheckDisabled())
|
|
85
|
+
return null;
|
|
86
|
+
return readCache();
|
|
87
|
+
}
|
|
40
88
|
/** Write a cache entry with the resolved latest version. */
|
|
41
89
|
function writeCache(latestVersion) {
|
|
42
90
|
try {
|
|
43
91
|
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
44
92
|
const entry = { checkedAt: Date.now(), latestVersion };
|
|
45
93
|
writeFileSync(CACHE_PATH, JSON.stringify(entry), 'utf8');
|
|
94
|
+
cacheWrittenThisProcess = true;
|
|
46
95
|
}
|
|
47
96
|
catch {
|
|
48
97
|
// Cache write failure is non-fatal
|
|
49
98
|
}
|
|
50
99
|
}
|
|
100
|
+
function isVersionCheckDisabled() {
|
|
101
|
+
return process.env.PB_NO_VERSION_CHECK === '1';
|
|
102
|
+
}
|
|
103
|
+
/** Clear the post-upgrade sentinel and stale update cache on next CLI startup. */
|
|
104
|
+
export function clearPendingUpgradeCache() {
|
|
105
|
+
if (pendingUpgradeClearedThisProcess)
|
|
106
|
+
return;
|
|
107
|
+
pendingUpgradeClearedThisProcess = true;
|
|
108
|
+
try {
|
|
109
|
+
if (!existsSync(UPGRADE_PENDING_PATH))
|
|
110
|
+
return;
|
|
111
|
+
try {
|
|
112
|
+
unlinkSync(UPGRADE_PENDING_PATH);
|
|
113
|
+
}
|
|
114
|
+
catch { /* non-fatal */ }
|
|
115
|
+
try {
|
|
116
|
+
if (existsSync(CACHE_PATH))
|
|
117
|
+
unlinkSync(CACHE_PATH);
|
|
118
|
+
}
|
|
119
|
+
catch { /* non-fatal */ }
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
// Sentinel cleanup must never block CLI startup.
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/** Written after a successful self-upgrade so the next CLI process drops stale cache. */
|
|
126
|
+
export function writeUpgradePendingSentinel() {
|
|
127
|
+
try {
|
|
128
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
129
|
+
writeFileSync(UPGRADE_PENDING_PATH, JSON.stringify({ upgradedAt: Date.now() }), 'utf8');
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Non-fatal: update checks will recover via normal cache TTL.
|
|
133
|
+
}
|
|
134
|
+
}
|
|
51
135
|
/** Fetch latest version from npm registry. Returns null on any error. */
|
|
52
136
|
function fetchLatestVersion() {
|
|
53
137
|
return new Promise((resolve) => {
|
|
54
|
-
|
|
55
|
-
const url = `https://registry.npmjs.org/${PKG_NAME}/beta`;
|
|
56
|
-
const req = request(url, { method: 'GET', headers: { 'Accept': 'application/json' } }, (res) => {
|
|
138
|
+
const req = request(NPM_BETA_URL, { method: 'GET', headers: { 'Accept': 'application/json' } }, (res) => {
|
|
57
139
|
let body = '';
|
|
58
140
|
res.on('data', (chunk) => { body += chunk.toString(); });
|
|
59
141
|
res.on('end', () => {
|
|
@@ -79,21 +161,19 @@ function fetchLatestVersion() {
|
|
|
79
161
|
* Compare two semver strings. Returns true if `b` is strictly newer than `a`.
|
|
80
162
|
* Handles standard x.y.z and x.y.z-beta.N formats (numeric comparison per part).
|
|
81
163
|
*/
|
|
82
|
-
function isNewer(current, latest) {
|
|
164
|
+
export function isNewer(current, latest) {
|
|
83
165
|
if (current === latest)
|
|
84
166
|
return false;
|
|
85
167
|
const parseVersion = (v) => {
|
|
86
|
-
// Strip leading 'v'
|
|
87
168
|
const clean = v.replace(/^v/, '');
|
|
88
|
-
// Split on '-' to handle pre-release like '0.1.0-beta.70'
|
|
89
169
|
const [release, pre] = clean.split('-');
|
|
90
170
|
const parts = (release ?? '').split('.').map((n) => parseInt(n, 10) || 0);
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return parts;
|
|
171
|
+
if (pre === undefined)
|
|
172
|
+
return [...parts, 0, 0];
|
|
173
|
+
const match = pre.match(/^([a-zA-Z]+)\.?(\d+)?/);
|
|
174
|
+
const channel = match?.[1]?.toLowerCase() ?? '';
|
|
175
|
+
const preNum = match?.[2] ? parseInt(match[2], 10) : 0;
|
|
176
|
+
return [...parts, CHANNEL_RANK[channel] ?? -4, Number.isFinite(preNum) ? preNum : 0];
|
|
97
177
|
};
|
|
98
178
|
const a = parseVersion(current);
|
|
99
179
|
const b = parseVersion(latest);
|
|
@@ -108,6 +188,29 @@ function isNewer(current, latest) {
|
|
|
108
188
|
}
|
|
109
189
|
return false;
|
|
110
190
|
}
|
|
191
|
+
/** Silently records a server-supplied latest version header. */
|
|
192
|
+
export function recordServerLatest(latestVersion) {
|
|
193
|
+
if (isVersionCheckDisabled())
|
|
194
|
+
return;
|
|
195
|
+
if (!latestVersion)
|
|
196
|
+
return;
|
|
197
|
+
if (cacheWrittenThisProcess && readCache() === latestVersion)
|
|
198
|
+
return;
|
|
199
|
+
writeCache(latestVersion);
|
|
200
|
+
reportVersionSkewIfNew(latestVersion);
|
|
201
|
+
}
|
|
202
|
+
/** Reads the latest version from cache or npm beta dist-tag. Silent on errors. */
|
|
203
|
+
export async function resolveLatestVersion() {
|
|
204
|
+
if (isVersionCheckDisabled())
|
|
205
|
+
return null;
|
|
206
|
+
const cached = readCache();
|
|
207
|
+
if (cached !== null)
|
|
208
|
+
return cached;
|
|
209
|
+
const latest = await fetchLatestVersion();
|
|
210
|
+
if (latest)
|
|
211
|
+
writeCache(latest);
|
|
212
|
+
return latest;
|
|
213
|
+
}
|
|
111
214
|
/**
|
|
112
215
|
* Prints one line to stderr if a newer version is available.
|
|
113
216
|
* The check is always non-blocking: it fires async and is not awaited by the caller.
|
|
@@ -115,6 +218,9 @@ function isNewer(current, latest) {
|
|
|
115
218
|
* Call once per human-initiated command, just before the command action runs.
|
|
116
219
|
*/
|
|
117
220
|
export function checkForUpdate(currentVersion) {
|
|
221
|
+
clearPendingUpgradeCache();
|
|
222
|
+
if (isVersionCheckDisabled())
|
|
223
|
+
return;
|
|
118
224
|
// Suppress in JSON/agent mode
|
|
119
225
|
if (isJsonMode())
|
|
120
226
|
return;
|
|
@@ -122,19 +228,14 @@ export function checkForUpdate(currentVersion) {
|
|
|
122
228
|
void (async () => {
|
|
123
229
|
try {
|
|
124
230
|
// Try cache first
|
|
125
|
-
|
|
126
|
-
if (latest === null) {
|
|
127
|
-
latest = await fetchLatestVersion();
|
|
128
|
-
if (latest)
|
|
129
|
-
writeCache(latest);
|
|
130
|
-
}
|
|
231
|
+
const latest = await resolveLatestVersion();
|
|
131
232
|
if (!latest)
|
|
132
233
|
return;
|
|
133
234
|
if (!isNewer(currentVersion, latest))
|
|
134
235
|
return;
|
|
135
236
|
// Print after current command output (nextTick ensures we don't interleave)
|
|
136
237
|
process.nextTick(() => {
|
|
137
|
-
process.stderr.write(`\n${yellow('Update available:')} ${dim(currentVersion)} → ${latest} ${dim('run')} pb upgrade ${dim(
|
|
238
|
+
process.stderr.write(`\n${yellow('Update available:')} ${dim(currentVersion)} → ${latest} ${dim('run')} pb upgrade ${dim(`(${UPGRADE_COMMAND})`)}\n`);
|
|
138
239
|
});
|
|
139
240
|
}
|
|
140
241
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/lib/update-check.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/lib/update-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type InstallChannel = 'npm' | 'pnpm' | 'yarn' | 'bun' | 'brew' | 'unknown';
|
|
2
|
+
export type UpgradeCommand = {
|
|
3
|
+
channel: InstallChannel;
|
|
4
|
+
command: string;
|
|
5
|
+
args: string[];
|
|
6
|
+
display: string;
|
|
7
|
+
};
|
|
8
|
+
export type UpgradeResult = {
|
|
9
|
+
channel: InstallChannel;
|
|
10
|
+
command: string;
|
|
11
|
+
exitCode: number;
|
|
12
|
+
output: string[];
|
|
13
|
+
};
|
|
14
|
+
export type SpawnUpgradeOptions = {
|
|
15
|
+
onOutput?: (line: string) => void;
|
|
16
|
+
env?: NodeJS.ProcessEnv;
|
|
17
|
+
};
|
|
18
|
+
export declare function detectInstallChannel(execPath?: string, env?: NodeJS.ProcessEnv): InstallChannel;
|
|
19
|
+
export declare function buildUpgradeCommand(channel: InstallChannel): UpgradeCommand;
|
|
20
|
+
export declare function spawnUpgrade(channel?: InstallChannel, options?: SpawnUpgradeOptions): Promise<UpgradeResult>;
|
|
21
|
+
//# sourceMappingURL=upgrade-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-runner.d.ts","sourceRoot":"","sources":["../../src/lib/upgrade-runner.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;AAElF,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB,CAAC;AAYF,wBAAgB,oBAAoB,CAAC,QAAQ,SAAmB,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,cAAc,CActH;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,CAc3E;AAaD,wBAAgB,YAAY,CAC1B,OAAO,GAAE,cAAuC,EAChD,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,aAAa,CAAC,CAiDxB"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { basename, dirname } from 'node:path';
|
|
3
|
+
import { CLIError, ErrorCode } from './errors.js';
|
|
4
|
+
import { UPGRADE_COMMAND } from './constants.js';
|
|
5
|
+
import { trackEvent } from './telemetry.js';
|
|
6
|
+
import { writeUpgradePendingSentinel } from './update-check.js';
|
|
7
|
+
function pathSegments(path) {
|
|
8
|
+
const segments = [];
|
|
9
|
+
let current = path;
|
|
10
|
+
while (current && current !== dirname(current)) {
|
|
11
|
+
segments.push(basename(current).toLowerCase());
|
|
12
|
+
current = dirname(current);
|
|
13
|
+
}
|
|
14
|
+
return segments;
|
|
15
|
+
}
|
|
16
|
+
export function detectInstallChannel(execPath = process.execPath, env = process.env) {
|
|
17
|
+
const ua = env.npm_config_user_agent?.toLowerCase() ?? '';
|
|
18
|
+
if (ua.startsWith('pnpm'))
|
|
19
|
+
return 'pnpm';
|
|
20
|
+
if (ua.startsWith('yarn'))
|
|
21
|
+
return 'yarn';
|
|
22
|
+
if (ua.startsWith('bun'))
|
|
23
|
+
return 'bun';
|
|
24
|
+
if (ua.startsWith('npm'))
|
|
25
|
+
return 'npm';
|
|
26
|
+
const segments = pathSegments(execPath);
|
|
27
|
+
if (segments.some((s) => s.includes('pnpm')))
|
|
28
|
+
return 'pnpm';
|
|
29
|
+
if (segments.some((s) => s.includes('yarn')))
|
|
30
|
+
return 'yarn';
|
|
31
|
+
if (segments.some((s) => s.includes('bun')))
|
|
32
|
+
return 'bun';
|
|
33
|
+
if (segments.some((s) => s.includes('homebrew') || s === 'brew' || s === 'cellar'))
|
|
34
|
+
return 'brew';
|
|
35
|
+
if (segments.some((s) => s.includes('npm') || s === 'node_modules'))
|
|
36
|
+
return 'npm';
|
|
37
|
+
return 'unknown';
|
|
38
|
+
}
|
|
39
|
+
export function buildUpgradeCommand(channel) {
|
|
40
|
+
switch (channel) {
|
|
41
|
+
case 'pnpm':
|
|
42
|
+
return { channel, command: 'pnpm', args: ['add', '-g', '@productbrain/cli@beta'], display: 'pnpm add -g @productbrain/cli@beta' };
|
|
43
|
+
case 'yarn':
|
|
44
|
+
return { channel, command: 'yarn', args: ['global', 'add', '@productbrain/cli@beta'], display: 'yarn global add @productbrain/cli@beta' };
|
|
45
|
+
case 'bun':
|
|
46
|
+
return { channel, command: 'bun', args: ['add', '-g', '@productbrain/cli@beta'], display: 'bun add -g @productbrain/cli@beta' };
|
|
47
|
+
case 'brew':
|
|
48
|
+
return { channel, command: 'brew', args: ['upgrade', 'productbrain'], display: 'brew upgrade productbrain' };
|
|
49
|
+
case 'npm':
|
|
50
|
+
case 'unknown':
|
|
51
|
+
return { channel, command: 'npm', args: ['install', '-g', '@productbrain/cli@beta'], display: UPGRADE_COMMAND };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function failureGuidance(message) {
|
|
55
|
+
const lower = message.toLowerCase();
|
|
56
|
+
if (lower.includes('eacces') || lower.includes('permission denied')) {
|
|
57
|
+
return 'Permission denied during global install. Use a Node version manager, fix the global npm prefix, or rerun the install command with the permissions your system requires.';
|
|
58
|
+
}
|
|
59
|
+
if (process.platform === 'win32' && (lower.includes('eperm') || lower.includes('busy') || lower.includes('locked'))) {
|
|
60
|
+
return 'Windows could not replace the active pb executable. Close terminals running pb, then rerun the upgrade command.';
|
|
61
|
+
}
|
|
62
|
+
return 'Run the displayed upgrade command manually, then retry pb doctor.';
|
|
63
|
+
}
|
|
64
|
+
export function spawnUpgrade(channel = detectInstallChannel(), options = {}) {
|
|
65
|
+
const spec = buildUpgradeCommand(channel);
|
|
66
|
+
const output = [];
|
|
67
|
+
trackEvent('cli.upgrade.initiated', { channel: spec.channel });
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
const child = spawn(spec.command, spec.args, {
|
|
70
|
+
env: options.env ?? process.env,
|
|
71
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
72
|
+
});
|
|
73
|
+
const emit = (chunk) => {
|
|
74
|
+
const text = chunk.toString();
|
|
75
|
+
for (const line of text.split(/\r?\n/).filter(Boolean)) {
|
|
76
|
+
output.push(line);
|
|
77
|
+
options.onOutput?.(line);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
child.stdout?.on('data', emit);
|
|
81
|
+
child.stderr?.on('data', emit);
|
|
82
|
+
child.on('error', (err) => {
|
|
83
|
+
const message = err.message || `Failed to spawn ${spec.display}`;
|
|
84
|
+
trackEvent('cli.upgrade.failed', { channel: spec.channel, reason: err.code ?? 'spawn_error' });
|
|
85
|
+
reject(new CLIError(`Upgrade failed: ${message}`, {
|
|
86
|
+
code: ErrorCode.UPGRADE_FAILED,
|
|
87
|
+
category: 'internal',
|
|
88
|
+
guidance: failureGuidance(message),
|
|
89
|
+
}));
|
|
90
|
+
});
|
|
91
|
+
child.on('close', (code) => {
|
|
92
|
+
const exitCode = code ?? 1;
|
|
93
|
+
if (exitCode !== 0) {
|
|
94
|
+
const message = output.slice(-4).join('\n') || `${spec.display} exited with code ${exitCode}`;
|
|
95
|
+
trackEvent('cli.upgrade.failed', { channel: spec.channel, exitCode });
|
|
96
|
+
reject(new CLIError(`Upgrade failed: ${message}`, {
|
|
97
|
+
code: ErrorCode.UPGRADE_FAILED,
|
|
98
|
+
category: 'internal',
|
|
99
|
+
guidance: failureGuidance(message),
|
|
100
|
+
}));
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
writeUpgradePendingSentinel();
|
|
104
|
+
trackEvent('cli.upgrade.succeeded', { channel: spec.channel });
|
|
105
|
+
resolve({ channel: spec.channel, command: spec.display, exitCode, output });
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=upgrade-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-runner.js","sourceRoot":"","sources":["../../src/lib/upgrade-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 5-minute TTL cache for workspace vocabulary context (WP-436 S2).
|
|
3
|
+
*
|
|
4
|
+
* Purpose (R2 mitigation): the CLI resolves vocabulary labels on every invocation.
|
|
5
|
+
* Without a cache, each `pb orient` / `pb get` / `pb capture` would call
|
|
6
|
+
* `chain.getVocabulary` — adding a Convex round-trip overhead and risking
|
|
7
|
+
* handshake-time staleness. A 5-min TTL short-circuits repeat calls within
|
|
8
|
+
* a typical session while staying fresh enough that label changes land quickly.
|
|
9
|
+
*
|
|
10
|
+
* PAT-230: the cache holds WorkspaceVocabCtx (pure data, no Convex imports here).
|
|
11
|
+
* DEC-1021: only Axis 2 (collectionLabels) lives here; Axis 1 (displayNames) is untouched.
|
|
12
|
+
*
|
|
13
|
+
* S4 note: when Cortex UI builds its `vocabularyStore`, it should mirror this
|
|
14
|
+
* contract — a keyed map by workspaceId with an expiresAt field (Cortex has
|
|
15
|
+
* direct access to workspaceId; the CLI uses apiKey as a 1:1 surrogate, since
|
|
16
|
+
* the HTTP gateway server-side injects workspaceId from authResult per
|
|
17
|
+
* convex/http.ts:675).
|
|
18
|
+
*/
|
|
19
|
+
import type { WorkspaceVocabCtx } from './canonicalRefs.js';
|
|
20
|
+
/**
|
|
21
|
+
* Get a cached WorkspaceVocabCtx by cacheKey, or null if expired/missing.
|
|
22
|
+
* Prints a staleness warning when the entry is older than STALE_WARN_MS.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getCachedVocabCtx(cacheKey: string): WorkspaceVocabCtx | null;
|
|
25
|
+
/**
|
|
26
|
+
* Store a WorkspaceVocabCtx under cacheKey with a 5-min TTL.
|
|
27
|
+
*/
|
|
28
|
+
export declare function setCachedVocabCtx(cacheKey: string, ctx: WorkspaceVocabCtx): void;
|
|
29
|
+
/**
|
|
30
|
+
* Explicitly invalidate a cached vocab context by cacheKey.
|
|
31
|
+
* Call this when `updateCollectionLabels` mutation succeeds (e.g. after `pb handshake`).
|
|
32
|
+
*/
|
|
33
|
+
export declare function invalidateVocabCtx(cacheKey: string): void;
|
|
34
|
+
/**
|
|
35
|
+
* Clear all cached entries (useful for testing or `pb handshake --refresh`).
|
|
36
|
+
*/
|
|
37
|
+
export declare function clearVocabCache(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Get the cached vocab context, or fetch it via the provided async fetcher on cache miss.
|
|
40
|
+
*
|
|
41
|
+
* Usage pattern at CLI command sites:
|
|
42
|
+
* ```ts
|
|
43
|
+
* const vocabCtx = await getOrFetchVocabCtx(config.apiKey, async () => {
|
|
44
|
+
* type VocabResult = { collectionLabels?: Record<string, unknown> };
|
|
45
|
+
* const vocab = await kernelCall<VocabResult>('chain.getVocabulary', {});
|
|
46
|
+
* return vocab?.collectionLabels
|
|
47
|
+
* ? { collectionLabels: vocab.collectionLabels as WorkspaceVocabCtx['collectionLabels'] }
|
|
48
|
+
* : null;
|
|
49
|
+
* });
|
|
50
|
+
* ```
|
|
51
|
+
*
|
|
52
|
+
* - `cacheKey`: use the API key as a surrogate for cacheKey (1:1 mapping at CLI layer).
|
|
53
|
+
* - `fetcher`: async function that resolves the vocab ctx; returns null on failure to signal
|
|
54
|
+
* "don't cache, fall back to resolver literal". Fetcher errors are swallowed — vocabulary
|
|
55
|
+
* labels are advisory (PAT-230 / fail-open principle).
|
|
56
|
+
*
|
|
57
|
+
* Returns WorkspaceVocabCtx on cache hit or successful fetch; undefined on error/null fetcher result.
|
|
58
|
+
*/
|
|
59
|
+
export declare function getOrFetchVocabCtx(cacheKey: string, fetcher: () => Promise<WorkspaceVocabCtx | null>): Promise<WorkspaceVocabCtx | undefined>;
|
|
60
|
+
//# sourceMappingURL=workspaceVocabCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceVocabCache.d.ts","sourceRoot":"","sources":["../../src/lib/workspaceVocabCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAc5D;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAe5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,IAAI,CAEhF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEzD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAC/C,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAcxC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 5-minute TTL cache for workspace vocabulary context (WP-436 S2).
|
|
3
|
+
*
|
|
4
|
+
* Purpose (R2 mitigation): the CLI resolves vocabulary labels on every invocation.
|
|
5
|
+
* Without a cache, each `pb orient` / `pb get` / `pb capture` would call
|
|
6
|
+
* `chain.getVocabulary` — adding a Convex round-trip overhead and risking
|
|
7
|
+
* handshake-time staleness. A 5-min TTL short-circuits repeat calls within
|
|
8
|
+
* a typical session while staying fresh enough that label changes land quickly.
|
|
9
|
+
*
|
|
10
|
+
* PAT-230: the cache holds WorkspaceVocabCtx (pure data, no Convex imports here).
|
|
11
|
+
* DEC-1021: only Axis 2 (collectionLabels) lives here; Axis 1 (displayNames) is untouched.
|
|
12
|
+
*
|
|
13
|
+
* S4 note: when Cortex UI builds its `vocabularyStore`, it should mirror this
|
|
14
|
+
* contract — a keyed map by workspaceId with an expiresAt field (Cortex has
|
|
15
|
+
* direct access to workspaceId; the CLI uses apiKey as a 1:1 surrogate, since
|
|
16
|
+
* the HTTP gateway server-side injects workspaceId from authResult per
|
|
17
|
+
* convex/http.ts:675).
|
|
18
|
+
*/
|
|
19
|
+
const TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
20
|
+
const STALE_WARN_MS = 4 * 60 * 1000; // warn after 4 minutes (1 minute before expiry)
|
|
21
|
+
/** In-memory cache: cacheKey (CLI: apiKey; Cortex would use workspaceId) → CacheEntry. */
|
|
22
|
+
const cache = new Map();
|
|
23
|
+
/**
|
|
24
|
+
* Get a cached WorkspaceVocabCtx by cacheKey, or null if expired/missing.
|
|
25
|
+
* Prints a staleness warning when the entry is older than STALE_WARN_MS.
|
|
26
|
+
*/
|
|
27
|
+
export function getCachedVocabCtx(cacheKey) {
|
|
28
|
+
const entry = cache.get(cacheKey);
|
|
29
|
+
if (!entry)
|
|
30
|
+
return null;
|
|
31
|
+
const now = Date.now();
|
|
32
|
+
if (now >= entry.expiresAt) {
|
|
33
|
+
cache.delete(cacheKey);
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
if (now - (entry.expiresAt - TTL_MS) >= STALE_WARN_MS) {
|
|
37
|
+
// Staleness hint: labels were fetched > 4 min ago, will refresh within 1 min.
|
|
38
|
+
process.stderr.write(`[pb] Workspace vocabulary context is almost stale — will refresh on next invocation.\n`);
|
|
39
|
+
}
|
|
40
|
+
return entry.ctx;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Store a WorkspaceVocabCtx under cacheKey with a 5-min TTL.
|
|
44
|
+
*/
|
|
45
|
+
export function setCachedVocabCtx(cacheKey, ctx) {
|
|
46
|
+
cache.set(cacheKey, { ctx, expiresAt: Date.now() + TTL_MS });
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Explicitly invalidate a cached vocab context by cacheKey.
|
|
50
|
+
* Call this when `updateCollectionLabels` mutation succeeds (e.g. after `pb handshake`).
|
|
51
|
+
*/
|
|
52
|
+
export function invalidateVocabCtx(cacheKey) {
|
|
53
|
+
cache.delete(cacheKey);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Clear all cached entries (useful for testing or `pb handshake --refresh`).
|
|
57
|
+
*/
|
|
58
|
+
export function clearVocabCache() {
|
|
59
|
+
cache.clear();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get the cached vocab context, or fetch it via the provided async fetcher on cache miss.
|
|
63
|
+
*
|
|
64
|
+
* Usage pattern at CLI command sites:
|
|
65
|
+
* ```ts
|
|
66
|
+
* const vocabCtx = await getOrFetchVocabCtx(config.apiKey, async () => {
|
|
67
|
+
* type VocabResult = { collectionLabels?: Record<string, unknown> };
|
|
68
|
+
* const vocab = await kernelCall<VocabResult>('chain.getVocabulary', {});
|
|
69
|
+
* return vocab?.collectionLabels
|
|
70
|
+
* ? { collectionLabels: vocab.collectionLabels as WorkspaceVocabCtx['collectionLabels'] }
|
|
71
|
+
* : null;
|
|
72
|
+
* });
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* - `cacheKey`: use the API key as a surrogate for cacheKey (1:1 mapping at CLI layer).
|
|
76
|
+
* - `fetcher`: async function that resolves the vocab ctx; returns null on failure to signal
|
|
77
|
+
* "don't cache, fall back to resolver literal". Fetcher errors are swallowed — vocabulary
|
|
78
|
+
* labels are advisory (PAT-230 / fail-open principle).
|
|
79
|
+
*
|
|
80
|
+
* Returns WorkspaceVocabCtx on cache hit or successful fetch; undefined on error/null fetcher result.
|
|
81
|
+
*/
|
|
82
|
+
export async function getOrFetchVocabCtx(cacheKey, fetcher) {
|
|
83
|
+
const cached = getCachedVocabCtx(cacheKey);
|
|
84
|
+
if (cached)
|
|
85
|
+
return cached;
|
|
86
|
+
try {
|
|
87
|
+
const ctx = await fetcher();
|
|
88
|
+
if (ctx) {
|
|
89
|
+
setCachedVocabCtx(cacheKey, ctx);
|
|
90
|
+
return ctx;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// fail-open — vocabulary labels are advisory, never block the command
|
|
95
|
+
}
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=workspaceVocabCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaceVocabCache.js","sourceRoot":"","sources":["../../src/lib/workspaceVocabCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAUH,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAC1C,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,gDAAgD;AAErF,0FAA0F;AAC1F,MAAM,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE5C;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAC3B,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QACtD,8EAA8E;QAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wFAAwF,CACzF,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,GAAsB;IACxE,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAgB,EAChB,OAAgD;IAEhD,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC3C,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,EAAE,CAAC;QAC5B,IAAI,GAAG,EAAE,CAAC;YACR,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACjC,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sEAAsE;IACxE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coach-traces.test.d.ts","sourceRoot":"","sources":["../../../src/setup/__tests__/coach-traces.test.ts"],"names":[],"mappings":""}
|