@productbrain/cli 0.1.0-beta.28 → 0.1.0-beta.30
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/README.md +2 -0
- package/dist/__tests__/constants.test.d.ts +2 -0
- package/dist/__tests__/constants.test.d.ts.map +1 -0
- package/dist/__tests__/constants.test.js +94 -0
- package/dist/__tests__/constants.test.js.map +1 -0
- package/dist/__tests__/login.test.d.ts +2 -0
- package/dist/__tests__/login.test.d.ts.map +1 -0
- package/dist/__tests__/login.test.js +168 -0
- package/dist/__tests__/login.test.js.map +1 -0
- package/dist/__tests__/setup.test.d.ts +2 -0
- package/dist/__tests__/setup.test.d.ts.map +1 -0
- package/dist/__tests__/setup.test.js +170 -0
- package/dist/__tests__/setup.test.js.map +1 -0
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +20 -0
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/collections.d.ts +6 -0
- package/dist/commands/collections.d.ts.map +1 -1
- package/dist/commands/collections.js +14 -0
- package/dist/commands/collections.js.map +1 -1
- package/dist/commands/doctor.d.ts +11 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +124 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/doctor.test.d.ts +6 -0
- package/dist/commands/doctor.test.d.ts.map +1 -0
- package/dist/commands/doctor.test.js +102 -0
- package/dist/commands/doctor.test.js.map +1 -0
- package/dist/commands/login.d.ts +4 -0
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +53 -27
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/setup.d.ts +16 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +213 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/generators/__tests__/surface-profiles.test.d.ts +2 -0
- package/dist/generators/__tests__/surface-profiles.test.d.ts.map +1 -0
- package/dist/generators/__tests__/surface-profiles.test.js +89 -0
- package/dist/generators/__tests__/surface-profiles.test.js.map +1 -0
- package/dist/generators/handshake-diff.test.js +1 -2
- package/dist/generators/handshake-diff.test.js.map +1 -1
- package/dist/index.js +39 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/activation.d.ts +28 -0
- package/dist/lib/activation.d.ts.map +1 -0
- package/dist/lib/activation.js +57 -0
- package/dist/lib/activation.js.map +1 -0
- package/dist/lib/activation.test.d.ts +6 -0
- package/dist/lib/activation.test.d.ts.map +1 -0
- package/dist/lib/activation.test.js +121 -0
- package/dist/lib/activation.test.js.map +1 -0
- package/dist/lib/client.d.ts +17 -0
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +41 -0
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +5 -3
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/constants.d.ts +21 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +39 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/telemetry.d.ts +15 -0
- package/dist/lib/telemetry.d.ts.map +1 -0
- package/dist/lib/telemetry.js +29 -0
- package/dist/lib/telemetry.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -14,6 +14,8 @@ CLI for Chain knowledge: read, search, gather context, and **write back**. Uses
|
|
|
14
14
|
npm install -g @productbrain/cli@beta
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
+
**IDE MCP (Cursor, Claude Desktop, VS Code):** `npx @productbrain/mcp@beta setup` — [Install — MCP and CLI](../../docs/surfaces/INSTALL.md).
|
|
18
|
+
|
|
17
19
|
Updates require a new publish to npm (and, if you use 2FA, a one-time password). Use this when you want a stable beta from the registry.
|
|
18
20
|
|
|
19
21
|
### From main (no publish needed)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/constants.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* constants — unit tests.
|
|
3
|
+
* WP-301 Slice 0: Verify DEFAULT_SITE_URL, resolveSiteUrl(), resolveAppUrl(), isDevMode().
|
|
4
|
+
*/
|
|
5
|
+
import { describe, expect, it, beforeEach, afterEach } from 'vitest';
|
|
6
|
+
import { DEFAULT_SITE_URL, resolveSiteUrl, resolveAppUrl, isDevMode } from '../lib/constants.js';
|
|
7
|
+
describe('DEFAULT_SITE_URL', () => {
|
|
8
|
+
it('is the production Convex site URL', () => {
|
|
9
|
+
expect(DEFAULT_SITE_URL).toBe('https://trustworthy-kangaroo-277.convex.site');
|
|
10
|
+
});
|
|
11
|
+
});
|
|
12
|
+
describe('resolveSiteUrl', () => {
|
|
13
|
+
let originalPbEnv;
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
originalPbEnv = process.env.PB_ENV;
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
if (originalPbEnv === undefined) {
|
|
19
|
+
delete process.env.PB_ENV;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
process.env.PB_ENV = originalPbEnv;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
it('returns localhost URL when PB_ENV=dev', () => {
|
|
26
|
+
process.env.PB_ENV = 'dev';
|
|
27
|
+
expect(resolveSiteUrl()).toBe('http://localhost:5176');
|
|
28
|
+
});
|
|
29
|
+
it('returns production URL when PB_ENV=production', () => {
|
|
30
|
+
process.env.PB_ENV = 'production';
|
|
31
|
+
expect(resolveSiteUrl()).toBe(DEFAULT_SITE_URL);
|
|
32
|
+
});
|
|
33
|
+
it('returns production URL when PB_ENV is unset', () => {
|
|
34
|
+
delete process.env.PB_ENV;
|
|
35
|
+
expect(resolveSiteUrl()).toBe(DEFAULT_SITE_URL);
|
|
36
|
+
});
|
|
37
|
+
it('is case-insensitive for dev', () => {
|
|
38
|
+
process.env.PB_ENV = 'DEV';
|
|
39
|
+
expect(resolveSiteUrl()).toBe('http://localhost:5176');
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe('resolveAppUrl', () => {
|
|
43
|
+
let originalPbEnv;
|
|
44
|
+
beforeEach(() => {
|
|
45
|
+
originalPbEnv = process.env.PB_ENV;
|
|
46
|
+
});
|
|
47
|
+
afterEach(() => {
|
|
48
|
+
if (originalPbEnv === undefined) {
|
|
49
|
+
delete process.env.PB_ENV;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
process.env.PB_ENV = originalPbEnv;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
it('returns localhost URL when PB_ENV=dev', () => {
|
|
56
|
+
process.env.PB_ENV = 'dev';
|
|
57
|
+
expect(resolveAppUrl()).toBe('http://localhost:5173');
|
|
58
|
+
});
|
|
59
|
+
it('returns production URL when PB_ENV=production', () => {
|
|
60
|
+
process.env.PB_ENV = 'production';
|
|
61
|
+
expect(resolveAppUrl()).toBe('https://work.productbrain.io');
|
|
62
|
+
});
|
|
63
|
+
it('returns production URL when PB_ENV is unset', () => {
|
|
64
|
+
delete process.env.PB_ENV;
|
|
65
|
+
expect(resolveAppUrl()).toBe('https://work.productbrain.io');
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe('isDevMode', () => {
|
|
69
|
+
let originalPbEnv;
|
|
70
|
+
beforeEach(() => {
|
|
71
|
+
originalPbEnv = process.env.PB_ENV;
|
|
72
|
+
});
|
|
73
|
+
afterEach(() => {
|
|
74
|
+
if (originalPbEnv === undefined) {
|
|
75
|
+
delete process.env.PB_ENV;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
process.env.PB_ENV = originalPbEnv;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
it('returns true when PB_ENV=dev', () => {
|
|
82
|
+
process.env.PB_ENV = 'dev';
|
|
83
|
+
expect(isDevMode()).toBe(true);
|
|
84
|
+
});
|
|
85
|
+
it('returns false when PB_ENV=production', () => {
|
|
86
|
+
process.env.PB_ENV = 'production';
|
|
87
|
+
expect(isDevMode()).toBe(false);
|
|
88
|
+
});
|
|
89
|
+
it('returns false when PB_ENV is unset', () => {
|
|
90
|
+
delete process.env.PB_ENV;
|
|
91
|
+
expect(isDevMode()).toBe(false);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=constants.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.test.js","sourceRoot":"","sources":["../../src/__tests__/constants.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/login.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Mocks
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
const validateKeyMock = vi.fn();
|
|
6
|
+
vi.mock('../lib/client.js', () => ({
|
|
7
|
+
validateKey: (...args) => validateKeyMock(...args),
|
|
8
|
+
}));
|
|
9
|
+
vi.mock('../lib/config.js', () => ({
|
|
10
|
+
HOME_CONFIG_DIR: '/tmp/test-pb-config',
|
|
11
|
+
HOME_ENV_PATH: '/tmp/test-pb-config/.env',
|
|
12
|
+
}));
|
|
13
|
+
const mkdirSyncMock = vi.fn();
|
|
14
|
+
const writeFileSyncMock = vi.fn();
|
|
15
|
+
vi.mock('fs', () => ({
|
|
16
|
+
mkdirSync: (...args) => mkdirSyncMock(...args),
|
|
17
|
+
writeFileSync: (...args) => writeFileSyncMock(...args),
|
|
18
|
+
existsSync: vi.fn(() => false),
|
|
19
|
+
readFileSync: vi.fn(() => ''),
|
|
20
|
+
}));
|
|
21
|
+
// Mock readline — simulate user pasting a key
|
|
22
|
+
let readlineAnswer = '';
|
|
23
|
+
vi.mock('readline', () => ({
|
|
24
|
+
createInterface: () => ({
|
|
25
|
+
question: (_prompt, cb) => cb(readlineAnswer),
|
|
26
|
+
close: vi.fn(),
|
|
27
|
+
}),
|
|
28
|
+
}));
|
|
29
|
+
// Capture console/process output
|
|
30
|
+
const consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
31
|
+
const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
32
|
+
const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
|
|
33
|
+
const stdoutWriteSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
34
|
+
// Track process.exit calls without throwing (so try/catch in login.ts doesn't catch it)
|
|
35
|
+
let exitCode;
|
|
36
|
+
vi.spyOn(process, 'exit').mockImplementation((code) => {
|
|
37
|
+
exitCode = code;
|
|
38
|
+
// Return undefined as never — the function won't actually continue
|
|
39
|
+
// but the test can check exitCode after the call
|
|
40
|
+
return undefined;
|
|
41
|
+
});
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Tests
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
describe('pb login — key validation', () => {
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
vi.clearAllMocks();
|
|
48
|
+
readlineAnswer = '';
|
|
49
|
+
exitCode = undefined;
|
|
50
|
+
delete process.env.CONVEX_SITE_URL;
|
|
51
|
+
});
|
|
52
|
+
it('saves key on successful validation', async () => {
|
|
53
|
+
readlineAnswer = 'pb_sk_valid_key_123';
|
|
54
|
+
validateKeyMock.mockResolvedValue({ valid: true, workspaceId: 'ws-123' });
|
|
55
|
+
const { runLogin } = await import('../commands/login.js');
|
|
56
|
+
await runLogin();
|
|
57
|
+
expect(validateKeyMock).toHaveBeenCalledWith('pb_sk_valid_key_123', 'https://trustworthy-kangaroo-277.convex.site');
|
|
58
|
+
expect(writeFileSyncMock).toHaveBeenCalledTimes(1);
|
|
59
|
+
expect(writeFileSyncMock.mock.calls[0][1]).toContain('PRODUCTBRAIN_API_KEY=pb_sk_valid_key_123');
|
|
60
|
+
expect(stdoutWriteSpy).toHaveBeenCalledWith(' connected.\n\n');
|
|
61
|
+
expect(exitCode).toBeUndefined();
|
|
62
|
+
});
|
|
63
|
+
it('rejects invalid key (401) without saving', async () => {
|
|
64
|
+
readlineAnswer = 'pb_sk_bad_key';
|
|
65
|
+
validateKeyMock.mockResolvedValue({ valid: false, error: 'Invalid API key.' });
|
|
66
|
+
const { runLogin } = await import('../commands/login.js');
|
|
67
|
+
await runLogin();
|
|
68
|
+
expect(writeFileSyncMock).not.toHaveBeenCalled();
|
|
69
|
+
expect(exitCode).toBe(1);
|
|
70
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Invalid key'));
|
|
71
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('work.productbrain.io'));
|
|
72
|
+
});
|
|
73
|
+
it('saves key on network timeout with warning', async () => {
|
|
74
|
+
readlineAnswer = 'pb_sk_offline_key';
|
|
75
|
+
validateKeyMock.mockRejectedValue(new Error('fetch failed'));
|
|
76
|
+
const { runLogin } = await import('../commands/login.js');
|
|
77
|
+
await runLogin();
|
|
78
|
+
expect(writeFileSyncMock).toHaveBeenCalledTimes(1);
|
|
79
|
+
expect(writeFileSyncMock.mock.calls[0][1]).toContain('PRODUCTBRAIN_API_KEY=pb_sk_offline_key');
|
|
80
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith(expect.stringContaining('Could not reach server'));
|
|
81
|
+
expect(exitCode).toBeUndefined();
|
|
82
|
+
});
|
|
83
|
+
it('exits on empty key', async () => {
|
|
84
|
+
readlineAnswer = '';
|
|
85
|
+
const { runLogin } = await import('../commands/login.js');
|
|
86
|
+
await runLogin();
|
|
87
|
+
expect(exitCode).toBe(1);
|
|
88
|
+
expect(validateKeyMock).not.toHaveBeenCalled();
|
|
89
|
+
expect(writeFileSyncMock).not.toHaveBeenCalled();
|
|
90
|
+
});
|
|
91
|
+
it('exits on key without pb_sk_ prefix', async () => {
|
|
92
|
+
readlineAnswer = 'sk_not_a_pb_key';
|
|
93
|
+
const { runLogin } = await import('../commands/login.js');
|
|
94
|
+
await runLogin();
|
|
95
|
+
expect(exitCode).toBe(1);
|
|
96
|
+
expect(validateKeyMock).not.toHaveBeenCalled();
|
|
97
|
+
expect(writeFileSyncMock).not.toHaveBeenCalled();
|
|
98
|
+
});
|
|
99
|
+
it('shows signup URL in error message', async () => {
|
|
100
|
+
readlineAnswer = 'pb_sk_bad';
|
|
101
|
+
validateKeyMock.mockResolvedValue({ valid: false, error: 'Invalid API key.' });
|
|
102
|
+
const { runLogin } = await import('../commands/login.js');
|
|
103
|
+
await runLogin();
|
|
104
|
+
// Signup URL should appear in the error output
|
|
105
|
+
const allErrorCalls = consoleErrorSpy.mock.calls.flat().join(' ');
|
|
106
|
+
expect(allErrorCalls).toContain('work.productbrain.io');
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
describe('validateKey()', () => {
|
|
110
|
+
const originalFetch = globalThis.fetch;
|
|
111
|
+
beforeEach(() => {
|
|
112
|
+
vi.clearAllMocks();
|
|
113
|
+
});
|
|
114
|
+
afterEach(() => {
|
|
115
|
+
globalThis.fetch = originalFetch;
|
|
116
|
+
});
|
|
117
|
+
it('returns valid on 200 with workspace data', async () => {
|
|
118
|
+
globalThis.fetch = vi.fn().mockResolvedValue({
|
|
119
|
+
ok: true,
|
|
120
|
+
status: 200,
|
|
121
|
+
json: () => Promise.resolve({ data: { _id: 'ws-abc' } }),
|
|
122
|
+
});
|
|
123
|
+
const mod = await vi.importActual('../lib/client.js');
|
|
124
|
+
const result = await mod.validateKey('pb_sk_test', 'https://test.convex.site');
|
|
125
|
+
expect(result).toEqual({ valid: true, workspaceId: 'ws-abc' });
|
|
126
|
+
});
|
|
127
|
+
it('returns invalid on 401', async () => {
|
|
128
|
+
globalThis.fetch = vi.fn().mockResolvedValue({
|
|
129
|
+
ok: false,
|
|
130
|
+
status: 401,
|
|
131
|
+
json: () => Promise.resolve({ error: 'Unauthorized' }),
|
|
132
|
+
});
|
|
133
|
+
const mod = await vi.importActual('../lib/client.js');
|
|
134
|
+
const result = await mod.validateKey('pb_sk_bad', 'https://test.convex.site');
|
|
135
|
+
expect(result).toEqual({ valid: false, error: 'Invalid API key.' });
|
|
136
|
+
});
|
|
137
|
+
it('returns invalid on 403', async () => {
|
|
138
|
+
globalThis.fetch = vi.fn().mockResolvedValue({
|
|
139
|
+
ok: false,
|
|
140
|
+
status: 403,
|
|
141
|
+
json: () => Promise.resolve({ error: 'Forbidden' }),
|
|
142
|
+
});
|
|
143
|
+
const mod = await vi.importActual('../lib/client.js');
|
|
144
|
+
const result = await mod.validateKey('pb_sk_bad', 'https://test.convex.site');
|
|
145
|
+
expect(result).toEqual({ valid: false, error: 'Invalid API key.' });
|
|
146
|
+
});
|
|
147
|
+
it('returns invalid on server error with message', async () => {
|
|
148
|
+
globalThis.fetch = vi.fn().mockResolvedValue({
|
|
149
|
+
ok: false,
|
|
150
|
+
status: 500,
|
|
151
|
+
json: () => Promise.resolve({ error: 'Internal server error' }),
|
|
152
|
+
});
|
|
153
|
+
const mod = await vi.importActual('../lib/client.js');
|
|
154
|
+
const result = await mod.validateKey('pb_sk_test', 'https://test.convex.site');
|
|
155
|
+
expect(result).toEqual({ valid: false, error: 'Internal server error' });
|
|
156
|
+
});
|
|
157
|
+
it('throws on network error (fetch failed)', async () => {
|
|
158
|
+
globalThis.fetch = vi.fn().mockRejectedValue(new Error('fetch failed'));
|
|
159
|
+
const mod = await vi.importActual('../lib/client.js');
|
|
160
|
+
await expect(mod.validateKey('pb_sk_test', 'https://test.convex.site')).rejects.toThrow('fetch failed');
|
|
161
|
+
});
|
|
162
|
+
it('throws on timeout (abort)', async () => {
|
|
163
|
+
globalThis.fetch = vi.fn().mockImplementation(() => new Promise((_, reject) => setTimeout(() => reject(new Error('AbortError')), 100)));
|
|
164
|
+
const mod = await vi.importActual('../lib/client.js');
|
|
165
|
+
await expect(mod.validateKey('pb_sk_test', 'https://test.convex.site', 50)).rejects.toThrow();
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
//# sourceMappingURL=login.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.test.js","sourceRoot":"","sources":["../../src/__tests__/login.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
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
|
|
6
|
+
* - setup with no config triggers login prompt
|
|
7
|
+
* - first capture flow starts session and creates entry
|
|
8
|
+
*/
|
|
9
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
10
|
+
// Track telemetry calls in order
|
|
11
|
+
const telemetryEvents = [];
|
|
12
|
+
vi.mock('../lib/telemetry.js', () => ({
|
|
13
|
+
trackEvent: (event) => {
|
|
14
|
+
telemetryEvents.push(event);
|
|
15
|
+
},
|
|
16
|
+
}));
|
|
17
|
+
const mcpCallMock = vi.fn();
|
|
18
|
+
const mcpCallWithSessionMock = vi.fn();
|
|
19
|
+
vi.mock('../lib/client.js', () => ({
|
|
20
|
+
mcpCall: (...args) => mcpCallMock(...args),
|
|
21
|
+
mcpCallWithSession: (...args) => mcpCallWithSessionMock(...args),
|
|
22
|
+
}));
|
|
23
|
+
let mockConfig = {
|
|
24
|
+
apiKey: 'pb_sk_test_key_1234',
|
|
25
|
+
siteUrl: 'https://test.convex.site',
|
|
26
|
+
};
|
|
27
|
+
vi.mock('../lib/config.js', () => ({
|
|
28
|
+
getConfig: () => {
|
|
29
|
+
if (!mockConfig)
|
|
30
|
+
throw new Error('No API key.');
|
|
31
|
+
return mockConfig;
|
|
32
|
+
},
|
|
33
|
+
getConfigOrGuide: vi.fn(() => mockConfig
|
|
34
|
+
? Promise.resolve(mockConfig)
|
|
35
|
+
: Promise.reject(new Error('No API key.'))),
|
|
36
|
+
HOME_CONFIG_DIR: '/tmp/test-config',
|
|
37
|
+
HOME_ENV_PATH: '/tmp/test-config/.env',
|
|
38
|
+
}));
|
|
39
|
+
let mockSession = null;
|
|
40
|
+
vi.mock('../lib/session.js', () => ({
|
|
41
|
+
readSession: () => mockSession,
|
|
42
|
+
writeSession: vi.fn(),
|
|
43
|
+
clearSession: vi.fn(),
|
|
44
|
+
addCapturedEntry: vi.fn(),
|
|
45
|
+
}));
|
|
46
|
+
const runLoginMock = vi.fn();
|
|
47
|
+
vi.mock('../commands/login.js', () => ({
|
|
48
|
+
runLogin: () => runLoginMock(),
|
|
49
|
+
}));
|
|
50
|
+
// Mock readline — supply answers in sequence
|
|
51
|
+
let readlineAnswers = [];
|
|
52
|
+
let answerIndex = 0;
|
|
53
|
+
vi.mock('readline', () => ({
|
|
54
|
+
createInterface: () => ({
|
|
55
|
+
question: (_prompt, cb) => {
|
|
56
|
+
const answer = readlineAnswers[answerIndex] ?? '';
|
|
57
|
+
answerIndex++;
|
|
58
|
+
cb(answer);
|
|
59
|
+
},
|
|
60
|
+
close: vi.fn(),
|
|
61
|
+
}),
|
|
62
|
+
}));
|
|
63
|
+
import { runSetup } from '../commands/setup.js';
|
|
64
|
+
describe('runSetup', () => {
|
|
65
|
+
beforeEach(() => {
|
|
66
|
+
vi.clearAllMocks();
|
|
67
|
+
telemetryEvents.length = 0;
|
|
68
|
+
readlineAnswers = [];
|
|
69
|
+
answerIndex = 0;
|
|
70
|
+
mockConfig = { apiKey: 'pb_sk_test_key_1234', siteUrl: 'https://test.convex.site' };
|
|
71
|
+
mockSession = null;
|
|
72
|
+
});
|
|
73
|
+
it('skips login when valid config exists and user declines capture', async () => {
|
|
74
|
+
// User answers: "n" to "Skip to first capture?"
|
|
75
|
+
readlineAnswers = ['n'];
|
|
76
|
+
mcpCallMock.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }); // resolveWorkspace
|
|
77
|
+
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
78
|
+
await runSetup();
|
|
79
|
+
// Should NOT call runLogin
|
|
80
|
+
expect(runLoginMock).not.toHaveBeenCalled();
|
|
81
|
+
// Should show masked key
|
|
82
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('pb_sk_'));
|
|
83
|
+
// Should show workspace name
|
|
84
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Test Workspace'));
|
|
85
|
+
logSpy.mockRestore();
|
|
86
|
+
});
|
|
87
|
+
it('tracks telemetry events in correct order when user completes full flow with existing config', async () => {
|
|
88
|
+
// User answers: "y" to skip to capture, "y" to capture, then capture text
|
|
89
|
+
readlineAnswers = ['y', 'y', 'My first insight'];
|
|
90
|
+
mcpCallMock
|
|
91
|
+
.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }) // resolveWorkspace (step 1)
|
|
92
|
+
.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }) // resolveWorkspace (capture)
|
|
93
|
+
.mockResolvedValueOnce({ sessionId: 'sess-1', workspaceName: 'Test Workspace', initiatedBy: 'cli', toolsScope: 'readwrite' }); // startSession
|
|
94
|
+
mcpCallWithSessionMock
|
|
95
|
+
.mockResolvedValueOnce({ docId: 'doc-1', entryId: 'INS-1' }); // createEntry
|
|
96
|
+
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
97
|
+
await runSetup();
|
|
98
|
+
expect(telemetryEvents).toEqual([
|
|
99
|
+
'setup_started',
|
|
100
|
+
'workspace_bound',
|
|
101
|
+
'first_capture_prompted',
|
|
102
|
+
'setup_completed',
|
|
103
|
+
]);
|
|
104
|
+
logSpy.mockRestore();
|
|
105
|
+
});
|
|
106
|
+
it('triggers login prompt when no valid config exists', async () => {
|
|
107
|
+
mockConfig = null;
|
|
108
|
+
// User answers: "n" to "Do you have an account?"
|
|
109
|
+
readlineAnswers = ['n'];
|
|
110
|
+
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
111
|
+
await runSetup();
|
|
112
|
+
// Should show signup guidance
|
|
113
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('productbrain.io'));
|
|
114
|
+
// Should NOT call runLogin since user said no account
|
|
115
|
+
expect(runLoginMock).not.toHaveBeenCalled();
|
|
116
|
+
logSpy.mockRestore();
|
|
117
|
+
});
|
|
118
|
+
it('calls runLogin when user has account but no config', async () => {
|
|
119
|
+
mockConfig = null;
|
|
120
|
+
// User answers: "y" to "have account?", then login runs,
|
|
121
|
+
// then "n" to capture prompt (via post-login rl)
|
|
122
|
+
readlineAnswers = ['y', 'n'];
|
|
123
|
+
// After login, config becomes valid
|
|
124
|
+
runLoginMock.mockImplementation(() => {
|
|
125
|
+
mockConfig = { apiKey: 'pb_sk_new_key', siteUrl: 'https://test.convex.site' };
|
|
126
|
+
});
|
|
127
|
+
mcpCallMock.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }); // resolveWorkspace
|
|
128
|
+
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
129
|
+
await runSetup();
|
|
130
|
+
expect(runLoginMock).toHaveBeenCalledOnce();
|
|
131
|
+
expect(telemetryEvents).toContain('setup_started');
|
|
132
|
+
expect(telemetryEvents).toContain('key_validated');
|
|
133
|
+
logSpy.mockRestore();
|
|
134
|
+
});
|
|
135
|
+
it('handles first capture with session creation', async () => {
|
|
136
|
+
// Already configured, user wants to capture
|
|
137
|
+
readlineAnswers = ['y', 'y', 'DEC: Use trunk-based dev'];
|
|
138
|
+
mcpCallMock
|
|
139
|
+
.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }) // resolveWorkspace (verify)
|
|
140
|
+
.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }) // resolveWorkspace (capture)
|
|
141
|
+
.mockResolvedValueOnce({ sessionId: 'sess-setup', workspaceName: 'Test Workspace', initiatedBy: 'cli', toolsScope: 'readwrite' }); // startSession
|
|
142
|
+
mcpCallWithSessionMock
|
|
143
|
+
.mockResolvedValueOnce({ docId: 'doc-1', entryId: 'DEC-100' }); // createEntry
|
|
144
|
+
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
145
|
+
await runSetup();
|
|
146
|
+
// Should have called createEntry with the capture text
|
|
147
|
+
expect(mcpCallWithSessionMock).toHaveBeenCalledWith('chain.createEntry', expect.objectContaining({
|
|
148
|
+
name: 'DEC: Use trunk-based dev',
|
|
149
|
+
collectionSlug: 'insights',
|
|
150
|
+
}));
|
|
151
|
+
// Should show the entry ID
|
|
152
|
+
expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('DEC-100'));
|
|
153
|
+
logSpy.mockRestore();
|
|
154
|
+
});
|
|
155
|
+
it('skips capture gracefully when user enters empty text', async () => {
|
|
156
|
+
readlineAnswers = ['y', 'y', ''];
|
|
157
|
+
mcpCallMock
|
|
158
|
+
.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }) // resolveWorkspace (verify)
|
|
159
|
+
.mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1', name: 'Test Workspace' }) // resolveWorkspace (capture)
|
|
160
|
+
.mockResolvedValueOnce({ sessionId: 'sess-setup', workspaceName: 'Test Workspace', initiatedBy: 'cli', toolsScope: 'readwrite' }); // startSession
|
|
161
|
+
const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
162
|
+
await runSetup();
|
|
163
|
+
// Should NOT call createEntry
|
|
164
|
+
expect(mcpCallWithSessionMock).not.toHaveBeenCalled();
|
|
165
|
+
// Should still complete setup
|
|
166
|
+
expect(telemetryEvents).toContain('setup_completed');
|
|
167
|
+
logSpy.mockRestore();
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=setup.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.test.js","sourceRoot":"","sources":["../../src/__tests__/setup.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiDH,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oDAAoD;IACpD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wFAAwF;IACxF,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA4ED,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAqJvE"}
|
package/dist/commands/capture.js
CHANGED
|
@@ -11,6 +11,7 @@ import { mcpCallWithSession } from '../lib/client.js';
|
|
|
11
11
|
import { readSession, addCapturedEntry } from '../lib/session.js';
|
|
12
12
|
import { isJsonMode } from '../lib/runner.js';
|
|
13
13
|
import { formatCaptureReceipt } from '../formatters/capture.js';
|
|
14
|
+
import { checkActivation } from '../lib/activation.js';
|
|
14
15
|
/**
|
|
15
16
|
* Infer an ISO date (YYYY-MM-DD) from free-text values.
|
|
16
17
|
*
|
|
@@ -147,6 +148,25 @@ export async function runCapture(options) {
|
|
|
147
148
|
});
|
|
148
149
|
// Track in session state
|
|
149
150
|
addCapturedEntry(result.entryId);
|
|
151
|
+
// WP-301 S4: Activation ceremony — show contextual retrieval after first capture
|
|
152
|
+
if (!json) {
|
|
153
|
+
try {
|
|
154
|
+
const activation = await checkActivation(result.entryId);
|
|
155
|
+
if (activation?.isFirst && activation.relatedEntries.length > 0) {
|
|
156
|
+
process.stdout.write('\n Your first capture is on the Chain. Here\'s how it connects:\n');
|
|
157
|
+
for (const rel of activation.relatedEntries.slice(0, 3)) {
|
|
158
|
+
process.stdout.write(` \u2192 ${rel.entryId}: ${rel.name} (${rel.relation})\n`);
|
|
159
|
+
}
|
|
160
|
+
process.stdout.write('\n');
|
|
161
|
+
}
|
|
162
|
+
else if (activation?.isFirst) {
|
|
163
|
+
process.stdout.write('\n Your first capture is on the Chain! Run `pb orient -b` to see your workspace.\n\n');
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Activation is additive — never blocks capture
|
|
168
|
+
}
|
|
169
|
+
}
|
|
150
170
|
// BET-272 S3: Advisory quality hints — from createEntryWithClassification result (BR-144)
|
|
151
171
|
const qualityHints = result.qualityHints ?? [];
|
|
152
172
|
// Phase 3: Link to existing entry if --link provided (TEN-705)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/commands/capture.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,4 +13,10 @@ export declare function runCollectionsGet(options: {
|
|
|
13
13
|
slug: string;
|
|
14
14
|
}): Promise<void>;
|
|
15
15
|
export declare function runCollectionsAudit(): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* BET-288 Slice 5: Export all system_collection_definitions with full classification metadata.
|
|
18
|
+
* Outputs raw JSON (no pretty formatting — designed for piping/diffing).
|
|
19
|
+
* Admin only (enforced by the HTTP route).
|
|
20
|
+
*/
|
|
21
|
+
export declare function runCollectionsExport(): Promise<void>;
|
|
16
22
|
//# sourceMappingURL=collections.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../src/commands/collections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAwBxD;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhF;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQzD"}
|
|
1
|
+
{"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../src/commands/collections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAwBxD;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhF;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQzD;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ1D"}
|
|
@@ -56,4 +56,18 @@ export async function runCollectionsAudit() {
|
|
|
56
56
|
formatPretty: (result) => formatCollectionAudit(result),
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* BET-288 Slice 5: Export all system_collection_definitions with full classification metadata.
|
|
61
|
+
* Outputs raw JSON (no pretty formatting — designed for piping/diffing).
|
|
62
|
+
* Admin only (enforced by the HTTP route).
|
|
63
|
+
*/
|
|
64
|
+
export async function runCollectionsExport() {
|
|
65
|
+
const config = await getConfigOrGuide(() => runCollectionsExport());
|
|
66
|
+
if (!config)
|
|
67
|
+
return;
|
|
68
|
+
await runCliCommand({
|
|
69
|
+
fn: () => mcpCall('chain.exportDefinitions', {}),
|
|
70
|
+
formatPretty: (result) => JSON.stringify(result, null, 2),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
59
73
|
//# sourceMappingURL=collections.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/commands/collections.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,GAGtB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,aAAa,CAAuB;QACxC,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,cAAc,GAAG,MAAM,OAAO,CAMhC,uBAAuB,EAAE,EAAE,CAAC,CAAC;YACjC,MAAM,WAAW,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrD,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,UAAU,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM;gBACnC,IAAI,EAAE,CAAC,CAAC,IAAI;aACb,CAAC,CAAC,CAAC;YACJ,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;QACpD,CAAC;QACD,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC;KACvD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAyB;IAC/D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,aAAa,CAA0B;QAC3C,EAAE,EAAE,KAAK,IAAI,EAAE;YACb,MAAM,MAAM,GAAG,MAAM,OAAO,CAC1B,qBAAqB,EACrB,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CACvB,CAAC;YACF,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CACb,eAAe,OAAO,CAAC,IAAI,eAAe;oBAC1C,yDAAyD,CAC1D,CAAC;YACJ,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,wBAAwB,CAAC,MAAM,CAAC;KAC3D,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,aAAa,CAAwB;QACzC,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAwB,wBAAwB,EAAE,EAAE,CAAC;QACtE,YAAY,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,qBAAqB,CAAC,MAAM,CAAC;KACxD,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/commands/collections.ts"],"names":[],"mappings":"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"}
|