@productbrain/cli 0.1.0-beta.36 → 0.1.0-beta.38

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 (100) hide show
  1. package/dist/__tests__/experiment.test.d.ts +6 -0
  2. package/dist/__tests__/experiment.test.d.ts.map +1 -0
  3. package/dist/__tests__/experiment.test.js +69 -0
  4. package/dist/__tests__/experiment.test.js.map +1 -0
  5. package/dist/__tests__/onboarding-path-b.test.d.ts +2 -0
  6. package/dist/__tests__/onboarding-path-b.test.d.ts.map +1 -0
  7. package/dist/__tests__/onboarding-path-b.test.js +46 -0
  8. package/dist/__tests__/onboarding-path-b.test.js.map +1 -0
  9. package/dist/__tests__/onboarding.test.js +242 -89
  10. package/dist/__tests__/onboarding.test.js.map +1 -1
  11. package/dist/__tests__/setup.test.js +15 -6
  12. package/dist/__tests__/setup.test.js.map +1 -1
  13. package/dist/commands/connect-integration.test.d.ts +7 -0
  14. package/dist/commands/connect-integration.test.d.ts.map +1 -0
  15. package/dist/commands/connect-integration.test.js +148 -0
  16. package/dist/commands/connect-integration.test.js.map +1 -0
  17. package/dist/commands/connect.d.ts +17 -0
  18. package/dist/commands/connect.d.ts.map +1 -0
  19. package/dist/commands/connect.js +280 -0
  20. package/dist/commands/connect.js.map +1 -0
  21. package/dist/commands/connect.test.d.ts +6 -0
  22. package/dist/commands/connect.test.d.ts.map +1 -0
  23. package/dist/commands/connect.test.js +230 -0
  24. package/dist/commands/connect.test.js.map +1 -0
  25. package/dist/commands/handshake.d.ts +2 -0
  26. package/dist/commands/handshake.d.ts.map +1 -1
  27. package/dist/commands/handshake.js +20 -5
  28. package/dist/commands/handshake.js.map +1 -1
  29. package/dist/commands/setup.d.ts.map +1 -1
  30. package/dist/commands/setup.js +29 -2
  31. package/dist/commands/setup.js.map +1 -1
  32. package/dist/generators/chain-classifier.d.ts +1 -1
  33. package/dist/generators/chain-classifier.d.ts.map +1 -1
  34. package/dist/generators/context-md.d.ts +1 -1
  35. package/dist/generators/context-md.d.ts.map +1 -1
  36. package/dist/generators/context-md.js +12 -1
  37. package/dist/generators/context-md.js.map +1 -1
  38. package/dist/index.js +14 -2
  39. package/dist/index.js.map +1 -1
  40. package/dist/lib/config.d.ts +1 -0
  41. package/dist/lib/config.d.ts.map +1 -1
  42. package/dist/lib/config.js +25 -1
  43. package/dist/lib/config.js.map +1 -1
  44. package/dist/lib/conversation-engine.d.ts +22 -27
  45. package/dist/lib/conversation-engine.d.ts.map +1 -1
  46. package/dist/lib/conversation-engine.js +58 -80
  47. package/dist/lib/conversation-engine.js.map +1 -1
  48. package/dist/lib/conversation-phases.d.ts +22 -37
  49. package/dist/lib/conversation-phases.d.ts.map +1 -1
  50. package/dist/lib/conversation-phases.js +4 -4
  51. package/dist/lib/conversation-signals.d.ts +3 -0
  52. package/dist/lib/conversation-signals.d.ts.map +1 -1
  53. package/dist/lib/conversation-signals.js +14 -3
  54. package/dist/lib/conversation-signals.js.map +1 -1
  55. package/dist/lib/experiment.d.ts +18 -0
  56. package/dist/lib/experiment.d.ts.map +1 -0
  57. package/dist/lib/experiment.js +28 -0
  58. package/dist/lib/experiment.js.map +1 -0
  59. package/dist/lib/onboarding-path-b.d.ts +10 -0
  60. package/dist/lib/onboarding-path-b.d.ts.map +1 -0
  61. package/dist/lib/onboarding-path-b.js +214 -0
  62. package/dist/lib/onboarding-path-b.js.map +1 -0
  63. package/dist/lib/onboarding-phases.js +1 -1
  64. package/dist/lib/onboarding-shared.d.ts +81 -0
  65. package/dist/lib/onboarding-shared.d.ts.map +1 -0
  66. package/dist/lib/onboarding-shared.js +190 -0
  67. package/dist/lib/onboarding-shared.js.map +1 -0
  68. package/dist/lib/onboarding-topics.d.ts +27 -0
  69. package/dist/lib/onboarding-topics.d.ts.map +1 -0
  70. package/dist/lib/onboarding-topics.js +57 -0
  71. package/dist/lib/onboarding-topics.js.map +1 -0
  72. package/dist/lib/onboarding.d.ts +3 -3
  73. package/dist/lib/onboarding.d.ts.map +1 -1
  74. package/dist/lib/onboarding.js +109 -240
  75. package/dist/lib/onboarding.js.map +1 -1
  76. package/dist/lib/profiles.d.ts +5 -0
  77. package/dist/lib/profiles.d.ts.map +1 -1
  78. package/dist/lib/profiles.js +7 -0
  79. package/dist/lib/profiles.js.map +1 -1
  80. package/dist/lib/telemetry.d.ts +5 -5
  81. package/dist/lib/telemetry.d.ts.map +1 -1
  82. package/dist/lib/telemetry.js +34 -16
  83. package/dist/lib/telemetry.js.map +1 -1
  84. package/dist/lib/wizard-surfaces.d.ts +47 -0
  85. package/dist/lib/wizard-surfaces.d.ts.map +1 -0
  86. package/dist/lib/wizard-surfaces.js +176 -0
  87. package/dist/lib/wizard-surfaces.js.map +1 -0
  88. package/dist/lib/wizard-surfaces.test.d.ts +2 -0
  89. package/dist/lib/wizard-surfaces.test.d.ts.map +1 -0
  90. package/dist/lib/wizard-surfaces.test.js +127 -0
  91. package/dist/lib/wizard-surfaces.test.js.map +1 -0
  92. package/dist/lib/wizard-trust.d.ts +31 -0
  93. package/dist/lib/wizard-trust.d.ts.map +1 -0
  94. package/dist/lib/wizard-trust.js +66 -0
  95. package/dist/lib/wizard-trust.js.map +1 -0
  96. package/dist/lib/wizard-trust.test.d.ts +2 -0
  97. package/dist/lib/wizard-trust.test.d.ts.map +1 -0
  98. package/dist/lib/wizard-trust.test.js +32 -0
  99. package/dist/lib/wizard-trust.test.js.map +1 -0
  100. package/package.json +1 -1
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Tests for experiment assignment (WP-304).
3
+ * Verifies deterministic, roughly even distribution.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=experiment.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experiment.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/experiment.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Tests for experiment assignment (WP-304).
3
+ * Verifies deterministic, roughly even distribution.
4
+ */
5
+ import { describe, it, expect } from 'vitest';
6
+ import { assignOnboardingPath, fnv1aHash, isExperimentActive } from '../lib/experiment.js';
7
+ describe('fnv1aHash', () => {
8
+ it('returns a positive integer', () => {
9
+ const hash = fnv1aHash('test-workspace-id');
10
+ expect(hash).toBeGreaterThanOrEqual(0);
11
+ expect(Number.isInteger(hash)).toBe(true);
12
+ });
13
+ it('is deterministic — same input produces same output', () => {
14
+ const id = 'workspace-abc-123';
15
+ expect(fnv1aHash(id)).toBe(fnv1aHash(id));
16
+ });
17
+ it('produces different hashes for different inputs', () => {
18
+ expect(fnv1aHash('workspace-a')).not.toBe(fnv1aHash('workspace-b'));
19
+ });
20
+ });
21
+ describe('assignOnboardingPath', () => {
22
+ it('returns A or B', () => {
23
+ const path = assignOnboardingPath('test-id');
24
+ expect(['A', 'B']).toContain(path);
25
+ });
26
+ it('is deterministic — same workspace always gets same path', () => {
27
+ const id = 'workspace-xyz';
28
+ const path1 = assignOnboardingPath(id);
29
+ const path2 = assignOnboardingPath(id);
30
+ expect(path1).toBe(path2);
31
+ });
32
+ it('produces both paths across varied workspace IDs', () => {
33
+ const paths = new Set();
34
+ // Use Convex-style IDs (alphanumeric hashes) for realistic distribution
35
+ const sampleIds = [
36
+ 'pd75hg0tz0dc0zsykxk1kef8ss81xff1',
37
+ 'a919963b8efd0edb6abc123def456789',
38
+ 'ab84fc69e35f10c04123456789abcdef',
39
+ 'k570x9npnvr5thzkf6rdq6a5ds81tygd',
40
+ 'rd7axryrw3f8aqgzmkmwmpw1vs84hrxb',
41
+ 'p979346p4js7mvw60yxk5ch2pd81t95n',
42
+ 'x1y2z3a4b5c6d7e8f9g0h1i2j3k4l5m6',
43
+ 'aaaa1111bbbb2222cccc3333dddd4444',
44
+ ];
45
+ for (const id of sampleIds) {
46
+ paths.add(assignOnboardingPath(id));
47
+ }
48
+ // Must produce both A and B across varied inputs
49
+ expect(paths.has('A')).toBe(true);
50
+ expect(paths.has('B')).toBe(true);
51
+ });
52
+ });
53
+ describe('isExperimentActive', () => {
54
+ it('returns false by default', () => {
55
+ delete process.env.PB_EXPERIMENT_304;
56
+ expect(isExperimentActive()).toBe(false);
57
+ });
58
+ it('returns true when PB_EXPERIMENT_304=1', () => {
59
+ process.env.PB_EXPERIMENT_304 = '1';
60
+ expect(isExperimentActive()).toBe(true);
61
+ delete process.env.PB_EXPERIMENT_304;
62
+ });
63
+ it('returns false for non-1 values', () => {
64
+ process.env.PB_EXPERIMENT_304 = 'true';
65
+ expect(isExperimentActive()).toBe(false);
66
+ delete process.env.PB_EXPERIMENT_304;
67
+ });
68
+ });
69
+ //# sourceMappingURL=experiment.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experiment.test.js","sourceRoot":"","sources":["../../src/__tests__/experiment.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE3F,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,IAAI,GAAG,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,EAAE,GAAG,mBAAmB,CAAC;QAC/B,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,gBAAgB,EAAE,GAAG,EAAE;QACxB,MAAM,IAAI,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,EAAE,GAAG,eAAe,CAAC;QAC3B,MAAM,KAAK,GAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,wEAAwE;QACxE,MAAM,SAAS,GAAG;YAChB,kCAAkC;YAClC,kCAAkC;YAClC,kCAAkC;YAClC,kCAAkC;YAClC,kCAAkC;YAClC,kCAAkC;YAClC,kCAAkC;YAClC,kCAAkC;SACnC,CAAC;QACF,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,iDAAiD;QACjD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACrC,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC;QACpC,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC;QACvC,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=onboarding-path-b.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-path-b.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/onboarding-path-b.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { mergeExtractions, dedupe } from '../lib/onboarding-path-b.js';
3
+ describe('Path B onboarding', () => {
4
+ describe('mergeExtractions', () => {
5
+ it('second extraction vision wins over first', () => {
6
+ const merged = mergeExtractions({ vision: 'first vision' }, { vision: 'second vision' });
7
+ expect(merged.vision).toBe('second vision');
8
+ });
9
+ it('falls back to first vision if second is empty', () => {
10
+ const merged = mergeExtractions({ vision: 'first vision' }, { vision: '' });
11
+ expect(merged.vision).toBe('first vision');
12
+ });
13
+ it('concatenates and deduplicates arrays', () => {
14
+ const merged = mergeExtractions({ vision: 'v', techStack: ['React', 'Node'] }, { vision: 'v', techStack: ['Node', 'Svelte'] });
15
+ expect(merged.techStack).toHaveLength(3);
16
+ expect(merged.techStack).toContain('React');
17
+ expect(merged.techStack).toContain('Svelte');
18
+ });
19
+ it('handles null first extraction', () => {
20
+ const merged = mergeExtractions(null, { vision: 'only vision' });
21
+ expect(merged.vision).toBe('only vision');
22
+ });
23
+ it('merges multiple array fields independently', () => {
24
+ const merged = mergeExtractions({ vision: 'v', keyTerms: ['API'], tensions: ['scaling'] }, { vision: 'v', keyTerms: ['SDK'], keyDecisions: ['use REST'] });
25
+ expect(merged.keyTerms).toEqual(['API', 'SDK']);
26
+ expect(merged.tensions).toEqual(['scaling']);
27
+ expect(merged.keyDecisions).toEqual(['use REST']);
28
+ });
29
+ });
30
+ describe('dedupe', () => {
31
+ it('removes case-insensitive duplicates', () => {
32
+ expect(dedupe(['React', 'react', 'Vue'])).toHaveLength(2);
33
+ });
34
+ it('preserves original casing of first occurrence', () => {
35
+ const result = dedupe(['TypeScript', 'typescript']);
36
+ expect(result[0]).toBe('TypeScript');
37
+ });
38
+ it('returns empty array for empty input', () => {
39
+ expect(dedupe([])).toEqual([]);
40
+ });
41
+ it('handles single-element arrays', () => {
42
+ expect(dedupe(['React'])).toEqual(['React']);
43
+ });
44
+ });
45
+ });
46
+ //# sourceMappingURL=onboarding-path-b.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding-path-b.test.js","sourceRoot":"","sources":["../../src/__tests__/onboarding-path-b.test.ts"],"names":[],"mappings":"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"}
@@ -3,17 +3,10 @@
3
3
  * WP-304: extractionToEntries, signal detection, phase engine, post-processing.
