@productbrain/cli 0.1.0-beta.36 → 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__/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.js +242 -89
- package/dist/__tests__/onboarding.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 +29 -2
- 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 +22 -27
- package/dist/lib/conversation-engine.d.ts.map +1 -1
- package/dist/lib/conversation-engine.js +58 -80
- package/dist/lib/conversation-engine.js.map +1 -1
- package/dist/lib/conversation-phases.d.ts +22 -37
- package/dist/lib/conversation-phases.d.ts.map +1 -1
- package/dist/lib/conversation-phases.js +4 -4
- package/dist/lib/conversation-signals.d.ts +3 -0
- package/dist/lib/conversation-signals.d.ts.map +1 -1
- package/dist/lib/conversation-signals.js +14 -3
- package/dist/lib/conversation-signals.js.map +1 -1
- 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.js +1 -1
- 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 -3
- package/dist/lib/onboarding.d.ts.map +1 -1
- package/dist/lib/onboarding.js +109 -240
- 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
|
@@ -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":"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"}
|
|
@@ -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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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('
|
|
144
|
-
it('returns empty array for
|
|
145
|
-
expect(
|
|
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('
|
|
148
|
-
const result =
|
|
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].
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
expect(
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
|
184
|
-
expect(
|
|
302
|
+
const result = evaluateTopic(topic, state, false);
|
|
303
|
+
expect(result).toEqual({ complete: true, forced: false, skip: false });
|
|
185
304
|
});
|
|
186
|
-
it('
|
|
187
|
-
const
|
|
188
|
-
|
|
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
|
-
|
|
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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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for pb connect — full E2E flow (FEAT-958 S5).
|
|
3
|
+
* Covers: token validation -> redemption -> key save -> wizard -> handshake.
|
|
4
|
+
* All external deps (fs, fetch, wizard, handshake) are mocked.
|
|
5
|
+
*/
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=connect-integration.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-integration.test.d.ts","sourceRoot":"","sources":["../../src/commands/connect-integration.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|