@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.
Files changed (105) hide show
  1. package/dist/__tests__/capture.test.js +22 -0
  2. package/dist/__tests__/capture.test.js.map +1 -1
  3. package/dist/__tests__/experiment.test.d.ts +6 -0
  4. package/dist/__tests__/experiment.test.d.ts.map +1 -0
  5. package/dist/__tests__/experiment.test.js +69 -0
  6. package/dist/__tests__/experiment.test.js.map +1 -0
  7. package/dist/__tests__/onboarding-path-b.test.d.ts +2 -0
  8. package/dist/__tests__/onboarding-path-b.test.d.ts.map +1 -0
  9. package/dist/__tests__/onboarding-path-b.test.js +46 -0
  10. package/dist/__tests__/onboarding-path-b.test.js.map +1 -0
  11. package/dist/__tests__/onboarding.test.d.ts +1 -1
  12. package/dist/__tests__/onboarding.test.js +304 -156
  13. package/dist/__tests__/onboarding.test.js.map +1 -1
  14. package/dist/__tests__/setup.test.js +22 -74
  15. package/dist/__tests__/setup.test.js.map +1 -1
  16. package/dist/commands/connect-integration.test.d.ts +7 -0
  17. package/dist/commands/connect-integration.test.d.ts.map +1 -0
  18. package/dist/commands/connect-integration.test.js +148 -0
  19. package/dist/commands/connect-integration.test.js.map +1 -0
  20. package/dist/commands/connect.d.ts +17 -0
  21. package/dist/commands/connect.d.ts.map +1 -0
  22. package/dist/commands/connect.js +280 -0
  23. package/dist/commands/connect.js.map +1 -0
  24. package/dist/commands/connect.test.d.ts +6 -0
  25. package/dist/commands/connect.test.d.ts.map +1 -0
  26. package/dist/commands/connect.test.js +230 -0
  27. package/dist/commands/connect.test.js.map +1 -0
  28. package/dist/commands/handshake.d.ts +2 -0
  29. package/dist/commands/handshake.d.ts.map +1 -1
  30. package/dist/commands/handshake.js +20 -5
  31. package/dist/commands/handshake.js.map +1 -1
  32. package/dist/commands/setup.d.ts.map +1 -1
  33. package/dist/commands/setup.js +57 -81
  34. package/dist/commands/setup.js.map +1 -1
  35. package/dist/generators/context-md.d.ts +1 -1
  36. package/dist/generators/context-md.d.ts.map +1 -1
  37. package/dist/generators/context-md.js +12 -1
  38. package/dist/generators/context-md.js.map +1 -1
  39. package/dist/index.js +13 -1
  40. package/dist/index.js.map +1 -1
  41. package/dist/lib/config.d.ts +1 -0
  42. package/dist/lib/config.d.ts.map +1 -1
  43. package/dist/lib/config.js +25 -1
  44. package/dist/lib/config.js.map +1 -1
  45. package/dist/lib/conversation-engine.d.ts +45 -0
  46. package/dist/lib/conversation-engine.d.ts.map +1 -0
  47. package/dist/lib/conversation-engine.js +112 -0
  48. package/dist/lib/conversation-engine.js.map +1 -0
  49. package/dist/lib/conversation-phases.d.ts +59 -0
  50. package/dist/lib/conversation-phases.d.ts.map +1 -0
  51. package/dist/lib/conversation-phases.js +11 -0
  52. package/dist/lib/conversation-phases.js.map +1 -0
  53. package/dist/lib/conversation-signals.d.ts +30 -0
  54. package/dist/lib/conversation-signals.d.ts.map +1 -0
  55. package/dist/lib/conversation-signals.js +64 -0
  56. package/dist/lib/conversation-signals.js.map +1 -0
  57. package/dist/lib/experiment.d.ts +18 -0
  58. package/dist/lib/experiment.d.ts.map +1 -0
  59. package/dist/lib/experiment.js +28 -0
  60. package/dist/lib/experiment.js.map +1 -0
  61. package/dist/lib/onboarding-path-b.d.ts +10 -0
  62. package/dist/lib/onboarding-path-b.d.ts.map +1 -0
  63. package/dist/lib/onboarding-path-b.js +214 -0
  64. package/dist/lib/onboarding-path-b.js.map +1 -0
  65. package/dist/lib/onboarding-phases.d.ts +9 -0
  66. package/dist/lib/onboarding-phases.d.ts.map +1 -0
  67. package/dist/lib/onboarding-phases.js +120 -0
  68. package/dist/lib/onboarding-phases.js.map +1 -0
  69. package/dist/lib/onboarding-shared.d.ts +81 -0
  70. package/dist/lib/onboarding-shared.d.ts.map +1 -0
  71. package/dist/lib/onboarding-shared.js +190 -0
  72. package/dist/lib/onboarding-shared.js.map +1 -0
  73. package/dist/lib/onboarding-topics.d.ts +27 -0
  74. package/dist/lib/onboarding-topics.d.ts.map +1 -0
  75. package/dist/lib/onboarding-topics.js +57 -0
  76. package/dist/lib/onboarding-topics.js.map +1 -0
  77. package/dist/lib/onboarding.d.ts +3 -5
  78. package/dist/lib/onboarding.d.ts.map +1 -1
  79. package/dist/lib/onboarding.js +224 -247
  80. package/dist/lib/onboarding.js.map +1 -1
  81. package/dist/lib/profiles.d.ts +5 -0
  82. package/dist/lib/profiles.d.ts.map +1 -1
  83. package/dist/lib/profiles.js +7 -0
  84. package/dist/lib/profiles.js.map +1 -1
  85. package/dist/lib/telemetry.d.ts +5 -5
  86. package/dist/lib/telemetry.d.ts.map +1 -1
  87. package/dist/lib/telemetry.js +34 -16
  88. package/dist/lib/telemetry.js.map +1 -1
  89. package/dist/lib/wizard-surfaces.d.ts +47 -0
  90. package/dist/lib/wizard-surfaces.d.ts.map +1 -0
  91. package/dist/lib/wizard-surfaces.js +176 -0
  92. package/dist/lib/wizard-surfaces.js.map +1 -0
  93. package/dist/lib/wizard-surfaces.test.d.ts +2 -0
  94. package/dist/lib/wizard-surfaces.test.d.ts.map +1 -0
  95. package/dist/lib/wizard-surfaces.test.js +127 -0
  96. package/dist/lib/wizard-surfaces.test.js.map +1 -0
  97. package/dist/lib/wizard-trust.d.ts +31 -0
  98. package/dist/lib/wizard-trust.d.ts.map +1 -0
  99. package/dist/lib/wizard-trust.js +66 -0
  100. package/dist/lib/wizard-trust.js.map +1 -0
  101. package/dist/lib/wizard-trust.test.d.ts +2 -0
  102. package/dist/lib/wizard-trust.test.d.ts.map +1 -0
  103. package/dist/lib/wizard-trust.test.js +32 -0
  104. package/dist/lib/wizard-trust.test.js.map +1 -0
  105. 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 skips login
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
- * - first capture flow starts session and creates entry
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 promptssupply answers in sequence
51
- // The old readline answers map to: confirm (y/n) and ask (text).
52
- // Each test sets up the sequence of prompt answers.
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 user declines capture', async () => {
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
- logSpy.mockRestore();
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?", then login runs,
133
- // then false to capture prompt (via post-login flow)
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 first capture with session creation', async () => {
148
- // Already configured, user wants to capture
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 NOT call createEntry
178
- expect(mcpCallWithSessionMock).not.toHaveBeenCalled();
179
- // Should still complete setup
180
- expect(telemetryEvents).toContain('setup_completed');
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":"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"}
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"}