@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,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":"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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"}
|
|
@@ -0,0 +1,148 @@
|
|
|
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
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
+
// Mock modules BEFORE imports
|
|
8
|
+
const mockFetch = vi.fn();
|
|
9
|
+
global.fetch = mockFetch;
|
|
10
|
+
const mockCreateProfile = vi.fn();
|
|
11
|
+
const mockListProfiles = vi.fn(() => []);
|
|
12
|
+
vi.mock('fs', () => ({
|
|
13
|
+
mkdirSync: vi.fn(),
|
|
14
|
+
writeFileSync: vi.fn(),
|
|
15
|
+
existsSync: vi.fn(() => false),
|
|
16
|
+
readFileSync: vi.fn(() => {
|
|
17
|
+
throw new Error('ENOENT');
|
|
18
|
+
}),
|
|
19
|
+
}));
|
|
20
|
+
vi.mock('../lib/constants.js', () => ({
|
|
21
|
+
resolveAppUrl: () => 'https://test.convex.site',
|
|
22
|
+
}));
|
|
23
|
+
vi.mock('../lib/spinner.js', () => ({
|
|
24
|
+
withSpinner: async (_msg, fn) => fn(),
|
|
25
|
+
}));
|
|
26
|
+
let clackSelectCallCount = 0;
|
|
27
|
+
vi.mock('@clack/prompts', () => ({
|
|
28
|
+
select: vi.fn(async () => {
|
|
29
|
+
clackSelectCallCount++;
|
|
30
|
+
// First two calls are continue gates, third is "What's next?" menu
|
|
31
|
+
return clackSelectCallCount <= 2 ? 'continue' : 'start';
|
|
32
|
+
}),
|
|
33
|
+
isCancel: vi.fn(() => false),
|
|
34
|
+
}));
|
|
35
|
+
vi.mock('../lib/profiles.js', () => ({
|
|
36
|
+
createProfile: (...args) => mockCreateProfile(...args),
|
|
37
|
+
listProfiles: () => mockListProfiles(),
|
|
38
|
+
}));
|
|
39
|
+
vi.mock('./handshake.js', () => ({
|
|
40
|
+
runHandshake: vi.fn(async () => { }),
|
|
41
|
+
}));
|
|
42
|
+
// Import function under test and mocked modules
|
|
43
|
+
import { runConnect } from './connect.js';
|
|
44
|
+
import { writeFileSync } from 'fs';
|
|
45
|
+
import { runHandshake } from './handshake.js';
|
|
46
|
+
import { CLIError } from '../lib/errors.js';
|
|
47
|
+
import * as clack from '@clack/prompts';
|
|
48
|
+
// Suppress console output
|
|
49
|
+
const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
50
|
+
const stdoutSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
51
|
+
const originalEnv = { ...process.env };
|
|
52
|
+
describe('pb connect — integration', () => {
|
|
53
|
+
beforeEach(() => {
|
|
54
|
+
vi.clearAllMocks();
|
|
55
|
+
consoleSpy.mockClear();
|
|
56
|
+
stdoutSpy.mockClear();
|
|
57
|
+
clackSelectCallCount = 0;
|
|
58
|
+
process.env.CONVEX_SITE_URL = 'https://test.convex.site';
|
|
59
|
+
});
|
|
60
|
+
afterEach(() => {
|
|
61
|
+
process.env = { ...originalEnv };
|
|
62
|
+
});
|
|
63
|
+
it('happy path: full connect flow', async () => {
|
|
64
|
+
const token = 'pb_ct_' + 'a'.repeat(40);
|
|
65
|
+
mockFetch.mockResolvedValueOnce({
|
|
66
|
+
ok: true,
|
|
67
|
+
json: async () => ({
|
|
68
|
+
apiKey: 'pb_sk_test123',
|
|
69
|
+
workspaceId: 'ws1',
|
|
70
|
+
workspaceName: 'Test WS',
|
|
71
|
+
}),
|
|
72
|
+
});
|
|
73
|
+
await runConnect(token);
|
|
74
|
+
// fetch called with /auth/redeem-connect-token
|
|
75
|
+
expect(mockFetch).toHaveBeenCalledWith(expect.stringContaining('/auth/redeem-connect-token'), expect.objectContaining({
|
|
76
|
+
method: 'POST',
|
|
77
|
+
body: JSON.stringify({ token }),
|
|
78
|
+
}));
|
|
79
|
+
// Profile created with slugified workspace name
|
|
80
|
+
expect(mockCreateProfile).toHaveBeenCalledWith('test-ws', 'pb_sk_test123', expect.any(String));
|
|
81
|
+
// useProfile NOT called — connect doesn't hijack global profile
|
|
82
|
+
// Project config written
|
|
83
|
+
expect(writeFileSync).toHaveBeenCalled();
|
|
84
|
+
// Handshake called with no surface filtering (writes all)
|
|
85
|
+
expect(runHandshake).toHaveBeenCalledWith({
|
|
86
|
+
quiet: true,
|
|
87
|
+
});
|
|
88
|
+
// Interactive prompts were called (continue gates + what's next menu)
|
|
89
|
+
expect(clack.select).toHaveBeenCalled();
|
|
90
|
+
});
|
|
91
|
+
it('token rejection stops flow — wizard and handshake not called', async () => {
|
|
92
|
+
const token = 'pb_ct_' + 'a'.repeat(40);
|
|
93
|
+
mockFetch.mockResolvedValueOnce({
|
|
94
|
+
ok: false,
|
|
95
|
+
status: 400,
|
|
96
|
+
json: async () => ({
|
|
97
|
+
error: {
|
|
98
|
+
code: 'invalid_token',
|
|
99
|
+
message: 'Token expired',
|
|
100
|
+
},
|
|
101
|
+
}),
|
|
102
|
+
});
|
|
103
|
+
await expect(runConnect(token)).rejects.toThrow(CLIError);
|
|
104
|
+
// Handshake and prompts should NOT have been called
|
|
105
|
+
expect(runHandshake).not.toHaveBeenCalled();
|
|
106
|
+
expect(clack.select).not.toHaveBeenCalled();
|
|
107
|
+
});
|
|
108
|
+
it('invalid token format never hits server', async () => {
|
|
109
|
+
await expect(runConnect('bad_token')).rejects.toThrow(CLIError);
|
|
110
|
+
// fetch should NOT have been called
|
|
111
|
+
expect(mockFetch).not.toHaveBeenCalled();
|
|
112
|
+
});
|
|
113
|
+
it('handshake failure is non-fatal', async () => {
|
|
114
|
+
const token = 'pb_ct_' + 'a'.repeat(40);
|
|
115
|
+
mockFetch.mockResolvedValueOnce({
|
|
116
|
+
ok: true,
|
|
117
|
+
json: async () => ({
|
|
118
|
+
apiKey: 'pb_sk_test456',
|
|
119
|
+
workspaceId: 'ws2',
|
|
120
|
+
workspaceName: 'WS Two',
|
|
121
|
+
}),
|
|
122
|
+
});
|
|
123
|
+
// Make handshake throw
|
|
124
|
+
vi.mocked(runHandshake).mockRejectedValueOnce(new Error('Handshake network error'));
|
|
125
|
+
// runConnect should NOT throw despite handshake failure
|
|
126
|
+
await expect(runConnect(token)).resolves.toBeUndefined();
|
|
127
|
+
// Handshake was called (and failed gracefully)
|
|
128
|
+
expect(runHandshake).toHaveBeenCalledOnce();
|
|
129
|
+
});
|
|
130
|
+
it('clack cancel on continue gate exits with 130', async () => {
|
|
131
|
+
const token = 'pb_ct_' + 'a'.repeat(40);
|
|
132
|
+
mockFetch.mockResolvedValueOnce({
|
|
133
|
+
ok: true,
|
|
134
|
+
json: async () => ({
|
|
135
|
+
apiKey: 'pb_sk_cancel',
|
|
136
|
+
workspaceId: 'ws3',
|
|
137
|
+
workspaceName: 'Cancel WS',
|
|
138
|
+
}),
|
|
139
|
+
});
|
|
140
|
+
// Make isCancel return true on the first select call
|
|
141
|
+
vi.mocked(clack.isCancel).mockReturnValueOnce(true);
|
|
142
|
+
const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => { throw new Error('process.exit'); });
|
|
143
|
+
await expect(runConnect(token)).rejects.toThrow('process.exit');
|
|
144
|
+
expect(exitSpy).toHaveBeenCalledWith(130);
|
|
145
|
+
exitSpy.mockRestore();
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=connect-integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect-integration.test.js","sourceRoot":"","sources":["../../src/commands/connect-integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pb connect — redeem a short-lived connect token to save an API key locally.
|
|
3
|
+
*
|
|
4
|
+
* Part of FEAT-958 Path C: Onboarding flow.
|
|
5
|
+
* Token is obtained from an onboarding link (e.g., email, QR code).
|
|
6
|
+
* S1 endpoint: POST /auth/redeem-connect-token
|
|
7
|
+
* S2 (this): CLI command to parse token, redeem, and save key locally.
|
|
8
|
+
* S3: Wizard flow (surface detection + trust level).
|
|
9
|
+
* S4: Final handshake (pb handshake).
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Main entrypoint for `pb connect <token>`.
|
|
13
|
+
* Validates token format, redeems it via /auth/redeem-connect-token,
|
|
14
|
+
* saves the key, and runs the wizard (S3).
|
|
15
|
+
*/
|
|
16
|
+
export declare function runConnect(token: string): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=connect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiNH;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoG7D"}
|