@productbrain/cli 0.1.0-beta.35 → 0.1.0-beta.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/capture.test.js +22 -0
- package/dist/__tests__/capture.test.js.map +1 -1
- package/dist/__tests__/experiment.test.d.ts +6 -0
- package/dist/__tests__/experiment.test.d.ts.map +1 -0
- package/dist/__tests__/experiment.test.js +69 -0
- package/dist/__tests__/experiment.test.js.map +1 -0
- package/dist/__tests__/onboarding-path-b.test.d.ts +2 -0
- package/dist/__tests__/onboarding-path-b.test.d.ts.map +1 -0
- package/dist/__tests__/onboarding-path-b.test.js +46 -0
- package/dist/__tests__/onboarding-path-b.test.js.map +1 -0
- package/dist/__tests__/onboarding.test.d.ts +1 -1
- package/dist/__tests__/onboarding.test.js +304 -156
- package/dist/__tests__/onboarding.test.js.map +1 -1
- package/dist/__tests__/setup.test.js +22 -74
- package/dist/__tests__/setup.test.js.map +1 -1
- package/dist/commands/connect-integration.test.d.ts +7 -0
- package/dist/commands/connect-integration.test.d.ts.map +1 -0
- package/dist/commands/connect-integration.test.js +148 -0
- package/dist/commands/connect-integration.test.js.map +1 -0
- package/dist/commands/connect.d.ts +17 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +280 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/connect.test.d.ts +6 -0
- package/dist/commands/connect.test.d.ts.map +1 -0
- package/dist/commands/connect.test.js +230 -0
- package/dist/commands/connect.test.js.map +1 -0
- package/dist/commands/handshake.d.ts +2 -0
- package/dist/commands/handshake.d.ts.map +1 -1
- package/dist/commands/handshake.js +20 -5
- package/dist/commands/handshake.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +57 -81
- package/dist/commands/setup.js.map +1 -1
- package/dist/generators/context-md.d.ts +1 -1
- package/dist/generators/context-md.d.ts.map +1 -1
- package/dist/generators/context-md.js +12 -1
- package/dist/generators/context-md.js.map +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +25 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/conversation-engine.d.ts +45 -0
- package/dist/lib/conversation-engine.d.ts.map +1 -0
- package/dist/lib/conversation-engine.js +112 -0
- package/dist/lib/conversation-engine.js.map +1 -0
- package/dist/lib/conversation-phases.d.ts +59 -0
- package/dist/lib/conversation-phases.d.ts.map +1 -0
- package/dist/lib/conversation-phases.js +11 -0
- package/dist/lib/conversation-phases.js.map +1 -0
- package/dist/lib/conversation-signals.d.ts +30 -0
- package/dist/lib/conversation-signals.d.ts.map +1 -0
- package/dist/lib/conversation-signals.js +64 -0
- package/dist/lib/conversation-signals.js.map +1 -0
- package/dist/lib/experiment.d.ts +18 -0
- package/dist/lib/experiment.d.ts.map +1 -0
- package/dist/lib/experiment.js +28 -0
- package/dist/lib/experiment.js.map +1 -0
- package/dist/lib/onboarding-path-b.d.ts +10 -0
- package/dist/lib/onboarding-path-b.d.ts.map +1 -0
- package/dist/lib/onboarding-path-b.js +214 -0
- package/dist/lib/onboarding-path-b.js.map +1 -0
- package/dist/lib/onboarding-phases.d.ts +9 -0
- package/dist/lib/onboarding-phases.d.ts.map +1 -0
- package/dist/lib/onboarding-phases.js +120 -0
- package/dist/lib/onboarding-phases.js.map +1 -0
- package/dist/lib/onboarding-shared.d.ts +81 -0
- package/dist/lib/onboarding-shared.d.ts.map +1 -0
- package/dist/lib/onboarding-shared.js +190 -0
- package/dist/lib/onboarding-shared.js.map +1 -0
- package/dist/lib/onboarding-topics.d.ts +27 -0
- package/dist/lib/onboarding-topics.d.ts.map +1 -0
- package/dist/lib/onboarding-topics.js +57 -0
- package/dist/lib/onboarding-topics.js.map +1 -0
- package/dist/lib/onboarding.d.ts +3 -5
- package/dist/lib/onboarding.d.ts.map +1 -1
- package/dist/lib/onboarding.js +224 -247
- package/dist/lib/onboarding.js.map +1 -1
- package/dist/lib/profiles.d.ts +5 -0
- package/dist/lib/profiles.d.ts.map +1 -1
- package/dist/lib/profiles.js +7 -0
- package/dist/lib/profiles.js.map +1 -1
- package/dist/lib/telemetry.d.ts +5 -5
- package/dist/lib/telemetry.d.ts.map +1 -1
- package/dist/lib/telemetry.js +34 -16
- package/dist/lib/telemetry.js.map +1 -1
- package/dist/lib/wizard-surfaces.d.ts +47 -0
- package/dist/lib/wizard-surfaces.d.ts.map +1 -0
- package/dist/lib/wizard-surfaces.js +176 -0
- package/dist/lib/wizard-surfaces.js.map +1 -0
- package/dist/lib/wizard-surfaces.test.d.ts +2 -0
- package/dist/lib/wizard-surfaces.test.d.ts.map +1 -0
- package/dist/lib/wizard-surfaces.test.js +127 -0
- package/dist/lib/wizard-surfaces.test.js.map +1 -0
- package/dist/lib/wizard-trust.d.ts +31 -0
- package/dist/lib/wizard-trust.d.ts.map +1 -0
- package/dist/lib/wizard-trust.js +66 -0
- package/dist/lib/wizard-trust.js.map +1 -0
- package/dist/lib/wizard-trust.test.d.ts +2 -0
- package/dist/lib/wizard-trust.test.d.ts.map +1 -0
- package/dist/lib/wizard-trust.test.js +32 -0
- package/dist/lib/wizard-trust.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,94 +1,48 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Unit tests for onboarding conversation pure functions.
|
|
3
|
-
* WP-304: extractionToEntries,
|
|
3
|
+
* WP-304: extractionToEntries, signal detection, phase engine, post-processing.
|
|
4
4
|
*/
|
|
5
5
|
import { describe, it, expect } from 'vitest';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if (extracted.techStack?.length) {
|
|
33
|
-
entries.push({
|
|
34
|
-
collection: 'architecture',
|
|
35
|
-
name: 'Tech Stack',
|
|
36
|
-
description: `Technology choices: ${extracted.techStack.join(', ')}`,
|
|
37
|
-
});
|
|
38
|
-
for (const tech of extracted.techStack.slice(0, 3)) {
|
|
39
|
-
entries.push({
|
|
40
|
-
collection: 'glossary',
|
|
41
|
-
name: tech,
|
|
42
|
-
description: `${tech} — part of the tech stack`,
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
if (extracted.keyTerms?.length) {
|
|
47
|
-
for (const term of extracted.keyTerms) {
|
|
48
|
-
const alreadyAdded = entries.some((e) => e.collection === 'glossary' && e.name.toLowerCase() === term.toLowerCase());
|
|
49
|
-
if (!alreadyAdded) {
|
|
50
|
-
entries.push({
|
|
51
|
-
collection: 'glossary',
|
|
52
|
-
name: term,
|
|
53
|
-
description: `Core domain term: ${term}`,
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
if (extracted.keyDecisions?.length) {
|
|
59
|
-
for (const decision of extracted.keyDecisions) {
|
|
60
|
-
entries.push({
|
|
61
|
-
collection: 'decisions',
|
|
62
|
-
name: truncate(decision, 80),
|
|
63
|
-
description: decision,
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
if (extracted.tensions?.length) {
|
|
68
|
-
for (const tension of extracted.tensions) {
|
|
69
|
-
entries.push({
|
|
70
|
-
collection: 'tensions',
|
|
71
|
-
name: truncate(tension, 80),
|
|
72
|
-
description: tension,
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return entries;
|
|
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';
|
|
10
|
+
// Signal detection patterns (from conversation-signals.ts)
|
|
11
|
+
const PRODUCT_PATTERNS = [
|
|
12
|
+
/\b(?:building|making|creating|working on|developing)\b/i,
|
|
13
|
+
/\b(?:app|platform|tool|product|service|saas|api|system|software)\b/i,
|
|
14
|
+
];
|
|
15
|
+
const CHALLENGE_PATTERNS = [
|
|
16
|
+
/\b(?:hard|hardest|difficult|challeng|struggling?|pain|problem|frustrat|broken|mess)\b/i,
|
|
17
|
+
/\b(?:don'?t know|can'?t figure|losing track|forget|lost context|outdated|rot)\b/i,
|
|
18
|
+
/\b(?:hate|annoying|waste|slow|manual|tedious)\b/i,
|
|
19
|
+
];
|
|
20
|
+
const WHY_PB_PATTERNS = [
|
|
21
|
+
/\b(?:product brain|brain)\b/i,
|
|
22
|
+
/\b(?:context|memory|decisions?|knowledge|source of truth|ssot)\b/i,
|
|
23
|
+
/\b(?:ai|llm|claude|cursor|copilot|agent)\b.*\b(?:context|remember|forget|know)\b/i,
|
|
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,
|
|
29
|
+
];
|
|
30
|
+
function detectSignal(patterns, text) {
|
|
31
|
+
return patterns.some((p) => p.test(text));
|
|
77
32
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
'got a clear picture',
|
|
85
|
-
'great start',
|
|
86
|
-
'let me pull',
|
|
87
|
-
'let me put',
|
|
33
|
+
// Post-processing (from conversation-engine.ts)
|
|
34
|
+
const BANNED_PATTERNS = [
|
|
35
|
+
/\bsounds like\b/gi,
|
|
36
|
+
/\bit sounds like\b/gi,
|
|
37
|
+
/\bsounds\s+(?:ambitious|exciting|fascinating|impressive|intriguing|interesting|amazing|complex|like)\b/gi,
|
|
38
|
+
/\bintriguing\b/gi,
|
|
88
39
|
];
|
|
89
|
-
function
|
|
90
|
-
|
|
91
|
-
|
|
40
|
+
function sanitizeResponse(text) {
|
|
41
|
+
let cleaned = text;
|
|
42
|
+
for (const pattern of BANNED_PATTERNS) {
|
|
43
|
+
cleaned = cleaned.replace(pattern, '');
|
|
44
|
+
}
|
|
45
|
+
return cleaned.replace(/\s{2,}/g, ' ').replace(/^\s*[.,]\s*/, '').trim();
|
|
92
46
|
}
|
|
93
47
|
// ── Tests ───────────────────────────────────────────────────────────────────
|
|
94
48
|
describe('truncate', () => {
|
|
@@ -109,91 +63,285 @@ describe('firstNWords', () => {
|
|
|
109
63
|
it('returns all words when fewer than N', () => {
|
|
110
64
|
expect(firstNWords('just two', 6)).toBe('just two');
|
|
111
65
|
});
|
|
112
|
-
|
|
113
|
-
|
|
66
|
+
});
|
|
67
|
+
describe('countWords', () => {
|
|
68
|
+
it('counts words', () => {
|
|
69
|
+
expect(countWords('hello world foo')).toBe(3);
|
|
70
|
+
});
|
|
71
|
+
it('returns 0 for empty', () => {
|
|
72
|
+
expect(countWords('')).toBe(0);
|
|
73
|
+
expect(countWords(' ')).toBe(0);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe('signal detection (pattern matching)', () => {
|
|
77
|
+
it('detects product mentions', () => {
|
|
78
|
+
expect(detectSignal(PRODUCT_PATTERNS, 'I am building an app for accounting')).toBe(true);
|
|
79
|
+
expect(detectSignal(PRODUCT_PATTERNS, 'something big')).toBe(false);
|
|
80
|
+
});
|
|
81
|
+
it('detects challenge mentions', () => {
|
|
82
|
+
expect(detectSignal(CHALLENGE_PATTERNS, 'the hardest part is keeping context')).toBe(true);
|
|
83
|
+
expect(detectSignal(CHALLENGE_PATTERNS, 'decision rot is a real problem')).toBe(true);
|
|
84
|
+
expect(detectSignal(CHALLENGE_PATTERNS, 'we build great features')).toBe(false);
|
|
85
|
+
});
|
|
86
|
+
it('detects why-PB mentions', () => {
|
|
87
|
+
expect(detectSignal(WHY_PB_PATTERNS, 'AI agents forget what we decided')).toBe(true);
|
|
88
|
+
expect(detectSignal(WHY_PB_PATTERNS, 'we need a source of truth for decisions')).toBe(true);
|
|
89
|
+
expect(detectSignal(WHY_PB_PATTERNS, 'I just saw an ad')).toBe(false);
|
|
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);
|
|
114
122
|
});
|
|
115
123
|
});
|
|
116
|
-
describe('
|
|
117
|
-
it('
|
|
118
|
-
|
|
124
|
+
describe('sanitizeResponse', () => {
|
|
125
|
+
it('strips "sounds like"', () => {
|
|
126
|
+
expect(sanitizeResponse('Automated accounting sounds like a big project')).toBe('Automated accounting a big project');
|
|
127
|
+
});
|
|
128
|
+
it('strips "intriguing"', () => {
|
|
129
|
+
expect(sanitizeResponse('Something big, huh? Intriguing!')).toBe("Something big, huh? !");
|
|
130
|
+
});
|
|
131
|
+
it('strips "sounds ambitious"', () => {
|
|
132
|
+
expect(sanitizeResponse('Automating accounting sounds ambitious')).toBe('Automating accounting');
|
|
133
|
+
});
|
|
134
|
+
it('leaves clean text unchanged', () => {
|
|
135
|
+
expect(sanitizeResponse('What problem are you trying to solve?')).toBe('What problem are you trying to solve?');
|
|
136
|
+
});
|
|
137
|
+
});
|
|
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([]);
|
|
145
|
+
});
|
|
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
|
+
]);
|
|
150
|
+
expect(result).toHaveLength(1);
|
|
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
|
+
]);
|
|
119
166
|
expect(result).toEqual([]);
|
|
120
167
|
});
|
|
121
|
-
it('
|
|
122
|
-
const result =
|
|
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
|
+
]);
|
|
123
173
|
expect(result).toHaveLength(1);
|
|
124
|
-
expect(result[0]).toEqual({
|
|
125
|
-
collection: 'strategy',
|
|
126
|
-
name: 'Product Vision',
|
|
127
|
-
description: 'Build the best product tool',
|
|
128
|
-
});
|
|
129
174
|
});
|
|
130
|
-
it('
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
expect(
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
expect(
|
|
165
|
-
expect(
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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 },
|
|
175
279
|
});
|
|
176
|
-
|
|
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 });
|
|
177
293
|
});
|
|
178
294
|
});
|
|
179
|
-
describe('
|
|
180
|
-
|
|
181
|
-
|
|
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 },
|
|
301
|
+
});
|
|
302
|
+
const result = evaluateTopic(topic, state, false);
|
|
303
|
+
expect(result).toEqual({ complete: true, forced: false, skip: false });
|
|
182
304
|
});
|
|
183
|
-
it('
|
|
184
|
-
|
|
305
|
+
it('never skips (skipIfSignal is null)', () => {
|
|
306
|
+
const state = makeState({
|
|
307
|
+
signals: { ...makeState().signals, hasSubstantiveAnswer: true, mentionedProduct: true, mentionedChallenge: true },
|
|
308
|
+
});
|
|
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);
|
|
185
313
|
});
|
|
186
|
-
|
|
187
|
-
|
|
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>');
|
|
188
324
|
});
|
|
189
|
-
it('
|
|
190
|
-
|
|
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?');
|
|
191
329
|
});
|
|
192
|
-
it('
|
|
193
|
-
|
|
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>');
|
|
194
340
|
});
|
|
195
|
-
it('is
|
|
196
|
-
|
|
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>');
|
|
197
345
|
});
|
|
198
346
|
});
|
|
199
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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"}
|