@productbrain/cli 0.1.0-beta.35 → 0.1.0-beta.36
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__/onboarding.test.d.ts +1 -1
- package/dist/__tests__/onboarding.test.js +95 -100
- 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/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +32 -83
- package/dist/commands/setup.js.map +1 -1
- package/dist/lib/conversation-engine.d.ts +50 -0
- package/dist/lib/conversation-engine.d.ts.map +1 -0
- package/dist/lib/conversation-engine.js +134 -0
- package/dist/lib/conversation-engine.js.map +1 -0
- package/dist/lib/conversation-phases.d.ts +74 -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 +27 -0
- package/dist/lib/conversation-signals.d.ts.map +1 -0
- package/dist/lib/conversation-signals.js +53 -0
- package/dist/lib/conversation-signals.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.d.ts +3 -5
- package/dist/lib/onboarding.d.ts.map +1 -1
- package/dist/lib/onboarding.js +224 -116
- package/dist/lib/onboarding.js.map +1 -1
- package/package.json +1 -1
|
@@ -91,6 +91,28 @@ describe('runCapture --json', () => {
|
|
|
91
91
|
expect(output).toHaveProperty('confidence');
|
|
92
92
|
});
|
|
93
93
|
});
|
|
94
|
+
describe('runCapture description field routing', () => {
|
|
95
|
+
beforeEach(() => {
|
|
96
|
+
mcpCallWithSessionMock.mockReset();
|
|
97
|
+
mockSession = { sessionId: 'sess-test' };
|
|
98
|
+
});
|
|
99
|
+
it('passes description key to createEntry for assumptions (TEN-1258 — remap happens in Convex)', async () => {
|
|
100
|
+
// The CLI always sends `description` — the Convex write gate remaps it to `belief`
|
|
101
|
+
// for the assumptions collection (TEN-1258). Verify the CLI routes correctly and
|
|
102
|
+
// sends the text as description so the Convex remap can fire.
|
|
103
|
+
mcpCallWithSessionMock
|
|
104
|
+
.mockResolvedValueOnce({ docId: 'doc-5', entryId: 'ASM-1' });
|
|
105
|
+
const writeSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
106
|
+
await runCapture({ text: 'ASM: users won\'t pay before seeing value' });
|
|
107
|
+
const createCall = mcpCallWithSessionMock.mock.calls.find(([fn]) => fn === 'chain.createEntry');
|
|
108
|
+
expect(createCall?.[1]).toMatchObject({
|
|
109
|
+
collectionSlug: 'assumptions',
|
|
110
|
+
name: "users won't pay before seeing value",
|
|
111
|
+
data: { description: "users won't pay before seeing value" },
|
|
112
|
+
});
|
|
113
|
+
writeSpy.mockRestore();
|
|
114
|
+
});
|
|
115
|
+
});
|
|
94
116
|
describe('runCapture classification guard', () => {
|
|
95
117
|
beforeEach(() => {
|
|
96
118
|
mcpCallWithSessionMock.mockReset();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.test.js","sourceRoot":"","sources":["../../src/__tests__/capture.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"capture.test.js","sourceRoot":"","sources":["../../src/__tests__/capture.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
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
|
export {};
|
|
6
6
|
//# sourceMappingURL=onboarding.test.d.ts.map
|
|
@@ -1,95 +1,86 @@
|
|
|
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
|
-
// Import the module to access internals — we test via the exported helpers
|
|
7
|
-
// Since these are not exported, we duplicate the logic here for testing.
|
|
8
|
-
// SYNC: Must match packages/cli/src/lib/onboarding.ts
|
|
9
6
|
// ── Helpers under test (copied for unit testing) ────────────────────────────
|
|
7
|
+
// SYNC: Must match packages/cli/src/lib/*.ts
|
|
10
8
|
function truncate(str, maxLen) {
|
|
11
9
|
return str.length <= maxLen ? str : str.slice(0, maxLen);
|
|
12
10
|
}
|
|
13
11
|
function firstNWords(str, n) {
|
|
14
12
|
return str.split(/\s+/).slice(0, n).join(' ');
|
|
15
13
|
}
|
|
14
|
+
function countWords(text) {
|
|
15
|
+
return text.trim().split(/\s+/).filter(Boolean).length;
|
|
16
|
+
}
|
|
17
|
+
// Signal detection patterns (from conversation-signals.ts)
|
|
18
|
+
const PRODUCT_PATTERNS = [
|
|
19
|
+
/\b(?:building|making|creating|working on|developing)\b/i,
|
|
20
|
+
/\b(?:app|platform|tool|product|service|saas|api|system|software)\b/i,
|
|
21
|
+
];
|
|
22
|
+
const CHALLENGE_PATTERNS = [
|
|
23
|
+
/\b(?:hard|hardest|difficult|challeng|struggling?|pain|problem|frustrat|broken|mess)\b/i,
|
|
24
|
+
/\b(?:don'?t know|can'?t figure|losing track|forget|lost context|outdated|rot)\b/i,
|
|
25
|
+
/\b(?:hate|annoying|waste|slow|manual|tedious)\b/i,
|
|
26
|
+
];
|
|
27
|
+
const WHY_PB_PATTERNS = [
|
|
28
|
+
/\b(?:product brain|brain)\b/i,
|
|
29
|
+
/\b(?:context|memory|decisions?|knowledge|source of truth|ssot)\b/i,
|
|
30
|
+
/\b(?:ai|llm|claude|cursor|copilot|agent)\b.*\b(?:context|remember|forget|know)\b/i,
|
|
31
|
+
/\b(?:remember|forget|consistent|prompt)\b.*\b(?:ai|llm|agent|tool)\b/i,
|
|
32
|
+
];
|
|
33
|
+
function detectSignal(patterns, text) {
|
|
34
|
+
return patterns.some((p) => p.test(text));
|
|
35
|
+
}
|
|
36
|
+
// Post-processing (from conversation-engine.ts)
|
|
37
|
+
const BANNED_PATTERNS = [
|
|
38
|
+
/\bsounds like\b/gi,
|
|
39
|
+
/\bit sounds like\b/gi,
|
|
40
|
+
/\bsounds\s+(?:ambitious|exciting|fascinating|impressive|intriguing|interesting|amazing|complex|like)\b/gi,
|
|
41
|
+
/\bintriguing\b/gi,
|
|
42
|
+
];
|
|
43
|
+
function sanitizeResponse(text) {
|
|
44
|
+
let cleaned = text;
|
|
45
|
+
for (const pattern of BANNED_PATTERNS) {
|
|
46
|
+
cleaned = cleaned.replace(pattern, '');
|
|
47
|
+
}
|
|
48
|
+
return cleaned.replace(/\s{2,}/g, ' ').replace(/^\s*[.,]\s*/, '').trim();
|
|
49
|
+
}
|
|
16
50
|
function extractionToEntries(extracted) {
|
|
17
51
|
const entries = [];
|
|
18
52
|
if (extracted.vision?.trim()) {
|
|
19
|
-
entries.push({
|
|
20
|
-
collection: 'strategy',
|
|
21
|
-
name: 'Product Vision',
|
|
22
|
-
description: extracted.vision,
|
|
23
|
-
});
|
|
53
|
+
entries.push({ collection: 'strategy', name: 'Product Vision', description: extracted.vision });
|
|
24
54
|
}
|
|
25
55
|
if (extracted.audience) {
|
|
26
|
-
entries.push({
|
|
27
|
-
collection: 'audiences',
|
|
28
|
-
name: firstNWords(extracted.audience, 6),
|
|
29
|
-
description: extracted.audience,
|
|
30
|
-
});
|
|
56
|
+
entries.push({ collection: 'audiences', name: firstNWords(extracted.audience, 6), description: extracted.audience });
|
|
31
57
|
}
|
|
32
58
|
if (extracted.techStack?.length) {
|
|
33
|
-
entries.push({
|
|
34
|
-
collection: 'architecture',
|
|
35
|
-
name: 'Tech Stack',
|
|
36
|
-
description: `Technology choices: ${extracted.techStack.join(', ')}`,
|
|
37
|
-
});
|
|
59
|
+
entries.push({ collection: 'architecture', name: 'Tech Stack', description: `Technology choices: ${extracted.techStack.join(', ')}` });
|
|
38
60
|
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
|
-
});
|
|
61
|
+
entries.push({ collection: 'glossary', name: tech, description: `${tech} — part of the tech stack` });
|
|
44
62
|
}
|
|
45
63
|
}
|
|
46
64
|
if (extracted.keyTerms?.length) {
|
|
47
65
|
for (const term of extracted.keyTerms) {
|
|
48
66
|
const alreadyAdded = entries.some((e) => e.collection === 'glossary' && e.name.toLowerCase() === term.toLowerCase());
|
|
49
67
|
if (!alreadyAdded) {
|
|
50
|
-
entries.push({
|
|
51
|
-
collection: 'glossary',
|
|
52
|
-
name: term,
|
|
53
|
-
description: `Core domain term: ${term}`,
|
|
54
|
-
});
|
|
68
|
+
entries.push({ collection: 'glossary', name: term, description: `Core domain term: ${term}` });
|
|
55
69
|
}
|
|
56
70
|
}
|
|
57
71
|
}
|
|
58
72
|
if (extracted.keyDecisions?.length) {
|
|
59
73
|
for (const decision of extracted.keyDecisions) {
|
|
60
|
-
entries.push({
|
|
61
|
-
collection: 'decisions',
|
|
62
|
-
name: truncate(decision, 80),
|
|
63
|
-
description: decision,
|
|
64
|
-
});
|
|
74
|
+
entries.push({ collection: 'decisions', name: truncate(decision, 80), description: decision });
|
|
65
75
|
}
|
|
66
76
|
}
|
|
67
77
|
if (extracted.tensions?.length) {
|
|
68
78
|
for (const tension of extracted.tensions) {
|
|
69
|
-
entries.push({
|
|
70
|
-
collection: 'tensions',
|
|
71
|
-
name: truncate(tension, 80),
|
|
72
|
-
description: tension,
|
|
73
|
-
});
|
|
79
|
+
entries.push({ collection: 'tensions', name: truncate(tension, 80), description: tension });
|
|
74
80
|
}
|
|
75
81
|
}
|
|
76
82
|
return entries;
|
|
77
83
|
}
|
|
78
|
-
const SYNTHESIS_SIGNALS = [
|
|
79
|
-
'good picture',
|
|
80
|
-
'organize what',
|
|
81
|
-
'let me organize',
|
|
82
|
-
'enough to get started',
|
|
83
|
-
'have a good sense',
|
|
84
|
-
'got a clear picture',
|
|
85
|
-
'great start',
|
|
86
|
-
'let me pull',
|
|
87
|
-
'let me put',
|
|
88
|
-
];
|
|
89
|
-
function hasSynthesisSignal(text) {
|
|
90
|
-
const lower = text.toLowerCase();
|
|
91
|
-
return SYNTHESIS_SIGNALS.some((signal) => lower.includes(signal));
|
|
92
|
-
}
|
|
93
84
|
// ── Tests ───────────────────────────────────────────────────────────────────
|
|
94
85
|
describe('truncate', () => {
|
|
95
86
|
it('returns string unchanged when within limit', () => {
|
|
@@ -109,23 +100,54 @@ describe('firstNWords', () => {
|
|
|
109
100
|
it('returns all words when fewer than N', () => {
|
|
110
101
|
expect(firstNWords('just two', 6)).toBe('just two');
|
|
111
102
|
});
|
|
112
|
-
|
|
113
|
-
|
|
103
|
+
});
|
|
104
|
+
describe('countWords', () => {
|
|
105
|
+
it('counts words', () => {
|
|
106
|
+
expect(countWords('hello world foo')).toBe(3);
|
|
107
|
+
});
|
|
108
|
+
it('returns 0 for empty', () => {
|
|
109
|
+
expect(countWords('')).toBe(0);
|
|
110
|
+
expect(countWords(' ')).toBe(0);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe('signal detection', () => {
|
|
114
|
+
it('detects product mentions', () => {
|
|
115
|
+
expect(detectSignal(PRODUCT_PATTERNS, 'I am building an app for accounting')).toBe(true);
|
|
116
|
+
expect(detectSignal(PRODUCT_PATTERNS, 'something big')).toBe(false);
|
|
117
|
+
});
|
|
118
|
+
it('detects challenge mentions', () => {
|
|
119
|
+
expect(detectSignal(CHALLENGE_PATTERNS, 'the hardest part is keeping context')).toBe(true);
|
|
120
|
+
expect(detectSignal(CHALLENGE_PATTERNS, 'decision rot is a real problem')).toBe(true);
|
|
121
|
+
expect(detectSignal(CHALLENGE_PATTERNS, 'we build great features')).toBe(false);
|
|
122
|
+
});
|
|
123
|
+
it('detects why-PB mentions', () => {
|
|
124
|
+
expect(detectSignal(WHY_PB_PATTERNS, 'AI agents forget what we decided')).toBe(true);
|
|
125
|
+
expect(detectSignal(WHY_PB_PATTERNS, 'we need a source of truth for decisions')).toBe(true);
|
|
126
|
+
expect(detectSignal(WHY_PB_PATTERNS, 'I just saw an ad')).toBe(false);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe('sanitizeResponse', () => {
|
|
130
|
+
it('strips "sounds like"', () => {
|
|
131
|
+
expect(sanitizeResponse('Automated accounting sounds like a big project')).toBe('Automated accounting a big project');
|
|
132
|
+
});
|
|
133
|
+
it('strips "intriguing"', () => {
|
|
134
|
+
expect(sanitizeResponse('Something big, huh? Intriguing!')).toBe("Something big, huh? !");
|
|
135
|
+
});
|
|
136
|
+
it('strips "sounds ambitious"', () => {
|
|
137
|
+
expect(sanitizeResponse('Automating accounting sounds ambitious')).toBe('Automating accounting');
|
|
138
|
+
});
|
|
139
|
+
it('leaves clean text unchanged', () => {
|
|
140
|
+
expect(sanitizeResponse('What problem are you trying to solve?')).toBe('What problem are you trying to solve?');
|
|
114
141
|
});
|
|
115
142
|
});
|
|
116
143
|
describe('extractionToEntries', () => {
|
|
117
|
-
it('returns empty array for
|
|
118
|
-
|
|
119
|
-
expect(result).toEqual([]);
|
|
144
|
+
it('returns empty array for blank vision', () => {
|
|
145
|
+
expect(extractionToEntries({ vision: ' ' })).toEqual([]);
|
|
120
146
|
});
|
|
121
|
-
it('maps vision-only extraction
|
|
147
|
+
it('maps vision-only extraction', () => {
|
|
122
148
|
const result = extractionToEntries({ vision: 'Build the best product tool' });
|
|
123
149
|
expect(result).toHaveLength(1);
|
|
124
|
-
expect(result[0]).
|
|
125
|
-
collection: 'strategy',
|
|
126
|
-
name: 'Product Vision',
|
|
127
|
-
description: 'Build the best product tool',
|
|
128
|
-
});
|
|
150
|
+
expect(result[0].collection).toBe('strategy');
|
|
129
151
|
});
|
|
130
152
|
it('maps full extraction to correct collections', () => {
|
|
131
153
|
const result = extractionToEntries({
|
|
@@ -144,56 +166,29 @@ describe('extractionToEntries', () => {
|
|
|
144
166
|
expect(collections).toContain('decisions');
|
|
145
167
|
expect(collections).toContain('tensions');
|
|
146
168
|
});
|
|
147
|
-
it('caps tech stack glossary
|
|
169
|
+
it('caps tech stack glossary at 3', () => {
|
|
148
170
|
const result = extractionToEntries({
|
|
149
171
|
vision: 'A tool',
|
|
150
172
|
techStack: ['React', 'Vue', 'Angular', 'Svelte', 'Solid'],
|
|
151
173
|
});
|
|
152
|
-
const
|
|
153
|
-
expect(
|
|
154
|
-
expect(glossaryEntries.map((e) => e.name)).toEqual(['React', 'Vue', 'Angular']);
|
|
174
|
+
const glossary = result.filter((e) => e.collection === 'glossary');
|
|
175
|
+
expect(glossary).toHaveLength(3);
|
|
155
176
|
});
|
|
156
|
-
it('deduplicates glossary terms
|
|
177
|
+
it('deduplicates glossary terms', () => {
|
|
157
178
|
const result = extractionToEntries({
|
|
158
179
|
vision: 'A tool',
|
|
159
180
|
techStack: ['TypeScript'],
|
|
160
181
|
keyTerms: ['TypeScript', 'Chain'],
|
|
161
182
|
});
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
expect(glossaryEntries).toHaveLength(2);
|
|
165
|
-
expect(glossaryEntries.map((e) => e.name)).toEqual(['TypeScript', 'Chain']);
|
|
183
|
+
const glossary = result.filter((e) => e.collection === 'glossary');
|
|
184
|
+
expect(glossary).toHaveLength(2);
|
|
166
185
|
});
|
|
167
186
|
it('handles null optional fields', () => {
|
|
168
187
|
const result = extractionToEntries({
|
|
169
188
|
vision: 'A product',
|
|
170
|
-
audience: null,
|
|
171
|
-
techStack: null,
|
|
172
|
-
keyTerms: null,
|
|
173
|
-
keyDecisions: null,
|
|
174
|
-
tensions: null,
|
|
189
|
+
audience: null, techStack: null, keyTerms: null, keyDecisions: null, tensions: null,
|
|
175
190
|
});
|
|
176
|
-
expect(result).toHaveLength(1);
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
describe('hasSynthesisSignal', () => {
|
|
180
|
-
it('detects "I think I have a good picture now"', () => {
|
|
181
|
-
expect(hasSynthesisSignal('I think I have a good picture now — let me organize.')).toBe(true);
|
|
182
|
-
});
|
|
183
|
-
it('detects "Let me organize what I\'ve learned"', () => {
|
|
184
|
-
expect(hasSynthesisSignal("Let me organize what I've learned")).toBe(true);
|
|
185
|
-
});
|
|
186
|
-
it('detects "I have enough to get started"', () => {
|
|
187
|
-
expect(hasSynthesisSignal('I have enough to get started!')).toBe(true);
|
|
188
|
-
});
|
|
189
|
-
it('returns false for normal conversation', () => {
|
|
190
|
-
expect(hasSynthesisSignal('Tell me more about your users.')).toBe(false);
|
|
191
|
-
});
|
|
192
|
-
it('returns false for empty string', () => {
|
|
193
|
-
expect(hasSynthesisSignal('')).toBe(false);
|
|
194
|
-
});
|
|
195
|
-
it('is case-insensitive', () => {
|
|
196
|
-
expect(hasSynthesisSignal('I HAVE A GOOD PICTURE NOW')).toBe(true);
|
|
191
|
+
expect(result).toHaveLength(1);
|
|
197
192
|
});
|
|
198
193
|
});
|
|
199
194
|
//# sourceMappingURL=onboarding.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding.test.js","sourceRoot":"","sources":["../../src/__tests__/onboarding.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C
|
|
1
|
+
{"version":3,"file":"onboarding.test.js","sourceRoot":"","sources":["../../src/__tests__/onboarding.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* pb setup — guided onboarding tests.
|
|
3
|
-
* WP-301 Slice 3. Verifies:
|
|
4
|
-
* - setup with valid existing config
|
|
5
|
-
* - setup tracks telemetry events in order
|
|
3
|
+
* WP-301 Slice 3, WP-304 (LLM onboarding). Verifies:
|
|
4
|
+
* - setup with valid existing config goes to onboarding conversation
|
|
6
5
|
* - setup with no config triggers login prompt
|
|
7
|
-
* -
|
|
6
|
+
* - setup tracks telemetry events
|
|
8
7
|
*/
|
|
9
8
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
10
9
|
// Track telemetry calls in order
|
|
@@ -47,24 +46,20 @@ const runLoginMock = vi.fn();
|
|
|
47
46
|
vi.mock('../commands/login.js', () => ({
|
|
48
47
|
runLogin: () => runLoginMock(),
|
|
49
48
|
}));
|
|
50
|
-
// Mock
|
|
51
|
-
|
|
52
|
-
|
|
49
|
+
// Mock the onboarding conversation — it has its own test file
|
|
50
|
+
const runOnboardingMock = vi.fn();
|
|
51
|
+
vi.mock('../lib/onboarding.js', () => ({
|
|
52
|
+
runOnboardingConversation: (...args) => runOnboardingMock(...args),
|
|
53
|
+
}));
|
|
53
54
|
let confirmAnswers = [];
|
|
54
|
-
let askAnswers = [];
|
|
55
55
|
let confirmIndex = 0;
|
|
56
|
-
let askIndex = 0;
|
|
57
56
|
vi.mock('../lib/prompts.js', () => ({
|
|
58
57
|
confirm: () => {
|
|
59
58
|
const answer = confirmAnswers[confirmIndex] ?? false;
|
|
60
59
|
confirmIndex++;
|
|
61
60
|
return Promise.resolve(answer);
|
|
62
61
|
},
|
|
63
|
-
ask: () =>
|
|
64
|
-
const answer = askAnswers[askIndex] ?? '';
|
|
65
|
-
askIndex++;
|
|
66
|
-
return Promise.resolve(answer);
|
|
67
|
-
},
|
|
62
|
+
ask: () => Promise.resolve(''),
|
|
68
63
|
password: () => Promise.resolve(''),
|
|
69
64
|
select: () => Promise.resolve(''),
|
|
70
65
|
isInteractive: () => true,
|
|
@@ -75,15 +70,11 @@ describe('runSetup', () => {
|
|
|
75
70
|
vi.clearAllMocks();
|
|
76
71
|
telemetryEvents.length = 0;
|
|
77
72
|
confirmAnswers = [];
|
|
78
|
-
askAnswers = [];
|
|
79
73
|
confirmIndex = 0;
|
|
80
|
-
askIndex = 0;
|
|
81
74
|
mockConfig = { apiKey: 'pb_sk_test_key_1234', siteUrl: 'https://test.convex.site' };
|
|
82
75
|
mockSession = null;
|
|
83
76
|
});
|
|
84
|
-
it('skips login when valid config exists and
|
|
85
|
-
// User answers: false to "Skip to first capture?"
|
|
86
|
-
confirmAnswers = [false];
|
|
77
|
+
it('skips login when valid config exists and runs onboarding', async () => {
|
|
87
78
|
mcpCallMock.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }); // resolveWorkspace
|
|
88
79
|
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
89
80
|
await runSetup();
|
|
@@ -93,26 +84,8 @@ describe('runSetup', () => {
|
|
|
93
84
|
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('pb_sk_'));
|
|
94
85
|
// Should show workspace name
|
|
95
86
|
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Test Workspace'));
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
it('tracks telemetry events in correct order when user completes full flow with existing config', async () => {
|
|
99
|
-
// User answers: true to skip to capture, true to capture, then capture text
|
|
100
|
-
confirmAnswers = [true, true];
|
|
101
|
-
askAnswers = ['My first insight'];
|
|
102
|
-
mcpCallMock
|
|
103
|
-
.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }) // resolveWorkspace (step 1)
|
|
104
|
-
.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }) // resolveWorkspace (capture)
|
|
105
|
-
.mockResolvedValueOnce({ sessionId: 'sess-1', workspaceName: 'Test Workspace', initiatedBy: 'cli', toolsScope: 'readwrite' }); // startSession
|
|
106
|
-
mcpCallWithSessionMock
|
|
107
|
-
.mockResolvedValueOnce({ docId: 'doc-1', entryId: 'INS-1' }); // createEntry
|
|
108
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
109
|
-
await runSetup();
|
|
110
|
-
expect(telemetryEvents).toEqual([
|
|
111
|
-
'setup_started',
|
|
112
|
-
'workspace_bound',
|
|
113
|
-
'first_capture_prompted',
|
|
114
|
-
'setup_completed',
|
|
115
|
-
]);
|
|
87
|
+
// Should call onboarding conversation
|
|
88
|
+
expect(runOnboardingMock).toHaveBeenCalledWith('Test Workspace');
|
|
116
89
|
logSpy.mockRestore();
|
|
117
90
|
});
|
|
118
91
|
it('triggers login prompt when no valid config exists', async () => {
|
|
@@ -129,9 +102,8 @@ describe('runSetup', () => {
|
|
|
129
102
|
});
|
|
130
103
|
it('calls runLogin when user has account but no config', async () => {
|
|
131
104
|
mockConfig = null;
|
|
132
|
-
// User answers: true to "have account?"
|
|
133
|
-
|
|
134
|
-
confirmAnswers = [true, false];
|
|
105
|
+
// User answers: true to "have account?"
|
|
106
|
+
confirmAnswers = [true];
|
|
135
107
|
// After login, config becomes valid
|
|
136
108
|
runLoginMock.mockImplementation(() => {
|
|
137
109
|
mockConfig = { apiKey: 'pb_sk_new_key', siteUrl: 'https://test.convex.site' };
|
|
@@ -142,42 +114,18 @@ describe('runSetup', () => {
|
|
|
142
114
|
expect(runLoginMock).toHaveBeenCalledOnce();
|
|
143
115
|
expect(telemetryEvents).toContain('setup_started');
|
|
144
116
|
expect(telemetryEvents).toContain('key_validated');
|
|
117
|
+
// Should call onboarding after login
|
|
118
|
+
expect(runOnboardingMock).toHaveBeenCalledWith('Test Workspace');
|
|
145
119
|
logSpy.mockRestore();
|
|
146
120
|
});
|
|
147
|
-
it('handles
|
|
148
|
-
|
|
149
|
-
confirmAnswers = [true, true];
|
|
150
|
-
askAnswers = ['DEC: Use trunk-based dev'];
|
|
151
|
-
mcpCallMock
|
|
152
|
-
.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }) // resolveWorkspace (verify)
|
|
153
|
-
.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }) // resolveWorkspace (capture)
|
|
154
|
-
.mockResolvedValueOnce({ sessionId: 'sess-setup', workspaceName: 'Test Workspace', initiatedBy: 'cli', toolsScope: 'readwrite' }); // startSession
|
|
155
|
-
mcpCallWithSessionMock
|
|
156
|
-
.mockResolvedValueOnce({ docId: 'doc-1', entryId: 'DEC-100' }); // createEntry
|
|
157
|
-
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
158
|
-
await runSetup();
|
|
159
|
-
// Should have called createEntry with the capture text
|
|
160
|
-
expect(mcpCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.objectContaining({
|
|
161
|
-
name: 'DEC: Use trunk-based dev',
|
|
162
|
-
collectionSlug: 'insights',
|
|
163
|
-
}));
|
|
164
|
-
// Should show the entry ID
|
|
165
|
-
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('DEC-100'));
|
|
166
|
-
logSpy.mockRestore();
|
|
167
|
-
});
|
|
168
|
-
it('skips capture gracefully when user enters empty text', async () => {
|
|
169
|
-
confirmAnswers = [true, true];
|
|
170
|
-
askAnswers = [''];
|
|
171
|
-
mcpCallMock
|
|
172
|
-
.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }) // resolveWorkspace (verify)
|
|
173
|
-
.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }) // resolveWorkspace (capture)
|
|
174
|
-
.mockResolvedValueOnce({ sessionId: 'sess-setup', workspaceName: 'Test Workspace', initiatedBy: 'cli', toolsScope: 'readwrite' }); // startSession
|
|
121
|
+
it('handles workspace verification failure gracefully', async () => {
|
|
122
|
+
mcpCallMock.mockRejectedValueOnce(new Error('Network error')); // resolveWorkspace fails
|
|
175
123
|
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
176
124
|
await runSetup();
|
|
177
|
-
// Should
|
|
178
|
-
expect(
|
|
179
|
-
// Should
|
|
180
|
-
expect(
|
|
125
|
+
// Should warn about connection
|
|
126
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Could not verify'));
|
|
127
|
+
// Should NOT call onboarding
|
|
128
|
+
expect(runOnboardingMock).not.toHaveBeenCalled();
|
|
181
129
|
logSpy.mockRestore();
|
|
182
130
|
});
|
|
183
131
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.test.js","sourceRoot":"","sources":["../../src/__tests__/setup.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"setup.test.js","sourceRoot":"","sources":["../../src/__tests__/setup.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9D,iCAAiC;AACjC,MAAM,eAAe,GAAa,EAAE,CAAC;AAErC,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,UAAU,EAAE,CAAC,KAAa,EAAE,EAAE;QAC5B,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF,CAAC,CAAC,CAAC;AAEJ,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC5B,MAAM,sBAAsB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAEvC,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,OAAO,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;IACrD,kBAAkB,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC;CAC5E,CAAC,CAAC,CAAC;AAEJ,IAAI,UAAU,GAA+C;IAC3D,MAAM,EAAE,qBAAqB;IAC7B,OAAO,EAAE,0BAA0B;CACpC,CAAC;AAEF,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,SAAS,EAAE,GAAG,EAAE;QACd,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QAChD,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAC3B,UAAU;QACR,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;QAC7B,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,CAC7C;IACD,eAAe,EAAE,kBAAkB;IACnC,aAAa,EAAE,uBAAuB;CACvC,CAAC,CAAC,CAAC;AAEJ,IAAI,WAAW,GAA2H,IAAI,CAAC;AAE/I,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IAClC,WAAW,EAAE,GAAG,EAAE,CAAC,WAAW;IAC9B,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;IACrB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;IACrB,gBAAgB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC1B,CAAC,CAAC,CAAC;AAEJ,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC7B,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,EAAE;CAC/B,CAAC,CAAC,CAAC;AAEJ,8DAA8D;AAC9D,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAClC,EAAE,CAAC,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,yBAAyB,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;CAC9E,CAAC,CAAC,CAAC;AAEJ,IAAI,cAAc,GAAc,EAAE,CAAC;AACnC,IAAI,YAAY,GAAG,CAAC,CAAC;AAErB,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IAClC,OAAO,EAAE,GAAG,EAAE;QACZ,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC;QACrD,YAAY,EAAE,CAAC;QACf,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IACD,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9B,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IACnC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IACjC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI;CAC1B,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAC3B,cAAc,GAAG,EAAE,CAAC;QACpB,YAAY,GAAG,CAAC,CAAC;QACjB,UAAU,GAAG,EAAE,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;QACpF,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,WAAW,CAAC,qBAAqB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,mBAAmB;QAE/G,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAErE,MAAM,QAAQ,EAAE,CAAC;QAEjB,2BAA2B;QAC3B,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAE5C,yBAAyB;QACzB,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEvE,6BAA6B;QAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAE/E,sCAAsC;QACtC,MAAM,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QAEjE,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,UAAU,GAAG,IAAI,CAAC;QAElB,mDAAmD;QACnD,cAAc,GAAG,CAAC,KAAK,CAAC,CAAC;QAEzB,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAErE,MAAM,QAAQ,EAAE,CAAC;QAEjB,8BAA8B;QAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAEhF,sDAAsD;QACtD,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAE5C,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,UAAU,GAAG,IAAI,CAAC;QAElB,wCAAwC;QACxC,cAAc,GAAG,CAAC,IAAI,CAAC,CAAC;QAExB,oCAAoC;QACpC,YAAY,CAAC,kBAAkB,CAAC,GAAG,EAAE;YACnC,UAAU,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC;QAChF,CAAC,CAAC,CAAC;QAEH,WAAW,CAAC,qBAAqB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,mBAAmB;QAE/G,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAErE,MAAM,QAAQ,EAAE,CAAC;QAEjB,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,EAAE,CAAC;QAC5C,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACnD,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAEnD,qCAAqC;QACrC,MAAM,CAAC,iBAAiB,CAAC,CAAC,oBAAoB,CAAC,gBAAgB,CAAC,CAAC;QAEjE,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,WAAW,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,yBAAyB;QAExF,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAErE,MAAM,QAAQ,EAAE,CAAC;QAEjB,+BAA+B;QAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAEjF,6BAA6B;QAC7B,MAAM,CAAC,iBAAiB,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAEjD,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA8BH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAE9C"}
|