4
4
  */
5
5
  import { describe, it, expect } from 'vitest';
6
- // ── Helpers under test (copied for unit testing) ────────────────────────────
7
- // SYNC: Must match packages/cli/src/lib/*.ts
8
- function truncate(str, maxLen) {
9
- return str.length <= maxLen ? str : str.slice(0, maxLen);
10
- }
11
- function firstNWords(str, n) {
12
- return str.split(/\s+/).slice(0, n).join(' ');
13
- }
14
- function countWords(text) {
15
- return text.trim().split(/\s+/).filter(Boolean).length;
16
- }
6
+ import { truncate, firstNWords, countWords, validateExtractedEntries, } from '../lib/onboarding-shared.js';
7
+ import { detectSignals } from '../lib/conversation-signals.js';
8
+ import { buildTopicDirective, evaluateTopic, shouldSkipTopic } from '../lib/conversation-engine.js';
9
+ import { ONBOARDING_TOPICS } from '../lib/onboarding-topics.js';
17
10
  // Signal detection patterns (from conversation-signals.ts)
18
11
  const PRODUCT_PATTERNS = [
19
12
  /\b(?:building|making|creating|working on|developing)\b/i,
@@ -29,6 +22,10 @@ const WHY_PB_PATTERNS = [
29
22
  /\b(?:context|memory|decisions?|knowledge|source of truth|ssot)\b/i,
30
23
  /\b(?:ai|llm|claude|cursor|copilot|agent)\b.*\b(?:context|remember|forget|know)\b/i,
31
24
  /\b(?:remember|forget|consistent|prompt)\b.*\b(?:ai|llm|agent|tool)\b/i,
25
+ // Broader: user describes the problem PB solves without naming PB
26
+ /\b(?:re-?explain|repeat myself|start from (?:zero|scratch)|re-?tell)\b/i,
27
+ /\b(?:docs?|documentation|md files?)\b.*\b(?:outdated|stale|rot|drift|wrong|maintain)\b/i,
28
+ /\b(?:cost|waste|spend)\b.*\b(?:tokens?|context|time)\b.*\b(?:re-?explain|repeat|maintain)\b/i,
32
29
  ];
33
30
  function detectSignal(patterns, text) {
34
31
  return patterns.some((p) => p.test(text));
@@ -47,40 +44,6 @@ function sanitizeResponse(text) {
47
44
  }
48
45
  return cleaned.replace(/\s{2,}/g, ' ').replace(/^\s*[.,]\s*/, '').trim();
49
46
  }
50
- function extractionToEntries(extracted) {
51
- const entries = [];
52
- if (extracted.vision?.trim()) {
53
- entries.push({ collection: 'strategy', name: 'Product Vision', description: extracted.vision });
54
- }
55
- if (extracted.audience) {
56
- entries.push({ collection: 'audiences', name: firstNWords(extracted.audience, 6), description: extracted.audience });
57
- }
58
- if (extracted.techStack?.length) {
59
- entries.push({ collection: 'architecture', name: 'Tech Stack', description: `Technology choices: ${extracted.techStack.join(', ')}` });
60
- for (const tech of extracted.techStack.slice(0, 3)) {
61
- entries.push({ collection: 'glossary', name: tech, description: `${tech} — part of the tech stack` });
62
- }
63
- }
64
- if (extracted.keyTerms?.length) {
65
- for (const term of extracted.keyTerms) {
66
- const alreadyAdded = entries.some((e) => e.collection === 'glossary' && e.name.toLowerCase() === term.toLowerCase());
67
- if (!alreadyAdded) {
68
- entries.push({ collection: 'glossary', name: term, description: `Core domain term: ${term}` });
69
- }
70
- }
71
- }
72
- if (extracted.keyDecisions?.length) {
73
- for (const decision of extracted.keyDecisions) {
74
- entries.push({ collection: 'decisions', name: truncate(decision, 80), description: decision });
75
- }
76
- }
77
- if (extracted.tensions?.length) {
78
- for (const tension of extracted.tensions) {
79
- entries.push({ collection: 'tensions', name: truncate(tension, 80), description: tension });
80
- }
81
- }
82
- return entries;
83
- }
84
47
  // ── Tests ───────────────────────────────────────────────────────────────────
85
48
  describe('truncate', () => {
86
49
  it('returns string unchanged when within limit', () => {
@@ -110,7 +73,7 @@ describe('countWords', () => {
110
73
  expect(countWords(' ')).toBe(0);
111
74
  });
112
75
  });
113
- describe('signal detection', () => {
76
+ describe('signal detection (pattern matching)', () => {
114
77
  it('detects product mentions', () => {
115
78
  expect(detectSignal(PRODUCT_PATTERNS, 'I am building an app for accounting')).toBe(true);
116
79
  expect(detectSignal(PRODUCT_PATTERNS, 'something big')).toBe(false);
@@ -125,6 +88,38 @@ describe('signal detection', () => {
125
88
  expect(detectSignal(WHY_PB_PATTERNS, 'we need a source of truth for decisions')).toBe(true);
126
89
  expect(detectSignal(WHY_PB_PATTERNS, 'I just saw an ad')).toBe(false);
127
90
  });
91
+ it('detects why-PB from reexplaining pattern', () => {
92
+ expect(detectSignal(WHY_PB_PATTERNS, 'i have to reexplain everything to my ai tools')).toBe(true);
93
+ });
94
+ it('detects why-PB from outdated docs pattern', () => {
95
+ expect(detectSignal(WHY_PB_PATTERNS, 'my md docs get outdated quickly')).toBe(true);
96
+ });
97
+ });
98
+ describe('detectSignals (integrated thresholds)', () => {
99
+ it('requires >= 10 words for mentionedProduct — short pattern match is not enough', () => {
100
+ const shortMsg = [{ role: 'user', content: 'I am building an app' }]; // 5 words, pattern matches
101
+ expect(detectSignals(shortMsg).mentionedProduct).toBe(false);
102
+ const longMsg = [{ role: 'user', content: 'I am building an app that connects to Revolut for bank transactions' }]; // 12 words
103
+ expect(detectSignals(longMsg).mentionedProduct).toBe(true);
104
+ });
105
+ it('requires >= 15 words for hasSubstantiveAnswer', () => {
106
+ const shortMsg = [{ role: 'user', content: 'it connects to revolut and gets my bank transactions automatically' }]; // 10 words
107
+ expect(detectSignals(shortMsg).hasSubstantiveAnswer).toBe(false);
108
+ const longMsg = [{ role: 'user', content: 'it connects to revolut and gets my bank transactions then matches them to invoices from gmail automatically' }]; // 17 words
109
+ expect(detectSignals(longMsg).hasSubstantiveAnswer).toBe(true);
110
+ });
111
+ it('counts substantive messages as >= 8 words', () => {
112
+ const msgs = [
113
+ { role: 'user', content: 'a cool app' }, // 3 words — not substantive
114
+ { role: 'user', content: 'me and my team use it daily for tracking' }, // 9 words — substantive
115
+ { role: 'user', content: 'yes' }, // 1 word — not substantive
116
+ ];
117
+ expect(detectSignals(msgs).substantiveMessageCount).toBe(1);
118
+ });
119
+ it('does not flag mentionedProduct without a pattern match even with many words', () => {
120
+ const noPattern = [{ role: 'user', content: 'I just want to try this out and see how it goes for my daily workflow' }]; // 16 words, no product pattern
121
+ expect(detectSignals(noPattern).mentionedProduct).toBe(false);
122
+ });
128
123
  });
129
124
  describe('sanitizeResponse', () => {
130
125
  it('strips "sounds like"', () => {
@@ -140,55 +135,213 @@ describe('sanitizeResponse', () => {
140
135
  expect(sanitizeResponse('What problem are you trying to solve?')).toBe('What problem are you trying to solve?');
141
136
  });
142
137
  });
143
- describe('extractionToEntries', () => {
144
- it('returns empty array for blank vision', () => {
145
- expect(extractionToEntries({ vision: ' ' })).toEqual([]);
138
+ describe('validateExtractedEntries', () => {
139
+ it('returns empty array for non-array input', () => {
140
+ expect(validateExtractedEntries(null)).toEqual([]);
141
+ expect(validateExtractedEntries(undefined)).toEqual([]);
142
+ });
143
+ it('returns empty array for empty entries', () => {
144
+ expect(validateExtractedEntries([])).toEqual([]);
146
145
  });
147
- it('maps vision-only extraction', () => {
148
- const result = extractionToEntries({ vision: 'Build the best product tool' });
146
+ it('validates and passes through well-formed entries', () => {
147
+ const result = validateExtractedEntries([
148
+ { collection: 'strategy', name: 'Product Vision', description: 'Automate bank transactions', typeLabel: "What you're building" },
149
+ ]);
149
150
  expect(result).toHaveLength(1);
150
- expect(result[0].collection).toBe('strategy');
151
- });
152
- it('maps full extraction to correct collections', () => {
153
- const result = extractionToEntries({
154
- vision: 'AI-powered product intelligence',
155
- audience: 'Solo product builders who ship fast',
156
- techStack: ['SvelteKit', 'Convex', 'TypeScript'],
157
- keyTerms: ['Chain', 'Product Brain'],
158
- keyDecisions: ['Go with Convex over Supabase'],
159
- tensions: ['Onboarding is too complex'],
160
- });
161
- const collections = result.map((e) => e.collection);
162
- expect(collections).toContain('strategy');
163
- expect(collections).toContain('audiences');
164
- expect(collections).toContain('architecture');
165
- expect(collections).toContain('glossary');
166
- expect(collections).toContain('decisions');
167
- expect(collections).toContain('tensions');
168
- });
169
- it('caps tech stack glossary at 3', () => {
170
- const result = extractionToEntries({
171
- vision: 'A tool',
172
- techStack: ['React', 'Vue', 'Angular', 'Svelte', 'Solid'],
151
+ expect(result[0].name).toBe('Product Vision');
152
+ expect(result[0].description).toBe('Automate bank transactions');
153
+ expect(result[0].typeLabel).toBe("What you're building");
154
+ });
155
+ it('rejects entries with invalid collection', () => {
156
+ const result = validateExtractedEntries([
157
+ { collection: 'invalid', name: 'Something Good', description: 'desc', typeLabel: 'label' },
158
+ ]);
159
+ expect(result).toEqual([]);
160
+ });
161
+ it('rejects entries with empty name or description', () => {
162
+ const result = validateExtractedEntries([
163
+ { collection: 'strategy', name: '', description: 'desc', typeLabel: 'label' },
164
+ { collection: 'strategy', name: 'Some Name', description: '', typeLabel: 'label' },
165
+ ]);
166
+ expect(result).toEqual([]);
167
+ });
168
+ it('deduplicates by name (case-insensitive)', () => {
169
+ const result = validateExtractedEntries([
170
+ { collection: 'glossary', name: 'Supabase', description: 'Database option', typeLabel: 'Term' },
171
+ { collection: 'glossary', name: 'supabase', description: 'Another desc', typeLabel: 'Term' },
172
+ ]);
173
+ expect(result).toHaveLength(1);
174
+ });
175
+ it('caps at 7 entries', () => {
176
+ const entries = Array.from({ length: 10 }, (_, i) => ({
177
+ collection: 'tensions',
178
+ name: `Challenge number ${i + 1}`,
179
+ description: `Description ${i + 1}`,
180
+ typeLabel: 'A challenge',
181
+ }));
182
+ expect(validateExtractedEntries(entries)).toHaveLength(7);
183
+ });
184
+ it('truncates long names to 120 chars', () => {
185
+ const longName = 'A '.repeat(100);
186
+ const result = validateExtractedEntries([
187
+ { collection: 'decisions', name: longName, description: 'desc', typeLabel: 'label' },
188
+ ]);
189
+ expect(result[0].name.length).toBeLessThanOrEqual(120);
190
+ });
191
+ it('skips single-word names except for glossary', () => {
192
+ const result = validateExtractedEntries([
193
+ { collection: 'strategy', name: 'Vision', description: 'desc', typeLabel: 'label' },
194
+ { collection: 'glossary', name: 'Supabase', description: 'A database', typeLabel: 'Term' },
195
+ ]);
196
+ expect(result).toHaveLength(1);
197
+ expect(result[0].collection).toBe('glossary');
198
+ });
199
+ it('falls back to collection name when typeLabel is empty', () => {
200
+ const result = validateExtractedEntries([
201
+ { collection: 'strategy', name: 'Product Vision', description: 'desc', typeLabel: '' },
202
+ ]);
203
+ expect(result[0].typeLabel).toBe('strategy');
204
+ });
205
+ it('passes descriptions through without template wrapping', () => {
206
+ const result = validateExtractedEntries([
207
+ { collection: 'architecture', name: 'Evaluating supabase vs liteSQL', description: 'Need to decide between liteSQL and supabase for production', typeLabel: 'A technology choice' },
208
+ ]);
209
+ expect(result[0].description).toBe('Need to decide between liteSQL and supabase for production');
210
+ expect(result[0].description).not.toContain('Technology choices:');
211
+ expect(result[0].description).not.toContain('part of the tech stack');
212
+ });
213
+ });
214
+ // ── Coach pattern: topic engine ─────────────────────────────────────────────
215
+ function makeState(overrides = {}) {
216
+ return {
217
+ messages: [],
218
+ userMessageCount: 0,
219
+ totalUserWords: 0,
220
+ topicExchanges: {},
221
+ phaseExchanges: {},
222
+ completedTopics: new Set(),
223
+ completedPhases: new Set(),
224
+ currentTopicId: 'why_here',
225
+ currentPhaseId: 'why_here',
226
+ completedQA: [],
227
+ signals: {
228
+ mentionedProduct: false,
229
+ mentionedChallenge: false,
230
+ mentionedWhyPB: false,
231
+ hasSubstantiveAnswer: false,
232
+ substantiveMessageCount: 0,
233
+ },
234
+ refusalStreak: 0,
235
+ ...overrides,
236
+ };
237
+ }
238
+ describe('shouldSkipTopic', () => {
239
+ it('returns false when skipIfSignal is null (always runs)', () => {
240
+ const topic = ONBOARDING_TOPICS[0]; // why_here — skipIfSignal: null
241
+ expect(shouldSkipTopic(topic, makeState().signals, 50)).toBe(false);
242
+ });
243
+ it('returns true when skipIfSignal is present and enough words', () => {
244
+ const topic = ONBOARDING_TOPICS[1]; // what_they_build — skipIfSignal: mentionedProduct
245
+ const signals = { ...makeState().signals, mentionedProduct: true };
246
+ expect(shouldSkipTopic(topic, signals, 25)).toBe(true);
247
+ });
248
+ it('returns false when skipIfSignal is not present', () => {
249
+ const topic = ONBOARDING_TOPICS[1]; // what_they_build — skipIfSignal: mentionedProduct
250
+ expect(shouldSkipTopic(topic, makeState().signals, 50)).toBe(false);
251
+ });
252
+ it('returns false when content is too thin even if signal is present', () => {
253
+ const topic = ONBOARDING_TOPICS[1]; // what_they_build — skipIfSignal: mentionedProduct
254
+ const signals = { ...makeState().signals, mentionedProduct: true };
255
+ expect(shouldSkipTopic(topic, signals, 10)).toBe(false); // < 20 words
256
+ });
257
+ });
258
+ describe('evaluateTopic', () => {
259
+ const topic = ONBOARDING_TOPICS[1]; // what_they_build — maxExchanges: 2, heuristic: mentionedProduct
260
+ it('skips when skipIfSignal is present and enough words', () => {
261
+ const state = makeState({ totalUserWords: 25, signals: { ...makeState().signals, mentionedProduct: true } });
262
+ const result = evaluateTopic(topic, state, false);
263
+ expect(result).toEqual({ complete: true, forced: false, skip: true });
264
+ });
265
+ it('completes when LLM says complete and at least 1 exchange', () => {
266
+ const state = makeState({ topicExchanges: { what_they_build: 1 } });
267
+ const result = evaluateTopic(topic, state, true);
268
+ expect(result).toEqual({ complete: true, forced: false, skip: false });
269
+ });
270
+ it('does NOT complete when LLM says complete but 0 exchanges', () => {
271
+ const state = makeState();
272
+ const result = evaluateTopic(topic, state, true);
273
+ expect(result).toEqual({ complete: false, forced: false, skip: false });
274
+ });
275
+ it('completes via heuristic backup when signal present but low words (no skip)', () => {
276
+ const state = makeState({
277
+ topicExchanges: { what_they_build: 1 },
278
+ signals: { ...makeState().signals, mentionedProduct: true },
173
279
  });
174
- const glossary = result.filter((e) => e.collection === 'glossary');
175
- expect(glossary).toHaveLength(3);
176
- });
177
- it('deduplicates glossary terms', () => {
178
- const result = extractionToEntries({
179
- vision: 'A tool',
180
- techStack: ['TypeScript'],
181
- keyTerms: ['TypeScript', 'Chain'],
280
+ // totalUserWords=0 < 20, so skip is blocked, but heuristic still completes the topic
281
+ const result = evaluateTopic(topic, state, false);
282
+ expect(result).toEqual({ complete: true, forced: false, skip: false });
283
+ });
284
+ it('forces completion at maxExchanges', () => {
285
+ const state = makeState({ topicExchanges: { what_they_build: 2 } });
286
+ const result = evaluateTopic(topic, state, false);
287
+ expect(result).toEqual({ complete: true, forced: true, skip: false });
288
+ });
289
+ it('continues when nothing is met', () => {
290
+ const state = makeState({ topicExchanges: { what_they_build: 1 } });
291
+ const result = evaluateTopic(topic, state, false);
292
+ expect(result).toEqual({ complete: false, forced: false, skip: false });
293
+ });
294
+ });
295
+ describe('evaluateTopic — why_here (no skip)', () => {
296
+ const topic = ONBOARDING_TOPICS[0]; // why_here — heuristic: hasSubstantiveAnswer
297
+ it('completes via heuristic when hasSubstantiveAnswer', () => {
298
+ const state = makeState({
299
+ topicExchanges: { why_here: 1 },
300
+ signals: { ...makeState().signals, hasSubstantiveAnswer: true },
182
301
  });
183
- const glossary = result.filter((e) => e.collection === 'glossary');
184
- expect(glossary).toHaveLength(2);
302
+ const result = evaluateTopic(topic, state, false);
303
+ expect(result).toEqual({ complete: true, forced: false, skip: false });
185
304
  });
186
- it('handles null optional fields', () => {
187
- const result = extractionToEntries({
188
- vision: 'A product',
189
- audience: null, techStack: null, keyTerms: null, keyDecisions: null, tensions: null,
305
+ it('never skips (skipIfSignal is null)', () => {
306
+ const state = makeState({
307
+ signals: { ...makeState().signals, hasSubstantiveAnswer: true, mentionedProduct: true, mentionedChallenge: true },
190
308
  });
191
- expect(result).toHaveLength(1);
309
+ const result = evaluateTopic(topic, state, false);
310
+ // Even with all signals true, why_here doesn't skip — it always runs
311
+ // But it completes via heuristic if exchanges >= 1
312
+ expect(result.skip).toBe(false);
313
+ });
314
+ });
315
+ describe('buildTopicDirective', () => {
316
+ it('renders XML with goal, behaviour, criteria', () => {
317
+ const topic = ONBOARDING_TOPICS[0];
318
+ const result = buildTopicDirective(topic, 0, 3, [], 'TestWorkspace');
319
+ expect(result).toContain('<topic id="why_here" index="1" of="3">');
320
+ expect(result).toContain('<goal>');
321
+ expect(result).toContain('<behaviour>');
322
+ expect(result).toContain('<criteria>');
323
+ expect(result).toContain('</topic>');
324
+ });
325
+ it('includes topic behaviour text', () => {
326
+ const topic = ONBOARDING_TOPICS[0];
327
+ const result = buildTopicDirective(topic, 0, 3, [], 'Acme Corp');
328
+ expect(result).toContain('Hey, what brings you to Product Brain?');
329
+ });
330
+ it('includes accumulated_context when completedQA is non-empty', () => {
331
+ const qa = [
332
+ { topicId: 'why_here', question: 'What brings you here?', answer: 'Building a finance tool' },
333
+ ];
334
+ const topic = ONBOARDING_TOPICS[1];
335
+ const result = buildTopicDirective(topic, 1, 3, qa, 'TestWS');
336
+ expect(result).toContain('<accumulated_context>');
337
+ expect(result).toContain('<topic_qa id="why_here">');
338
+ expect(result).toContain('Building a finance tool');
339
+ expect(result).toContain('</accumulated_context>');
340
+ });
341
+ it('omits accumulated_context when completedQA is empty', () => {
342
+ const topic = ONBOARDING_TOPICS[0];
343
+ const result = buildTopicDirective(topic, 0, 3, [], 'TestWS');
344
+ expect(result).not.toContain('<accumulated_context>');
192
345
  });
193
346
  });
194
347
  //# sourceMappingURL=onboarding.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"onboarding.test.js","sourceRoot":"","sources":["../../src/__tests__/onboarding.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"onboarding.test.js","sourceRoot":"","sources":["../../src/__tests__/onboarding.test.ts"],"names":[],"mappings":"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"}