@productbrain/cli 0.1.0-beta.7 → 0.1.0-beta.9

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 (166) hide show
  1. package/README.md +84 -1
  2. package/dist/__tests__/capture.test.d.ts +2 -0
  3. package/dist/__tests__/capture.test.d.ts.map +1 -0
  4. package/dist/__tests__/capture.test.js +86 -0
  5. package/dist/__tests__/capture.test.js.map +1 -0
  6. package/dist/__tests__/constellation.test.d.ts +2 -0
  7. package/dist/__tests__/constellation.test.d.ts.map +1 -0
  8. package/dist/__tests__/constellation.test.js +260 -0
  9. package/dist/__tests__/constellation.test.js.map +1 -0
  10. package/dist/__tests__/fields.test.d.ts +2 -0
  11. package/dist/__tests__/fields.test.d.ts.map +1 -0
  12. package/dist/__tests__/fields.test.js +238 -0
  13. package/dist/__tests__/fields.test.js.map +1 -0
  14. package/dist/__tests__/handshake.test.d.ts +2 -0
  15. package/dist/__tests__/handshake.test.d.ts.map +1 -0
  16. package/dist/__tests__/handshake.test.js +187 -0
  17. package/dist/__tests__/handshake.test.js.map +1 -0
  18. package/dist/__tests__/relate.test.d.ts +2 -0
  19. package/dist/__tests__/relate.test.d.ts.map +1 -0
  20. package/dist/__tests__/relate.test.js +79 -0
  21. package/dist/__tests__/relate.test.js.map +1 -0
  22. package/dist/__tests__/repo-detect.test.d.ts +2 -0
  23. package/dist/__tests__/repo-detect.test.d.ts.map +1 -0
  24. package/dist/__tests__/repo-detect.test.js +119 -0
  25. package/dist/__tests__/repo-detect.test.js.map +1 -0
  26. package/dist/__tests__/runner.test.d.ts +2 -0
  27. package/dist/__tests__/runner.test.d.ts.map +1 -0
  28. package/dist/__tests__/runner.test.js +215 -0
  29. package/dist/__tests__/runner.test.js.map +1 -0
  30. package/dist/__tests__/session-touch.test.d.ts +2 -0
  31. package/dist/__tests__/session-touch.test.d.ts.map +1 -0
  32. package/dist/__tests__/session-touch.test.js +134 -0
  33. package/dist/__tests__/session-touch.test.js.map +1 -0
  34. package/dist/__tests__/session.test.d.ts +2 -0
  35. package/dist/__tests__/session.test.d.ts.map +1 -0
  36. package/dist/__tests__/session.test.js +52 -0
  37. package/dist/__tests__/session.test.js.map +1 -0
  38. package/dist/__tests__/strip.test.d.ts +2 -0
  39. package/dist/__tests__/strip.test.d.ts.map +1 -0
  40. package/dist/__tests__/strip.test.js +136 -0
  41. package/dist/__tests__/strip.test.js.map +1 -0
  42. package/dist/__tests__/update.test.d.ts +2 -0
  43. package/dist/__tests__/update.test.d.ts.map +1 -0
  44. package/dist/__tests__/update.test.js +148 -0
  45. package/dist/__tests__/update.test.js.map +1 -0
  46. package/dist/commands/capture.d.ts +21 -0
  47. package/dist/commands/capture.d.ts.map +1 -0
  48. package/dist/commands/capture.js +100 -0
  49. package/dist/commands/capture.js.map +1 -0
  50. package/dist/commands/constellation.d.ts +11 -0
  51. package/dist/commands/constellation.d.ts.map +1 -0
  52. package/dist/commands/constellation.js +28 -0
  53. package/dist/commands/constellation.js.map +1 -0
  54. package/dist/commands/context.d.ts +2 -1
  55. package/dist/commands/context.d.ts.map +1 -1
  56. package/dist/commands/context.js +15 -9
  57. package/dist/commands/context.js.map +1 -1
  58. package/dist/commands/fields.d.ts +9 -0
  59. package/dist/commands/fields.d.ts.map +1 -0
  60. package/dist/commands/fields.js +26 -0
  61. package/dist/commands/fields.js.map +1 -0
  62. package/dist/commands/get.d.ts +8 -1
  63. package/dist/commands/get.d.ts.map +1 -1
  64. package/dist/commands/get.js +51 -6
  65. package/dist/commands/get.js.map +1 -1
  66. package/dist/commands/handshake.d.ts +18 -0
  67. package/dist/commands/handshake.d.ts.map +1 -0
  68. package/dist/commands/handshake.js +378 -0
  69. package/dist/commands/handshake.js.map +1 -0
  70. package/dist/commands/ingest.d.ts +1 -0
  71. package/dist/commands/ingest.d.ts.map +1 -1
  72. package/dist/commands/ingest.js +25 -8
  73. package/dist/commands/ingest.js.map +1 -1
  74. package/dist/commands/orient.d.ts +1 -0
  75. package/dist/commands/orient.d.ts.map +1 -1
  76. package/dist/commands/orient.js +13 -8
  77. package/dist/commands/orient.js.map +1 -1
  78. package/dist/commands/relate.d.ts +15 -0
  79. package/dist/commands/relate.d.ts.map +1 -0
  80. package/dist/commands/relate.js +72 -0
  81. package/dist/commands/relate.js.map +1 -0
  82. package/dist/commands/search.d.ts +1 -0
  83. package/dist/commands/search.d.ts.map +1 -1
  84. package/dist/commands/search.js +5 -3
  85. package/dist/commands/search.js.map +1 -1
  86. package/dist/commands/session.d.ts +20 -0
  87. package/dist/commands/session.d.ts.map +1 -0
  88. package/dist/commands/session.js +134 -0
  89. package/dist/commands/session.js.map +1 -0
  90. package/dist/commands/update.d.ts +16 -0
  91. package/dist/commands/update.d.ts.map +1 -0
  92. package/dist/commands/update.js +89 -0
  93. package/dist/commands/update.js.map +1 -0
  94. package/dist/formatters/capture.d.ts +30 -0
  95. package/dist/formatters/capture.d.ts.map +1 -0
  96. package/dist/formatters/capture.js +58 -0
  97. package/dist/formatters/capture.js.map +1 -0
  98. package/dist/formatters/constellation.d.ts +34 -0
  99. package/dist/formatters/constellation.d.ts.map +1 -0
  100. package/dist/formatters/constellation.js +38 -0
  101. package/dist/formatters/constellation.js.map +1 -0
  102. package/dist/formatters/fields.d.ts +32 -0
  103. package/dist/formatters/fields.d.ts.map +1 -0
  104. package/dist/formatters/fields.js +49 -0
  105. package/dist/formatters/fields.js.map +1 -0
  106. package/dist/formatters/handshake.d.ts +17 -0
  107. package/dist/formatters/handshake.d.ts.map +1 -0
  108. package/dist/formatters/handshake.js +51 -0
  109. package/dist/formatters/handshake.js.map +1 -0
  110. package/dist/formatters/relate.d.ts +11 -0
  111. package/dist/formatters/relate.d.ts.map +1 -0
  112. package/dist/formatters/relate.js +10 -0
  113. package/dist/formatters/relate.js.map +1 -0
  114. package/dist/formatters/session.d.ts +11 -0
  115. package/dist/formatters/session.d.ts.map +1 -0
  116. package/dist/formatters/session.js +51 -0
  117. package/dist/formatters/session.js.map +1 -0
  118. package/dist/formatters/update.d.ts +17 -0
  119. package/dist/formatters/update.d.ts.map +1 -0
  120. package/dist/formatters/update.js +43 -0
  121. package/dist/formatters/update.js.map +1 -0
  122. package/dist/generators/adapters.d.ts +10 -0
  123. package/dist/generators/adapters.d.ts.map +1 -0
  124. package/dist/generators/adapters.js +102 -0
  125. package/dist/generators/adapters.js.map +1 -0
  126. package/dist/generators/briefing-md.d.ts +8 -0
  127. package/dist/generators/briefing-md.d.ts.map +1 -0
  128. package/dist/generators/briefing-md.js +51 -0
  129. package/dist/generators/briefing-md.js.map +1 -0
  130. package/dist/generators/context-md.d.ts +8 -0
  131. package/dist/generators/context-md.d.ts.map +1 -0
  132. package/dist/generators/context-md.js +123 -0
  133. package/dist/generators/context-md.js.map +1 -0
  134. package/dist/generators/portable-knowledge.d.ts +72 -0
  135. package/dist/generators/portable-knowledge.d.ts.map +1 -0
  136. package/dist/generators/portable-knowledge.js +246 -0
  137. package/dist/generators/portable-knowledge.js.map +1 -0
  138. package/dist/generators/portable-knowledge.test.d.ts +2 -0
  139. package/dist/generators/portable-knowledge.test.d.ts.map +1 -0
  140. package/dist/generators/portable-knowledge.test.js +399 -0
  141. package/dist/generators/portable-knowledge.test.js.map +1 -0
  142. package/dist/index.d.ts +3 -2
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +231 -6
  145. package/dist/index.js.map +1 -1
  146. package/dist/lib/client.d.ts +19 -0
  147. package/dist/lib/client.d.ts.map +1 -1
  148. package/dist/lib/client.js +102 -8
  149. package/dist/lib/client.js.map +1 -1
  150. package/dist/lib/repo-detect.d.ts +14 -0
  151. package/dist/lib/repo-detect.d.ts.map +1 -0
  152. package/dist/lib/repo-detect.js +58 -0
  153. package/dist/lib/repo-detect.js.map +1 -0
  154. package/dist/lib/runner.d.ts +31 -0
  155. package/dist/lib/runner.d.ts.map +1 -0
  156. package/dist/lib/runner.js +65 -0
  157. package/dist/lib/runner.js.map +1 -0
  158. package/dist/lib/session.d.ts +17 -0
  159. package/dist/lib/session.d.ts.map +1 -0
  160. package/dist/lib/session.js +43 -0
  161. package/dist/lib/session.js.map +1 -0
  162. package/dist/lib/strip.d.ts +11 -0
  163. package/dist/lib/strip.d.ts.map +1 -0
  164. package/dist/lib/strip.js +26 -0
  165. package/dist/lib/strip.js.map +1 -0
  166. package/package.json +6 -3
