@productbrain/cli 0.1.0-beta.5 → 0.1.0-beta.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -30
- package/dist/__tests__/adapters.test.d.ts +2 -0
- package/dist/__tests__/adapters.test.d.ts.map +1 -0
- package/dist/__tests__/adapters.test.js +417 -0
- package/dist/__tests__/adapters.test.js.map +1 -0
- package/dist/__tests__/audit.test.d.ts +2 -0
- package/dist/__tests__/audit.test.d.ts.map +1 -0
- package/dist/__tests__/audit.test.js +394 -0
- package/dist/__tests__/audit.test.js.map +1 -0
- package/dist/__tests__/batch-transformations.test.d.ts +2 -0
- package/dist/__tests__/batch-transformations.test.d.ts.map +1 -0
- package/dist/__tests__/batch-transformations.test.js +263 -0
- package/dist/__tests__/batch-transformations.test.js.map +1 -0
- package/dist/__tests__/capture.test.d.ts +2 -0
- package/dist/__tests__/capture.test.d.ts.map +1 -0
- package/dist/__tests__/capture.test.js +156 -0
- package/dist/__tests__/capture.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +8 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +166 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/constants.test.d.ts +2 -0
- package/dist/__tests__/constants.test.d.ts.map +1 -0
- package/dist/__tests__/constants.test.js +141 -0
- package/dist/__tests__/constants.test.js.map +1 -0
- package/dist/__tests__/constellation.test.d.ts +2 -0
- package/dist/__tests__/constellation.test.d.ts.map +1 -0
- package/dist/__tests__/constellation.test.js +254 -0
- package/dist/__tests__/constellation.test.js.map +1 -0
- package/dist/__tests__/context-strategy.test.d.ts +2 -0
- package/dist/__tests__/context-strategy.test.d.ts.map +1 -0
- package/dist/__tests__/context-strategy.test.js +79 -0
- package/dist/__tests__/context-strategy.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +117 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/experiment.test.d.ts +6 -0
- package/dist/__tests__/experiment.test.d.ts.map +1 -0
- package/dist/__tests__/experiment.test.js +69 -0
- package/dist/__tests__/experiment.test.js.map +1 -0
- package/dist/__tests__/fields.test.d.ts +2 -0
- package/dist/__tests__/fields.test.d.ts.map +1 -0
- package/dist/__tests__/fields.test.js +238 -0
- package/dist/__tests__/fields.test.js.map +1 -0
- package/dist/__tests__/glossary.test.d.ts +2 -0
- package/dist/__tests__/glossary.test.d.ts.map +1 -0
- package/dist/__tests__/glossary.test.js +32 -0
- package/dist/__tests__/glossary.test.js.map +1 -0
- package/dist/__tests__/handshake.test.d.ts +2 -0
- package/dist/__tests__/handshake.test.d.ts.map +1 -0
- package/dist/__tests__/handshake.test.js +196 -0
- package/dist/__tests__/handshake.test.js.map +1 -0
- package/dist/__tests__/ingest.test.js +98 -0
- package/dist/__tests__/ingest.test.js.map +1 -1
- package/dist/__tests__/init.test.d.ts +7 -0
- package/dist/__tests__/init.test.d.ts.map +1 -0
- package/dist/__tests__/init.test.js +146 -0
- package/dist/__tests__/init.test.js.map +1 -0
- package/dist/__tests__/login.test.d.ts +2 -0
- package/dist/__tests__/login.test.d.ts.map +1 -0
- package/dist/__tests__/login.test.js +167 -0
- package/dist/__tests__/login.test.js.map +1 -0
- package/dist/__tests__/onboarding-path-b.test.d.ts +2 -0
- package/dist/__tests__/onboarding-path-b.test.d.ts.map +1 -0
- package/dist/__tests__/onboarding-path-b.test.js +46 -0
- package/dist/__tests__/onboarding-path-b.test.js.map +1 -0
- package/dist/__tests__/onboarding.test.d.ts +6 -0
- package/dist/__tests__/onboarding.test.d.ts.map +1 -0
- package/dist/__tests__/onboarding.test.js +347 -0
- package/dist/__tests__/onboarding.test.js.map +1 -0
- package/dist/__tests__/orient.test.d.ts +2 -0
- package/dist/__tests__/orient.test.d.ts.map +1 -0
- package/dist/__tests__/orient.test.js +143 -0
- package/dist/__tests__/orient.test.js.map +1 -0
- package/dist/__tests__/profiles.test.d.ts +2 -0
- package/dist/__tests__/profiles.test.d.ts.map +1 -0
- package/dist/__tests__/profiles.test.js +168 -0
- package/dist/__tests__/profiles.test.js.map +1 -0
- package/dist/__tests__/promote.test.d.ts +2 -0
- package/dist/__tests__/promote.test.d.ts.map +1 -0
- package/dist/__tests__/promote.test.js +161 -0
- package/dist/__tests__/promote.test.js.map +1 -0
- package/dist/__tests__/prompts.test.d.ts +6 -0
- package/dist/__tests__/prompts.test.d.ts.map +1 -0
- package/dist/__tests__/prompts.test.js +146 -0
- package/dist/__tests__/prompts.test.js.map +1 -0
- package/dist/__tests__/proposals.test.d.ts +2 -0
- package/dist/__tests__/proposals.test.d.ts.map +1 -0
- package/dist/__tests__/proposals.test.js +167 -0
- package/dist/__tests__/proposals.test.js.map +1 -0
- package/dist/__tests__/relate.test.d.ts +2 -0
- package/dist/__tests__/relate.test.d.ts.map +1 -0
- package/dist/__tests__/relate.test.js +103 -0
- package/dist/__tests__/relate.test.js.map +1 -0
- package/dist/__tests__/repo-detect.test.d.ts +2 -0
- package/dist/__tests__/repo-detect.test.d.ts.map +1 -0
- package/dist/__tests__/repo-detect.test.js +215 -0
- package/dist/__tests__/repo-detect.test.js.map +1 -0
- package/dist/__tests__/runner.test.d.ts +2 -0
- package/dist/__tests__/runner.test.d.ts.map +1 -0
- package/dist/__tests__/runner.test.js +219 -0
- package/dist/__tests__/runner.test.js.map +1 -0
- package/dist/__tests__/session-touch.test.d.ts +2 -0
- package/dist/__tests__/session-touch.test.d.ts.map +1 -0
- package/dist/__tests__/session-touch.test.js +134 -0
- package/dist/__tests__/session-touch.test.js.map +1 -0
- package/dist/__tests__/session.test.d.ts +2 -0
- package/dist/__tests__/session.test.d.ts.map +1 -0
- package/dist/__tests__/session.test.js +46 -0
- package/dist/__tests__/session.test.js.map +1 -0
- package/dist/__tests__/setup.test.d.ts +2 -0
- package/dist/__tests__/setup.test.d.ts.map +1 -0
- package/dist/__tests__/setup.test.js +141 -0
- package/dist/__tests__/setup.test.js.map +1 -0
- package/dist/__tests__/spinner-labels.test.d.ts +2 -0
- package/dist/__tests__/spinner-labels.test.d.ts.map +1 -0
- package/dist/__tests__/spinner-labels.test.js +23 -0
- package/dist/__tests__/spinner-labels.test.js.map +1 -0
- package/dist/__tests__/strip.test.d.ts +2 -0
- package/dist/__tests__/strip.test.d.ts.map +1 -0
- package/dist/__tests__/strip.test.js +136 -0
- package/dist/__tests__/strip.test.js.map +1 -0
- package/dist/__tests__/surface-profiles.test.d.ts +2 -0
- package/dist/__tests__/surface-profiles.test.d.ts.map +1 -0
- package/dist/__tests__/surface-profiles.test.js +233 -0
- package/dist/__tests__/surface-profiles.test.js.map +1 -0
- package/dist/__tests__/update.test.d.ts +2 -0
- package/dist/__tests__/update.test.d.ts.map +1 -0
- package/dist/__tests__/update.test.js +228 -0
- package/dist/__tests__/update.test.js.map +1 -0
- package/dist/__tests__/workspace.test.d.ts +2 -0
- package/dist/__tests__/workspace.test.d.ts.map +1 -0
- package/dist/__tests__/workspace.test.js +308 -0
- package/dist/__tests__/workspace.test.js.map +1 -0
- package/dist/commands/accept.d.ts +18 -0
- package/dist/commands/accept.d.ts.map +1 -0
- package/dist/commands/accept.js +76 -0
- package/dist/commands/accept.js.map +1 -0
- package/dist/commands/admin/index.d.ts +17 -0
- package/dist/commands/admin/index.d.ts.map +1 -0
- package/dist/commands/admin/index.js +95 -0
- package/dist/commands/admin/index.js.map +1 -0
- package/dist/commands/admin/inspect.d.ts +12 -0
- package/dist/commands/admin/inspect.d.ts.map +1 -0
- package/dist/commands/admin/inspect.js +506 -0
- package/dist/commands/admin/inspect.js.map +1 -0
- package/dist/commands/admin/inspect.test.d.ts +5 -0
- package/dist/commands/admin/inspect.test.d.ts.map +1 -0
- package/dist/commands/admin/inspect.test.js +40 -0
- package/dist/commands/admin/inspect.test.js.map +1 -0
- package/dist/commands/admin/seed.d.ts +32 -0
- package/dist/commands/admin/seed.d.ts.map +1 -0
- package/dist/commands/admin/seed.js +527 -0
- package/dist/commands/admin/seed.js.map +1 -0
- package/dist/commands/admin/seed.test.d.ts +6 -0
- package/dist/commands/admin/seed.test.d.ts.map +1 -0
- package/dist/commands/admin/seed.test.js +65 -0
- package/dist/commands/admin/seed.test.js.map +1 -0
- package/dist/commands/audit.d.ts +25 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +188 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/brand-pack.d.ts +2 -0
- package/dist/commands/brand-pack.d.ts.map +1 -0
- package/dist/commands/brand-pack.js +25 -0
- package/dist/commands/brand-pack.js.map +1 -0
- package/dist/commands/brief.d.ts +28 -0
- package/dist/commands/brief.d.ts.map +1 -0
- package/dist/commands/brief.js +75 -0
- package/dist/commands/brief.js.map +1 -0
- package/dist/commands/capture.d.ts +25 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +232 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/chain-walk.d.ts +14 -0
- package/dist/commands/chain-walk.d.ts.map +1 -0
- package/dist/commands/chain-walk.js +38 -0
- package/dist/commands/chain-walk.js.map +1 -0
- package/dist/commands/changes.d.ts +11 -0
- package/dist/commands/changes.d.ts.map +1 -0
- package/dist/commands/changes.js +46 -0
- package/dist/commands/changes.js.map +1 -0
- package/dist/commands/codex-prep.d.ts +12 -0
- package/dist/commands/codex-prep.d.ts.map +1 -0
- package/dist/commands/codex-prep.js +122 -0
- package/dist/commands/codex-prep.js.map +1 -0
- package/dist/commands/collections.d.ts +22 -0
- package/dist/commands/collections.d.ts.map +1 -0
- package/dist/commands/collections.js +77 -0
- package/dist/commands/collections.js.map +1 -0
- package/dist/commands/connect-integration.test.d.ts +7 -0
- package/dist/commands/connect-integration.test.d.ts.map +1 -0
- package/dist/commands/connect-integration.test.js +200 -0
- package/dist/commands/connect-integration.test.js.map +1 -0
- package/dist/commands/connect.d.ts +21 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +279 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/connect.test.d.ts +6 -0
- package/dist/commands/connect.test.d.ts.map +1 -0
- package/dist/commands/connect.test.js +230 -0
- package/dist/commands/connect.test.js.map +1 -0
- package/dist/commands/constellation.d.ts +11 -0
- package/dist/commands/constellation.d.ts.map +1 -0
- package/dist/commands/constellation.js +33 -0
- package/dist/commands/constellation.js.map +1 -0
- package/dist/commands/context.d.ts +2 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +20 -9
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/cross-cut.d.ts +11 -0
- package/dist/commands/cross-cut.d.ts.map +1 -0
- package/dist/commands/cross-cut.js +23 -0
- package/dist/commands/cross-cut.js.map +1 -0
- package/dist/commands/doctor.d.ts +18 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +231 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/doctor.test.d.ts +8 -0
- package/dist/commands/doctor.test.d.ts.map +1 -0
- package/dist/commands/doctor.test.js +311 -0
- package/dist/commands/doctor.test.js.map +1 -0
- package/dist/commands/fields.d.ts +9 -0
- package/dist/commands/fields.d.ts.map +1 -0
- package/dist/commands/fields.js +30 -0
- package/dist/commands/fields.js.map +1 -0
- package/dist/commands/get.d.ts +8 -1
- package/dist/commands/get.d.ts.map +1 -1
- package/dist/commands/get.js +60 -7
- package/dist/commands/get.js.map +1 -1
- package/dist/commands/handshake.d.ts +28 -0
- package/dist/commands/handshake.d.ts.map +1 -0
- package/dist/commands/handshake.js +617 -0
- package/dist/commands/handshake.js.map +1 -0
- package/dist/commands/ingest.d.ts +8 -2
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +148 -25
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/init.d.ts +14 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +117 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +4 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +99 -37
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/orient.d.ts +103 -1
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +24 -8
- package/dist/commands/orient.js.map +1 -1
- package/dist/commands/profile.d.ts +24 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +82 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/promote.d.ts +12 -0
- package/dist/commands/promote.d.ts.map +1 -0
- package/dist/commands/promote.js +90 -0
- package/dist/commands/promote.js.map +1 -0
- package/dist/commands/proposals.d.ts +9 -0
- package/dist/commands/proposals.d.ts.map +1 -0
- package/dist/commands/proposals.js +24 -0
- package/dist/commands/proposals.js.map +1 -0
- package/dist/commands/reject.d.ts +14 -0
- package/dist/commands/reject.d.ts.map +1 -0
- package/dist/commands/reject.js +43 -0
- package/dist/commands/reject.js.map +1 -0
- package/dist/commands/relate.d.ts +16 -0
- package/dist/commands/relate.d.ts.map +1 -0
- package/dist/commands/relate.js +98 -0
- package/dist/commands/relate.js.map +1 -0
- package/dist/commands/search.d.ts +1 -0
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +5 -3
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/session.d.ts +20 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +144 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/setup.d.ts +15 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +168 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/update.d.ts +17 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +178 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +13 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +49 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/commands/workspace.d.ts +41 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +239 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/formatters/audit.d.ts +46 -0
- package/dist/formatters/audit.d.ts.map +1 -0
- package/dist/formatters/audit.js +81 -0
- package/dist/formatters/audit.js.map +1 -0
- package/dist/formatters/brief.d.ts +112 -0
- package/dist/formatters/brief.d.ts.map +1 -0
- package/dist/formatters/brief.js +179 -0
- package/dist/formatters/brief.js.map +1 -0
- package/dist/formatters/capture.d.ts +48 -0
- package/dist/formatters/capture.d.ts.map +1 -0
- package/dist/formatters/capture.js +77 -0
- package/dist/formatters/capture.js.map +1 -0
- package/dist/formatters/chain-walk.d.ts +33 -0
- package/dist/formatters/chain-walk.d.ts.map +1 -0
- package/dist/formatters/chain-walk.js +54 -0
- package/dist/formatters/chain-walk.js.map +1 -0
- package/dist/formatters/changes.d.ts +25 -0
- package/dist/formatters/changes.d.ts.map +1 -0
- package/dist/formatters/changes.js +60 -0
- package/dist/formatters/changes.js.map +1 -0
- package/dist/formatters/collections.d.ts +40 -0
- package/dist/formatters/collections.d.ts.map +1 -0
- package/dist/formatters/collections.js +93 -0
- package/dist/formatters/collections.js.map +1 -0
- package/dist/formatters/constellation.d.ts +34 -0
- package/dist/formatters/constellation.d.ts.map +1 -0
- package/dist/formatters/constellation.js +38 -0
- package/dist/formatters/constellation.js.map +1 -0
- package/dist/formatters/cross-cut.d.ts +21 -0
- package/dist/formatters/cross-cut.d.ts.map +1 -0
- package/dist/formatters/cross-cut.js +32 -0
- package/dist/formatters/cross-cut.js.map +1 -0
- package/dist/formatters/entry.d.ts +11 -4
- package/dist/formatters/entry.d.ts.map +1 -1
- package/dist/formatters/entry.js +24 -8
- package/dist/formatters/entry.js.map +1 -1
- package/dist/formatters/fields.d.ts +32 -0
- package/dist/formatters/fields.d.ts.map +1 -0
- package/dist/formatters/fields.js +49 -0
- package/dist/formatters/fields.js.map +1 -0
- package/dist/formatters/handshake.d.ts +24 -0
- package/dist/formatters/handshake.d.ts.map +1 -0
- package/dist/formatters/handshake.js +69 -0
- package/dist/formatters/handshake.js.map +1 -0
- package/dist/formatters/orient.d.ts +100 -1
- package/dist/formatters/orient.d.ts.map +1 -1
- package/dist/formatters/orient.js +123 -17
- package/dist/formatters/orient.js.map +1 -1
- package/dist/formatters/promote.d.ts +30 -0
- package/dist/formatters/promote.d.ts.map +1 -0
- package/dist/formatters/promote.js +39 -0
- package/dist/formatters/promote.js.map +1 -0
- package/dist/formatters/proposals.d.ts +45 -0
- package/dist/formatters/proposals.d.ts.map +1 -0
- package/dist/formatters/proposals.js +62 -0
- package/dist/formatters/proposals.js.map +1 -0
- package/dist/formatters/relate.d.ts +14 -0
- package/dist/formatters/relate.d.ts.map +1 -0
- package/dist/formatters/relate.js +16 -0
- package/dist/formatters/relate.js.map +1 -0
- package/dist/formatters/search.d.ts +0 -4
- package/dist/formatters/search.d.ts.map +1 -1
- package/dist/formatters/search.js +4 -1
- package/dist/formatters/search.js.map +1 -1
- package/dist/formatters/session.d.ts +11 -0
- package/dist/formatters/session.d.ts.map +1 -0
- package/dist/formatters/session.js +51 -0
- package/dist/formatters/session.js.map +1 -0
- package/dist/formatters/update.d.ts +17 -0
- package/dist/formatters/update.d.ts.map +1 -0
- package/dist/formatters/update.js +45 -0
- package/dist/formatters/update.js.map +1 -0
- package/dist/formatters/verify.d.ts +11 -0
- package/dist/formatters/verify.d.ts.map +1 -0
- package/dist/formatters/verify.js +11 -0
- package/dist/formatters/verify.js.map +1 -0
- package/dist/generators/__tests__/surface-profiles.test.d.ts +2 -0
- package/dist/generators/__tests__/surface-profiles.test.d.ts.map +1 -0
- package/dist/generators/__tests__/surface-profiles.test.js +89 -0
- package/dist/generators/__tests__/surface-profiles.test.js.map +1 -0
- package/dist/generators/adapters.d.ts +44 -0
- package/dist/generators/adapters.d.ts.map +1 -0
- package/dist/generators/adapters.js +290 -0
- package/dist/generators/adapters.js.map +1 -0
- package/dist/generators/adapters.test.d.ts +2 -0
- package/dist/generators/adapters.test.d.ts.map +1 -0
- package/dist/generators/adapters.test.js +27 -0
- package/dist/generators/adapters.test.js.map +1 -0
- package/dist/generators/archetypes.d.ts +52 -0
- package/dist/generators/archetypes.d.ts.map +1 -0
- package/dist/generators/archetypes.js +153 -0
- package/dist/generators/archetypes.js.map +1 -0
- package/dist/generators/archetypes.test.d.ts +2 -0
- package/dist/generators/archetypes.test.d.ts.map +1 -0
- package/dist/generators/archetypes.test.js +237 -0
- package/dist/generators/archetypes.test.js.map +1 -0
- package/dist/generators/briefing-md.d.ts +8 -0
- package/dist/generators/briefing-md.d.ts.map +1 -0
- package/dist/generators/briefing-md.js +51 -0
- package/dist/generators/briefing-md.js.map +1 -0
- package/dist/generators/chain-classifier.d.ts +49 -0
- package/dist/generators/chain-classifier.d.ts.map +1 -0
- package/dist/generators/chain-classifier.js +180 -0
- package/dist/generators/chain-classifier.js.map +1 -0
- package/dist/generators/chain-classifier.test.d.ts +2 -0
- package/dist/generators/chain-classifier.test.d.ts.map +1 -0
- package/dist/generators/chain-classifier.test.js +257 -0
- package/dist/generators/chain-classifier.test.js.map +1 -0
- package/dist/generators/chain-rules.d.ts +42 -0
- package/dist/generators/chain-rules.d.ts.map +1 -0
- package/dist/generators/chain-rules.js +144 -0
- package/dist/generators/chain-rules.js.map +1 -0
- package/dist/generators/chain-rules.test.d.ts +2 -0
- package/dist/generators/chain-rules.test.d.ts.map +1 -0
- package/dist/generators/chain-rules.test.js +179 -0
- package/dist/generators/chain-rules.test.js.map +1 -0
- package/dist/generators/context-md.d.ts +8 -0
- package/dist/generators/context-md.d.ts.map +1 -0
- package/dist/generators/context-md.js +134 -0
- package/dist/generators/context-md.js.map +1 -0
- package/dist/generators/handshake-diff.d.ts +67 -0
- package/dist/generators/handshake-diff.d.ts.map +1 -0
- package/dist/generators/handshake-diff.js +183 -0
- package/dist/generators/handshake-diff.js.map +1 -0
- package/dist/generators/handshake-diff.test.d.ts +2 -0
- package/dist/generators/handshake-diff.test.d.ts.map +1 -0
- package/dist/generators/handshake-diff.test.js +264 -0
- package/dist/generators/handshake-diff.test.js.map +1 -0
- package/dist/generators/portable-knowledge.d.ts +143 -0
- package/dist/generators/portable-knowledge.d.ts.map +1 -0
- package/dist/generators/portable-knowledge.js +504 -0
- package/dist/generators/portable-knowledge.js.map +1 -0
- package/dist/generators/portable-knowledge.test.d.ts +2 -0
- package/dist/generators/portable-knowledge.test.d.ts.map +1 -0
- package/dist/generators/portable-knowledge.test.js +927 -0
- package/dist/generators/portable-knowledge.test.js.map +1 -0
- package/dist/generators/surface-profiles.d.ts +49 -0
- package/dist/generators/surface-profiles.d.ts.map +1 -0
- package/dist/generators/surface-profiles.js +98 -0
- package/dist/generators/surface-profiles.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +637 -37
- package/dist/index.js.map +1 -1
- package/dist/lib/activation.d.ts +28 -0
- package/dist/lib/activation.d.ts.map +1 -0
- package/dist/lib/activation.js +57 -0
- package/dist/lib/activation.js.map +1 -0
- package/dist/lib/activation.test.d.ts +6 -0
- package/dist/lib/activation.test.d.ts.map +1 -0
- package/dist/lib/activation.test.js +121 -0
- package/dist/lib/activation.test.js.map +1 -0
- package/dist/lib/client.d.ts +61 -0
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +262 -12
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/config.d.ts +84 -4
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +318 -39
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/constants.d.ts +42 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +76 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/conversation-engine.d.ts +45 -0
- package/dist/lib/conversation-engine.d.ts.map +1 -0
- package/dist/lib/conversation-engine.js +112 -0
- package/dist/lib/conversation-engine.js.map +1 -0
- package/dist/lib/conversation-phases.d.ts +59 -0
- package/dist/lib/conversation-phases.d.ts.map +1 -0
- package/dist/lib/conversation-phases.js +11 -0
- package/dist/lib/conversation-phases.js.map +1 -0
- package/dist/lib/conversation-signals.d.ts +30 -0
- package/dist/lib/conversation-signals.d.ts.map +1 -0
- package/dist/lib/conversation-signals.js +64 -0
- package/dist/lib/conversation-signals.js.map +1 -0
- package/dist/lib/deployment.d.ts +23 -0
- package/dist/lib/deployment.d.ts.map +1 -0
- package/dist/lib/deployment.js +78 -0
- package/dist/lib/deployment.js.map +1 -0
- package/dist/lib/deployment.test.d.ts +5 -0
- package/dist/lib/deployment.test.d.ts.map +1 -0
- package/dist/lib/deployment.test.js +54 -0
- package/dist/lib/deployment.test.js.map +1 -0
- package/dist/lib/errors.d.ts +58 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +67 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/experiment.d.ts +18 -0
- package/dist/lib/experiment.d.ts.map +1 -0
- package/dist/lib/experiment.js +28 -0
- package/dist/lib/experiment.js.map +1 -0
- package/dist/lib/format.d.ts +10 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +27 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/glossary.d.ts +19 -0
- package/dist/lib/glossary.d.ts.map +1 -0
- package/dist/lib/glossary.js +53 -0
- package/dist/lib/glossary.js.map +1 -0
- package/dist/lib/onboarding-path-b.d.ts +10 -0
- package/dist/lib/onboarding-path-b.d.ts.map +1 -0
- package/dist/lib/onboarding-path-b.js +214 -0
- package/dist/lib/onboarding-path-b.js.map +1 -0
- package/dist/lib/onboarding-phases.d.ts +9 -0
- package/dist/lib/onboarding-phases.d.ts.map +1 -0
- package/dist/lib/onboarding-phases.js +120 -0
- package/dist/lib/onboarding-phases.js.map +1 -0
- package/dist/lib/onboarding-shared.d.ts +81 -0
- package/dist/lib/onboarding-shared.d.ts.map +1 -0
- package/dist/lib/onboarding-shared.js +190 -0
- package/dist/lib/onboarding-shared.js.map +1 -0
- package/dist/lib/onboarding-topics.d.ts +27 -0
- package/dist/lib/onboarding-topics.d.ts.map +1 -0
- package/dist/lib/onboarding-topics.js +57 -0
- package/dist/lib/onboarding-topics.js.map +1 -0
- package/dist/lib/onboarding.d.ts +17 -0
- package/dist/lib/onboarding.d.ts.map +1 -0
- package/dist/lib/onboarding.js +350 -0
- package/dist/lib/onboarding.js.map +1 -0
- package/dist/lib/profiles.d.ts +39 -0
- package/dist/lib/profiles.d.ts.map +1 -0
- package/dist/lib/profiles.js +180 -0
- package/dist/lib/profiles.js.map +1 -0
- package/dist/lib/prompts.d.ts +65 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +132 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/lib/repo-detect.d.ts +33 -0
- package/dist/lib/repo-detect.d.ts.map +1 -0
- package/dist/lib/repo-detect.js +83 -0
- package/dist/lib/repo-detect.js.map +1 -0
- package/dist/lib/runner.d.ts +33 -0
- package/dist/lib/runner.d.ts.map +1 -0
- package/dist/lib/runner.js +79 -0
- package/dist/lib/runner.js.map +1 -0
- package/dist/lib/session.d.ts +17 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/session.js +43 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/spinner.d.ts +27 -0
- package/dist/lib/spinner.d.ts.map +1 -0
- package/dist/lib/spinner.js +76 -0
- package/dist/lib/spinner.js.map +1 -0
- package/dist/lib/spinner.test.d.ts +2 -0
- package/dist/lib/spinner.test.d.ts.map +1 -0
- package/dist/lib/spinner.test.js +39 -0
- package/dist/lib/spinner.test.js.map +1 -0
- package/dist/lib/strip.d.ts +12 -0
- package/dist/lib/strip.d.ts.map +1 -0
- package/dist/lib/strip.js +41 -0
- package/dist/lib/strip.js.map +1 -0
- package/dist/lib/style.d.ts +94 -0
- package/dist/lib/style.d.ts.map +1 -0
- package/dist/lib/style.js +167 -0
- package/dist/lib/style.js.map +1 -0
- package/dist/lib/style.test.d.ts +7 -0
- package/dist/lib/style.test.d.ts.map +1 -0
- package/dist/lib/style.test.js +263 -0
- package/dist/lib/style.test.js.map +1 -0
- package/dist/lib/telemetry.d.ts +15 -0
- package/dist/lib/telemetry.d.ts.map +1 -0
- package/dist/lib/telemetry.js +47 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/dist/lib/wizard-surfaces.d.ts +47 -0
- package/dist/lib/wizard-surfaces.d.ts.map +1 -0
- package/dist/lib/wizard-surfaces.js +176 -0
- package/dist/lib/wizard-surfaces.js.map +1 -0
- package/dist/lib/wizard-surfaces.test.d.ts +2 -0
- package/dist/lib/wizard-surfaces.test.d.ts.map +1 -0
- package/dist/lib/wizard-surfaces.test.js +127 -0
- package/dist/lib/wizard-surfaces.test.js.map +1 -0
- package/dist/lib/wizard-trust.d.ts +31 -0
- package/dist/lib/wizard-trust.d.ts.map +1 -0
- package/dist/lib/wizard-trust.js +66 -0
- package/dist/lib/wizard-trust.js.map +1 -0
- package/dist/lib/wizard-trust.test.d.ts +2 -0
- package/dist/lib/wizard-trust.test.d.ts.map +1 -0
- package/dist/lib/wizard-trust.test.js +32 -0
- package/dist/lib/wizard-trust.test.js.map +1 -0
- package/dist/lib/workspace-probe.d.ts +16 -0
- package/dist/lib/workspace-probe.d.ts.map +1 -0
- package/dist/lib/workspace-probe.js +33 -0
- package/dist/lib/workspace-probe.js.map +1 -0
- package/package.json +9 -4
- package/templates/archetypes/boundary.md +23 -0
- package/templates/archetypes/constraint.md +23 -0
- package/templates/archetypes/convention.md +23 -0
- package/templates/archetypes/policy.md +23 -0
- package/templates/archetypes/quality-gate.md +23 -0
- package/templates/archetypes/workflow.md +23 -0
- package/templates/general/code-integrity.md +11 -0
- package/templates/general/getting-started.md +12 -0
- package/templates/node-ts/code-integrity.md +13 -0
- package/templates/node-ts/testing.md +12 -0
- package/templates/python/code-integrity.md +13 -0
- package/templates/python/testing.md +12 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BET-270 S1: Batch transformation tests for surface-optimized skill projection.
|
|
3
|
+
* Tests applyBatchTransformations + generateCodexSkill batch mode + Claude/Cursor unchanged.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, expect, it } from 'vitest';
|
|
6
|
+
import { applyBatchTransformations, generateCodexSkill, generateCursorSkill, generateClaudeRule, generateClaudeSkillRouter, } from '../generators/portable-knowledge.js';
|
|
7
|
+
import { SURFACE_PROFILES } from '../generators/surface-profiles.js';
|
|
8
|
+
describe('applyBatchTransformations', () => {
|
|
9
|
+
it('strips sub-agent spawn patterns and replaces with inline step instruction', () => {
|
|
10
|
+
const body = `# My Skill
|
|
11
|
+
|
|
12
|
+
Do some work.
|
|
13
|
+
Spawn a sub-agent to handle the review.
|
|
14
|
+
Continue with the result.`;
|
|
15
|
+
const result = applyBatchTransformations(body);
|
|
16
|
+
expect(result).not.toContain('Spawn a sub-agent');
|
|
17
|
+
expect(result).toContain('Execute as inline steps within this session.');
|
|
18
|
+
expect(result).toContain('Do some work.');
|
|
19
|
+
expect(result).toContain('Continue with the result.');
|
|
20
|
+
});
|
|
21
|
+
it('strips SPAWN build sub-agent pattern (uppercase SPAWN)', () => {
|
|
22
|
+
const body = `# Heading
|
|
23
|
+
|
|
24
|
+
SPAWN build sub-agent with primer.
|
|
25
|
+
Other content.`;
|
|
26
|
+
const result = applyBatchTransformations(body);
|
|
27
|
+
expect(result).not.toContain('SPAWN build sub-agent');
|
|
28
|
+
expect(result).toContain('Execute as inline steps within this session.');
|
|
29
|
+
});
|
|
30
|
+
it('strips SPAWN review sub-agent pattern', () => {
|
|
31
|
+
const body = `# Heading
|
|
32
|
+
|
|
33
|
+
SPAWN review sub-agent for verification.
|
|
34
|
+
Done.`;
|
|
35
|
+
const result = applyBatchTransformations(body);
|
|
36
|
+
expect(result).not.toContain('SPAWN review sub-agent');
|
|
37
|
+
expect(result).toContain('Execute as inline steps within this session.');
|
|
38
|
+
});
|
|
39
|
+
it('strips "fresh conversation handoff" pattern', () => {
|
|
40
|
+
const body = `# Heading
|
|
41
|
+
|
|
42
|
+
Use fresh conversation handoff for next slice.
|
|
43
|
+
Continue.`;
|
|
44
|
+
const result = applyBatchTransformations(body);
|
|
45
|
+
expect(result).not.toContain('fresh conversation handoff');
|
|
46
|
+
expect(result).toContain('Execute as inline steps within this session.');
|
|
47
|
+
});
|
|
48
|
+
it('strips user confirmation gates — "Ask the user"', () => {
|
|
49
|
+
const body = `# Skill
|
|
50
|
+
|
|
51
|
+
Do work.
|
|
52
|
+
Ask the user before proceeding.
|
|
53
|
+
Continue.`;
|
|
54
|
+
const result = applyBatchTransformations(body);
|
|
55
|
+
expect(result).not.toContain('Ask the user');
|
|
56
|
+
expect(result).toContain('Proceed autonomously. Log decision rationale.');
|
|
57
|
+
expect(result).toContain('Do work.');
|
|
58
|
+
expect(result).toContain('Continue.');
|
|
59
|
+
});
|
|
60
|
+
it('strips user confirmation gates — "Wait for user input"', () => {
|
|
61
|
+
const body = `# Skill
|
|
62
|
+
|
|
63
|
+
Step one done.
|
|
64
|
+
Wait for user input before continuing.
|
|
65
|
+
Step two.`;
|
|
66
|
+
const result = applyBatchTransformations(body);
|
|
67
|
+
expect(result).not.toContain('Wait for user input');
|
|
68
|
+
expect(result).toContain('Proceed autonomously. Log decision rationale.');
|
|
69
|
+
});
|
|
70
|
+
it('strips user confirmation gates — "Present gate to user"', () => {
|
|
71
|
+
const body = `# Skill
|
|
72
|
+
|
|
73
|
+
Build the feature.
|
|
74
|
+
Present gate to user before merging.
|
|
75
|
+
Merge.`;
|
|
76
|
+
const result = applyBatchTransformations(body);
|
|
77
|
+
expect(result).not.toContain('Present gate to user');
|
|
78
|
+
expect(result).toContain('Proceed autonomously. Log decision rationale.');
|
|
79
|
+
});
|
|
80
|
+
it('strips user confirmation gates — "STOP and ask"', () => {
|
|
81
|
+
const body = `# Skill
|
|
82
|
+
|
|
83
|
+
Analyze problem.
|
|
84
|
+
STOP and ask the user whether to continue.
|
|
85
|
+
Then proceed.`;
|
|
86
|
+
const result = applyBatchTransformations(body);
|
|
87
|
+
expect(result).not.toContain('STOP and ask');
|
|
88
|
+
expect(result).toContain('Proceed autonomously. Log decision rationale.');
|
|
89
|
+
});
|
|
90
|
+
it('adds batch governance header after the first # heading', () => {
|
|
91
|
+
const body = `# My Skill
|
|
92
|
+
|
|
93
|
+
Some content here.`;
|
|
94
|
+
const result = applyBatchTransformations(body);
|
|
95
|
+
expect(result).toContain('> Batch execution mode: This skill runs autonomously without interactive gates. Decisions are logged, not prompted.');
|
|
96
|
+
// Header must appear right after the heading
|
|
97
|
+
const lines = result.split('\n');
|
|
98
|
+
const headingIdx = lines.findIndex((l) => l.startsWith('# My Skill'));
|
|
99
|
+
const batchHeaderIdx = lines.findIndex((l) => l.includes('Batch execution mode:'));
|
|
100
|
+
expect(headingIdx).toBeGreaterThanOrEqual(0);
|
|
101
|
+
expect(batchHeaderIdx).toBeGreaterThan(headingIdx);
|
|
102
|
+
expect(batchHeaderIdx - headingIdx).toBeLessThanOrEqual(3);
|
|
103
|
+
});
|
|
104
|
+
it('preserves non-interactive content unchanged', () => {
|
|
105
|
+
const body = `# Clean Skill
|
|
106
|
+
|
|
107
|
+
This skill has no interactive patterns.
|
|
108
|
+
It describes steps the agent should follow.
|
|
109
|
+
Use grep to find the file.
|
|
110
|
+
Run npm run build.`;
|
|
111
|
+
const result = applyBatchTransformations(body);
|
|
112
|
+
expect(result).toContain('This skill has no interactive patterns.');
|
|
113
|
+
expect(result).toContain('It describes steps the agent should follow.');
|
|
114
|
+
expect(result).toContain('Use grep to find the file.');
|
|
115
|
+
expect(result).toContain('Run npm run build.');
|
|
116
|
+
expect(result).toContain('Batch execution mode:');
|
|
117
|
+
});
|
|
118
|
+
it('preserves interactive patterns inside fenced code blocks', () => {
|
|
119
|
+
const body = `# Skill With Examples
|
|
120
|
+
|
|
121
|
+
Here is how it works in interactive mode:
|
|
122
|
+
|
|
123
|
+
\`\`\`
|
|
124
|
+
Spawn a sub-agent to handle the review.
|
|
125
|
+
Ask the user before proceeding.
|
|
126
|
+
Wait for user input.
|
|
127
|
+
\`\`\`
|
|
128
|
+
|
|
129
|
+
Normal prose outside the fence.
|
|
130
|
+
Spawn a sub-agent for the next step.`;
|
|
131
|
+
const result = applyBatchTransformations(body);
|
|
132
|
+
// Patterns inside the code fence must be preserved verbatim
|
|
133
|
+
expect(result).toContain('Spawn a sub-agent to handle the review.');
|
|
134
|
+
expect(result).toContain('Ask the user before proceeding.');
|
|
135
|
+
expect(result).toContain('Wait for user input.');
|
|
136
|
+
// Pattern outside the code fence must be transformed
|
|
137
|
+
expect(result).not.toContain('Spawn a sub-agent for the next step.');
|
|
138
|
+
expect(result).toContain('Execute as inline steps within this session.');
|
|
139
|
+
});
|
|
140
|
+
it('preserves patterns inside tilde-fenced code blocks', () => {
|
|
141
|
+
const body = `# Skill
|
|
142
|
+
|
|
143
|
+
~~~bash
|
|
144
|
+
Ask the user for confirmation.
|
|
145
|
+
~~~
|
|
146
|
+
|
|
147
|
+
Ask the user to approve.`;
|
|
148
|
+
const result = applyBatchTransformations(body);
|
|
149
|
+
// Inside fence: preserved
|
|
150
|
+
expect(result).toContain('Ask the user for confirmation.');
|
|
151
|
+
// Outside fence: transformed
|
|
152
|
+
expect(result).not.toContain('Ask the user to approve.');
|
|
153
|
+
expect(result).toContain('Proceed autonomously. Log decision rationale.');
|
|
154
|
+
});
|
|
155
|
+
it('does not transform every mention of "user" — only clear interactive gate patterns', () => {
|
|
156
|
+
const body = `# Skill
|
|
157
|
+
|
|
158
|
+
The user should be aware of this tradeoff.
|
|
159
|
+
User data must be validated before insert.`;
|
|
160
|
+
const result = applyBatchTransformations(body);
|
|
161
|
+
expect(result).toContain('The user should be aware of this tradeoff.');
|
|
162
|
+
expect(result).toContain('User data must be validated before insert.');
|
|
163
|
+
expect(result).not.toContain('Proceed autonomously. Log decision rationale.');
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
describe('generateCodexSkill — batch mode (BET-270 S1)', () => {
|
|
167
|
+
const baseSkill = {
|
|
168
|
+
name: 'orchestrate',
|
|
169
|
+
description: 'Orchestrate a bet slice.',
|
|
170
|
+
triggers: ['orchestrate'],
|
|
171
|
+
body: `# Orchestrate
|
|
172
|
+
|
|
173
|
+
Do planning.
|
|
174
|
+
Spawn a sub-agent to execute.
|
|
175
|
+
Ask the user to confirm the plan.
|
|
176
|
+
Finalize.`,
|
|
177
|
+
sourcePath: '/tmp/.productbrain/skills/orchestrate.md',
|
|
178
|
+
};
|
|
179
|
+
it('applies batch transformations when profile.executionModel is batch', () => {
|
|
180
|
+
const output = generateCodexSkill(baseSkill, SURFACE_PROFILES.codex);
|
|
181
|
+
expect(output).not.toContain('Spawn a sub-agent');
|
|
182
|
+
expect(output).not.toContain('Ask the user');
|
|
183
|
+
expect(output).toContain('Execute as inline steps within this session.');
|
|
184
|
+
expect(output).toContain('Proceed autonomously. Log decision rationale.');
|
|
185
|
+
expect(output).toContain('Batch execution mode:');
|
|
186
|
+
});
|
|
187
|
+
it('produces CURRENT output (no batch transforms) when profile is undefined — backward compat', () => {
|
|
188
|
+
const output = generateCodexSkill(baseSkill, undefined);
|
|
189
|
+
expect(output).toContain('Spawn a sub-agent to execute.');
|
|
190
|
+
expect(output).toContain('Ask the user to confirm the plan.');
|
|
191
|
+
expect(output).not.toContain('Batch execution mode:');
|
|
192
|
+
});
|
|
193
|
+
it('includes skill name, description, triggers in both modes', () => {
|
|
194
|
+
const withProfile = generateCodexSkill(baseSkill, SURFACE_PROFILES.codex);
|
|
195
|
+
const withoutProfile = generateCodexSkill(baseSkill, undefined);
|
|
196
|
+
for (const output of [withProfile, withoutProfile]) {
|
|
197
|
+
expect(output).toContain('# orchestrate');
|
|
198
|
+
expect(output).toContain('Orchestrate a bet slice.');
|
|
199
|
+
expect(output).toContain('`orchestrate`');
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
it('still performs path replacement before batch transforms', () => {
|
|
203
|
+
const skillWithPath = {
|
|
204
|
+
...baseSkill,
|
|
205
|
+
body: `# Path Skill
|
|
206
|
+
|
|
207
|
+
Read \`.productbrain/skills/preflight.md\` before starting.
|
|
208
|
+
Ask the user for approval.`,
|
|
209
|
+
};
|
|
210
|
+
const output = generateCodexSkill(skillWithPath, SURFACE_PROFILES.codex);
|
|
211
|
+
expect(output).toContain('.codex/skills/preflight.md');
|
|
212
|
+
expect(output).not.toContain('.productbrain/skills/preflight.md');
|
|
213
|
+
expect(output).not.toContain('Ask the user');
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
describe('generateCursorSkill / generateClaudeRule / generateClaudeSkillRouter — profile ignored (BET-270 S1)', () => {
|
|
217
|
+
const skill = {
|
|
218
|
+
name: 'test-skill',
|
|
219
|
+
description: 'Test skill',
|
|
220
|
+
triggers: ['test'],
|
|
221
|
+
body: `# Test Skill
|
|
222
|
+
|
|
223
|
+
Ask the user to confirm.
|
|
224
|
+
Spawn a sub-agent.
|
|
225
|
+
Normal content.`,
|
|
226
|
+
sourcePath: '/tmp/.productbrain/skills/test-skill.md',
|
|
227
|
+
};
|
|
228
|
+
const rule = {
|
|
229
|
+
name: 'test-rule',
|
|
230
|
+
description: 'A test rule',
|
|
231
|
+
autoApply: true,
|
|
232
|
+
body: '# Rule body\n\nAsk the user to confirm.\nNormal content.',
|
|
233
|
+
sourcePath: '/tmp/.productbrain/rules/test-rule.md',
|
|
234
|
+
};
|
|
235
|
+
it('generateCursorSkill preserves interactive content regardless of profile', () => {
|
|
236
|
+
const withProfile = generateCursorSkill(skill, SURFACE_PROFILES.cursor);
|
|
237
|
+
const withCodexProfile = generateCursorSkill(skill, SURFACE_PROFILES.codex);
|
|
238
|
+
for (const output of [withProfile, withCodexProfile]) {
|
|
239
|
+
expect(output).toContain('Ask the user to confirm.');
|
|
240
|
+
expect(output).toContain('Spawn a sub-agent.');
|
|
241
|
+
expect(output).not.toContain('Batch execution mode:');
|
|
242
|
+
expect(output).not.toContain('Proceed autonomously');
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
it('generateClaudeRule preserves interactive content regardless of profile', () => {
|
|
246
|
+
const withProfile = generateClaudeRule(rule, SURFACE_PROFILES.claude);
|
|
247
|
+
const withCodexProfile = generateClaudeRule(rule, SURFACE_PROFILES.codex);
|
|
248
|
+
for (const output of [withProfile, withCodexProfile]) {
|
|
249
|
+
expect(output).toContain('Ask the user to confirm.');
|
|
250
|
+
expect(output).not.toContain('Batch execution mode:');
|
|
251
|
+
expect(output).not.toContain('Proceed autonomously');
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
it('generateClaudeSkillRouter preserves interactive content regardless of profile', () => {
|
|
255
|
+
const withProfile = generateClaudeSkillRouter([skill], SURFACE_PROFILES.claude);
|
|
256
|
+
const withCodexProfile = generateClaudeSkillRouter([skill], SURFACE_PROFILES.codex);
|
|
257
|
+
for (const output of [withProfile, withCodexProfile]) {
|
|
258
|
+
expect(output).toContain('test-skill');
|
|
259
|
+
expect(output).toContain('Skill Router');
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
//# sourceMappingURL=batch-transformations.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-transformations.test.js","sourceRoot":"","sources":["../../src/__tests__/batch-transformations.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/capture.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pb capture extensions — --link, --json flags.
|
|
3
|
+
* TEN-341 test contract: capture --link calls createEntryRelation, capture --json outputs JSON.
|
|
4
|
+
*/
|
|
5
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
6
|
+
import { runCapture } from '../commands/capture.js';
|
|
7
|
+
const mcpCallWithSessionMock = vi.fn();
|
|
8
|
+
vi.mock('../lib/client.js', () => ({
|
|
9
|
+
mcpCallWithSession: (...args) => mcpCallWithSessionMock(...args),
|
|
10
|
+
}));
|
|
11
|
+
vi.mock('../lib/config.js', () => ({
|
|
12
|
+
getConfigOrGuide: vi.fn(() => Promise.resolve({ apiKey: 'pb_sk_test', siteUrl: 'https://test.convex.site' })),
|
|
13
|
+
}));
|
|
14
|
+
let mockSession = { sessionId: 'sess-test' };
|
|
15
|
+
vi.mock('../lib/session.js', () => ({
|
|
16
|
+
readSession: () => mockSession,
|
|
17
|
+
addCapturedEntry: vi.fn(),
|
|
18
|
+
}));
|
|
19
|
+
describe('runCapture --link', () => {
|
|
20
|
+
beforeEach(() => {
|
|
21
|
+
mcpCallWithSessionMock.mockReset();
|
|
22
|
+
mockSession = { sessionId: 'sess-test' };
|
|
23
|
+
});
|
|
24
|
+
it('creates entry then links to target with default relation type', async () => {
|
|
25
|
+
// Prefix "TEN:" is extracted → skips classification, routes directly to tensions
|
|
26
|
+
mcpCallWithSessionMock
|
|
27
|
+
.mockResolvedValueOnce({ docId: 'doc-1', entryId: 'TEN-710' })
|
|
28
|
+
.mockResolvedValueOnce({});
|
|
29
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
30
|
+
await runCapture({ text: 'TEN: missing validation', link: 'BET-151' });
|
|
31
|
+
// Verify classification was skipped (no resolveCollection call)
|
|
32
|
+
expect(mcpCallWithSessionMock).not.toHaveBeenCalledWith('chain.resolveCollection', expect.anything());
|
|
33
|
+
// Verify prefix was stripped from entry name and routed to correct collection
|
|
34
|
+
expect(mcpCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.objectContaining({
|
|
35
|
+
collectionSlug: 'tensions',
|
|
36
|
+
name: 'missing validation',
|
|
37
|
+
}));
|
|
38
|
+
expect(mcpCallWithSessionMock).toHaveBeenCalledWith('chain.createEntryRelation', {
|
|
39
|
+
fromEntryId: 'TEN-710',
|
|
40
|
+
toEntryId: 'BET-151',
|
|
41
|
+
type: 'surfaces_tension_in',
|
|
42
|
+
});
|
|
43
|
+
writeSpy.mockRestore();
|
|
44
|
+
});
|
|
45
|
+
it('uses custom relation type when --type provided', async () => {
|
|
46
|
+
// Prefix "INS:" is extracted → skips classification, routes directly to insights
|
|
47
|
+
mcpCallWithSessionMock
|
|
48
|
+
.mockResolvedValueOnce({ docId: 'doc-2', entryId: 'INS-50' })
|
|
49
|
+
.mockResolvedValueOnce({});
|
|
50
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
51
|
+
await runCapture({ text: 'INS: discovered X', link: 'DEC-264', type: 'informed_by' });
|
|
52
|
+
expect(mcpCallWithSessionMock).not.toHaveBeenCalledWith('chain.resolveCollection', expect.anything());
|
|
53
|
+
expect(mcpCallWithSessionMock).toHaveBeenCalledWith('chain.createEntryRelation', {
|
|
54
|
+
fromEntryId: 'INS-50',
|
|
55
|
+
toEntryId: 'DEC-264',
|
|
56
|
+
type: 'informed_by',
|
|
57
|
+
});
|
|
58
|
+
writeSpy.mockRestore();
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('runCapture --json', () => {
|
|
62
|
+
beforeEach(() => {
|
|
63
|
+
mcpCallWithSessionMock.mockReset();
|
|
64
|
+
mockSession = { sessionId: 'sess-test' };
|
|
65
|
+
});
|
|
66
|
+
it('outputs valid JSON with id field and no other stdout', async () => {
|
|
67
|
+
// Prefix "TEN:" is extracted → skips classification
|
|
68
|
+
mcpCallWithSessionMock
|
|
69
|
+
.mockResolvedValueOnce({ docId: 'doc-1', entryId: 'TEN-711' });
|
|
70
|
+
let stdoutOutput = '';
|
|
71
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
72
|
+
stdoutOutput += String(chunk);
|
|
73
|
+
return true;
|
|
74
|
+
});
|
|
75
|
+
await runCapture({ text: 'TEN: test', json: true });
|
|
76
|
+
writeSpy.mockRestore();
|
|
77
|
+
// Find JSON lines in stdout
|
|
78
|
+
const jsonLines = stdoutOutput.split('\n').filter(line => {
|
|
79
|
+
try {
|
|
80
|
+
JSON.parse(line);
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
expect(jsonLines).toHaveLength(1);
|
|
88
|
+
const output = JSON.parse(jsonLines[0]);
|
|
89
|
+
expect(output).toHaveProperty('id', 'TEN-711');
|
|
90
|
+
expect(output).toHaveProperty('collection', 'tensions');
|
|
91
|
+
expect(output).toHaveProperty('confidence');
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
describe('runCapture description field routing', () => {
|
|
95
|
+
beforeEach(() => {
|
|
96
|
+
mcpCallWithSessionMock.mockReset();
|
|
97
|
+
mockSession = { sessionId: 'sess-test' };
|
|
98
|
+
});
|
|
99
|
+
it('passes description key to createEntry for assumptions (TEN-1258 — remap happens in Convex)', async () => {
|
|
100
|
+
// The CLI always sends `description` — the Convex write gate remaps it to `belief`
|
|
101
|
+
// for the assumptions collection (TEN-1258). Verify the CLI routes correctly and
|
|
102
|
+
// sends the text as description so the Convex remap can fire.
|
|
103
|
+
mcpCallWithSessionMock
|
|
104
|
+
.mockResolvedValueOnce({ docId: 'doc-5', entryId: 'ASM-1' });
|
|
105
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
106
|
+
await runCapture({ text: 'ASM: users won\'t pay before seeing value' });
|
|
107
|
+
const createCall = mcpCallWithSessionMock.mock.calls.find(([fn]) => fn === 'chain.createEntry');
|
|
108
|
+
expect(createCall?.[1]).toMatchObject({
|
|
109
|
+
collectionSlug: 'assumptions',
|
|
110
|
+
name: "users won't pay before seeing value",
|
|
111
|
+
data: { description: "users won't pay before seeing value" },
|
|
112
|
+
});
|
|
113
|
+
writeSpy.mockRestore();
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe('runCapture classification guard', () => {
|
|
117
|
+
beforeEach(() => {
|
|
118
|
+
mcpCallWithSessionMock.mockReset();
|
|
119
|
+
mockSession = { sessionId: 'sess-test' };
|
|
120
|
+
});
|
|
121
|
+
it('throws CLIError when classification requires review', async () => {
|
|
122
|
+
mcpCallWithSessionMock.mockResolvedValueOnce(null);
|
|
123
|
+
await expect(runCapture({ text: 'Ambiguous capture' })).rejects.toThrow('Classification needs review before capture can continue.');
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe('runCapture date inference', () => {
|
|
127
|
+
beforeEach(() => {
|
|
128
|
+
mcpCallWithSessionMock.mockReset();
|
|
129
|
+
mockSession = { sessionId: 'sess-test' };
|
|
130
|
+
});
|
|
131
|
+
it('does not default date to today when no source date is present', async () => {
|
|
132
|
+
mcpCallWithSessionMock
|
|
133
|
+
.mockResolvedValueOnce({ collection: 'decisions', confidence: 0.9, tier: 'high' })
|
|
134
|
+
.mockResolvedValueOnce({ docId: 'doc-3', entryId: 'DEC-10' });
|
|
135
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
136
|
+
await runCapture({ text: 'Decision without explicit source date' });
|
|
137
|
+
const createCall = mcpCallWithSessionMock.mock.calls.find(([fn]) => fn === 'chain.createEntry');
|
|
138
|
+
expect(createCall?.[1]).toMatchObject({
|
|
139
|
+
collectionSlug: 'decisions',
|
|
140
|
+
data: { description: 'Decision without explicit source date' },
|
|
141
|
+
});
|
|
142
|
+
expect((createCall?.[1]).data).not.toHaveProperty('date');
|
|
143
|
+
writeSpy.mockRestore();
|
|
144
|
+
});
|
|
145
|
+
it('uses inferred source date when the capture text includes one', async () => {
|
|
146
|
+
mcpCallWithSessionMock
|
|
147
|
+
.mockResolvedValueOnce({ collection: 'decisions', confidence: 0.9, tier: 'high' })
|
|
148
|
+
.mockResolvedValueOnce({ docId: 'doc-4', entryId: 'DEC-11' });
|
|
149
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
150
|
+
await runCapture({ text: 'Decision from April 1, 2026 steering meeting' });
|
|
151
|
+
const createCall = mcpCallWithSessionMock.mock.calls.find(([fn]) => fn === 'chain.createEntry');
|
|
152
|
+
expect((createCall?.[1]).data.date).toBe('2026-04-01');
|
|
153
|
+
writeSpy.mockRestore();
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
//# sourceMappingURL=capture.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture.test.js","sourceRoot":"","sources":["../../src/__tests__/capture.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for config resolution — WP-303 Slice 0.
|
|
3
|
+
*
|
|
4
|
+
* Tests resolveConfig(), getConfigSafe(), and .productbrain/config.json reading.
|
|
5
|
+
* Uses temp directories and mocks to isolate from real config on the filesystem.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=config.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for config resolution — WP-303 Slice 0.
|
|
3
|
+
*
|
|
4
|
+
* Tests resolveConfig(), getConfigSafe(), and .productbrain/config.json reading.
|
|
5
|
+
* Uses temp directories and mocks to isolate from real config on the filesystem.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
8
|
+
import { mkdirSync, writeFileSync, rmSync } from 'fs';
|
|
9
|
+
import { resolve } from 'path';
|
|
10
|
+
import { tmpdir } from 'os';
|
|
11
|
+
import { randomUUID } from 'crypto';
|
|
12
|
+
// Mock the profiles module to prevent real profile config from leaking in
|
|
13
|
+
vi.mock('../lib/profiles.js', () => ({
|
|
14
|
+
resolveProfileConfig: vi.fn(() => null),
|
|
15
|
+
}));
|
|
16
|
+
// Mock os.homedir to prevent reading real ~/.config/productbrain/.env
|
|
17
|
+
vi.mock('os', async (importOriginal) => {
|
|
18
|
+
const actual = await importOriginal();
|
|
19
|
+
return {
|
|
20
|
+
...actual,
|
|
21
|
+
homedir: vi.fn(() => '/tmp/pb-test-fake-home-' + process.pid),
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
describe('config resolution', () => {
|
|
25
|
+
let tempDir;
|
|
26
|
+
const originalCwd = process.cwd;
|
|
27
|
+
const savedEnv = {};
|
|
28
|
+
const envKeys = ['PRODUCTBRAIN_API_KEY', 'CONVEX_SITE_URL', 'PB_PROFILE', 'PB_ENV'];
|
|
29
|
+
// Import after mock setup
|
|
30
|
+
let resolveConfig;
|
|
31
|
+
let getConfigSafe;
|
|
32
|
+
let resetConfigCache;
|
|
33
|
+
beforeEach(async () => {
|
|
34
|
+
// Save and clear relevant env vars
|
|
35
|
+
for (const key of envKeys) {
|
|
36
|
+
savedEnv[key] = process.env[key];
|
|
37
|
+
delete process.env[key];
|
|
38
|
+
}
|
|
39
|
+
// Create isolated temp directory
|
|
40
|
+
tempDir = resolve(tmpdir(), `pb-config-test-${randomUUID()}`);
|
|
41
|
+
mkdirSync(tempDir, { recursive: true });
|
|
42
|
+
// Override CWD
|
|
43
|
+
process.cwd = () => tempDir;
|
|
44
|
+
// Dynamic import to get module with mocks applied
|
|
45
|
+
const config = await import('../lib/config.js');
|
|
46
|
+
resolveConfig = config.resolveConfig;
|
|
47
|
+
getConfigSafe = config.getConfigSafe;
|
|
48
|
+
resetConfigCache = config.resetConfigCache;
|
|
49
|
+
// Reset envLoaded state before each test
|
|
50
|
+
resetConfigCache();
|
|
51
|
+
});
|
|
52
|
+
afterEach(() => {
|
|
53
|
+
// Restore env
|
|
54
|
+
for (const key of envKeys) {
|
|
55
|
+
if (savedEnv[key] !== undefined) {
|
|
56
|
+
process.env[key] = savedEnv[key];
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
delete process.env[key];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Restore CWD
|
|
63
|
+
process.cwd = originalCwd;
|
|
64
|
+
// Clean up temp dir
|
|
65
|
+
try {
|
|
66
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// ignore
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
describe('resolveConfig()', () => {
|
|
73
|
+
it('returns project config.json values when env vars are absent', () => {
|
|
74
|
+
const pbDir = resolve(tempDir, '.productbrain');
|
|
75
|
+
mkdirSync(pbDir, { recursive: true });
|
|
76
|
+
writeFileSync(resolve(pbDir, 'config.json'), JSON.stringify({ apiKey: 'pb_sk_project_key', siteUrl: 'https://custom.example.com' }));
|
|
77
|
+
const result = resolveConfig();
|
|
78
|
+
expect(result.apiKey).toBe('pb_sk_project_key');
|
|
79
|
+
expect(result.siteUrl).toBe('https://custom.example.com');
|
|
80
|
+
expect(result.source).toBe('project');
|
|
81
|
+
});
|
|
82
|
+
it('env vars override project config.json', () => {
|
|
83
|
+
process.env.PRODUCTBRAIN_API_KEY = 'pb_sk_env_key';
|
|
84
|
+
process.env.CONVEX_SITE_URL = 'https://env.example.com';
|
|
85
|
+
const pbDir = resolve(tempDir, '.productbrain');
|
|
86
|
+
mkdirSync(pbDir, { recursive: true });
|
|
87
|
+
writeFileSync(resolve(pbDir, 'config.json'), JSON.stringify({ apiKey: 'pb_sk_project_key', siteUrl: 'https://project.example.com' }));
|
|
88
|
+
const result = resolveConfig();
|
|
89
|
+
expect(result.apiKey).toBe('pb_sk_env_key');
|
|
90
|
+
expect(result.siteUrl).toBe('https://env.example.com');
|
|
91
|
+
expect(result.source).toBe('env');
|
|
92
|
+
});
|
|
93
|
+
it('returns default source with siteUrl when no config found', () => {
|
|
94
|
+
const result = resolveConfig();
|
|
95
|
+
expect(result.apiKey).toBeUndefined();
|
|
96
|
+
expect(result.siteUrl).toBe('https://gateway.productbrain.io');
|
|
97
|
+
expect(result.source).toBe('default');
|
|
98
|
+
});
|
|
99
|
+
it('handles partial project config (only siteUrl, no apiKey)', () => {
|
|
100
|
+
const pbDir = resolve(tempDir, '.productbrain');
|
|
101
|
+
mkdirSync(pbDir, { recursive: true });
|
|
102
|
+
writeFileSync(resolve(pbDir, 'config.json'), JSON.stringify({ siteUrl: 'https://partial.example.com' }));
|
|
103
|
+
const result = resolveConfig();
|
|
104
|
+
// No apiKey in project config, so it should fall through to default
|
|
105
|
+
expect(result.apiKey).toBeUndefined();
|
|
106
|
+
expect(result.source).toBe('default');
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe('getConfigSafe()', () => {
|
|
110
|
+
it('returns { ok: false } when no API key found', () => {
|
|
111
|
+
resetConfigCache();
|
|
112
|
+
const result = getConfigSafe();
|
|
113
|
+
expect(result.ok).toBe(false);
|
|
114
|
+
if (!result.ok) {
|
|
115
|
+
expect(result.reason).toContain('No API key');
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
it('returns { ok: true } with correct source when key exists in env', () => {
|
|
119
|
+
process.env.PRODUCTBRAIN_API_KEY = 'pb_sk_test_key';
|
|
120
|
+
process.env.CONVEX_SITE_URL = 'https://test.example.com';
|
|
121
|
+
resetConfigCache();
|
|
122
|
+
const result = getConfigSafe();
|
|
123
|
+
expect(result.ok).toBe(true);
|
|
124
|
+
if (result.ok) {
|
|
125
|
+
expect(result.apiKey).toBe('pb_sk_test_key');
|
|
126
|
+
expect(result.siteUrl).toBe('https://test.example.com');
|
|
127
|
+
expect(result.source).toBe('env');
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
it('returns { ok: true } with project source when key in config.json', () => {
|
|
131
|
+
const pbDir = resolve(tempDir, '.productbrain');
|
|
132
|
+
mkdirSync(pbDir, { recursive: true });
|
|
133
|
+
writeFileSync(resolve(pbDir, 'config.json'), JSON.stringify({ apiKey: 'pb_sk_proj_safe', siteUrl: 'https://proj.example.com' }));
|
|
134
|
+
resetConfigCache();
|
|
135
|
+
const result = getConfigSafe();
|
|
136
|
+
expect(result.ok).toBe(true);
|
|
137
|
+
if (result.ok) {
|
|
138
|
+
expect(result.apiKey).toBe('pb_sk_proj_safe');
|
|
139
|
+
expect(result.source).toBe('project');
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe('.productbrain/config.json error handling', () => {
|
|
144
|
+
it('warns but does not crash on invalid JSON', () => {
|
|
145
|
+
const pbDir = resolve(tempDir, '.productbrain');
|
|
146
|
+
mkdirSync(pbDir, { recursive: true });
|
|
147
|
+
writeFileSync(resolve(pbDir, 'config.json'), '{ invalid json!!!');
|
|
148
|
+
// Capture stderr
|
|
149
|
+
const stderrWrite = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
|
|
150
|
+
const result = resolveConfig();
|
|
151
|
+
// Should have warned
|
|
152
|
+
expect(stderrWrite).toHaveBeenCalledWith(expect.stringContaining('invalid JSON'));
|
|
153
|
+
// Should fall through to default
|
|
154
|
+
expect(result.apiKey).toBeUndefined();
|
|
155
|
+
expect(result.source).toBe('default');
|
|
156
|
+
stderrWrite.mockRestore();
|
|
157
|
+
});
|
|
158
|
+
it('skips gracefully when config.json is missing', () => {
|
|
159
|
+
// No .productbrain directory at all
|
|
160
|
+
const result = resolveConfig();
|
|
161
|
+
expect(result.apiKey).toBeUndefined();
|
|
162
|
+
expect(result.source).toBe('default');
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
//# sourceMappingURL=config.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"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"}
|