@productbrain/cli 0.1.0-beta.108 → 0.1.0-beta.109

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.
Files changed (247) hide show
  1. package/dist/__tests__/canonicalRefs.vocab.test.d.ts +2 -0
  2. package/dist/__tests__/canonicalRefs.vocab.test.d.ts.map +1 -0
  3. package/dist/__tests__/canonicalRefs.vocab.test.js +251 -0
  4. package/dist/__tests__/canonicalRefs.vocab.test.js.map +1 -0
  5. package/dist/__tests__/constants.test.js +6 -1
  6. package/dist/__tests__/constants.test.js.map +1 -1
  7. package/dist/__tests__/envelope-contract.test.js +29 -3
  8. package/dist/__tests__/envelope-contract.test.js.map +1 -1
  9. package/dist/__tests__/errors.test.js +1 -0
  10. package/dist/__tests__/errors.test.js.map +1 -1
  11. package/dist/__tests__/handshake-preview.test.js +501 -1
  12. package/dist/__tests__/handshake-preview.test.js.map +1 -1
  13. package/dist/__tests__/handshake.e2e.test.d.ts +2 -0
  14. package/dist/__tests__/handshake.e2e.test.d.ts.map +1 -0
  15. package/dist/__tests__/handshake.e2e.test.js +257 -0
  16. package/dist/__tests__/handshake.e2e.test.js.map +1 -0
  17. package/dist/__tests__/handshake.test.js +251 -1
  18. package/dist/__tests__/handshake.test.js.map +1 -1
  19. package/dist/__tests__/manifest.test.js +118 -1
  20. package/dist/__tests__/manifest.test.js.map +1 -1
  21. package/dist/__tests__/orient.test.js +65 -24
  22. package/dist/__tests__/orient.test.js.map +1 -1
  23. package/dist/__tests__/perimeter.test.d.ts +2 -0
  24. package/dist/__tests__/perimeter.test.d.ts.map +1 -0
  25. package/dist/__tests__/perimeter.test.js +143 -0
  26. package/dist/__tests__/perimeter.test.js.map +1 -0
  27. package/dist/__tests__/promote.test.js +2 -2
  28. package/dist/__tests__/promote.test.js.map +1 -1
  29. package/dist/__tests__/setup-ingest.test.js +16 -0
  30. package/dist/__tests__/setup-ingest.test.js.map +1 -1
  31. package/dist/__tests__/skill-vocabulary.test.d.ts +21 -0
  32. package/dist/__tests__/skill-vocabulary.test.d.ts.map +1 -0
  33. package/dist/__tests__/skill-vocabulary.test.js +187 -0
  34. package/dist/__tests__/skill-vocabulary.test.js.map +1 -0
  35. package/dist/__tests__/update-check.test.d.ts +2 -0
  36. package/dist/__tests__/update-check.test.d.ts.map +1 -0
  37. package/dist/__tests__/update-check.test.js +56 -0
  38. package/dist/__tests__/update-check.test.js.map +1 -0
  39. package/dist/__tests__/upgrade-runner.test.d.ts +2 -0
  40. package/dist/__tests__/upgrade-runner.test.d.ts.map +1 -0
  41. package/dist/__tests__/upgrade-runner.test.js +42 -0
  42. package/dist/__tests__/upgrade-runner.test.js.map +1 -0
  43. package/dist/__tests__/vocabulary-leak.test.d.ts +25 -0
  44. package/dist/__tests__/vocabulary-leak.test.d.ts.map +1 -0
  45. package/dist/__tests__/vocabulary-leak.test.js +379 -0
  46. package/dist/__tests__/vocabulary-leak.test.js.map +1 -0
  47. package/dist/commands/__tests__/connect-handoff.test.d.ts +11 -0
  48. package/dist/commands/__tests__/connect-handoff.test.d.ts.map +1 -0
  49. package/dist/commands/__tests__/connect-handoff.test.js +111 -0
  50. package/dist/commands/__tests__/connect-handoff.test.js.map +1 -0
  51. package/dist/commands/__tests__/setup-state.test.d.ts +2 -0
  52. package/dist/commands/__tests__/setup-state.test.d.ts.map +1 -0
  53. package/dist/commands/__tests__/setup-state.test.js +194 -0
  54. package/dist/commands/__tests__/setup-state.test.js.map +1 -0
  55. package/dist/commands/admin/seed.d.ts +32 -2
  56. package/dist/commands/admin/seed.d.ts.map +1 -1
  57. package/dist/commands/admin/seed.js +279 -33
  58. package/dist/commands/admin/seed.js.map +1 -1
  59. package/dist/commands/admin/seed.test.js +7 -0
  60. package/dist/commands/admin/seed.test.js.map +1 -1
  61. package/dist/commands/admin/seedRegistryEntries.generated.d.ts +14 -0
  62. package/dist/commands/admin/seedRegistryEntries.generated.d.ts.map +1 -0
  63. package/dist/commands/admin/seedRegistryEntries.generated.js +117 -0
  64. package/dist/commands/admin/seedRegistryEntries.generated.js.map +1 -0
  65. package/dist/commands/admin/seedRegistryEntries.test.d.ts +11 -0
  66. package/dist/commands/admin/seedRegistryEntries.test.d.ts.map +1 -0
  67. package/dist/commands/admin/seedRegistryEntries.test.js +67 -0
  68. package/dist/commands/admin/seedRegistryEntries.test.js.map +1 -0
  69. package/dist/commands/authority-domains.d.ts +7 -1
  70. package/dist/commands/authority-domains.d.ts.map +1 -1
  71. package/dist/commands/authority-domains.js +17 -3
  72. package/dist/commands/authority-domains.js.map +1 -1
  73. package/dist/commands/capture.d.ts.map +1 -1
  74. package/dist/commands/capture.js +3 -2
  75. package/dist/commands/capture.js.map +1 -1
  76. package/dist/commands/codex-prep.js +6 -6
  77. package/dist/commands/codex-prep.js.map +1 -1
  78. package/dist/commands/connect-handoff.d.ts +51 -0
  79. package/dist/commands/connect-handoff.d.ts.map +1 -0
  80. package/dist/commands/connect-handoff.js +70 -0
  81. package/dist/commands/connect-handoff.js.map +1 -0
  82. package/dist/commands/connect-integration.test.js +13 -12
  83. package/dist/commands/connect-integration.test.js.map +1 -1
  84. package/dist/commands/connect-screens.d.ts +2 -2
  85. package/dist/commands/connect-screens.js +2 -2
  86. package/dist/commands/connect.d.ts +3 -6
  87. package/dist/commands/connect.d.ts.map +1 -1
  88. package/dist/commands/connect.js +10 -36
  89. package/dist/commands/connect.js.map +1 -1
  90. package/dist/commands/doctor.d.ts.map +1 -1
  91. package/dist/commands/doctor.js +67 -2
  92. package/dist/commands/doctor.js.map +1 -1
  93. package/dist/commands/doctor.test.js +131 -0
  94. package/dist/commands/doctor.test.js.map +1 -1
  95. package/dist/commands/handshake.d.ts +25 -0
  96. package/dist/commands/handshake.d.ts.map +1 -1
  97. package/dist/commands/handshake.js +795 -18
  98. package/dist/commands/handshake.js.map +1 -1
  99. package/dist/commands/method.d.ts.map +1 -1
  100. package/dist/commands/method.js +3 -0
  101. package/dist/commands/method.js.map +1 -1
  102. package/dist/commands/orient.d.ts +4 -2
  103. package/dist/commands/orient.d.ts.map +1 -1
  104. package/dist/commands/orient.js +16 -2
  105. package/dist/commands/orient.js.map +1 -1
  106. package/dist/commands/setup-detect-surfaces.d.ts +38 -0
  107. package/dist/commands/setup-detect-surfaces.d.ts.map +1 -0
  108. package/dist/commands/setup-detect-surfaces.js +67 -0
  109. package/dist/commands/setup-detect-surfaces.js.map +1 -0
  110. package/dist/commands/setup-ingest.d.ts.map +1 -1
  111. package/dist/commands/setup-ingest.js +4 -2
  112. package/dist/commands/setup-ingest.js.map +1 -1
  113. package/dist/commands/setup-state.d.ts +42 -0
  114. package/dist/commands/setup-state.d.ts.map +1 -0
  115. package/dist/commands/setup-state.js +93 -0
  116. package/dist/commands/setup-state.js.map +1 -0
  117. package/dist/commands/setup.d.ts +17 -9
  118. package/dist/commands/setup.d.ts.map +1 -1
  119. package/dist/commands/setup.js +52 -131
  120. package/dist/commands/setup.js.map +1 -1
  121. package/dist/commands/upgrade.d.ts +5 -0
  122. package/dist/commands/upgrade.d.ts.map +1 -0
  123. package/dist/commands/upgrade.js +89 -0
  124. package/dist/commands/upgrade.js.map +1 -0
  125. package/dist/formatters/handshake.d.ts +12 -0
  126. package/dist/formatters/handshake.d.ts.map +1 -1
  127. package/dist/formatters/handshake.js +32 -0
  128. package/dist/formatters/handshake.js.map +1 -1
  129. package/dist/formatters/orient.d.ts +10 -4
  130. package/dist/formatters/orient.d.ts.map +1 -1
  131. package/dist/formatters/orient.js +32 -16
  132. package/dist/formatters/orient.js.map +1 -1
  133. package/dist/generators/context-md.js +6 -6
  134. package/dist/generators/context-md.js.map +1 -1
  135. package/dist/generators/manifest.d.ts +76 -0
  136. package/dist/generators/manifest.d.ts.map +1 -1
  137. package/dist/generators/manifest.js +125 -14
  138. package/dist/generators/manifest.js.map +1 -1
  139. package/dist/generators/portable-knowledge.d.ts +2 -2
  140. package/dist/generators/portable-knowledge.d.ts.map +1 -1
  141. package/dist/generators/surface-profiles.d.ts +1 -2
  142. package/dist/generators/surface-profiles.d.ts.map +1 -1
  143. package/dist/generators/surface-profiles.js.map +1 -1
  144. package/dist/index.js +43 -18
  145. package/dist/index.js.map +1 -1
  146. package/dist/lib/activation.js +2 -2
  147. package/dist/lib/activation.js.map +1 -1
  148. package/dist/lib/activation.test.js +3 -3
  149. package/dist/lib/activation.test.js.map +1 -1
  150. package/dist/lib/canonicalRefs.d.ts +72 -0
  151. package/dist/lib/canonicalRefs.d.ts.map +1 -1
  152. package/dist/lib/canonicalRefs.js +67 -0
  153. package/dist/lib/canonicalRefs.js.map +1 -1
  154. package/dist/lib/client.d.ts.map +1 -1
  155. package/dist/lib/client.js +13 -3
  156. package/dist/lib/client.js.map +1 -1
  157. package/dist/lib/constants.d.ts +2 -0
  158. package/dist/lib/constants.d.ts.map +1 -1
  159. package/dist/lib/constants.js +2 -0
  160. package/dist/lib/constants.js.map +1 -1
  161. package/dist/lib/errors.d.ts +1 -0
  162. package/dist/lib/errors.d.ts.map +1 -1
  163. package/dist/lib/errors.js +1 -0
  164. package/dist/lib/errors.js.map +1 -1
  165. package/dist/lib/onboarding-shared.js +1 -1
  166. package/dist/lib/onboarding-shared.js.map +1 -1
  167. package/dist/lib/update-check.d.ts +20 -0
  168. package/dist/lib/update-check.d.ts.map +1 -1
  169. package/dist/lib/update-check.js +122 -21
  170. package/dist/lib/update-check.js.map +1 -1
  171. package/dist/lib/upgrade-runner.d.ts +21 -0
  172. package/dist/lib/upgrade-runner.d.ts.map +1 -0
  173. package/dist/lib/upgrade-runner.js +109 -0
  174. package/dist/lib/upgrade-runner.js.map +1 -0
  175. package/dist/lib/workspaceVocabCache.d.ts +60 -0
  176. package/dist/lib/workspaceVocabCache.d.ts.map +1 -0
  177. package/dist/lib/workspaceVocabCache.js +98 -0
  178. package/dist/lib/workspaceVocabCache.js.map +1 -0
  179. package/dist/setup/__tests__/coach-traces.test.d.ts +2 -0
  180. package/dist/setup/__tests__/coach-traces.test.d.ts.map +1 -0
  181. package/dist/setup/__tests__/coach-traces.test.js +189 -0
  182. package/dist/setup/__tests__/coach-traces.test.js.map +1 -0
  183. package/dist/setup/__tests__/setup-commands.test.d.ts +2 -0
  184. package/dist/setup/__tests__/setup-commands.test.d.ts.map +1 -0
  185. package/dist/setup/__tests__/setup-commands.test.js +177 -0
  186. package/dist/setup/__tests__/setup-commands.test.js.map +1 -0
  187. package/dist/setup/__tests__/state-machine.test.d.ts +2 -0
  188. package/dist/setup/__tests__/state-machine.test.d.ts.map +1 -0
  189. package/dist/setup/__tests__/state-machine.test.js +341 -0
  190. package/dist/setup/__tests__/state-machine.test.js.map +1 -0
  191. package/dist/setup/detect-surfaces.d.ts +21 -0
  192. package/dist/setup/detect-surfaces.d.ts.map +1 -0
  193. package/dist/setup/detect-surfaces.js +39 -0
  194. package/dist/setup/detect-surfaces.js.map +1 -0
  195. package/dist/setup/manifest-writer.d.ts +17 -0
  196. package/dist/setup/manifest-writer.d.ts.map +1 -0
  197. package/dist/setup/manifest-writer.js +153 -0
  198. package/dist/setup/manifest-writer.js.map +1 -0
  199. package/dist/setup/perimeter.d.ts +62 -0
  200. package/dist/setup/perimeter.d.ts.map +1 -0
  201. package/dist/setup/perimeter.js +113 -0
  202. package/dist/setup/perimeter.js.map +1 -0
  203. package/dist/setup/state-machine.d.ts +67 -0
  204. package/dist/setup/state-machine.d.ts.map +1 -0
  205. package/dist/setup/state-machine.js +124 -0
  206. package/dist/setup/state-machine.js.map +1 -0
  207. package/dist/surfaces/__tests__/adapter.test.d.ts +2 -0
  208. package/dist/surfaces/__tests__/adapter.test.d.ts.map +1 -0
  209. package/dist/surfaces/__tests__/adapter.test.js +90 -0
  210. package/dist/surfaces/__tests__/adapter.test.js.map +1 -0
  211. package/dist/surfaces/__tests__/pb-setup-passthrough.test.d.ts +2 -0
  212. package/dist/surfaces/__tests__/pb-setup-passthrough.test.d.ts.map +1 -0
  213. package/dist/surfaces/__tests__/pb-setup-passthrough.test.js +132 -0
  214. package/dist/surfaces/__tests__/pb-setup-passthrough.test.js.map +1 -0
  215. package/dist/surfaces/__tests__/telemetry.test.d.ts +2 -0
  216. package/dist/surfaces/__tests__/telemetry.test.d.ts.map +1 -0
  217. package/dist/surfaces/__tests__/telemetry.test.js +55 -0
  218. package/dist/surfaces/__tests__/telemetry.test.js.map +1 -0
  219. package/dist/surfaces/adapter.d.ts +70 -0
  220. package/dist/surfaces/adapter.d.ts.map +1 -0
  221. package/dist/surfaces/adapter.js +2 -0
  222. package/dist/surfaces/adapter.js.map +1 -0
  223. package/dist/surfaces/adapters/claude.d.ts +3 -0
  224. package/dist/surfaces/adapters/claude.d.ts.map +1 -0
  225. package/dist/surfaces/adapters/claude.js +67 -0
  226. package/dist/surfaces/adapters/claude.js.map +1 -0
  227. package/dist/surfaces/adapters/codex.d.ts +3 -0
  228. package/dist/surfaces/adapters/codex.d.ts.map +1 -0
  229. package/dist/surfaces/adapters/codex.js +61 -0
  230. package/dist/surfaces/adapters/codex.js.map +1 -0
  231. package/dist/surfaces/adapters/copilot.d.ts +3 -0
  232. package/dist/surfaces/adapters/copilot.d.ts.map +1 -0
  233. package/dist/surfaces/adapters/copilot.js +59 -0
  234. package/dist/surfaces/adapters/copilot.js.map +1 -0
  235. package/dist/surfaces/adapters/cursor.d.ts +3 -0
  236. package/dist/surfaces/adapters/cursor.d.ts.map +1 -0
  237. package/dist/surfaces/adapters/cursor.js +78 -0
  238. package/dist/surfaces/adapters/cursor.js.map +1 -0
  239. package/dist/surfaces/registry.d.ts +58 -2
  240. package/dist/surfaces/registry.d.ts.map +1 -1
  241. package/dist/surfaces/registry.js +82 -7
  242. package/dist/surfaces/registry.js.map +1 -1
  243. package/dist/surfaces/telemetry.d.ts +17 -0
  244. package/dist/surfaces/telemetry.d.ts.map +1 -0
  245. package/dist/surfaces/telemetry.js +31 -0
  246. package/dist/surfaces/telemetry.js.map +1 -0
  247. package/package.json +2 -1
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=telemetry.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/surfaces/adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { SurfaceAdapter } from '../adapter.js';
2
+ export declare const claudeAdapter: SurfaceAdapter;
3
+ //# sourceMappingURL=claude.d.ts.map
@@ -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,3 @@
1
+ import type { SurfaceAdapter } from '../adapter.js';
2
+ export declare const codexAdapter: SurfaceAdapter;
3
+ //# sourceMappingURL=codex.d.ts.map
@@ -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,3 @@
1
+ import type { SurfaceAdapter } from '../adapter.js';
2
+ export declare const copilotAdapter: SurfaceAdapter;
3
+ //# sourceMappingURL=copilot.d.ts.map
@@ -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,3 @@
1
+ import type { SurfaceAdapter } from '../adapter.js';
2
+ export declare const cursorAdapter: SurfaceAdapter;
3
+ //# sourceMappingURL=cursor.d.ts.map
@@ -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"}
@@ -1,10 +1,15 @@
1
1
  /**
2
- * Surface Capability Registry — WP-310 S0 (FEAT-959)
2
+ * Surface Capability Registry — WP-310 S0 (FEAT-959), extended in WP-421 S2c (DEC-952).
3
+ *
4
+ * Static typed record of per-surface capabilities consumed by E1–E4 and the
5
+ * SurfaceAdapter set introduced in WP-421 S2c. The legacy `SURFACE_REGISTRY`
6
+ * shape is preserved verbatim for callers (handshake hook plumbing,
7
+ * `lib/hook-intents.ts`, existing tests).
3
8
  *
4
- * Static typed record of per-surface capabilities consumed by E1–E4.
5
9
  * INS-740: Cursor and Copilot had confirmed double-fire risk with Claude Code hooks.
6
10
  * Their hookEvents arrays MUST be empty in v1. Only 'claude' gets hook events by default.
7
11
  */
