@productbrain/cli 0.1.0-beta.99 → 0.1.0-beta.997
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__/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.js +272 -2
- 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.js +29 -3
- package/dist/__tests__/envelope-contract.test.js.map +1 -1
- 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 +566 -4
- 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__/notice-marker.test.d.ts +2 -0
- package/dist/__tests__/notice-marker.test.d.ts.map +1 -0
- package/dist/__tests__/notice-marker.test.js +41 -0
- package/dist/__tests__/notice-marker.test.js.map +1 -0
- package/dist/__tests__/onboarding-path-b.test.js +4 -4
- package/dist/__tests__/onboarding-path-b.test.js.map +1 -1
- package/dist/__tests__/orient.test.js +184 -7
- 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 +106 -2
- package/dist/__tests__/profiles.test.js.map +1 -1
- package/dist/__tests__/promote.test.js +2 -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.js +16 -0
- package/dist/__tests__/setup-ingest.test.js.map +1 -1
- 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 +215 -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 +54 -0
- package/dist/__tests__/upgrade-runner.test.js.map +1 -0
- package/dist/__tests__/upgrade.test.d.ts +2 -0
- package/dist/__tests__/upgrade.test.d.ts.map +1 -0
- package/dist/__tests__/upgrade.test.js +56 -0
- package/dist/__tests__/upgrade.test.js.map +1 -0
- package/dist/__tests__/vocabulary-leak.test.d.ts +39 -0
- package/dist/__tests__/vocabulary-leak.test.d.ts.map +1 -0
- package/dist/__tests__/vocabulary-leak.test.js +534 -0
- package/dist/__tests__/vocabulary-leak.test.js.map +1 -0
- package/dist/__tests__/workspace.test.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 +7 -1
- package/dist/commands/authority-domains.d.ts.map +1 -1
- package/dist/commands/authority-domains.js +19 -4
- package/dist/commands/authority-domains.js.map +1 -1
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +5 -3
- 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 +13 -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 +19 -6
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +31 -56
- package/dist/commands/connect.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 +150 -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 +1538 -46
- package/dist/commands/handshake.js.map +1 -1
- package/dist/commands/method.d.ts.map +1 -1
- package/dist/commands/method.js +5 -1
- package/dist/commands/method.js.map +1 -1
- package/dist/commands/orient.d.ts +63 -2
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +106 -4
- package/dist/commands/orient.js.map +1 -1
- package/dist/commands/profile.d.ts +1 -14
- package/dist/commands/profile.d.ts.map +1 -1
- package/dist/commands/profile.js +89 -72
- package/dist/commands/profile.js.map +1 -1
- package/dist/commands/reject.d.ts.map +1 -1
- package/dist/commands/reject.js +2 -1
- package/dist/commands/reject.js.map +1 -1
- package/dist/commands/relate.d.ts.map +1 -1
- package/dist/commands/relate.js +4 -2
- package/dist/commands/relate.js.map +1 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +50 -13
- 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.map +1 -1
- package/dist/commands/setup-ingest.js +4 -2
- package/dist/commands/setup-ingest.js.map +1 -1
- 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/update.d.ts.map +1 -1
- package/dist/commands/update.js +2 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/commands/upgrade.d.ts +5 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +110 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +2 -1
- package/dist/commands/verify.js.map +1 -1
- 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 +23 -2
- package/dist/commands/workspace.d.ts.map +1 -1
- package/dist/commands/workspace.js +2 -2
- package/dist/commands/workspace.js.map +1 -1
- package/dist/formatters/__tests__/orient-provenance.test.d.ts +7 -0
- package/dist/formatters/__tests__/orient-provenance.test.d.ts.map +1 -0
- package/dist/formatters/__tests__/orient-provenance.test.js +454 -0
- package/dist/formatters/__tests__/orient-provenance.test.js.map +1 -0
- package/dist/formatters/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/entry.d.ts +21 -0
- package/dist/formatters/entry.d.ts.map +1 -1
- package/dist/formatters/entry.js +46 -5
- package/dist/formatters/entry.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 +79 -4
- package/dist/formatters/orient.d.ts.map +1 -1
- package/dist/formatters/orient.js +119 -18
- package/dist/formatters/orient.js.map +1 -1
- package/dist/generators/context-md.js +6 -6
- package/dist/generators/context-md.js.map +1 -1
- package/dist/generators/manifest.d.ts +76 -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 +134 -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 +72 -0
- package/dist/lib/canonicalRefs.d.ts.map +1 -1
- package/dist/lib/canonicalRefs.js +67 -0
- package/dist/lib/canonicalRefs.js.map +1 -1
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +13 -3
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/config.d.ts +70 -4
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +151 -11
- package/dist/lib/config.js.map +1 -1
- 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 +1 -0
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +1 -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/notice-marker.d.ts +3 -0
- package/dist/lib/notice-marker.d.ts.map +1 -0
- package/dist/lib/notice-marker.js +53 -0
- package/dist/lib/notice-marker.js.map +1 -0
- package/dist/lib/onboarding-path-b.d.ts.map +1 -1
- package/dist/lib/onboarding-path-b.js +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 +42 -7
- package/dist/lib/update-check.d.ts.map +1 -1
- package/dist/lib/update-check.js +213 -62
- package/dist/lib/update-check.js.map +1 -1
- package/dist/lib/upgrade-runner.d.ts +22 -0
- package/dist/lib/upgrade-runner.d.ts.map +1 -0
- package/dist/lib/upgrade-runner.js +110 -0
- package/dist/lib/upgrade-runner.js.map +1 -0
- package/dist/lib/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,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pb-setup canonical skill — SurfaceAdapter passthrough goldens (WP-431 S4).
|
|
3
|
+
*
|
|
4
|
+
* doneWhen #1: the canonical .productbrain/skills/pb-setup.md projects through
|
|
5
|
+
* each adapter's `transform` such that the body content is preserved verbatim
|
|
6
|
+
* (no surface-specific rewriting of the body). Per DEC-997, the skill body is
|
|
7
|
+
* the universal SSOT and uses the in-body surface-routing block to drive both
|
|
8
|
+
* CLI and chat-only flows; the adapter's job is wrapping (frontmatter,
|
|
9
|
+
* marker), not rewriting the body itself.
|
|
10
|
+
*
|
|
11
|
+
* Parity assertions per adapter:
|
|
12
|
+
* - claude: body emitted verbatim (no wrapping). Path matches `.claude/skills/pb-setup.md`.
|
|
13
|
+
* - cursor: body preserved inside a Cursor SKILL.md wrapper. Path matches
|
|
14
|
+
* `.cursor/skills/pb-setup/SKILL.md`. Triggers appear in the
|
|
15
|
+
* wrapper's description.
|
|
16
|
+
* - codex: body preserved inside a Codex skill projection wrapper. Path
|
|
17
|
+
* matches `.codex/skills/pb-setup.md`. Triggers appear in the
|
|
18
|
+
* wrapper.
|
|
19
|
+
* - copilot: skills not projected (skillsFormat: 'none'). Transform returns
|
|
20
|
+
* empty string for skill kind (matches handshake.ts behavior).
|
|
21
|
+
*
|
|
22
|
+
* The test reads the canonical file from disk so a content drift in the
|
|
23
|
+
* source markdown surfaces here.
|
|
24
|
+
*/
|
|
25
|
+
import { describe, expect, it } from 'vitest';
|
|
26
|
+
import { readFileSync, existsSync } from 'fs';
|
|
27
|
+
import { join } from 'path';
|
|
28
|
+
import { fileURLToPath } from 'url';
|
|
29
|
+
import { dirname } from 'path';
|
|
30
|
+
import { claudeAdapter } from '../adapters/claude.js';
|
|
31
|
+
import { cursorAdapter } from '../adapters/cursor.js';
|
|
32
|
+
import { codexAdapter } from '../adapters/codex.js';
|
|
33
|
+
import { copilotAdapter } from '../adapters/copilot.js';
|
|
34
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
35
|
+
// repo root: packages/cli/src/surfaces/__tests__ -> ../../../../..
|
|
36
|
+
const REPO_ROOT = join(__dirname, '..', '..', '..', '..', '..');
|
|
37
|
+
const CANONICAL_PATH = join(REPO_ROOT, '.productbrain', 'skills', 'pb-setup.md');
|
|
38
|
+
/**
|
|
39
|
+
* Minimal frontmatter parser tuned to the pb-setup skill shape. We avoid
|
|
40
|
+
* importing the production parser to keep this test independent of internal
|
|
41
|
+
* helper drift (the goldens are about the `transform` contract, not the
|
|
42
|
+
* parser).
|
|
43
|
+
*/
|
|
44
|
+
function loadCanonicalPbSetup() {
|
|
45
|
+
if (!existsSync(CANONICAL_PATH)) {
|
|
46
|
+
throw new Error(`Canonical pb-setup.md not found at ${CANONICAL_PATH}`);
|
|
47
|
+
}
|
|
48
|
+
const raw = readFileSync(CANONICAL_PATH, 'utf8');
|
|
49
|
+
const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
|
|
50
|
+
if (!match)
|
|
51
|
+
throw new Error('pb-setup.md missing frontmatter');
|
|
52
|
+
const yaml = match[1];
|
|
53
|
+
const body = match[2];
|
|
54
|
+
const nameMatch = yaml.match(/^name:\s*(.+)$/m);
|
|
55
|
+
const descMatch = yaml.match(/description:\s*>-\s*\n((?:\s+.+\n?)+?)(?=^\w|^---|\Z)/m);
|
|
56
|
+
const triggers = [];
|
|
57
|
+
const trigBlock = yaml.match(/^triggers:\s*\n((?:\s+-\s.+\n?)+)/m);
|
|
58
|
+
if (trigBlock) {
|
|
59
|
+
for (const line of trigBlock[1].split('\n')) {
|
|
60
|
+
const m = line.match(/^\s+-\s+(.+)$/);
|
|
61
|
+
if (m)
|
|
62
|
+
triggers.push(m[1].trim().replace(/^["']|["']$/g, ''));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
name: (nameMatch?.[1] ?? 'pb-setup').trim(),
|
|
67
|
+
description: descMatch
|
|
68
|
+
? descMatch[1].split('\n').map((l) => l.trim()).filter(Boolean).join(' ')
|
|
69
|
+
: '',
|
|
70
|
+
triggers,
|
|
71
|
+
body,
|
|
72
|
+
sourcePath: CANONICAL_PATH,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
describe('pb-setup canonical skill — SurfaceAdapter passthrough', () => {
|
|
76
|
+
const canonical = loadCanonicalPbSetup();
|
|
77
|
+
it('canonical file exists with expected name and triggers', () => {
|
|
78
|
+
expect(canonical.name).toBe('pb-setup');
|
|
79
|
+
expect(canonical.triggers).toContain('pb setup');
|
|
80
|
+
expect(canonical.body.length).toBeGreaterThan(500);
|
|
81
|
+
});
|
|
82
|
+
it('claude adapter: body verbatim, path .claude/skills/pb-setup.md', () => {
|
|
83
|
+
const out = claudeAdapter.transform({ canonical: { kind: 'skill', ...canonical } });
|
|
84
|
+
expect(out).toBe(canonical.body);
|
|
85
|
+
const path = claudeAdapter.paths({ kind: 'skill', basename: canonical.name }).projectionPath;
|
|
86
|
+
expect(path).toBe('.claude/skills/pb-setup.md');
|
|
87
|
+
});
|
|
88
|
+
it('cursor adapter: body content preserved inside wrapper, triggers injected, path .cursor/skills/pb-setup/SKILL.md', () => {
|
|
89
|
+
const out = cursorAdapter.transform({ canonical: { kind: 'skill', ...canonical } });
|
|
90
|
+
// Body content must appear verbatim (the cursor regex does not match
|
|
91
|
+
// `.productbrain/{skills,rules,hooks}/...md` — the body has no
|
|
92
|
+
// `.productbrain/skills/<name>.md` literal references that would be
|
|
93
|
+
// rewritten, so passthrough holds).
|
|
94
|
+
expect(out).toContain(canonical.body);
|
|
95
|
+
// Cursor wraps with its own frontmatter + marker comment.
|
|
96
|
+
expect(out.startsWith('---\nname: pb-setup')).toBe(true);
|
|
97
|
+
expect(out).toContain('source: .productbrain/skills/pb-setup.md');
|
|
98
|
+
// Triggers travel into the description per Cursor's convention.
|
|
99
|
+
expect(out).toContain('"pb setup"');
|
|
100
|
+
const path = cursorAdapter.paths({ kind: 'skill', basename: canonical.name }).projectionPath;
|
|
101
|
+
expect(path).toBe('.cursor/skills/pb-setup/SKILL.md');
|
|
102
|
+
});
|
|
103
|
+
it('codex adapter: body content preserved inside wrapper, triggers attached, path .codex/skills/pb-setup.md', () => {
|
|
104
|
+
const out = codexAdapter.transform({ canonical: { kind: 'skill', ...canonical } });
|
|
105
|
+
expect(out).toContain(canonical.body);
|
|
106
|
+
expect(out).toContain('source: .productbrain/skills/pb-setup.md');
|
|
107
|
+
// Codex wraps with a `# <name>` heading, description, and a Triggers line.
|
|
108
|
+
expect(out).toContain('# pb-setup');
|
|
109
|
+
expect(out).toContain('**Triggers:**');
|
|
110
|
+
expect(out).toContain('`pb setup`');
|
|
111
|
+
const path = codexAdapter.paths({ kind: 'skill', basename: canonical.name }).projectionPath;
|
|
112
|
+
expect(path).toBe('.codex/skills/pb-setup.md');
|
|
113
|
+
});
|
|
114
|
+
it('copilot adapter: skills not projected (skillsFormat: none), transform returns empty', () => {
|
|
115
|
+
const out = copilotAdapter.transform({ canonical: { kind: 'skill', ...canonical } });
|
|
116
|
+
expect(out).toBe('');
|
|
117
|
+
// Copilot's only target file is the aggregate copilot-instructions.md.
|
|
118
|
+
const path = copilotAdapter.paths({ kind: 'skill', basename: canonical.name }).projectionPath;
|
|
119
|
+
expect(path).toBe('.github/copilot-instructions.md');
|
|
120
|
+
});
|
|
121
|
+
it('canonical body is free of `.productbrain/{skills,rules}/<name>.md` literal refs that would trigger surface path rewrites', () => {
|
|
122
|
+
// Per DEC-997, the canonical skill body should not depend on adapter path
|
|
123
|
+
// rewriting — the in-body surface-routing block carries all surface logic.
|
|
124
|
+
// Guard: if a future edit adds such a literal reference, this test catches
|
|
125
|
+
// it BEFORE the cursor/codex transform mangles it through the regex.
|
|
126
|
+
const skillsRefs = canonical.body.match(/\.productbrain\/skills\/[\w.-]+\.md/g) ?? [];
|
|
127
|
+
const rulesRefs = canonical.body.match(/\.productbrain\/rules\/[\w.-]+\.md/g) ?? [];
|
|
128
|
+
expect(skillsRefs).toEqual([]);
|
|
129
|
+
expect(rulesRefs).toEqual([]);
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
//# sourceMappingURL=pb-setup-passthrough.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pb-setup-passthrough.test.js","sourceRoot":"","sources":["../../../src/surfaces/__tests__/pb-setup-passthrough.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.test.d.ts","sourceRoot":"","sources":["../../../src/surfaces/__tests__/telemetry.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reverse-map telemetry fallback — WP-421 S2c.
|
|
3
|
+
* When canonicalPathFor returns null on a known surface, the consumer must
|
|
4
|
+
* emit `surface-reverse-map-missing` telemetry and surface the generic upstream
|
|
5
|
+
* message ("edit upstream in .productbrain/skills|rules|hooks/").
|
|
6
|
+
*/
|
|
7
|
+
import { describe, expect, it, vi, beforeEach } from 'vitest';
|
|
8
|
+
const trackEventMock = vi.fn();
|
|
9
|
+
vi.mock('../../lib/telemetry.js', () => ({
|
|
10
|
+
trackEvent: (...args) => trackEventMock(...args),
|
|
11
|
+
}));
|
|
12
|
+
import { reportReverseMapMissing, getReverseMapFallbackMessage, } from '../telemetry.js';
|
|
13
|
+
import { canonicalPathForAnySurface } from '../registry.js';
|
|
14
|
+
describe('reportReverseMapMissing', () => {
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
trackEventMock.mockClear();
|
|
17
|
+
});
|
|
18
|
+
it('emits surface-reverse-map-missing with surface + projectionPath', () => {
|
|
19
|
+
const warnings = [];
|
|
20
|
+
reportReverseMapMissing({ surface: 'copilot', projectionPath: '.github/copilot-instructions.md' }, (msg) => warnings.push(msg));
|
|
21
|
+
expect(trackEventMock).toHaveBeenCalledWith('surface-reverse-map-missing', {
|
|
22
|
+
surface: 'copilot',
|
|
23
|
+
projectionPath: '.github/copilot-instructions.md',
|
|
24
|
+
});
|
|
25
|
+
expect(warnings).toHaveLength(1);
|
|
26
|
+
expect(warnings[0]).toContain('[surface-reverse-map-missing]');
|
|
27
|
+
expect(warnings[0]).toContain('copilot');
|
|
28
|
+
expect(warnings[0]).toContain(getReverseMapFallbackMessage());
|
|
29
|
+
});
|
|
30
|
+
it('exposes the canonical fallback message', () => {
|
|
31
|
+
expect(getReverseMapFallbackMessage()).toContain('.productbrain/skills');
|
|
32
|
+
expect(getReverseMapFallbackMessage()).toContain('rules');
|
|
33
|
+
expect(getReverseMapFallbackMessage()).toContain('hooks');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('canonicalPathForAnySurface', () => {
|
|
37
|
+
it('returns the first matching adapter for a known projection path', () => {
|
|
38
|
+
const cursorMatch = canonicalPathForAnySurface('.cursor/rules/foo.mdc');
|
|
39
|
+
expect(cursorMatch).toEqual({
|
|
40
|
+
surface: 'cursor',
|
|
41
|
+
canonicalPath: '.productbrain/rules/foo.md',
|
|
42
|
+
});
|
|
43
|
+
const claudeMatch = canonicalPathForAnySurface('.claude/skills/orient.md');
|
|
44
|
+
expect(claudeMatch).toEqual({
|
|
45
|
+
surface: 'claude',
|
|
46
|
+
canonicalPath: '.productbrain/skills/orient.md',
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
it('returns null for an unknown projection path (caller emits telemetry)', () => {
|
|
50
|
+
expect(canonicalPathForAnySurface('some/unknown/path.txt')).toBeNull();
|
|
51
|
+
// Copilot's aggregate file legitimately has no reverse map → null.
|
|
52
|
+
expect(canonicalPathForAnySurface('.github/copilot-instructions.md')).toBeNull();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
//# sourceMappingURL=telemetry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../../../src/surfaces/__tests__/telemetry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SurfaceAdapter — WP-421 S2c (DEC-952).
|
|
3
|
+
*
|
|
4
|
+
* One canonical asset in `.productbrain/{skills,rules,hooks}/`; per-surface adapters
|
|
5
|
+
* detect/paths/transform/goldens. New surface = adapter file + registry line.
|
|
6
|
+
*
|
|
7
|
+
* canonicalPathFor is the REVERSE map: given a projection path on a surface
|
|
8
|
+
* (e.g. `.cursor/rules/foo.mdc`), return the canonical authoring path
|
|
9
|
+
* (e.g. `.productbrain/rules/foo.md`). Returns null when the path does not
|
|
10
|
+
* belong to this adapter — callers should use the telemetry fallback in
|
|
11
|
+
* `surfaces/telemetry.ts` to emit `surface-reverse-map-missing`.
|
|
12
|
+
*/
|
|
13
|
+
import type { CanonicalRule, CanonicalSkill } from '../generators/portable-knowledge.js';
|
|
14
|
+
/** Discriminated union covering canonical asset bodies the adapters consume. */
|
|
15
|
+
export type CanonicalAssetBody = ({
|
|
16
|
+
kind: 'skill';
|
|
17
|
+
} & CanonicalSkill) | ({
|
|
18
|
+
kind: 'rule';
|
|
19
|
+
} & CanonicalRule);
|
|
20
|
+
/** Optional Chain grounding context the transform may consult when shaping output. */
|
|
21
|
+
export interface ChainGroundingContext {
|
|
22
|
+
workspaceStage?: string;
|
|
23
|
+
totalRelations?: number;
|
|
24
|
+
detectedStack?: string[];
|
|
25
|
+
/** Free-form context bag for future grounding signals — adapters MUST tolerate unknown keys. */
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
}
|
|
28
|
+
export interface SurfaceAssetRef {
|
|
29
|
+
kind: 'skill' | 'rule' | 'hook';
|
|
30
|
+
basename: string;
|
|
31
|
+
}
|
|
32
|
+
export interface SurfacePaths {
|
|
33
|
+
/** Path relative to repoRoot where the projection is written. */
|
|
34
|
+
projectionPath: string;
|
|
35
|
+
}
|
|
36
|
+
export interface SurfaceAdapter {
|
|
37
|
+
/** Stable machine identity (matches SurfaceName in registry.ts). */
|
|
38
|
+
name: string;
|
|
39
|
+
/** Human-friendly display label. */
|
|
40
|
+
displayName: string;
|
|
41
|
+
/**
|
|
42
|
+
* Does this surface exist in the project? Used to decide whether to project at all.
|
|
43
|
+
* Pure: only inspects repoRoot — no network, no Chain calls.
|
|
44
|
+
*/
|
|
45
|
+
detect(repoRoot: string): Promise<boolean> | boolean;
|
|
46
|
+
/** Where the projection is written for a given canonical asset. */
|
|
47
|
+
paths(asset: SurfaceAssetRef): SurfacePaths;
|
|
48
|
+
/** Take a canonical asset (+ optional grounding) and produce surface-formatted content. */
|
|
49
|
+
transform(input: {
|
|
50
|
+
canonical: CanonicalAssetBody;
|
|
51
|
+
grounding?: ChainGroundingContext;
|
|
52
|
+
}): string;
|
|
53
|
+
/**
|
|
54
|
+
* Round-trip golden fixtures: pinned (canonical, expected) pairs.
|
|
55
|
+
* Each adapter MUST define at least one. Tests assert transform(canonical) === expected.
|
|
56
|
+
*/
|
|
57
|
+
goldens: SurfaceGolden[];
|
|
58
|
+
/**
|
|
59
|
+
* REVERSE map from a projection path back to the canonical authoring path
|
|
60
|
+
* in `.productbrain/`. Used by tampered-bucket prompts to point users at the
|
|
61
|
+
* upstream source. Returns null when the path is unknown to this adapter.
|
|
62
|
+
*/
|
|
63
|
+
canonicalPathFor(projectionPath: string): string | null;
|
|
64
|
+
}
|
|
65
|
+
export interface SurfaceGolden {
|
|
66
|
+
name: string;
|
|
67
|
+
canonical: CanonicalAssetBody;
|
|
68
|
+
expected: string;
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/surfaces/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAEzF,gFAAgF;AAChF,MAAM,MAAM,kBAAkB,GAC1B,CAAC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG,cAAc,CAAC,GACpC,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,aAAa,CAAC,CAAC;AAEvC,sFAAsF;AACtF,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,gGAAgG;IAChG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,iEAAiE;IACjE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAErD,mEAAmE;IACnE,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,CAAC;IAE5C,2FAA2F;IAC3F,SAAS,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,kBAAkB,CAAC;QAAC,SAAS,CAAC,EAAE,qBAAqB,CAAA;KAAE,GAAG,MAAM,CAAC;IAE/F;;;OAGG;IACH,OAAO,EAAE,aAAa,EAAE,CAAC;IAEzB;;;;OAIG;IACH,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACzD;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,kBAAkB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/surfaces/adapter.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../src/surfaces/adapters/claude.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAGV,cAAc,EAIf,MAAM,eAAe,CAAC;AAoDvB,eAAO,MAAM,aAAa,EAAE,cAQ3B,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code SurfaceAdapter — WP-421 S2c (DEC-952).
|
|
3
|
+
*
|
|
4
|
+
* Projects:
|
|
5
|
+
* - rules → .claude/rules/<name>.md
|
|
6
|
+
* - skills → .claude/skills/<name>.md (legacy skill projection; canonical lives in .productbrain/skills/)
|
|
7
|
+
* - hooks → .claude/settings.json (handled outside the per-asset transform path)
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { generateClaudeRule, } from '../../generators/portable-knowledge.js';
|
|
12
|
+
function transform(input) {
|
|
13
|
+
const { canonical } = input;
|
|
14
|
+
if (canonical.kind === 'rule') {
|
|
15
|
+
return generateClaudeRule(canonical);
|
|
16
|
+
}
|
|
17
|
+
// Skills: claude rules-router has a separate generator; per-skill projection
|
|
18
|
+
// re-emits the canonical body verbatim under .claude/skills/. Keep this in
|
|
19
|
+
// sync with handshake.ts which currently writes canonical body untouched.
|
|
20
|
+
return canonical.body;
|
|
21
|
+
}
|
|
22
|
+
function paths(asset) {
|
|
23
|
+
switch (asset.kind) {
|
|
24
|
+
case 'rule':
|
|
25
|
+
return { projectionPath: `.claude/rules/${asset.basename}.md` };
|
|
26
|
+
case 'skill':
|
|
27
|
+
return { projectionPath: `.claude/skills/${asset.basename}.md` };
|
|
28
|
+
case 'hook':
|
|
29
|
+
return { projectionPath: '.claude/settings.json' };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const goldenRule = {
|
|
33
|
+
name: 'sample-rule',
|
|
34
|
+
description: 'Sample rule for golden test',
|
|
35
|
+
scope: undefined,
|
|
36
|
+
autoApply: true,
|
|
37
|
+
body: 'Body referencing .productbrain/rules/other.md and .productbrain/skills/x.md\n',
|
|
38
|
+
sourcePath: '/abs/.productbrain/rules/sample-rule.md',
|
|
39
|
+
};
|
|
40
|
+
const goldens = [
|
|
41
|
+
{
|
|
42
|
+
name: 'rule-with-canonical-path-rewrite',
|
|
43
|
+
canonical: { kind: 'rule', ...goldenRule },
|
|
44
|
+
expected: generateClaudeRule(goldenRule),
|
|
45
|
+
},
|
|
46
|
+
];
|
|
47
|
+
function canonicalPathFor(projectionPath) {
|
|
48
|
+
// Normalize: accept paths with or without leading "./".
|
|
49
|
+
const p = projectionPath.replace(/^\.\//, '');
|
|
50
|
+
let m = p.match(/^\.claude\/rules\/(.+)\.md$/);
|
|
51
|
+
if (m)
|
|
52
|
+
return `.productbrain/rules/${m[1]}.md`;
|
|
53
|
+
m = p.match(/^\.claude\/skills\/(.+)\.md$/);
|
|
54
|
+
if (m)
|
|
55
|
+
return `.productbrain/skills/${m[1]}.md`;
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
export const claudeAdapter = {
|
|
59
|
+
name: 'claude',
|
|
60
|
+
displayName: 'Claude Code',
|
|
61
|
+
detect: (repoRoot) => existsSync(join(repoRoot, '.claude')),
|
|
62
|
+
paths,
|
|
63
|
+
transform,
|
|
64
|
+
goldens,
|
|
65
|
+
canonicalPathFor,
|
|
66
|
+
};
|
|
67
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/surfaces/adapters/claude.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,kBAAkB,GACnB,MAAM,wCAAwC,CAAC;AAYhD,SAAS,SAAS,CAAC,KAA2E;IAC5F,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IACD,6EAA6E;IAC7E,2EAA2E;IAC3E,0EAA0E;IAC1E,OAAO,SAAS,CAAC,IAAI,CAAC;AACxB,CAAC;AAED,SAAS,KAAK,CAAC,KAAsB;IACnC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,EAAE,cAAc,EAAE,iBAAiB,KAAK,CAAC,QAAQ,KAAK,EAAE,CAAC;QAClE,KAAK,OAAO;YACV,OAAO,EAAE,cAAc,EAAE,kBAAkB,KAAK,CAAC,QAAQ,KAAK,EAAE,CAAC;QACnE,KAAK,MAAM;YACT,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,CAAC;IACvD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAkB;IAChC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,6BAA6B;IAC1C,KAAK,EAAE,SAAS;IAChB,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,+EAA+E;IACrF,UAAU,EAAE,yCAAyC;CACtD,CAAC;AAEF,MAAM,OAAO,GAAoB;IAC/B;QACE,IAAI,EAAE,kCAAkC;QACxC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE;QAC1C,QAAQ,EAAE,kBAAkB,CAAC,UAAU,CAAC;KACzC;CACF,CAAC;AAEF,SAAS,gBAAgB,CAAC,cAAsB;IAC9C,wDAAwD;IACxD,MAAM,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC/C,IAAI,CAAC;QAAE,OAAO,uBAAuB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC5C,IAAI,CAAC;QAAE,OAAO,wBAAwB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAChD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,aAAa;IAC1B,MAAM,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACnE,KAAK;IACL,SAAS;IACT,OAAO;IACP,gBAAgB;CACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/surfaces/adapters/codex.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAGV,cAAc,EAIf,MAAM,eAAe,CAAC;AA8CvB,eAAO,MAAM,YAAY,EAAE,cAS1B,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex SurfaceAdapter — WP-421 S2c (DEC-952).
|
|
3
|
+
*
|
|
4
|
+
* Projects:
|
|
5
|
+
* - skills → .codex/skills/<name>.md
|
|
6
|
+
* - rules: not projected (codex consumes AGENTS.md instead).
|
|
7
|
+
* - hooks → AGENTS.md (handled outside per-asset transform path).
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { generateCodexSkill } from '../../generators/portable-knowledge.js';
|
|
12
|
+
function transform(input) {
|
|
13
|
+
const { canonical } = input;
|
|
14
|
+
if (canonical.kind === 'skill')
|
|
15
|
+
return generateCodexSkill(canonical);
|
|
16
|
+
// Rules are not projected to codex; pass body through unchanged for completeness.
|
|
17
|
+
return canonical.body;
|
|
18
|
+
}
|
|
19
|
+
function paths(asset) {
|
|
20
|
+
switch (asset.kind) {
|
|
21
|
+
case 'skill':
|
|
22
|
+
return { projectionPath: `.codex/skills/${asset.basename}.md` };
|
|
23
|
+
case 'rule':
|
|
24
|
+
// Codex has no per-rule projection target — return AGENTS.md for callers
|
|
25
|
+
// that need a path; handshake won't actually write rules here.
|
|
26
|
+
return { projectionPath: 'AGENTS.md' };
|
|
27
|
+
case 'hook':
|
|
28
|
+
return { projectionPath: 'AGENTS.md' };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const goldenSkill = {
|
|
32
|
+
name: 'sample-skill',
|
|
33
|
+
description: 'Sample skill for golden test',
|
|
34
|
+
triggers: ['/sample'],
|
|
35
|
+
body: 'Reference .productbrain/skills/other.md inside the body.\n',
|
|
36
|
+
sourcePath: '/abs/.productbrain/skills/sample-skill.md',
|
|
37
|
+
};
|
|
38
|
+
const goldens = [
|
|
39
|
+
{
|
|
40
|
+
name: 'skill-with-canonical-path-rewrite',
|
|
41
|
+
canonical: { kind: 'skill', ...goldenSkill },
|
|
42
|
+
expected: generateCodexSkill(goldenSkill),
|
|
43
|
+
},
|
|
44
|
+
];
|
|
45
|
+
function canonicalPathFor(projectionPath) {
|
|
46
|
+
const p = projectionPath.replace(/^\.\//, '');
|
|
47
|
+
const m = p.match(/^\.codex\/skills\/(.+)\.md$/);
|
|
48
|
+
if (m)
|
|
49
|
+
return `.productbrain/skills/${m[1]}.md`;
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
export const codexAdapter = {
|
|
53
|
+
name: 'codex',
|
|
54
|
+
displayName: 'Codex',
|
|
55
|
+
detect: (repoRoot) => existsSync(join(repoRoot, '.codex')) || existsSync(join(repoRoot, 'AGENTS.md')),
|
|
56
|
+
paths,
|
|
57
|
+
transform,
|
|
58
|
+
goldens,
|
|
59
|
+
canonicalPathFor,
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/surfaces/adapters/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,wCAAwC,CAAC;AAW5E,SAAS,SAAS,CAAC,KAA2E;IAC5F,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACrE,kFAAkF;IAClF,OAAO,SAAS,CAAC,IAAI,CAAC;AACxB,CAAC;AAED,SAAS,KAAK,CAAC,KAAsB;IACnC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,EAAE,cAAc,EAAE,iBAAiB,KAAK,CAAC,QAAQ,KAAK,EAAE,CAAC;QAClE,KAAK,MAAM;YACT,yEAAyE;YACzE,+DAA+D;YAC/D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;QACzC,KAAK,MAAM;YACT,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,MAAM,WAAW,GAAmB;IAClC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,8BAA8B;IAC3C,QAAQ,EAAE,CAAC,SAAS,CAAC;IACrB,IAAI,EAAE,4DAA4D;IAClE,UAAU,EAAE,2CAA2C;CACxD,CAAC;AAEF,MAAM,OAAO,GAAoB;IAC/B;QACE,IAAI,EAAE,mCAAmC;QACzC,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE;QAC5C,QAAQ,EAAE,kBAAkB,CAAC,WAAW,CAAC;KAC1C;CACF,CAAC;AAEF,SAAS,gBAAgB,CAAC,cAAsB;IAC9C,MAAM,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,IAAI,CAAC;QAAE,OAAO,wBAAwB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAChD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,OAAO;IACpB,MAAM,EAAE,CAAC,QAAgB,EAAE,EAAE,CAC3B,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACjF,KAAK;IACL,SAAS;IACT,OAAO;IACP,gBAAgB;CACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../../src/surfaces/adapters/copilot.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAGV,cAAc,EAIf,MAAM,eAAe,CAAC;AA2CvB,eAAO,MAAM,cAAc,EAAE,cAS5B,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copilot SurfaceAdapter — WP-421 S2c (DEC-952).
|
|
3
|
+
*
|
|
4
|
+
* Copilot has only one projection target — `.github/copilot-instructions.md` — which
|
|
5
|
+
* concatenates rule summaries. Per-skill projection is unsupported.
|
|
6
|
+
*
|
|
7
|
+
* canonicalPathFor returns null for the aggregate file: there is no 1:1 reverse map
|
|
8
|
+
* (the file is generated from many sources). Consumers fall back to the generic
|
|
9
|
+
* "edit upstream in .productbrain/{skills,rules,hooks}/" message and emit
|
|
10
|
+
* `surface-reverse-map-missing` telemetry — see surfaces/telemetry.ts.
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync } from 'fs';
|
|
13
|
+
import { join } from 'path';
|
|
14
|
+
function transform(input) {
|
|
15
|
+
// Copilot aggregates rule summaries inside copilot-instructions.md; the
|
|
16
|
+
// single-asset transform emits the rule's summary block. Skills are not
|
|
17
|
+
// included (matches handshake.ts behavior).
|
|
18
|
+
const { canonical } = input;
|
|
19
|
+
if (canonical.kind === 'rule') {
|
|
20
|
+
return `### ${canonical.name}\n${canonical.description}\n`;
|
|
21
|
+
}
|
|
22
|
+
return '';
|
|
23
|
+
}
|
|
24
|
+
function paths(_asset) {
|
|
25
|
+
return { projectionPath: '.github/copilot-instructions.md' };
|
|
26
|
+
}
|
|
27
|
+
const goldenRule = {
|
|
28
|
+
name: 'sample-rule',
|
|
29
|
+
description: 'Sample rule for golden test',
|
|
30
|
+
scope: undefined,
|
|
31
|
+
autoApply: true,
|
|
32
|
+
body: 'unused for copilot summary',
|
|
33
|
+
sourcePath: '/abs/.productbrain/rules/sample-rule.md',
|
|
34
|
+
};
|
|
35
|
+
const goldens = [
|
|
36
|
+
{
|
|
37
|
+
name: 'rule-summary-block',
|
|
38
|
+
canonical: { kind: 'rule', ...goldenRule },
|
|
39
|
+
expected: `### ${goldenRule.name}\n${goldenRule.description}\n`,
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
function canonicalPathFor(projectionPath) {
|
|
43
|
+
// Copilot's only target file aggregates many canonical sources — no defensible
|
|
44
|
+
// 1:1 reverse map. Return null and let consumers emit the telemetry fallback.
|
|
45
|
+
const p = projectionPath.replace(/^\.\//, '');
|
|
46
|
+
if (p === '.github/copilot-instructions.md')
|
|
47
|
+
return null;
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
export const copilotAdapter = {
|
|
51
|
+
name: 'copilot',
|
|
52
|
+
displayName: 'GitHub Copilot',
|
|
53
|
+
detect: (repoRoot) => existsSync(join(repoRoot, '.github', 'copilot-instructions.md')),
|
|
54
|
+
paths,
|
|
55
|
+
transform,
|
|
56
|
+
goldens,
|
|
57
|
+
canonicalPathFor,
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=copilot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../src/surfaces/adapters/copilot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAW5B,SAAS,SAAS,CAAC,KAA2E;IAC5F,wEAAwE;IACxE,wEAAwE;IACxE,4CAA4C;IAC5C,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC9B,OAAO,OAAO,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,WAAW,IAAI,CAAC;IAC7D,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,KAAK,CAAC,MAAuB;IACpC,OAAO,EAAE,cAAc,EAAE,iCAAiC,EAAE,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,GAAkB;IAChC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,6BAA6B;IAC1C,KAAK,EAAE,SAAS;IAChB,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,4BAA4B;IAClC,UAAU,EAAE,yCAAyC;CACtD,CAAC;AAEF,MAAM,OAAO,GAAoB;IAC/B;QACE,IAAI,EAAE,oBAAoB;QAC1B,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE;QAC1C,QAAQ,EAAE,OAAO,UAAU,CAAC,IAAI,KAAK,UAAU,CAAC,WAAW,IAAI;KAChE;CACF,CAAC;AAEF,SAAS,gBAAgB,CAAC,cAAsB;IAC9C,+EAA+E;IAC/E,8EAA8E;IAC9E,MAAM,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,KAAK,iCAAiC;QAAE,OAAO,IAAI,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,gBAAgB;IAC7B,MAAM,EAAE,CAAC,QAAgB,EAAE,EAAE,CAC3B,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,yBAAyB,CAAC,CAAC;IAClE,KAAK;IACL,SAAS;IACT,OAAO;IACP,gBAAgB;CACjB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/surfaces/adapters/cursor.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAGV,cAAc,EAIf,MAAM,eAAe,CAAC;AA+DvB,eAAO,MAAM,aAAa,EAAE,cAQ3B,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor SurfaceAdapter — WP-421 S2c (DEC-952).
|
|
3
|
+
*
|
|
4
|
+
* Projects:
|
|
5
|
+
* - rules → .cursor/rules/<name>.mdc (note the .md → .mdc extension flip)
|
|
6
|
+
* - skills → .cursor/skills/<name>/SKILL.md
|
|
7
|
+
* - hooks: not supported (INS-740 — empty hookEvents)
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { generateCursorRule, generateCursorSkill, } from '../../generators/portable-knowledge.js';
|
|
12
|
+
function transform(input) {
|
|
13
|
+
const { canonical } = input;
|
|
14
|
+
if (canonical.kind === 'rule')
|
|
15
|
+
return generateCursorRule(canonical);
|
|
16
|
+
return generateCursorSkill(canonical);
|
|
17
|
+
}
|
|
18
|
+
function paths(asset) {
|
|
19
|
+
switch (asset.kind) {
|
|
20
|
+
case 'rule':
|
|
21
|
+
// .md → .mdc extension flip is the cursor-specific signature.
|
|
22
|
+
return { projectionPath: `.cursor/rules/${asset.basename}.mdc` };
|
|
23
|
+
case 'skill':
|
|
24
|
+
return { projectionPath: `.cursor/skills/${asset.basename}/SKILL.md` };
|
|
25
|
+
case 'hook':
|
|
26
|
+
// INS-740: cursor has no native hook events. Path returned for completeness;
|
|
27
|
+
// handshake never writes here by default.
|
|
28
|
+
return { projectionPath: '.cursor/settings.json' };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const goldenRule = {
|
|
32
|
+
name: 'sample-rule',
|
|
33
|
+
description: 'Sample rule for golden test',
|
|
34
|
+
scope: undefined,
|
|
35
|
+
autoApply: true,
|
|
36
|
+
body: 'Body referencing .productbrain/rules/other.md and .productbrain/skills/x.md\n',
|
|
37
|
+
sourcePath: '/abs/.productbrain/rules/sample-rule.md',
|
|
38
|
+
};
|
|
39
|
+
const goldenSkill = {
|
|
40
|
+
name: 'sample-skill',
|
|
41
|
+
description: 'Sample skill for golden test',
|
|
42
|
+
triggers: ['/sample'],
|
|
43
|
+
body: 'Reference .productbrain/skills/other.md inside the body.\n',
|
|
44
|
+
sourcePath: '/abs/.productbrain/skills/sample-skill.md',
|
|
45
|
+
};
|
|
46
|
+
const goldens = [
|
|
47
|
+
{
|
|
48
|
+
name: 'rule-mdc-frontmatter',
|
|
49
|
+
canonical: { kind: 'rule', ...goldenRule },
|
|
50
|
+
expected: generateCursorRule(goldenRule),
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'skill-trigger-injection',
|
|
54
|
+
canonical: { kind: 'skill', ...goldenSkill },
|
|
55
|
+
expected: generateCursorSkill(goldenSkill),
|
|
56
|
+
},
|
|
57
|
+
];
|
|
58
|
+
function canonicalPathFor(projectionPath) {
|
|
59
|
+
const p = projectionPath.replace(/^\.\//, '');
|
|
60
|
+
// Reverse the .md → .mdc extension flip on the rule projection.
|
|
61
|
+
let m = p.match(/^\.cursor\/rules\/(.+)\.mdc$/);
|
|
62
|
+
if (m)
|
|
63
|
+
return `.productbrain/rules/${m[1]}.md`;
|
|
64
|
+
m = p.match(/^\.cursor\/skills\/(.+)\/SKILL\.md$/);
|
|
65
|
+
if (m)
|
|
66
|
+
return `.productbrain/skills/${m[1]}.md`;
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
export const cursorAdapter = {
|
|
70
|
+
name: 'cursor',
|
|
71
|
+
displayName: 'Cursor',
|
|
72
|
+
detect: (repoRoot) => existsSync(join(repoRoot, '.cursor')),
|
|
73
|
+
paths,
|
|
74
|
+
transform,
|
|
75
|
+
goldens,
|
|
76
|
+
canonicalPathFor,
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/surfaces/adapters/cursor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,wCAAwC,CAAC;AAWhD,SAAS,SAAS,CAAC,KAA2E;IAC5F,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACpE,OAAO,mBAAmB,CAAC,SAAS,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,KAAK,CAAC,KAAsB;IACnC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,8DAA8D;YAC9D,OAAO,EAAE,cAAc,EAAE,iBAAiB,KAAK,CAAC,QAAQ,MAAM,EAAE,CAAC;QACnE,KAAK,OAAO;YACV,OAAO,EAAE,cAAc,EAAE,kBAAkB,KAAK,CAAC,QAAQ,WAAW,EAAE,CAAC;QACzE,KAAK,MAAM;YACT,6EAA6E;YAC7E,0CAA0C;YAC1C,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,CAAC;IACvD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAkB;IAChC,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,6BAA6B;IAC1C,KAAK,EAAE,SAAS;IAChB,SAAS,EAAE,IAAI;IACf,IAAI,EAAE,+EAA+E;IACrF,UAAU,EAAE,yCAAyC;CACtD,CAAC;AAEF,MAAM,WAAW,GAAmB;IAClC,IAAI,EAAE,cAAc;IACpB,WAAW,EAAE,8BAA8B;IAC3C,QAAQ,EAAE,CAAC,SAAS,CAAC;IACrB,IAAI,EAAE,4DAA4D;IAClE,UAAU,EAAE,2CAA2C;CACxD,CAAC;AAEF,MAAM,OAAO,GAAoB;IAC/B;QACE,IAAI,EAAE,sBAAsB;QAC5B,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE;QAC1C,QAAQ,EAAE,kBAAkB,CAAC,UAAU,CAAC;KACzC;IACD;QACE,IAAI,EAAE,yBAAyB;QAC/B,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,WAAW,EAAE;QAC5C,QAAQ,EAAE,mBAAmB,CAAC,WAAW,CAAC;KAC3C;CACF,CAAC;AAEF,SAAS,gBAAgB,CAAC,cAAsB;IAC9C,MAAM,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9C,gEAAgE;IAChE,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAChD,IAAI,CAAC;QAAE,OAAO,uBAAuB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACnD,IAAI,CAAC;QAAE,OAAO,wBAAwB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAChD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAmB;IAC3C,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,QAAQ;IACrB,MAAM,EAAE,CAAC,QAAgB,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACnE,KAAK;IACL,SAAS;IACT,OAAO;IACP,gBAAgB;CACjB,CAAC"}
|