@productbrain/cli 0.1.0-beta.29 → 0.1.0-beta.32
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 +62 -178
- 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__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +117 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/glossary.test.d.ts +2 -0
- package/dist/__tests__/glossary.test.d.ts.map +1 -0
- package/dist/__tests__/glossary.test.js +32 -0
- package/dist/__tests__/glossary.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__/profiles.test.d.ts +2 -0
- package/dist/__tests__/profiles.test.d.ts.map +1 -0
- package/dist/__tests__/profiles.test.js +168 -0
- package/dist/__tests__/profiles.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 +23 -2
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/doctor.d.ts +18 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +211 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/doctor.test.d.ts +7 -0
- package/dist/commands/doctor.test.d.ts.map +1 -0
- package/dist/commands/doctor.test.js +265 -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/profile.d.ts +24 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +82 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/promote.d.ts.map +1 -1
- package/dist/commands/promote.js +3 -2
- package/dist/commands/promote.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/formatters/promote.d.ts +1 -0
- package/dist/formatters/promote.d.ts.map +1 -1
- package/dist/formatters/promote.js +1 -0
- package/dist/formatters/promote.js.map +1 -1
- package/dist/index.js +251 -284
- 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 +19 -2
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +71 -11
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/config.d.ts +9 -3
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +54 -15
- 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/errors.d.ts +57 -0
- package/dist/lib/errors.d.ts.map +1 -0
- package/dist/lib/errors.js +65 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/glossary.d.ts +19 -0
- package/dist/lib/glossary.d.ts.map +1 -0
- package/dist/lib/glossary.js +53 -0
- package/dist/lib/glossary.js.map +1 -0
- package/dist/lib/profiles.d.ts +34 -0
- package/dist/lib/profiles.d.ts.map +1 -0
- package/dist/lib/profiles.js +173 -0
- package/dist/lib/profiles.js.map +1 -0
- package/dist/lib/runner.d.ts +2 -0
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/lib/runner.js +33 -4
- package/dist/lib/runner.js.map +1 -1
- package/dist/lib/style.d.ts +65 -0
- package/dist/lib/style.d.ts.map +1 -0
- package/dist/lib/style.js +108 -0
- package/dist/lib/style.js.map +1 -0
- package/dist/lib/style.test.d.ts +7 -0
- package/dist/lib/style.test.d.ts.map +1 -0
- package/dist/lib/style.test.js +195 -0
- package/dist/lib/style.test.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/dist/commands/login.js
CHANGED
|
@@ -1,53 +1,79 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* pb login — save API key to ~/.config/productbrain/.env so pb works from any directory.
|
|
3
|
+
*
|
|
4
|
+
* Validates the key against the server before saving. On auth failure, shows
|
|
5
|
+
* error + signup URL and does NOT save. On network/timeout, warns but saves
|
|
6
|
+
* (don't block offline users).
|
|
3
7
|
*/
|
|
4
8
|
import { createInterface } from 'readline';
|
|
5
9
|
import { mkdirSync, writeFileSync } from 'fs';
|
|
6
|
-
import { HOME_CONFIG_DIR, HOME_ENV_PATH
|
|
7
|
-
|
|
10
|
+
import { HOME_CONFIG_DIR, HOME_ENV_PATH } from '../lib/config.js';
|
|
11
|
+
import { DEFAULT_SITE_URL, resolveAppUrl } from '../lib/constants.js';
|
|
12
|
+
import { validateKey } from '../lib/client.js';
|
|
13
|
+
const SIGNUP_URL = resolveAppUrl();
|
|
8
14
|
function question(rl, prompt) {
|
|
9
15
|
return new Promise((resolve) => {
|
|
10
16
|
rl.question(prompt, (answer) => resolve((answer ?? '').trim()));
|
|
11
17
|
});
|
|
12
18
|
}
|
|
13
|
-
|
|
14
|
-
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
15
|
-
console.log('Product Brain — sign in with your API key');
|
|
16
|
-
console.log(' Get a key: Product Brain app → Settings → API Keys\n');
|
|
17
|
-
let apiKey = await question(rl, 'Paste your API key (pb_sk_...): ');
|
|
18
|
-
if (!apiKey) {
|
|
19
|
-
console.error('No key entered. Exiting.');
|
|
20
|
-
rl.close();
|
|
21
|
-
process.exit(1);
|
|
22
|
-
}
|
|
23
|
-
if (!apiKey.startsWith('pb_sk_')) {
|
|
24
|
-
console.error('Key must start with pb_sk_. Get one from Product Brain → Settings → API Keys.');
|
|
25
|
-
rl.close();
|
|
26
|
-
process.exit(1);
|
|
27
|
-
}
|
|
28
|
-
const siteUrl = await question(rl, `API base URL (Enter for default): `);
|
|
29
|
-
rl.close();
|
|
30
|
-
const url = siteUrl || DEFAULT_SITE_URL;
|
|
19
|
+
function saveKey(apiKey, siteUrl) {
|
|
31
20
|
const content = [
|
|
32
21
|
`# Product Brain CLI — saved by "pb login"`,
|
|
33
22
|
`# Edit or delete this file to change or remove your key.`,
|
|
34
23
|
``,
|
|
35
24
|
`PRODUCTBRAIN_API_KEY=${apiKey}`,
|
|
36
|
-
`CONVEX_SITE_URL=${
|
|
25
|
+
`CONVEX_SITE_URL=${siteUrl}`,
|
|
37
26
|
``,
|
|
38
27
|
].join('\n');
|
|
39
28
|
mkdirSync(HOME_CONFIG_DIR, { recursive: true });
|
|
40
29
|
writeFileSync(HOME_ENV_PATH, content, { mode: 0o600 });
|
|
41
30
|
process.env.PRODUCTBRAIN_API_KEY = apiKey;
|
|
42
|
-
process.env.CONVEX_SITE_URL =
|
|
43
|
-
|
|
44
|
-
|
|
31
|
+
process.env.CONVEX_SITE_URL = siteUrl;
|
|
32
|
+
}
|
|
33
|
+
export async function runLogin() {
|
|
34
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
35
|
+
console.log('Product Brain — sign in with your API key');
|
|
36
|
+
console.log(` Get a key: ${SIGNUP_URL} → Settings → API Keys\n`);
|
|
37
|
+
const apiKey = await question(rl, 'Paste your API key (pb_sk_...): ');
|
|
38
|
+
rl.close();
|
|
39
|
+
if (!apiKey) {
|
|
40
|
+
console.error('No key entered. Exiting.');
|
|
41
|
+
process.exit(1);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (!apiKey.startsWith('pb_sk_')) {
|
|
45
|
+
console.error(`Key must start with pb_sk_. Get one from ${SIGNUP_URL} → Settings → API Keys.`);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Use CONVEX_SITE_URL env var if set (advanced users), otherwise default
|
|
50
|
+
const siteUrl = (process.env.CONVEX_SITE_URL || DEFAULT_SITE_URL).replace(/\/$/, '');
|
|
51
|
+
// Validate key against the server before saving
|
|
52
|
+
process.stdout.write('Validating key...');
|
|
45
53
|
try {
|
|
46
|
-
|
|
47
|
-
|
|
54
|
+
const result = await validateKey(apiKey, siteUrl);
|
|
55
|
+
if (result.valid) {
|
|
56
|
+
process.stdout.write(' connected.\n\n');
|
|
57
|
+
saveKey(apiKey, siteUrl);
|
|
58
|
+
console.log(`Saved to ${HOME_ENV_PATH}`);
|
|
59
|
+
console.log('You can run pb from any directory now. Try: pb orient -b\n');
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
process.stdout.write(' failed.\n\n');
|
|
63
|
+
console.error(`Invalid key: ${result.error}`);
|
|
64
|
+
console.error(`Get a valid key: ${SIGNUP_URL} → Settings → API Keys.`);
|
|
65
|
+
process.exit(1);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
48
68
|
}
|
|
49
69
|
catch {
|
|
50
|
-
//
|
|
70
|
+
// Network error or timeout — save anyway, don't block offline users
|
|
71
|
+
process.stdout.write(' could not reach server.\n\n');
|
|
72
|
+
console.warn('Could not reach server — key saved but not verified.\n' +
|
|
73
|
+
'Run `pb doctor` to check connectivity later.\n');
|
|
74
|
+
saveKey(apiKey, siteUrl);
|
|
75
|
+
console.log(`Saved to ${HOME_ENV_PATH}`);
|
|
76
|
+
console.log('You can run pb from any directory now. Try: pb orient -b\n');
|
|
51
77
|
}
|
|
52
78
|
}
|
|
53
79
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pb profile — workspace profile management commands.
|
|
3
|
+
* WP-302 Slice 2: list, create, use, delete profiles.
|
|
4
|
+
*
|
|
5
|
+
* Uses runCliCommand pattern from runner.ts for JSON/pretty output.
|
|
6
|
+
* Uses CLIError from errors.ts for structured error reporting.
|
|
7
|
+
*/
|
|
8
|
+
/** pb profile list — show all profiles, mark active one. */
|
|
9
|
+
export declare function runProfileList(): Promise<void>;
|
|
10
|
+
/** pb profile create <name> --api-key <key> [--url <url>] */
|
|
11
|
+
export declare function runProfileCreate(opts: {
|
|
12
|
+
name: string;
|
|
13
|
+
apiKey: string;
|
|
14
|
+
url?: string;
|
|
15
|
+
}): Promise<void>;
|
|
16
|
+
/** pb profile use <name> — switch active profile, close any active session. */
|
|
17
|
+
export declare function runProfileUse(opts: {
|
|
18
|
+
name: string;
|
|
19
|
+
}): Promise<void>;
|
|
20
|
+
/** pb profile delete <name> */
|
|
21
|
+
export declare function runProfileDelete(opts: {
|
|
22
|
+
name: string;
|
|
23
|
+
}): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH,4DAA4D;AAC5D,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBpD;AAED,6DAA6D;AAC7D,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhB;AAED,+EAA+E;AAC/E,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BzE;AAED,+BAA+B;AAC/B,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ5E"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pb profile — workspace profile management commands.
|
|
3
|
+
* WP-302 Slice 2: list, create, use, delete profiles.
|
|
4
|
+
*
|
|
5
|
+
* Uses runCliCommand pattern from runner.ts for JSON/pretty output.
|
|
6
|
+
* Uses CLIError from errors.ts for structured error reporting.
|
|
7
|
+
*/
|
|
8
|
+
import { runCliCommand } from '../lib/runner.js';
|
|
9
|
+
import { listProfiles, getActiveProfile, createProfile, useProfile, deleteProfile, } from '../lib/profiles.js';
|
|
10
|
+
import { readSession, clearSession } from '../lib/session.js';
|
|
11
|
+
import { resetConfigCache } from '../lib/config.js';
|
|
12
|
+
/** pb profile list — show all profiles, mark active one. */
|
|
13
|
+
export async function runProfileList() {
|
|
14
|
+
await runCliCommand({
|
|
15
|
+
fn: async () => {
|
|
16
|
+
const profiles = listProfiles();
|
|
17
|
+
const active = getActiveProfile();
|
|
18
|
+
return { profiles, active };
|
|
19
|
+
},
|
|
20
|
+
formatPretty: (data) => {
|
|
21
|
+
if (data.profiles.length === 0) {
|
|
22
|
+
return 'No profiles configured. Run: pb profile create <name> --api-key <key>';
|
|
23
|
+
}
|
|
24
|
+
const lines = data.profiles.map((name) => {
|
|
25
|
+
const marker = name === data.active ? ' (active)' : '';
|
|
26
|
+
return ` ${name}${marker}`;
|
|
27
|
+
});
|
|
28
|
+
return `Profiles:\n${lines.join('\n')}`;
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** pb profile create <name> --api-key <key> [--url <url>] */
|
|
33
|
+
export async function runProfileCreate(opts) {
|
|
34
|
+
await runCliCommand({
|
|
35
|
+
fn: async () => {
|
|
36
|
+
createProfile(opts.name, opts.apiKey, opts.url);
|
|
37
|
+
return { name: opts.name, created: true };
|
|
38
|
+
},
|
|
39
|
+
formatPretty: (data) => `Profile "${data.name}" created.`,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/** pb profile use <name> — switch active profile, close any active session. */
|
|
43
|
+
export async function runProfileUse(opts) {
|
|
44
|
+
await runCliCommand({
|
|
45
|
+
fn: async () => {
|
|
46
|
+
// Close active session before switching (TEN-1277: session orphaning)
|
|
47
|
+
const session = readSession();
|
|
48
|
+
if (session) {
|
|
49
|
+
clearSession();
|
|
50
|
+
}
|
|
51
|
+
useProfile(opts.name);
|
|
52
|
+
// Reset config cache so next getConfig() reads the new profile
|
|
53
|
+
resetConfigCache();
|
|
54
|
+
// Clear env vars so they get re-read from the new profile
|
|
55
|
+
delete process.env.PRODUCTBRAIN_API_KEY;
|
|
56
|
+
delete process.env.CONVEX_SITE_URL;
|
|
57
|
+
return {
|
|
58
|
+
name: opts.name,
|
|
59
|
+
active: true,
|
|
60
|
+
sessionClosed: session !== null,
|
|
61
|
+
};
|
|
62
|
+
},
|
|
63
|
+
formatPretty: (data) => {
|
|
64
|
+
let msg = `Switched to profile "${data.name}".`;
|
|
65
|
+
if (data.sessionClosed) {
|
|
66
|
+
msg += ' (previous session closed)';
|
|
67
|
+
}
|
|
68
|
+
return msg;
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
/** pb profile delete <name> */
|
|
73
|
+
export async function runProfileDelete(opts) {
|
|
74
|
+
await runCliCommand({
|
|
75
|
+
fn: async () => {
|
|
76
|
+
deleteProfile(opts.name);
|
|
77
|
+
return { name: opts.name, deleted: true };
|
|
78
|
+
},
|
|
79
|
+
formatPretty: (data) => `Profile "${data.name}" deleted.`,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../src/commands/profile.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../src/commands/promote.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../src/commands/promote.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAyBD,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAyEvE"}
|
package/dist/commands/promote.js
CHANGED
|
@@ -8,6 +8,7 @@ import { mcpCallWithSession } from '../lib/client.js';
|
|
|
8
8
|
import { readSession } from '../lib/session.js';
|
|
9
9
|
import { runCliCommand } from '../lib/runner.js';
|
|
10
10
|
import { formatPromoteReceipt } from '../formatters/promote.js';
|
|
11
|
+
import { copy } from '../lib/style.js';
|
|
11
12
|
const BLOCKING_CONTRADICTION_THRESHOLD = 0.75;
|
|
12
13
|
export async function runPromote(options) {
|
|
13
14
|
const config = await getConfigOrGuide(() => runPromote(options));
|
|
@@ -16,8 +17,8 @@ export async function runPromote(options) {
|
|
|
16
17
|
// Require active session (DEC-9, BR-8)
|
|
17
18
|
const session = readSession();
|
|
18
19
|
if (!session) {
|
|
19
|
-
process.stderr.write(
|
|
20
|
-
process.stderr.write(
|
|
20
|
+
process.stderr.write(copy.noSession + '\n');
|
|
21
|
+
process.stderr.write(copy.sessionRequired + '\n');
|
|
21
22
|
process.exit(1);
|
|
22
23
|
}
|
|
23
24
|
const entryId = options.entryId.trim();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/commands/promote.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAA0B,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/commands/promote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pb setup — guided first-time onboarding: npm install → first capture.
|
|
3
|
+
* WP-301 Slice 3. Each step emits telemetry (STD-155 event names).
|
|
4
|
+
*
|
|
5
|
+
* Flow:
|
|
6
|
+
* 0. Check existing config → offer health check or continue to login
|
|
7
|
+
* 1. Account check → signup URL or login inline
|
|
8
|
+
* 2. Workspace binding confirmation
|
|
9
|
+
* 3. Guided first capture (starts a session, captures via MCP)
|
|
10
|
+
* 4. Summary with next-step hint
|
|
11
|
+
*
|
|
12
|
+
* Uses readline for interactive prompts (same pattern as login.ts).
|
|
13
|
+
* No new npm dependencies.
|
|
14
|
+
*/
|
|
15
|
+
export declare function runSetup(): Promise<void>;
|
|
16
|
+
//# sourceMappingURL=setup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAyCH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAQ9C"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pb setup — guided first-time onboarding: npm install → first capture.
|
|
3
|
+
* WP-301 Slice 3. Each step emits telemetry (STD-155 event names).
|
|
4
|
+
*
|
|
5
|
+
* Flow:
|
|
6
|
+
* 0. Check existing config → offer health check or continue to login
|
|
7
|
+
* 1. Account check → signup URL or login inline
|
|
8
|
+
* 2. Workspace binding confirmation
|
|
9
|
+
* 3. Guided first capture (starts a session, captures via MCP)
|
|
10
|
+
* 4. Summary with next-step hint
|
|
11
|
+
*
|
|
12
|
+
* Uses readline for interactive prompts (same pattern as login.ts).
|
|
13
|
+
* No new npm dependencies.
|
|
14
|
+
*/
|
|
15
|
+
import { createInterface } from 'readline';
|
|
16
|
+
import { getConfig } from '../lib/config.js';
|
|
17
|
+
import { mcpCall, mcpCallWithSession } from '../lib/client.js';
|
|
18
|
+
import { readSession, writeSession } from '../lib/session.js';
|
|
19
|
+
import { trackEvent } from '../lib/telemetry.js';
|
|
20
|
+
import { runLogin } from './login.js';
|
|
21
|
+
/** Prompt helper — same pattern as login.ts. */
|
|
22
|
+
function question(rl, prompt) {
|
|
23
|
+
return new Promise((resolve) => {
|
|
24
|
+
rl.question(prompt, (answer) => resolve((answer ?? '').trim()));
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/** Mask an API key for display: show prefix + last 4 chars. */
|
|
28
|
+
function maskKey(key) {
|
|
29
|
+
if (key.length <= 10)
|
|
30
|
+
return key.slice(0, 6) + '****';
|
|
31
|
+
return key.slice(0, 6) + '...' + key.slice(-4);
|
|
32
|
+
}
|
|
33
|
+
export async function runSetup() {
|
|
34
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
35
|
+
try {
|
|
36
|
+
await runSetupFlow(rl);
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
rl.close();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async function runSetupFlow(rl) {
|
|
43
|
+
trackEvent('setup_started');
|
|
44
|
+
console.log('');
|
|
45
|
+
console.log('Product Brain — Setup');
|
|
46
|
+
console.log('=====================');
|
|
47
|
+
console.log('');
|
|
48
|
+
// Step 1: Check existing config
|
|
49
|
+
let hasValidConfig = false;
|
|
50
|
+
try {
|
|
51
|
+
const config = getConfig();
|
|
52
|
+
hasValidConfig = true;
|
|
53
|
+
console.log(`Already configured: ${maskKey(config.apiKey)}`);
|
|
54
|
+
console.log(`API endpoint: ${config.siteUrl}`);
|
|
55
|
+
console.log('');
|
|
56
|
+
// Verify workspace connectivity
|
|
57
|
+
try {
|
|
58
|
+
const workspace = await mcpCall('resolveWorkspace', {});
|
|
59
|
+
if (workspace?.name) {
|
|
60
|
+
console.log(`Connected to workspace: ${workspace.name}`);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
console.log('Workspace connection verified.');
|
|
64
|
+
}
|
|
65
|
+
trackEvent('workspace_bound');
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
console.log('Warning: Could not verify workspace connection. Your key may be invalid.');
|
|
69
|
+
console.log('Run `pb login` to re-enter your API key.');
|
|
70
|
+
}
|
|
71
|
+
console.log('');
|
|
72
|
+
const runCheck = await question(rl, 'Skip to first capture? (y/n): ');
|
|
73
|
+
if (runCheck.toLowerCase() !== 'y' && runCheck.toLowerCase() !== 'yes') {
|
|
74
|
+
console.log('');
|
|
75
|
+
console.log('Setup complete. Try: pb orient -b');
|
|
76
|
+
trackEvent('setup_completed');
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// No valid config — continue to login
|
|
82
|
+
}
|
|
83
|
+
// Step 2: Account check + login (only if no valid config)
|
|
84
|
+
if (!hasValidConfig) {
|
|
85
|
+
console.log('To get started, you need a Product Brain account and API key.');
|
|
86
|
+
console.log('');
|
|
87
|
+
const hasAccount = await question(rl, 'Do you have a Product Brain account? (y/n): ');
|
|
88
|
+
if (hasAccount.toLowerCase() !== 'y' && hasAccount.toLowerCase() !== 'yes') {
|
|
89
|
+
console.log('');
|
|
90
|
+
console.log('Create an account at: https://productbrain.io');
|
|
91
|
+
console.log('Then come back and run: pb setup');
|
|
92
|
+
console.log('');
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
// Run login flow — this handles key prompt, validation, and saving
|
|
96
|
+
console.log('');
|
|
97
|
+
rl.close(); // Close our rl so login.ts can create its own
|
|
98
|
+
await runLogin();
|
|
99
|
+
trackEvent('key_validated');
|
|
100
|
+
// Re-open rl for remaining prompts
|
|
101
|
+
const newRl = createInterface({ input: process.stdin, output: process.stdout });
|
|
102
|
+
try {
|
|
103
|
+
await runSetupPostLogin(newRl);
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
newRl.close();
|
|
107
|
+
}
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// If we already had config, go straight to first capture
|
|
111
|
+
await runFirstCapture(rl);
|
|
112
|
+
}
|
|
113
|
+
async function runSetupPostLogin(rl) {
|
|
114
|
+
// Step 3: Workspace binding — the API key already binds to a workspace
|
|
115
|
+
console.log('');
|
|
116
|
+
try {
|
|
117
|
+
const workspace = await mcpCall('resolveWorkspace', {});
|
|
118
|
+
if (workspace?.name) {
|
|
119
|
+
console.log(`Connected to workspace: ${workspace.name}`);
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
console.log('Workspace connection verified.');
|
|
123
|
+
}
|
|
124
|
+
trackEvent('workspace_bound');
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
console.log(`Warning: Could not verify workspace: ${err instanceof Error ? err.message : String(err)}`);
|
|
128
|
+
console.log('You can still try commands. Run `pb orient -b` to test.');
|
|
129
|
+
}
|
|
130
|
+
// Step 4: First capture
|
|
131
|
+
await runFirstCapture(rl);
|
|
132
|
+
}
|
|
133
|
+
async function runFirstCapture(rl) {
|
|
134
|
+
console.log('');
|
|
135
|
+
const wantCapture = await question(rl, 'Ready to capture your first piece of knowledge? (y/n): ');
|
|
136
|
+
trackEvent('first_capture_prompted');
|
|
137
|
+
if (wantCapture.toLowerCase() !== 'y' && wantCapture.toLowerCase() !== 'yes') {
|
|
138
|
+
console.log('');
|
|
139
|
+
console.log('Setup complete! Try: pb orient -b');
|
|
140
|
+
trackEvent('setup_completed');
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
// Start a session if none exists
|
|
144
|
+
let session = readSession();
|
|
145
|
+
if (!session) {
|
|
146
|
+
try {
|
|
147
|
+
const workspace = await mcpCall('resolveWorkspace', {});
|
|
148
|
+
if (!workspace?.keyId) {
|
|
149
|
+
console.log('Your API key is read-only. You need a readwrite key for captures.');
|
|
150
|
+
console.log('Generate one: Product Brain app > Settings > API Keys.');
|
|
151
|
+
trackEvent('setup_completed');
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const result = await mcpCall('agent.startSession', {
|
|
155
|
+
workspaceId: workspace._id,
|
|
156
|
+
apiKeyId: workspace.keyId,
|
|
157
|
+
clientKind: 'cli',
|
|
158
|
+
});
|
|
159
|
+
session = {
|
|
160
|
+
sessionId: result.sessionId,
|
|
161
|
+
workspaceId: workspace._id,
|
|
162
|
+
workspaceName: result.workspaceName,
|
|
163
|
+
startedAt: new Date().toISOString(),
|
|
164
|
+
entriesCaptured: [],
|
|
165
|
+
};
|
|
166
|
+
writeSession(session);
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
console.log(`Could not start session: ${err instanceof Error ? err.message : String(err)}`);
|
|
170
|
+
console.log('You can start a session manually: pb session start');
|
|
171
|
+
trackEvent('setup_completed');
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Prompt for capture text
|
|
176
|
+
console.log('');
|
|
177
|
+
console.log('Type a short insight, decision, or tension:');
|
|
178
|
+
const captureText = await question(rl, '> ');
|
|
179
|
+
if (!captureText) {
|
|
180
|
+
console.log('No text entered. You can capture later: pb capture "your insight here"');
|
|
181
|
+
console.log('');
|
|
182
|
+
console.log('Setup complete! Try: pb orient -b');
|
|
183
|
+
trackEvent('setup_completed');
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
// Capture via MCP — use mcpCallWithSession which reads the session file
|
|
187
|
+
try {
|
|
188
|
+
const result = await mcpCallWithSession('chain.createEntry', {
|
|
189
|
+
collectionSlug: 'insights',
|
|
190
|
+
name: captureText,
|
|
191
|
+
status: 'draft',
|
|
192
|
+
data: { description: captureText },
|
|
193
|
+
sessionId: session.sessionId,
|
|
194
|
+
createdBy: `agent:${session.sessionId}`,
|
|
195
|
+
});
|
|
196
|
+
console.log('');
|
|
197
|
+
console.log(`Captured: ${result.entryId} (draft)`);
|
|
198
|
+
console.log('Your knowledge is on the Chain. Review it in Product Brain.');
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
console.log(`Capture failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
202
|
+
console.log('You can try again: pb capture "your insight here"');
|
|
203
|
+
}
|
|
204
|
+
// Step 5: Summary
|
|
205
|
+
console.log('');
|
|
206
|
+
console.log('Setup complete! Next steps:');
|
|
207
|
+
console.log(' pb orient -b See your workspace at a glance');
|
|
208
|
+
console.log(' pb capture "..." Capture more knowledge');
|
|
209
|
+
console.log(' pb session close End your session when done');
|
|
210
|
+
console.log('');
|
|
211
|
+
trackEvent('setup_completed');
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../src/formatters/promote.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../src/formatters/promote.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,MAAM,iBAAiB,GACzB;IACE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,GACD;IACE,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC7D,CAAC;AAEN,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAiCrE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/formatters/promote.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/formatters/promote.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0BH,MAAM,UAAU,oBAAoB,CAAC,IAAwB;IAC3D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAE3B,IAAI,QAAQ,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,kBAAkB,EAAE,CAAC;QAC/D,6DAA6D;QAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAClF,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,QAAQ,IAAI,CAAC,OAAO,oBAAoB,CAAC,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QAC3E,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,MAA4I,CAAC;QACvJ,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,YAAY,SAAS,sBAAsB,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,CAAC,cAAc,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,cAAc,CAAC,UAAU,IAAI,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClH,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;YACxE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,kBAAkB,SAAS,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|