@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
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `pb setup-audit` — WP-439 S2 (audit) + S3 (--repair).
|
|
3
|
+
*
|
|
4
|
+
* Operator preflight for handshake: classifies every setup_asset row in the
|
|
5
|
+
* caller's active workspace and surfaces orphaned bodies BEFORE handshake
|
|
6
|
+
* runs. With --repair, attempts a transactional fix for each orphan that has
|
|
7
|
+
* a canonical body in STARTER_* (class III and class II rows).
|
|
8
|
+
*
|
|
9
|
+
* Modes:
|
|
10
|
+
* pb setup-audit — human table; exit 1 if orphans > 0.
|
|
11
|
+
* pb setup-audit --json — machine-readable JSON; exit 1 if orphans > 0.
|
|
12
|
+
* pb setup-audit --repair — audit + attempt repair on III/II rows.
|
|
13
|
+
* Exit 1 if any repair genuinely fails (not
|
|
14
|
+
* counted: 'unrecoverable' — those are
|
|
15
|
+
* expected when no STARTER_* match exists).
|
|
16
|
+
*
|
|
17
|
+
* Server contract (see convex/setup.ts:auditAssetBodies, repairAssetBody):
|
|
18
|
+
* - Gateway derives workspaceId from the API key / JWT (injectSessionAuth).
|
|
19
|
+
* - Audit returns { summary, rows[] }. See `AuditResult` below.
|
|
20
|
+
* - Repair returns { status, newBodyStorageId, error, receiptId }.
|
|
21
|
+
*
|
|
22
|
+
* Notes:
|
|
23
|
+
* - Class 'i_inline_only' rows are NOT repaired by this slice (their body
|
|
24
|
+
* recovery comes from the inline `data.body` via a future bet, not from
|
|
25
|
+
* STARTER_*).
|
|
26
|
+
* - Class 'iv_hash_drift' rows are NOT repaired by this slice (out of scope
|
|
27
|
+
* for S3; resolution is per-row operator review).
|
|
28
|
+
*
|
|
29
|
+
* Auth: requires `pb login` / API key. No active write session needed.
|
|
30
|
+
*/
|
|
31
|
+
import { getConfigOrGuide } from '../lib/config.js';
|
|
32
|
+
import { kernelCall } from '../lib/client.js';
|
|
33
|
+
import { CLIError, ErrorCode } from '../lib/errors.js';
|
|
34
|
+
import { bold, dim, green, red, yellow, heading, icons, } from '../lib/style.js';
|
|
35
|
+
import { isJsonMode } from '../lib/runner.js';
|
|
36
|
+
// ── Formatting ───────────────────────────────────────────────────────────────
|
|
37
|
+
const CLASS_LABEL = {
|
|
38
|
+
ok: 'ok',
|
|
39
|
+
i_inline_only: 'I:inline-only',
|
|
40
|
+
ii_unrecoverable: 'II:unrecoverable',
|
|
41
|
+
iii_blob_missing: 'III:blob-missing',
|
|
42
|
+
iv_hash_drift: 'IV:hash-drift',
|
|
43
|
+
};
|
|
44
|
+
function colorize(cls, text) {
|
|
45
|
+
if (cls === 'ok')
|
|
46
|
+
return green(text);
|
|
47
|
+
if (cls === 'iii_blob_missing' || cls === 'ii_unrecoverable')
|
|
48
|
+
return red(text);
|
|
49
|
+
return yellow(text);
|
|
50
|
+
}
|
|
51
|
+
function pad(s, len) {
|
|
52
|
+
if (s.length >= len)
|
|
53
|
+
return s;
|
|
54
|
+
return s + ' '.repeat(len - s.length);
|
|
55
|
+
}
|
|
56
|
+
function formatPretty(result) {
|
|
57
|
+
const lines = [];
|
|
58
|
+
lines.push('');
|
|
59
|
+
lines.push(`${bold('Setup-asset orphan audit')} ${dim('— WP-439 S2')}`);
|
|
60
|
+
lines.push('');
|
|
61
|
+
const { total, ok, orphans, byClass } = result.summary;
|
|
62
|
+
lines.push(heading('Summary'));
|
|
63
|
+
lines.push('');
|
|
64
|
+
lines.push(` ${dim('Total rows :')} ${bold(String(total))}`);
|
|
65
|
+
lines.push(` ${dim('OK :')} ${green(String(ok))}`);
|
|
66
|
+
lines.push(` ${dim('Orphans :')} ${orphans > 0 ? red(String(orphans)) : green(String(orphans))}`);
|
|
67
|
+
if (orphans > 0) {
|
|
68
|
+
lines.push('');
|
|
69
|
+
lines.push(` ${dim('Class I (inline-only) :')} ${yellow(String(byClass.i))}`);
|
|
70
|
+
lines.push(` ${dim('Class II (unrecoverable) :')} ${red(String(byClass.ii))}`);
|
|
71
|
+
lines.push(` ${dim('Class III (blob-missing) :')} ${red(String(byClass.iii))}`);
|
|
72
|
+
lines.push(` ${dim('Class IV (hash-drift) :')} ${yellow(String(byClass.iv))}`);
|
|
73
|
+
}
|
|
74
|
+
lines.push('');
|
|
75
|
+
if (result.rows.length === 0) {
|
|
76
|
+
lines.push(dim('No setup_asset rows in this workspace.'));
|
|
77
|
+
return lines.join('\n');
|
|
78
|
+
}
|
|
79
|
+
// Show orphan rows first, then ok rows (for scannability).
|
|
80
|
+
const orphanRows = result.rows.filter((r) => r.class !== 'ok');
|
|
81
|
+
const okRows = result.rows.filter((r) => r.class === 'ok');
|
|
82
|
+
if (orphanRows.length > 0) {
|
|
83
|
+
lines.push(heading('Orphaned rows'));
|
|
84
|
+
lines.push('');
|
|
85
|
+
// Column widths sized to the data so the table stays readable in narrow shells.
|
|
86
|
+
const idW = Math.min(40, Math.max(...orphanRows.map((r) => r.entryId.length), 'EntryId'.length));
|
|
87
|
+
const nameW = Math.min(30, Math.max(...orphanRows.map((r) => r.name.length), 'Name'.length));
|
|
88
|
+
lines.push(` ${dim(pad('EntryId', idW))} ${dim(pad('Kind', 6))} ${dim(pad('Name', nameW))} ${dim('Class')}`);
|
|
89
|
+
for (const row of orphanRows) {
|
|
90
|
+
const label = CLASS_LABEL[row.class];
|
|
91
|
+
lines.push(` ${pad(row.entryId, idW)} ${pad(row.assetKind, 6)} ${pad(row.name.slice(0, nameW), nameW)} ${colorize(row.class, label)}`);
|
|
92
|
+
}
|
|
93
|
+
lines.push('');
|
|
94
|
+
}
|
|
95
|
+
if (okRows.length > 0) {
|
|
96
|
+
lines.push(`${dim(`${icons.dot} ${okRows.length} row(s) classified OK (hidden — re-run with --json to see them).`)}`);
|
|
97
|
+
lines.push('');
|
|
98
|
+
}
|
|
99
|
+
if (orphans === 0) {
|
|
100
|
+
lines.push(green(`${icons.pass} All setup_asset bodies resolve.`));
|
|
101
|
+
}
|
|
102
|
+
return lines.join('\n');
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Repair targets: classes that can be regenerated from STARTER_* constants.
|
|
106
|
+
* - iii_blob_missing — storage blob is gone; canonical body is the fix.
|
|
107
|
+
* - ii_unrecoverable — neither storage nor inline body; canonical body
|
|
108
|
+
* is the only recovery path (otherwise the row was never recoverable).
|
|
109
|
+
*
|
|
110
|
+
* Excluded:
|
|
111
|
+
* - i_inline_only — inline body IS the body; restore from `data.body`
|
|
112
|
+
* (out of scope for this slice).
|
|
113
|
+
* - iv_hash_drift — drifted; manual review (out of scope).
|
|
114
|
+
*/
|
|
115
|
+
function isRepairTarget(cls) {
|
|
116
|
+
return cls === 'iii_blob_missing' || cls === 'ii_unrecoverable';
|
|
117
|
+
}
|
|
118
|
+
async function runRepair(rows) {
|
|
119
|
+
const targets = rows.filter((r) => isRepairTarget(r.class));
|
|
120
|
+
const perRow = [];
|
|
121
|
+
let succeeded = 0;
|
|
122
|
+
let failed = 0;
|
|
123
|
+
let unrecoverable = 0;
|
|
124
|
+
for (const row of targets) {
|
|
125
|
+
let outcome;
|
|
126
|
+
try {
|
|
127
|
+
outcome = await kernelCall('setup.repairAssetBody', {
|
|
128
|
+
entryDocId: row.entryDocId,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
outcome = {
|
|
133
|
+
status: 'failed',
|
|
134
|
+
newBodyStorageId: null,
|
|
135
|
+
error: err instanceof Error ? err.message : String(err),
|
|
136
|
+
receiptId: '',
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
perRow.push({ row, outcome });
|
|
140
|
+
if (outcome.status === 'succeeded')
|
|
141
|
+
succeeded++;
|
|
142
|
+
else if (outcome.status === 'unrecoverable')
|
|
143
|
+
unrecoverable++;
|
|
144
|
+
else
|
|
145
|
+
failed++;
|
|
146
|
+
// Per-row outcome line.
|
|
147
|
+
if (outcome.status === 'succeeded') {
|
|
148
|
+
process.stdout.write(`${green(icons.pass)} ${row.entryId} repaired\n`);
|
|
149
|
+
}
|
|
150
|
+
else if (outcome.status === 'unrecoverable') {
|
|
151
|
+
process.stdout.write(`${yellow('⊘')} ${row.entryId} unrecoverable (no STARTER_* match)\n`);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
process.stdout.write(`${red(icons.fail)} ${row.entryId} failed: ${outcome.error ?? 'unknown error'}\n`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return { succeeded, failed, unrecoverable, perRow };
|
|
158
|
+
}
|
|
159
|
+
async function fetchAudit() {
|
|
160
|
+
try {
|
|
161
|
+
return await kernelCall('setup.auditAssetBodies', {});
|
|
162
|
+
}
|
|
163
|
+
catch (err) {
|
|
164
|
+
if (err instanceof CLIError)
|
|
165
|
+
throw err;
|
|
166
|
+
throw new CLIError(err instanceof Error ? err.message : String(err), {
|
|
167
|
+
code: ErrorCode.INTERNAL,
|
|
168
|
+
category: 'internal',
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
export async function runSetupAudit(opts = {}) {
|
|
173
|
+
const config = await getConfigOrGuide(() => runSetupAudit(opts));
|
|
174
|
+
if (!config)
|
|
175
|
+
return;
|
|
176
|
+
// Respect both the global --json flag (isJsonMode) and the per-command override.
|
|
177
|
+
const json = opts.json || isJsonMode();
|
|
178
|
+
const repair = opts.repair === true;
|
|
179
|
+
// ── 1. Initial audit ──────────────────────────────────────────────────────
|
|
180
|
+
let result = await fetchAudit();
|
|
181
|
+
if (!repair) {
|
|
182
|
+
if (json) {
|
|
183
|
+
process.stdout.write(JSON.stringify(result) + '\n');
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
process.stdout.write(formatPretty(result) + '\n');
|
|
187
|
+
}
|
|
188
|
+
// Exit-code contract: 0 when clean, 1 when any orphan class is present.
|
|
189
|
+
if (result.summary.orphans > 0) {
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
// ── 2. --repair path: print initial audit, attempt repairs, re-audit. ─────
|
|
195
|
+
if (json) {
|
|
196
|
+
// JSON mode + --repair: emit the union artifact as a single object so
|
|
197
|
+
// pipelines can read structured outcomes.
|
|
198
|
+
const repairReport = await runRepair(result.rows);
|
|
199
|
+
const after = await fetchAudit();
|
|
200
|
+
process.stdout.write(JSON.stringify({
|
|
201
|
+
before: result,
|
|
202
|
+
repair: {
|
|
203
|
+
attempted: repairReport.perRow.length,
|
|
204
|
+
succeeded: repairReport.succeeded,
|
|
205
|
+
failed: repairReport.failed,
|
|
206
|
+
unrecoverable: repairReport.unrecoverable,
|
|
207
|
+
perRow: repairReport.perRow.map(({ row, outcome }) => ({
|
|
208
|
+
entryId: row.entryId,
|
|
209
|
+
entryDocId: row.entryDocId,
|
|
210
|
+
class: row.class,
|
|
211
|
+
status: outcome.status,
|
|
212
|
+
error: outcome.error,
|
|
213
|
+
receiptId: outcome.receiptId,
|
|
214
|
+
newBodyStorageId: outcome.newBodyStorageId,
|
|
215
|
+
})),
|
|
216
|
+
},
|
|
217
|
+
after,
|
|
218
|
+
}) + '\n');
|
|
219
|
+
if (repairReport.failed > 0)
|
|
220
|
+
process.exit(1);
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
// Pretty mode.
|
|
224
|
+
process.stdout.write(formatPretty(result) + '\n');
|
|
225
|
+
const repairTargets = result.rows.filter((r) => isRepairTarget(r.class));
|
|
226
|
+
if (repairTargets.length === 0) {
|
|
227
|
+
process.stdout.write(dim('\nNo repairable orphans (class III/II) — nothing to do.\n'));
|
|
228
|
+
if (result.summary.orphans > 0) {
|
|
229
|
+
// There are class I or IV orphans but nothing this slice can fix.
|
|
230
|
+
process.exit(1);
|
|
231
|
+
}
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
process.stdout.write(`\n${heading('Repair')}\n\n`);
|
|
235
|
+
const repairReport = await runRepair(result.rows);
|
|
236
|
+
process.stdout.write('\n');
|
|
237
|
+
process.stdout.write(` ${dim('Attempted :')} ${bold(String(repairReport.perRow.length))}\n`);
|
|
238
|
+
process.stdout.write(` ${dim('Succeeded :')} ${green(String(repairReport.succeeded))}\n`);
|
|
239
|
+
process.stdout.write(` ${dim('Unrecoverable:')} ${repairReport.unrecoverable > 0 ? yellow(String(repairReport.unrecoverable)) : String(repairReport.unrecoverable)}\n`);
|
|
240
|
+
process.stdout.write(` ${dim('Failed :')} ${repairReport.failed > 0 ? red(String(repairReport.failed)) : String(repairReport.failed)}\n`);
|
|
241
|
+
process.stdout.write('\n');
|
|
242
|
+
// ── 3. Re-run the audit so the operator sees the fresh state. ─────────────
|
|
243
|
+
const after = await fetchAudit();
|
|
244
|
+
process.stdout.write(formatPretty(after) + '\n');
|
|
245
|
+
// Exit code: only genuine failures (not 'unrecoverable') trip the wire.
|
|
246
|
+
if (repairReport.failed > 0) {
|
|
247
|
+
process.exit(1);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
//# sourceMappingURL=setup-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-audit.js","sourceRoot":"","sources":["../../src/commands/setup-audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `pb setup-detect-surfaces` — WP-431 S3.
|
|
3
|
+
*
|
|
4
|
+
* Walks the repo for known surface markers (delegated to SURFACE_ADAPTERS) and
|
|
5
|
+
* union-merges the result with whatever `manifest.surfaces` already declares.
|
|
6
|
+
* STD-235 forward-only: detection NEVER removes a surface; only adds. Manifest
|
|
7
|
+
* write goes through `writeManifestSurfaces` which calls `assertSetupWritePath`
|
|
8
|
+
* (STD-234 perimeter).
|
|
9
|
+
*
|
|
10
|
+
* WP-433 S2: After the local manifest write, stamps the detected surfaces onto
|
|
11
|
+
* the server via `setup.stampDetectedSurfaces` so Phase 1 → Phase 2 advances in
|
|
12
|
+
* one server call (TEN-1990 / IMP-10). If the server call fails, the error is
|
|
13
|
+
* logged and surfaced to the caller but the local manifest is NOT rolled back
|
|
14
|
+
* (it is already on disk; the next run will retry the server stamp).
|
|
15
|
+
*/
|
|
16
|
+
export interface RunSetupDetectSurfacesOptions {
|
|
17
|
+
cwd?: string;
|
|
18
|
+
/** Skip the server stamp call (used in tests / offline mode). */
|
|
19
|
+
skipServerStamp?: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface SetupDetectSurfacesResult {
|
|
22
|
+
detected: string[];
|
|
23
|
+
existing: string[];
|
|
24
|
+
newlyAdded: string[];
|
|
25
|
+
union: string[];
|
|
26
|
+
manifestUpdated: boolean;
|
|
27
|
+
manifestPath: string;
|
|
28
|
+
/** WP-433 S2: result of the server stamp call, or null if skipped / not needed. */
|
|
29
|
+
serverStamp: {
|
|
30
|
+
stamped: boolean;
|
|
31
|
+
surfaces: string[];
|
|
32
|
+
} | null;
|
|
33
|
+
/** WP-433 S2: error from the server stamp call, if any. Does NOT abort the local write. */
|
|
34
|
+
serverStampError: string | null;
|
|
35
|
+
}
|
|
36
|
+
export declare function runSetupDetectSurfaces(opts?: RunSetupDetectSurfacesOptions): Promise<SetupDetectSurfacesResult>;
|
|
37
|
+
export declare function formatDetectSurfacesSummary(result: SetupDetectSurfacesResult): string;
|
|
38
|
+
//# sourceMappingURL=setup-detect-surfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-detect-surfaces.d.ts","sourceRoot":"","sources":["../../src/commands/setup-detect-surfaces.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,6BAA6B;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,mFAAmF;IACnF,WAAW,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7D,2FAA2F;IAC3F,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,GAAE,6BAAkC,GACvC,OAAO,CAAC,yBAAyB,CAAC,CAsCpC;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,yBAAyB,GAAG,MAAM,CAqBrF"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `pb setup-detect-surfaces` — WP-431 S3.
|
|
3
|
+
*
|
|
4
|
+
* Walks the repo for known surface markers (delegated to SURFACE_ADAPTERS) and
|
|
5
|
+
* union-merges the result with whatever `manifest.surfaces` already declares.
|
|
6
|
+
* STD-235 forward-only: detection NEVER removes a surface; only adds. Manifest
|
|
7
|
+
* write goes through `writeManifestSurfaces` which calls `assertSetupWritePath`
|
|
8
|
+
* (STD-234 perimeter).
|
|
9
|
+
*
|
|
10
|
+
* WP-433 S2: After the local manifest write, stamps the detected surfaces onto
|
|
11
|
+
* the server via `setup.stampDetectedSurfaces` so Phase 1 → Phase 2 advances in
|
|
12
|
+
* one server call (TEN-1990 / IMP-10). If the server call fails, the error is
|
|
13
|
+
* logged and surfaced to the caller but the local manifest is NOT rolled back
|
|
14
|
+
* (it is already on disk; the next run will retry the server stamp).
|
|
15
|
+
*/
|
|
16
|
+
import { detectSurfaces, unionSurfaces } from '../setup/detect-surfaces.js';
|
|
17
|
+
import { readManifestSurfaces, writeManifestSurfaces } from '../setup/manifest-writer.js';
|
|
18
|
+
import { kernelCall } from '../lib/client.js';
|
|
19
|
+
export async function runSetupDetectSurfaces(opts = {}) {
|
|
20
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
21
|
+
const detected = await detectSurfaces(cwd);
|
|
22
|
+
const existing = readManifestSurfaces(cwd);
|
|
23
|
+
const union = unionSurfaces(existing, detected);
|
|
24
|
+
const existingSet = new Set(existing);
|
|
25
|
+
const newlyAdded = detected.filter((s) => !existingSet.has(s));
|
|
26
|
+
// Local manifest write (always runs first — server stamp is best-effort).
|
|
27
|
+
const writeResult = await writeManifestSurfaces(cwd, union);
|
|
28
|
+
// WP-433 S2: Stamp surfaces to server so state machine can advance Phase 1 → Phase 2.
|
|
29
|
+
// Only stamp if there are surfaces to declare (no-op on empty union).
|
|
30
|
+
// Error handling: log + surface to caller but do NOT roll back the local write.
|
|
31
|
+
// No config pre-check — kernelCall handles missing config; errors are caught below.
|
|
32
|
+
let serverStamp = null;
|
|
33
|
+
let serverStampError = null;
|
|
34
|
+
if (!opts.skipServerStamp && union.length > 0) {
|
|
35
|
+
try {
|
|
36
|
+
serverStamp = await kernelCall('setup.stampDetectedSurfaces', { surfaces: union });
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
serverStampError = err instanceof Error ? err.message : String(err);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
detected: [...detected].sort(),
|
|
44
|
+
existing: [...existing].sort(),
|
|
45
|
+
newlyAdded: [...newlyAdded].sort(),
|
|
46
|
+
union,
|
|
47
|
+
manifestUpdated: writeResult.written,
|
|
48
|
+
manifestPath: writeResult.path,
|
|
49
|
+
serverStamp,
|
|
50
|
+
serverStampError,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export function formatDetectSurfacesSummary(result) {
|
|
54
|
+
const detected = result.detected.length === 0 ? 'none' : result.detected.join(', ');
|
|
55
|
+
const newOnes = result.newlyAdded.length === 0 ? 'none' : result.newlyAdded.join(', ');
|
|
56
|
+
const existing = result.existing.length === 0 ? 'none' : result.existing.join(', ');
|
|
57
|
+
const status = result.manifestUpdated ? 'Manifest updated.' : 'Manifest unchanged.';
|
|
58
|
+
let serverStatus = '';
|
|
59
|
+
if (result.serverStampError) {
|
|
60
|
+
serverStatus = ` Server stamp failed: ${result.serverStampError}`;
|
|
61
|
+
}
|
|
62
|
+
else if (result.serverStamp !== null) {
|
|
63
|
+
serverStatus = result.serverStamp.stamped ? ' Server stamped.' : ' Server: surfaces already current.';
|
|
64
|
+
}
|
|
65
|
+
let summary = `Detected: ${detected} (new: ${newOnes}). Existing: ${existing}. ${status}${serverStatus}`;
|
|
66
|
+
// WP-433 S5: bare-repo guidance — ask when there are truly zero known surfaces.
|
|
67
|
+
// Only applies when both detected AND existing are empty (true bare-repo state).
|
|
68
|
+
// STD-235 remnant case (existing surfaces present, none re-detected from disk) is
|
|
69
|
+
// intentionally suppressed: the manifest still carries the surface, so the user
|
|
70
|
+
// is not in a bare-repo state.
|
|
71
|
+
if (result.detected.length === 0 && result.existing.length === 0) {
|
|
72
|
+
summary += '\nI don\'t see Claude Code or Cursor — which AI tool do you use?';
|
|
73
|
+
}
|
|
74
|
+
return summary;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=setup-detect-surfaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-detect-surfaces.js","sourceRoot":"","sources":["../../src/commands/setup-detect-surfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pb setup:ingest <path> — Push a single .productbrain skill/rule/hook file to the DB SSOT.
|
|
3
|
+
*
|
|
4
|
+
* WP-345 S3: Single-file push from disk to DB for workspace-managed setup assets.
|
|
5
|
+
* Lets users explicitly push an edited skill/rule/hook file to the DB rather than
|
|
6
|
+
* waiting for a full `migrate:setup` run.
|
|
7
|
+
*
|
|
8
|
+
* Idempotent: re-running produces created/updated/unchanged — never duplicates.
|
|
9
|
+
* entryId rule: SETUP-{KIND}-{SCREAMING_SNAKE_CASE_BASENAME}
|
|
10
|
+
*
|
|
11
|
+
* Chain: WP-345, TEN-1459 (handshake reads FS — this fixes it).
|
|
12
|
+
*/
|
|
13
|
+
export interface SetupIngestOptions {
|
|
14
|
+
dryRun?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function runSetupIngest(filePath: string, opts?: SetupIngestOptions): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=setup-ingest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-ingest.d.ts","sourceRoot":"","sources":["../../src/commands/setup-ingest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAgHD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,kBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqInG"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pb setup:ingest <path> — Push a single .productbrain skill/rule/hook file to the DB SSOT.
|
|
3
|
+
*
|
|
4
|
+
* WP-345 S3: Single-file push from disk to DB for workspace-managed setup assets.
|
|
5
|
+
* Lets users explicitly push an edited skill/rule/hook file to the DB rather than
|
|
6
|
+
* waiting for a full `migrate:setup` run.
|
|
7
|
+
*
|
|
8
|
+
* Idempotent: re-running produces created/updated/unchanged — never duplicates.
|
|
9
|
+
* entryId rule: SETUP-{KIND}-{SCREAMING_SNAKE_CASE_BASENAME}
|
|
10
|
+
*
|
|
11
|
+
* Chain: WP-345, TEN-1459 (handshake reads FS — this fixes it).
|
|
12
|
+
*/
|
|
13
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
14
|
+
import { basename, resolve, dirname } from 'node:path';
|
|
15
|
+
import { kernelCall } from '../lib/client.js';
|
|
16
|
+
import { readSession } from '../lib/session.js';
|
|
17
|
+
import { isJsonMode } from '../lib/runner.js';
|
|
18
|
+
import { trackEvent } from '../lib/telemetry.js';
|
|
19
|
+
import { CLIError, ErrorCode } from '../lib/errors.js';
|
|
20
|
+
/**
|
|
21
|
+
* Parse minimal frontmatter from a .md file.
|
|
22
|
+
* Supports YAML-style --- fences. Fields: name, description, assetKind.
|
|
23
|
+
* Array fields: triggers, semanticRefs (YAML list).
|
|
24
|
+
*/
|
|
25
|
+
function parseFrontmatter(raw) {
|
|
26
|
+
const fmMatch = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
|
|
27
|
+
if (!fmMatch) {
|
|
28
|
+
// No frontmatter — derive name from H1, empty description
|
|
29
|
+
const h1 = raw.match(/^# (.+)$/m);
|
|
30
|
+
return { name: h1?.[1] ?? '', description: '', triggers: [], semanticRefs: [], body: raw };
|
|
31
|
+
}
|
|
32
|
+
const fmBlock = fmMatch[1];
|
|
33
|
+
const body = fmMatch[2];
|
|
34
|
+
const fields = new Map();
|
|
35
|
+
const arrayFields = new Map();
|
|
36
|
+
// Parse simple key: value and key:\n - item YAML arrays
|
|
37
|
+
const lines = fmBlock.split('\n');
|
|
38
|
+
let currentArrayKey = null;
|
|
39
|
+
let currentArrayValues = [];
|
|
40
|
+
for (const line of lines) {
|
|
41
|
+
const arrayItemMatch = line.match(/^\s+-\s+(.+)$/);
|
|
42
|
+
const keyValueMatch = line.match(/^(\w+):\s*(.*)$/);
|
|
43
|
+
if (arrayItemMatch && currentArrayKey) {
|
|
44
|
+
currentArrayValues.push(arrayItemMatch[1].trim());
|
|
45
|
+
}
|
|
46
|
+
else if (keyValueMatch) {
|
|
47
|
+
if (currentArrayKey) {
|
|
48
|
+
arrayFields.set(currentArrayKey, currentArrayValues);
|
|
49
|
+
currentArrayKey = null;
|
|
50
|
+
currentArrayValues = [];
|
|
51
|
+
}
|
|
52
|
+
const [, key, value] = keyValueMatch;
|
|
53
|
+
if (value.trim() === '') {
|
|
54
|
+
// Start of array block
|
|
55
|
+
currentArrayKey = key;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
fields.set(key, value.trim().replace(/^['"]|['"]$/g, ''));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (currentArrayKey) {
|
|
63
|
+
arrayFields.set(currentArrayKey, currentArrayValues);
|
|
64
|
+
}
|
|
65
|
+
const id = fields.get('id');
|
|
66
|
+
const name = fields.get('name') ?? body.match(/^# (.+)$/m)?.[1] ?? '';
|
|
67
|
+
const description = fields.get('description') ?? '';
|
|
68
|
+
const triggers = arrayFields.get('triggers') ?? [];
|
|
69
|
+
const semanticRefs = arrayFields.get('semanticRefs') ?? [];
|
|
70
|
+
const assetKind = fields.get('assetKind');
|
|
71
|
+
return { id, name, description, triggers, semanticRefs, assetKind, body };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Infer AssetKind from the file's directory path.
|
|
75
|
+
* Checks if any segment of the path is 'skills', 'rules', or 'hooks'.
|
|
76
|
+
*/
|
|
77
|
+
function inferKindFromPath(filePath) {
|
|
78
|
+
const parts = filePath.replace(/\\/g, '/').split('/');
|
|
79
|
+
for (const part of parts) {
|
|
80
|
+
if (part === 'skills')
|
|
81
|
+
return 'skill';
|
|
82
|
+
if (part === 'rules')
|
|
83
|
+
return 'rule';
|
|
84
|
+
if (part === 'hooks')
|
|
85
|
+
return 'hook';
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Normalise a frontmatter assetKind string to AssetKind or null.
|
|
91
|
+
*/
|
|
92
|
+
function normalizeFrontmatterKind(raw) {
|
|
93
|
+
const lower = raw.toLowerCase().trim();
|
|
94
|
+
if (lower === 'skill')
|
|
95
|
+
return 'skill';
|
|
96
|
+
if (lower === 'rule')
|
|
97
|
+
return 'rule';
|
|
98
|
+
if (lower === 'hook')
|
|
99
|
+
return 'hook';
|
|
100
|
+
if (lower === 'bundle')
|
|
101
|
+
return 'bundle';
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Derive a stable entryId from the filename and assetKind.
|
|
106
|
+
* Example: skills/triage.md, kind=skill → SETUP-SKILL-TRIAGE
|
|
107
|
+
*/
|
|
108
|
+
function deriveEntryId(filename, kind) {
|
|
109
|
+
const base = basename(filename, '.md');
|
|
110
|
+
const snakeCase = base.toUpperCase().replace(/[^A-Z0-9]+/g, '_');
|
|
111
|
+
return `SETUP-${kind.toUpperCase()}-${snakeCase}`;
|
|
112
|
+
}
|
|
113
|
+
export async function runSetupIngest(filePath, opts = {}) {
|
|
114
|
+
const dryRun = opts.dryRun ?? false;
|
|
115
|
+
const json = isJsonMode();
|
|
116
|
+
// Resolve path relative to cwd
|
|
117
|
+
const absPath = resolve(process.cwd(), filePath);
|
|
118
|
+
// Validate file exists
|
|
119
|
+
if (!existsSync(absPath)) {
|
|
120
|
+
trackEvent('setup.ingest.failed', { reason: 'file_not_found', path: absPath });
|
|
121
|
+
throw new CLIError(`File not found: ${absPath}`, {
|
|
122
|
+
code: ErrorCode.VALIDATION_FAILED,
|
|
123
|
+
category: 'validation',
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
// Validate .md extension
|
|
127
|
+
if (!absPath.endsWith('.md')) {
|
|
128
|
+
trackEvent('setup.ingest.failed', { reason: 'not_markdown', path: absPath });
|
|
129
|
+
throw new CLIError(`File must be a .md file: ${absPath}`, {
|
|
130
|
+
code: ErrorCode.VALIDATION_FAILED,
|
|
131
|
+
category: 'validation',
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
// Parse frontmatter
|
|
135
|
+
const raw = readFileSync(absPath, 'utf-8');
|
|
136
|
+
const { id, name, description, body, triggers, semanticRefs, assetKind: fmKind } = parseFrontmatter(raw);
|
|
137
|
+
// Determine assetKind — explicit bundle frontmatter always rejects this generic path.
|
|
138
|
+
// For skill/rule/hook, directory still wins and frontmatter is fallback.
|
|
139
|
+
const frontmatterKind = fmKind ? normalizeFrontmatterKind(fmKind) : null;
|
|
140
|
+
let kind = frontmatterKind === 'bundle'
|
|
141
|
+
? 'bundle'
|
|
142
|
+
: inferKindFromPath(dirname(absPath));
|
|
143
|
+
if (!kind) {
|
|
144
|
+
kind = frontmatterKind;
|
|
145
|
+
}
|
|
146
|
+
if (!kind) {
|
|
147
|
+
const err = new CLIError(`Cannot determine asset kind for ${absPath}.\n` +
|
|
148
|
+
`File must be under a 'skills/', 'rules/', or 'hooks/' directory, ` +
|
|
149
|
+
`or include an 'assetKind: skill|rule|hook' field in frontmatter.`, { code: ErrorCode.VALIDATION_FAILED, category: 'validation' });
|
|
150
|
+
trackEvent('setup.ingest.failed', { reason: 'unknown_kind', path: absPath });
|
|
151
|
+
throw err;
|
|
152
|
+
}
|
|
153
|
+
// Bundle commit is UI-only (Clerk JWT auth via commitSetupBundle). CLI path not supported (WP-345).
|
|
154
|
+
if (kind === 'bundle') {
|
|
155
|
+
trackEvent('setup.bundle.commit.failed', { reason: 'bundle_cli_not_supported', path: absPath });
|
|
156
|
+
throw new CLIError(`Bundle assets must be committed via the UI (Customize → Setup → Commit Bundle).\n` +
|
|
157
|
+
`The 'commitSetupBundle' operation requires workspace session auth unavailable in the CLI.`, { code: ErrorCode.VALIDATION_FAILED, category: 'validation' });
|
|
158
|
+
}
|
|
159
|
+
const entryId = deriveEntryId(absPath, kind);
|
|
160
|
+
const resolvedName = name || basename(absPath, '.md');
|
|
161
|
+
// Get workspaceId from active session
|
|
162
|
+
const session = readSession();
|
|
163
|
+
if (!session?.workspaceId) {
|
|
164
|
+
trackEvent('setup.ingest.failed', { reason: 'no_session', path: absPath });
|
|
165
|
+
throw new CLIError('No active session found. Run `pb session start` first.', { code: ErrorCode.SESSION_REQUIRED, category: 'session' });
|
|
166
|
+
}
|
|
167
|
+
const workspaceId = session.workspaceId;
|
|
168
|
+
if (dryRun) {
|
|
169
|
+
if (json) {
|
|
170
|
+
process.stdout.write(JSON.stringify({
|
|
171
|
+
ok: true,
|
|
172
|
+
dryRun: true,
|
|
173
|
+
entryId,
|
|
174
|
+
name: resolvedName,
|
|
175
|
+
assetKind: kind,
|
|
176
|
+
workspaceId,
|
|
177
|
+
path: absPath,
|
|
178
|
+
}) + '\n');
|
|
179
|
+
}
|
|
180
|
+
else {
|
|
181
|
+
process.stdout.write(`[dry-run] Would ingest:\n`);
|
|
182
|
+
process.stdout.write(` entryId: ${entryId}\n`);
|
|
183
|
+
process.stdout.write(` name: ${resolvedName}\n`);
|
|
184
|
+
process.stdout.write(` kind: ${kind}\n`);
|
|
185
|
+
process.stdout.write(` workspace: ${workspaceId}\n`);
|
|
186
|
+
process.stdout.write(` path: ${absPath}\n`);
|
|
187
|
+
}
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
// Call the mutation
|
|
191
|
+
let result;
|
|
192
|
+
try {
|
|
193
|
+
result = await kernelCall('setup.ingestSetupAsset', {
|
|
194
|
+
workspaceId,
|
|
195
|
+
entryId,
|
|
196
|
+
frontmatterId: id,
|
|
197
|
+
name: resolvedName,
|
|
198
|
+
description,
|
|
199
|
+
body,
|
|
200
|
+
assetKind: kind,
|
|
201
|
+
triggers,
|
|
202
|
+
semanticRefs,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
catch (err) {
|
|
206
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
207
|
+
trackEvent('setup.ingest.failed', { reason, path: absPath });
|
|
208
|
+
throw err;
|
|
209
|
+
}
|
|
210
|
+
// Emit telemetry
|
|
211
|
+
trackEvent('setup.ingest.succeeded', {
|
|
212
|
+
action: result.action,
|
|
213
|
+
assetKind: kind,
|
|
214
|
+
entryId: result.entryId,
|
|
215
|
+
});
|
|
216
|
+
// Output result
|
|
217
|
+
if (json) {
|
|
218
|
+
process.stdout.write(JSON.stringify({ ok: true, ...result, assetKind: kind, path: absPath }) + '\n');
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
const icon = result.action === 'created' ? '✓' : result.action === 'updated' ? '✓' : '—';
|
|
222
|
+
const label = result.action === 'created' ? 'created' : result.action === 'updated' ? 'updated' : 'unchanged';
|
|
223
|
+
process.stdout.write(`${icon} ${label} ${result.entryId}\n`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=setup-ingest.js.map
|