12
+ import type { SurfaceAdapter } from './adapter.js';
8
13
  export type SurfaceName = 'claude' | 'cursor' | 'copilot' | 'codex';
9
14
  export interface SurfaceCapability {
10
15
  rulesFormat: 'markdown' | 'mdc';
@@ -17,4 +22,55 @@ export interface SurfaceCapability {
17
22
  supportsAgentsMd: boolean;
18
23
  }
19
24
  export declare const SURFACE_REGISTRY: Record<SurfaceName, SurfaceCapability>;
25
+ /**
26
+ * Per-surface adapter registry. New surface = new adapter file + line here.
27
+ * Adapters expose detect/paths/transform/goldens/canonicalPathFor — one canonical
28
+ * asset, many surface projections.
29
+ */
30
+ export declare const SURFACE_ADAPTERS: Record<SurfaceName, SurfaceAdapter>;
31
+ /** Convenience array view for iteration (e.g. detect-all). */
32
+ export declare const SURFACE_ADAPTER_LIST: SurfaceAdapter[];
33
+ /**
34
+ * Lookup the canonical authoring path for a projection path on any surface.
35
+ * Returns the first non-null mapping; if every adapter returns null, returns null
36
+ * and the caller MUST emit `surface-reverse-map-missing` telemetry via
37
+ * `surfaces/telemetry.ts:reportReverseMapMissing`.
38
+ */
39
+ export declare function canonicalPathForAnySurface(projectionPath: string): {
40
+ surface: SurfaceName;
41
+ canonicalPath: string;
42
+ } | null;
43
+ /** Govern mode declared with empty surfaces[]. Hard error (handshake refuses). */
44
+ export declare const SURFACE_GOVERN_NO_SURFACES: "govern-no-surfaces";
45
+ /** Surface name in manifest is not registered. Advisory flag for drift report. */
46
+ export declare const SURFACE_ADAPTER_MISSING: "surface-adapter-missing";
47
+ /**
48
+ * Result of the surfaces validation for a given authority mode.
49
+ *
50
+ * - `error` is set when the configuration is invalid for the requested mode
51
+ * (today: only Govern + empty surfaces). Caller should refuse to proceed.
52
+ * - `unregisteredSurfaces` enumerates manifest surface names that are not in
53
+ * SURFACE_ADAPTERS; emit one `SURFACE_ADAPTER_MISSING` flag per entry but
54
+ * do NOT fail.
55
+ */
56
+ export interface SurfacesValidationResult {
57
+ error?: typeof SURFACE_GOVERN_NO_SURFACES;
58
+ unregisteredSurfaces: string[];
59
+ /** Subset of `manifest.surfaces` that resolve to a known SurfaceName. */
60
+ registeredSurfaces: SurfaceName[];
61
+ }
62
+ /**
63
+ * Validate `manifest.surfaces[]` against the requested authority mode.
64
+ *
65
+ * Govern + empty surfaces → `{ error: SURFACE_GOVERN_NO_SURFACES }`.
66
+ * Any other mode is permitted with any (possibly empty) surface list.
67
+ *
68
+ * Unregistered surface names are reported via `unregisteredSurfaces` so the
69
+ * caller can flag them in the drift report. Pure: no I/O, no Convex calls.
70
+ *
71
+ * Surface name normalization: this validator strips a leading `.` from each
72
+ * entry (e.g. `.cursor` → `cursor`) so manifests can declare either form.
73
+ * The canonical SurfaceName values in SURFACE_ADAPTERS use the bare name.
74
+ */
75
+ export declare function validateSurfacesForMode(mode: 'off' | 'observe' | 'project' | 'govern', surfacesFromManifest: string[]): SurfacesValidationResult;
20
76
  //# sourceMappingURL=registry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/surfaces/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,UAAU,GAAG,KAAK,CAAC;IAChC,YAAY,EAAE,UAAU,GAAG,MAAM,CAAC;IAClC,+FAA+F;IAC/F,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE,eAAe,GAAG,MAAM,CAAC;IAClD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAiCnE,CAAC"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/surfaces/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMnD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,UAAU,GAAG,KAAK,CAAC;IAChC,YAAY,EAAE,UAAU,GAAG,MAAM,CAAC;IAClC,+FAA+F;IAC/F,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE,eAAe,GAAG,MAAM,CAAC;IAClD,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAiCnE,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAAE,cAAc,CAKhE,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,oBAAoB,EAAE,cAAc,EAAoC,CAAC;AAEtF;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,MAAM,GACrB;IAAE,OAAO,EAAE,WAAW,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMxD;AAaD,kFAAkF;AAClF,eAAO,MAAM,0BAA0B,EAAG,oBAA6B,CAAC;AAExE,kFAAkF;AAClF,eAAO,MAAM,uBAAuB,EAAG,yBAAkC,CAAC;AAE1E;;;;;;;;GAQG;AACH,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,OAAO,0BAA0B,CAAC;IAC1C,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,yEAAyE;IACzE,kBAAkB,EAAE,WAAW,EAAE,CAAC;CACnC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,EAC9C,oBAAoB,EAAE,MAAM,EAAE,GAC7B,wBAAwB,CAuB1B"}