@@ -0,0 +1,399 @@
1
+ /**
2
+ * portable-knowledge — unit tests.
3
+ * BET-169: transport-aware skill dispatch, target filtering, and transport section stripping.
4
+ */
5
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
6
+ import { join } from 'path';
7
+ // vi.mock calls are hoisted — use vi.hoisted() for constants referenced inside factories.
8
+ const { vfs } = vi.hoisted(() => ({
9
+ vfs: {},
10
+ }));
11
+ vi.mock('fs', () => ({
12
+ mkdirSync: vi.fn(),
13
+ writeFileSync: vi.fn((path, content) => {
14
+ vfs[path] = content;
15
+ }),
16
+ existsSync: vi.fn((path) => {
17
+ // Check if the path itself or any child key exists (for directory checks)
18
+ if (path in vfs)
19
+ return true;
20
+ // For directory checks: return true if any key starts with path + '/'
21
+ return Object.keys(vfs).some((k) => k.startsWith(path + '/'));
22
+ }),
23
+ readFileSync: vi.fn((path, _enc) => {
24
+ if (path in vfs)
25
+ return vfs[path];
26
+ throw Object.assign(new Error(`ENOENT: no such file '${path}'`), { code: 'ENOENT' });
27
+ }),
28
+ readdirSync: vi.fn((dir) => {
29
+ const prefix = dir.endsWith('/') ? dir : dir + '/';
30
+ const files = new Set();
31
+ for (const key of Object.keys(vfs)) {
32
+ if (key.startsWith(prefix)) {
33
+ const rest = key.slice(prefix.length);
34
+ const parts = rest.split('/');
35
+ if (parts.length === 1)
36
+ files.add(parts[0]);
37
+ }
38
+ }
39
+ return [...files];
40
+ }),
41
+ }));
42
+ import { readCanonicalSkills, shouldEmitToTarget, stripTransportSections, filterByLevel, generateCursorSkill, generateClaudeSkillRouter, } from './portable-knowledge.js';
43
+ const PB_DIR = '/tmp/pb-test/.productbrain';
44
+ describe('readCanonicalSkills', () => {
45
+ beforeEach(() => {
46
+ Object.keys(vfs).forEach((k) => delete vfs[k]);
47
+ });
48
+ it('parses targets from frontmatter', () => {
49
+ vfs[join(PB_DIR, 'skills', 'test-skill.md')] = `---
50
+ name: test-skill
51
+ description: A test skill
52
+ triggers:
53
+ - test
54
+ targets:
55
+ - claude
56
+ ---
57
+
58
+ # Test Skill Body
59
+ `;
60
+ const skills = readCanonicalSkills(PB_DIR);
61
+ expect(skills).toHaveLength(1);
62
+ expect(skills[0].targets).toEqual(['claude']);
63
+ });
64
+ it('returns undefined targets when not specified in frontmatter', () => {
65
+ vfs[join(PB_DIR, 'skills', 'universal-skill.md')] = `---
66
+ name: universal-skill
67
+ description: A universal skill
68
+ triggers:
69
+ - universal
70
+ ---
71
+
72
+ # Universal Skill Body
73
+ `;
74
+ const skills = readCanonicalSkills(PB_DIR);
75
+ expect(skills).toHaveLength(1);
76
+ expect(skills[0].targets).toBeUndefined();
77
+ });
78
+ it('parses multiple targets', () => {
79
+ vfs[join(PB_DIR, 'skills', 'multi-target.md')] = `---
80
+ name: multi-target
81
+ description: Multi-target skill
82
+ triggers:
83
+ - multi
84
+ targets:
85
+ - claude
86
+ - cursor
87
+ ---
88
+
89
+ # Multi-Target Body
90
+ `;
91
+ const skills = readCanonicalSkills(PB_DIR);
92
+ expect(skills).toHaveLength(1);
93
+ expect(skills[0].targets).toEqual(['claude', 'cursor']);
94
+ });
95
+ it('parses level from frontmatter', () => {
96
+ vfs[join(PB_DIR, 'skills', 'leveled-skill.md')] = `---
97
+ name: leveled-skill
98
+ description: A leveled skill
99
+ level: core
100
+ triggers:
101
+ - leveled
102
+ ---
103
+
104
+ # Leveled Skill Body
105
+ `;
106
+ const skills = readCanonicalSkills(PB_DIR);
107
+ expect(skills).toHaveLength(1);
108
+ expect(skills[0].level).toBe('core');
109
+ });
110
+ it('returns undefined level when not specified in frontmatter', () => {
111
+ vfs[join(PB_DIR, 'skills', 'no-level-skill.md')] = `---
112
+ name: no-level-skill
113
+ description: A skill without level
114
+ triggers:
115
+ - nolevel
116
+ ---
117
+
118
+ # No Level Skill Body
119
+ `;
120
+ const skills = readCanonicalSkills(PB_DIR);
121
+ expect(skills).toHaveLength(1);
122
+ expect(skills[0].level).toBeUndefined();
123
+ });
124
+ });
125
+ describe('shouldEmitToTarget', () => {
126
+ it('returns true when targets is undefined (emit to all)', () => {
127
+ const skill = {
128
+ name: 'test',
129
+ description: '',
130
+ triggers: [],
131
+ body: '',
132
+ sourcePath: '',
133
+ };
134
+ expect(shouldEmitToTarget(skill, 'claude')).toBe(true);
135
+ expect(shouldEmitToTarget(skill, 'cursor')).toBe(true);
136
+ expect(shouldEmitToTarget(skill, 'copilot')).toBe(true);
137
+ });
138
+ it('returns true when target is in the list', () => {
139
+ const skill = {
140
+ name: 'test',
141
+ description: '',
142
+ triggers: [],
143
+ body: '',
144
+ sourcePath: '',
145
+ targets: ['claude'],
146
+ };
147
+ expect(shouldEmitToTarget(skill, 'claude')).toBe(true);
148
+ });
149
+ it('returns false when target is not in the list', () => {
150
+ const skill = {
151
+ name: 'test',
152
+ description: '',
153
+ triggers: [],
154
+ body: '',
155
+ sourcePath: '',
156
+ targets: ['claude'],
157
+ };
158
+ expect(shouldEmitToTarget(skill, 'cursor')).toBe(false);
159
+ expect(shouldEmitToTarget(skill, 'copilot')).toBe(false);
160
+ });
161
+ it('works for CanonicalRule as well', () => {
162
+ const rule = {
163
+ name: 'test-rule',
164
+ description: '',
165
+ autoApply: true,
166
+ body: '',
167
+ sourcePath: '',
168
+ targets: ['cursor'],
169
+ };
170
+ expect(shouldEmitToTarget(rule, 'cursor')).toBe(true);
171
+ expect(shouldEmitToTarget(rule, 'claude')).toBe(false);
172
+ });
173
+ });
174
+ describe('stripTransportSections', () => {
175
+ it('keeps content for the matching target and removes delimiters', () => {
176
+ const body = `Universal content above.
177
+
178
+ <!-- transport:claude -->
179
+ Claude-specific instructions here.
180
+ <!-- /transport -->
181
+
182
+ Universal content below.`;
183
+ const result = stripTransportSections(body, 'claude');
184
+ expect(result).toContain('Claude-specific instructions here.');
185
+ expect(result).toContain('Universal content above.');
186
+ expect(result).toContain('Universal content below.');
187
+ expect(result).not.toContain('<!-- transport:claude -->');
188
+ expect(result).not.toContain('<!-- /transport -->');
189
+ });
190
+ it('removes blocks for other targets entirely', () => {
191
+ const body = `Universal content.
192
+
193
+ <!-- transport:cursor -->
194
+ Cursor-only instructions.
195
+ <!-- /transport -->
196
+
197
+ More universal.`;
198
+ const result = stripTransportSections(body, 'claude');
199
+ expect(result).toContain('Universal content.');
200
+ expect(result).toContain('More universal.');
201
+ expect(result).not.toContain('Cursor-only instructions.');
202
+ expect(result).not.toContain('<!-- transport:cursor -->');
203
+ });
204
+ it('handles multiple transport blocks for different targets', () => {
205
+ const body = `# Heading
206
+
207
+ <!-- transport:claude -->
208
+ Claude dispatch: use Agent tool.
209
+ <!-- /transport -->
210
+
211
+ <!-- transport:cursor -->
212
+ Cursor dispatch: use fresh conversation.
213
+ <!-- /transport -->
214
+
215
+ ## Footer`;
216
+ const claudeResult = stripTransportSections(body, 'claude');
217
+ expect(claudeResult).toContain('Claude dispatch: use Agent tool.');
218
+ expect(claudeResult).not.toContain('Cursor dispatch: use fresh conversation.');
219
+ expect(claudeResult).toContain('# Heading');
220
+ expect(claudeResult).toContain('## Footer');
221
+ const cursorResult = stripTransportSections(body, 'cursor');
222
+ expect(cursorResult).toContain('Cursor dispatch: use fresh conversation.');
223
+ expect(cursorResult).not.toContain('Claude dispatch: use Agent tool.');
224
+ expect(cursorResult).toContain('# Heading');
225
+ expect(cursorResult).toContain('## Footer');
226
+ });
227
+ it('keeps universal content untouched when no transport blocks exist', () => {
228
+ const body = `# Just a normal skill
229
+
230
+ No transport sections here.
231
+
232
+ ## Section 2
233
+
234
+ More content.`;
235
+ const result = stripTransportSections(body, 'claude');
236
+ expect(result).toBe(body);
237
+ });
238
+ it('handles markdown and code blocks inside transport sections', () => {
239
+ const body = `Universal.
240
+
241
+ <!-- transport:claude -->
242
+ **Bold text** and \`inline code\`.
243
+
244
+ \`\`\`bash
245
+ git diff main..HEAD
246
+ \`\`\`
247
+
248
+ - List item 1
249
+ - List item 2
250
+ <!-- /transport -->
251
+
252
+ End.`;
253
+ const result = stripTransportSections(body, 'claude');
254
+ expect(result).toContain('**Bold text** and `inline code`.');
255
+ expect(result).toContain('git diff main..HEAD');
256
+ expect(result).toContain('- List item 1');
257
+ expect(result).toContain('End.');
258
+ });
259
+ it('handles transport sections with no trailing newline after closing tag', () => {
260
+ const body = `Before.
261
+ <!-- transport:claude -->
262
+ Content.
263
+ <!-- /transport -->After.`;
264
+ const result = stripTransportSections(body, 'claude');
265
+ expect(result).toContain('Content.');
266
+ expect(result).toContain('After.');
267
+ });
268
+ });
269
+ describe('generateCursorSkill (transport stripping)', () => {
270
+ it('strips non-cursor transport sections from generated output', () => {
271
+ const skill = {
272
+ name: 'test-skill',
273
+ description: 'Test skill',
274
+ triggers: ['test'],
275
+ body: `# Heading
276
+
277
+ <!-- transport:claude -->
278
+ Claude-only content.
279
+ <!-- /transport -->
280
+
281
+ <!-- transport:cursor -->
282
+ Cursor-only content.
283
+ <!-- /transport -->
284
+
285
+ Universal content.`,
286
+ sourcePath: '/tmp/.productbrain/skills/test-skill.md',
287
+ };
288
+ const output = generateCursorSkill(skill);
289
+ expect(output).toContain('Cursor-only content.');
290
+ expect(output).not.toContain('Claude-only content.');
291
+ expect(output).toContain('Universal content.');
292
+ expect(output).not.toContain('<!-- transport:');
293
+ });
294
+ });
295
+ describe('generateClaudeSkillRouter (target filtering)', () => {
296
+ it('includes only skills with matching or no targets', () => {
297
+ const claudeOnly = {
298
+ name: 'claude-skill',
299
+ description: 'Claude only',
300
+ triggers: ['test-claude'],
301
+ body: '# Claude',
302
+ sourcePath: '/tmp/skills/claude-skill.md',
303
+ targets: ['claude'],
304
+ };
305
+ const cursorOnly = {
306
+ name: 'cursor-skill',
307
+ description: 'Cursor only',
308
+ triggers: ['test-cursor'],
309
+ body: '# Cursor',
310
+ sourcePath: '/tmp/skills/cursor-skill.md',
311
+ targets: ['cursor'],
312
+ };
313
+ const universal = {
314
+ name: 'universal-skill',
315
+ description: 'Universal',
316
+ triggers: ['test-universal'],
317
+ body: '# Universal',
318
+ sourcePath: '/tmp/skills/universal-skill.md',
319
+ };
320
+ // Filter skills for Claude (as handshake.ts would do)
321
+ const claudeSkills = [claudeOnly, cursorOnly, universal].filter((s) => shouldEmitToTarget(s, 'claude'));
322
+ const router = generateClaudeSkillRouter(claudeSkills);
323
+ expect(router).toContain('claude-skill');
324
+ expect(router).toContain('universal-skill');
325
+ expect(router).not.toContain('cursor-skill');
326
+ });
327
+ it('skill with targets: [claude] does not appear in Cursor output', () => {
328
+ const claudeOnly = {
329
+ name: 'claude-exclusive',
330
+ description: 'Claude exclusive skill',
331
+ triggers: ['claude-trigger'],
332
+ body: '# Claude Exclusive',
333
+ sourcePath: '/tmp/skills/claude-exclusive.md',
334
+ targets: ['claude'],
335
+ };
336
+ // Filter for Cursor (as handshake.ts would do)
337
+ const cursorSkills = [claudeOnly].filter((s) => shouldEmitToTarget(s, 'cursor'));
338
+ expect(cursorSkills).toHaveLength(0);
339
+ });
340
+ it('skill with no targets appears in both Claude and Cursor output', () => {
341
+ const universal = {
342
+ name: 'universal',
343
+ description: 'Universal skill',
344
+ triggers: ['uni'],
345
+ body: '# Universal',
346
+ sourcePath: '/tmp/skills/universal.md',
347
+ };
348
+ const claudeSkills = [universal].filter((s) => shouldEmitToTarget(s, 'claude'));
349
+ const cursorSkills = [universal].filter((s) => shouldEmitToTarget(s, 'cursor'));
350
+ expect(claudeSkills).toHaveLength(1);
351
+ expect(cursorSkills).toHaveLength(1);
352
+ const router = generateClaudeSkillRouter(claudeSkills);
353
+ expect(router).toContain('universal');
354
+ const cursorOutput = generateCursorSkill(cursorSkills[0]);
355
+ expect(cursorOutput).toContain('universal');
356
+ });
357
+ });
358
+ describe('filterByLevel', () => {
359
+ const items = [
360
+ { name: 'core-item', level: 'core' },
361
+ { name: 'intermediate-item', level: 'intermediate' },
362
+ { name: 'expert-item', level: 'expert' },
363
+ { name: 'no-level-item' },
364
+ ];
365
+ it('filterByLevel("beginner") returns only level:core items + items with no level', () => {
366
+ const result = filterByLevel(items, 'beginner');
367
+ const names = result.map((i) => i.name);
368
+ expect(names).toContain('core-item');
369
+ expect(names).toContain('no-level-item');
370
+ expect(names).not.toContain('intermediate-item');
371
+ expect(names).not.toContain('expert-item');
372
+ expect(result).toHaveLength(2);
373
+ });
374
+ it('filterByLevel("intermediate") returns core + intermediate + no level', () => {
375
+ const result = filterByLevel(items, 'intermediate');
376
+ const names = result.map((i) => i.name);
377
+ expect(names).toContain('core-item');
378
+ expect(names).toContain('intermediate-item');
379
+ expect(names).toContain('no-level-item');
380
+ expect(names).not.toContain('expert-item');
381
+ expect(result).toHaveLength(3);
382
+ });
383
+ it('filterByLevel("expert") returns all items', () => {
384
+ const result = filterByLevel(items, 'expert');
385
+ expect(result).toHaveLength(4);
386
+ });
387
+ it('filterByLevel(undefined) returns all items (backward compat)', () => {
388
+ const result = filterByLevel(items, undefined);
389
+ expect(result).toHaveLength(4);
390
+ });
391
+ it('filterByLevel(null-ish) returns all items (backward compat)', () => {
392
+ const result = filterByLevel(items);
393
+ expect(result).toHaveLength(4);
394
+ });
395
+ it('unknown level throws an error', () => {
396
+ expect(() => filterByLevel(items, 'unknown')).toThrow('Unknown level "unknown"');
397
+ });
398
+ });
399
+ //# sourceMappingURL=portable-knowledge.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portable-knowledge.test.js","sourceRoot":"","sources":["../../src/generators/portable-knowledge.test.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Product Brain CLI — read-only Chain knowledge in the terminal.
4
- * BET-108 Slice 0: pb orient
3
+ * Product Brain CLI — Chain knowledge + write-back in the terminal.
4
+ * Read: BET-108. Write: pb session + pb capture (TEN-27, INS-80).
5
+ * BET-181 Slice 0: global --json / --pretty flags for agent-native output (DEC-299).
5
6
  */
6
7
  export {};
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG"}