@productbrain/cli 0.1.0-beta.1 → 0.1.0-beta.6

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 ADDED
@@ -0,0 +1,59 @@
1
+ # Product Brain CLI (`pb`)
2
+
3
+ Read-only CLI for Chain knowledge: orient, search, get entry, gather context. Uses your Product Brain API key (same as MCP).
4
+
5
+ **Requirements:** Node 18+, API key from Product Brain → Settings → API Keys (`pb_sk_*`).
6
+
7
+ ---
8
+
9
+ ## Install
10
+
11
+ ### From npm (beta)
12
+
13
+ ```bash
14
+ npm install -g @productbrain/cli@beta
15
+ ```
16
+
17
+ 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
+
19
+ ### From main (no publish needed)
20
+
21
+ If you have the repo and want **latest from `main`** without publishing to npm:
22
+
23
+ ```bash
24
+ git clone https://github.com/synergyai-os/Product-OS.git
25
+ cd Product-OS
26
+ npm ci
27
+ cd packages/cli && npm run build && npm install -g .
28
+ ```
29
+
30
+ After that, `pb` runs from your global path. Pull and re-run the last two commands to update:
31
+
32
+ ```bash
33
+ cd Product-OS && git pull && cd packages/cli && npm run build && npm install -g .
34
+ ```
35
+
36
+ See [Deployment strategy — CLI vs MCP](../../docs/deployment-strategy.md#cli-vs-mcp-distribution) for why this avoids `cli:publish` / OTP.
37
+
38
+ ---
39
+
40
+ ## First run
41
+
42
+ - **No key yet:** Run any command (e.g. `pb orient -b`). You’ll get a short guided flow: “Do you have an API key? (y/n)” → paste key → saved to `~/.config/productbrain/.env`. Your command then runs.
43
+ - **Or:** Run `pb login` to paste and save your key once. Get a key: Product Brain app → Settings → API Keys.
44
+
45
+ Config is read from (in order): env vars → `~/.config/productbrain/.env` → `.env.mcp` in the current directory.
46
+
47
+ ---
48
+
49
+ ## Commands
50
+
51
+ | Command | Description |
52
+ |--------|-------------|
53
+ | `pb orient` | Workspace stage, bets, governance, tensions. Use `-b` for a brief view. |
54
+ | `pb search <query>` | Full-text search across the Chain. |
55
+ | `pb get <entry-id>` | Full entry (data, relations, last 10 history events). |
56
+ | `pb context <entry-id>` | Constellation context (pipe-friendly markdown when not a TTY). |
57
+ | `pb login` | Save your API key to `~/.config/productbrain/.env`. |
58
+
59
+ `pb --help` for options.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ingest.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ingest.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * CLI ingest command — verify mcpCall sequence and args.
3
+ * BET-81 Slice 1: chain.ingestDocument called with correct args, batch size.
4
+ */
5
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
6
+ import { mkdtempSync, writeFileSync, rmSync } from 'fs';
7
+ import { join } from 'path';
8
+ import { tmpdir } from 'os';
9
+ import { runIngest } from '../commands/ingest.js';
10
+ const mcpCallMock = vi.fn();
11
+ vi.mock('../lib/client.js', () => ({
12
+ mcpCall: (...args) => mcpCallMock(...args),
13
+ }));
14
+ vi.mock('../lib/config.js', () => ({
15
+ getConfigOrGuide: vi.fn((retry) => Promise.resolve({ apiKey: 'pb_sk_test', siteUrl: 'https://test.convex.site' })),
16
+ }));
17
+ describe('runIngest', () => {
18
+ let tmpDir;
19
+ beforeEach(() => {
20
+ vi.clearAllMocks();
21
+ tmpDir = mkdtempSync(join(tmpdir(), 'pb-ingest-'));
22
+ mcpCallMock
23
+ .mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1' }) // resolveWorkspace
24
+ .mockResolvedValueOnce({ sessionId: 'sess-1', toolsScope: 'readwrite', workspaceName: 'Test' }) // startSession
25
+ .mockResolvedValue({ entriesCreated: ['e1', 'e2'], skipped: 0 }); // ingestDocument, closeSession
26
+ });
27
+ afterEach(() => {
28
+ rmSync(tmpDir, { recursive: true, force: true });
29
+ });
30
+ it('calls resolveWorkspace then agent.startSession with clientKind: cli', async () => {
31
+ const f = join(tmpDir, 'doc.md');
32
+ writeFileSync(f, '# Test\n\nContent here.');
33
+ await runIngest({ pattern: f });
34
+ expect(mcpCallMock).toHaveBeenNthCalledWith(1, 'resolveWorkspace', {});
35
+ expect(mcpCallMock).toHaveBeenNthCalledWith(2, 'agent.startSession', {
36
+ workspaceId: 'ws-1',
37
+ apiKeyId: 'key-1',
38
+ clientKind: 'cli',
39
+ });
40
+ });
41
+ it('calls chain.ingestDocument with content, sourceRef, ingestionRunId, sessionId', async () => {
42
+ mcpCallMock
43
+ .mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1' })
44
+ .mockResolvedValueOnce({ sessionId: 'sess-1', toolsScope: 'readwrite', workspaceName: 'Test' })
45
+ .mockResolvedValue({ entriesCreated: ['e1', 'e2'], skipped: 0 });
46
+ const f = join(tmpDir, 'doc.md');
47
+ const content = '# Decision\n\nWe use TypeScript.';
48
+ writeFileSync(f, content);
49
+ await runIngest({ pattern: f });
50
+ const ingestCall = mcpCallMock.mock.calls.find((c) => c[0] === 'chain.ingestDocument');
51
+ expect(ingestCall).toBeDefined();
52
+ const [, args] = ingestCall;
53
+ expect(args.content).toBe(content);
54
+ expect(args.sourceRef).toBe(f);
55
+ expect(args.ingestionRunId).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/);
56
+ expect(args.sessionId).toBe('sess-1');
57
+ });
58
+ it('calls agent.closeSession after ingest', async () => {
59
+ mcpCallMock
60
+ .mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1' })
61
+ .mockResolvedValueOnce({ sessionId: 'sess-1', toolsScope: 'readwrite', workspaceName: 'Test' })
62
+ .mockResolvedValue({ entriesCreated: ['e1', 'e2'], skipped: 0 });
63
+ const f = join(tmpDir, 'doc.md');
64
+ writeFileSync(f, '# Test');
65
+ await runIngest({ pattern: f });
66
+ const closeCall = mcpCallMock.mock.calls.find((c) => c[0] === 'agent.closeSession');
67
+ expect(closeCall).toBeDefined();
68
+ expect(closeCall).toEqual(['agent.closeSession', { sessionId: 'sess-1', status: 'closed' }]);
69
+ });
70
+ it('processes one file per chain.ingestDocument call (no batching of content)', async () => {
71
+ mcpCallMock
72
+ .mockResolvedValueOnce({ _id: 'ws-1', keyId: 'key-1' })
73
+ .mockResolvedValueOnce({ sessionId: 'sess-1', toolsScope: 'readwrite', workspaceName: 'Test' })
74
+ .mockResolvedValue({ entriesCreated: ['e1', 'e2'], skipped: 0 });
75
+ const f1 = join(tmpDir, 'a.md');
76
+ const f2 = join(tmpDir, 'b.md');
77
+ writeFileSync(f1, '# A');
78
+ writeFileSync(f2, '# B');
79
+ await runIngest({ pattern: join(tmpDir, '*.md') });
80
+ const ingestCalls = mcpCallMock.mock.calls.filter((c) => c[0] === 'chain.ingestDocument');
81
+ expect(ingestCalls).toHaveLength(2);
82
+ const contents = ingestCalls.map((c) => c[1].content);
83
+ expect(contents).toContain('# A');
84
+ expect(contents).toContain('# B');
85
+ });
86
+ });
87
+ //# sourceMappingURL=ingest.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.test.js","sourceRoot":"","sources":["../../src/__tests__/ingest.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAY5E"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAe5E"}
@@ -2,9 +2,13 @@
2
2
  * pb context <entry-id> — gather and display constellation context.
3
3
  * Pipe-friendly: when stdout is not a TTY, output clean markdown (no ANSI codes).
4
4
  */
5
+ import { getConfigOrGuide } from '../lib/config.js';
5
6
  import { mcpCall } from '../lib/client.js';
6
7
  import { formatContext } from '../formatters/context.js';
7
8
  export async function runContext(options) {
9
+ const config = await getConfigOrGuide(() => runContext(options));
10
+ if (!config)
11
+ return;
8
12
  const result = await mcpCall('chain.gatherContext', {
9
13
  entryId: options.entryId,
10
14
  maxHops: 2,
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAsB,MAAM,0BAA0B,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA4B;IAC3D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAgB,qBAAqB,EAAE;QACjE,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,CAAC;KACX,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,CAAC,OAAO,cAAc,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAsB,MAAM,0BAA0B,CAAC;AAE7E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA4B;IAC3D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAgB,qBAAqB,EAAE;QACjE,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,CAAC;KACX,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,CAAC,OAAO,cAAc,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;AAC9C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../src/commands/get.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,wBAAsB,MAAM,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAWxE"}
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../src/commands/get.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,wBAAsB,MAAM,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAcxE"}
@@ -2,9 +2,13 @@
2
2
  * pb get — display full entry by ID (data, relations, last 10 history events).
3
3
  * BET-108 Slice 3.
4
4
  */
5
+ import { getConfigOrGuide } from '../lib/config.js';
5
6
  import { mcpCall } from '../lib/client.js';
6
7
  import { formatEntry } from '../formatters/entry.js';
7
8
  export async function runGet(options) {
9
+ const config = await getConfigOrGuide(() => runGet(options));
10
+ if (!config)
11
+ return;
8
12
  const entry = await mcpCall('chain.getEntry', {
9
13
  entryId: options.entryId,
10
14
  });
@@ -1 +1 @@
1
- {"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/commands/get.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAqB,MAAM,wBAAwB,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAA4B;IACvD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAsB,gBAAgB,EAAE;QACjE,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,OAAO,cAAc,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../src/commands/get.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAqB,MAAM,wBAAwB,CAAC;AAExE,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,OAA4B;IACvD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,KAAK,GAAG,MAAM,OAAO,CAAsB,gBAAgB,EAAE;QACjE,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,CAAC,OAAO,cAAc,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * pb ingest — bulk document ingestion to Chain as drafts.
3
+ * BET-81 Slice 1: CLI-first ingestion with clientKind attribution (DEC-184).
4
+ */
5
+ export declare function runIngest(options: {
6
+ pattern: string;
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=ingest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../src/commands/ingest.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqBH,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD3E"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * pb ingest — bulk document ingestion to Chain as drafts.
3
+ * BET-81 Slice 1: CLI-first ingestion with clientKind attribution (DEC-184).
4
+ */
5
+ import { readFile } from 'fs/promises';
6
+ import { homedir } from 'os';
7
+ import { resolve } from 'path';
8
+ import { globSync } from 'glob';
9
+ import { randomUUID } from 'crypto';
10
+ import { getConfigOrGuide } from '../lib/config.js';
11
+ import { mcpCall } from '../lib/client.js';
12
+ function expandGlob(pattern) {
13
+ const cwd = process.cwd();
14
+ const expanded = pattern.startsWith('~') ? pattern.replace('~', homedir()) : pattern;
15
+ const normalized = expanded.replace(/^\.\//, '');
16
+ const resolved = expanded.startsWith('/') ? expanded : resolve(cwd, normalized);
17
+ return globSync(resolved, { nodir: true, absolute: true });
18
+ }
19
+ export async function runIngest(options) {
20
+ const config = await getConfigOrGuide(() => runIngest(options));
21
+ if (!config)
22
+ return;
23
+ const files = expandGlob(options.pattern);
24
+ if (files.length === 0) {
25
+ console.error(`No files matched: ${options.pattern}`);
26
+ process.exit(1);
27
+ }
28
+ const ingestionRunId = randomUUID();
29
+ // Resolve workspace + keyId — startSession requires apiKeyId (MCP server passes it; CLI gets from resolveWorkspace)
30
+ const workspace = await mcpCall('resolveWorkspace', {});
31
+ if (!workspace?.keyId) {
32
+ throw new Error('API key has no keyId. Use a readwrite key from Settings → API Keys.');
33
+ }
34
+ const startRes = await mcpCall('agent.startSession', {
35
+ workspaceId: workspace._id,
36
+ apiKeyId: workspace.keyId,
37
+ clientKind: 'cli',
38
+ });
39
+ const sessionId = startRes.sessionId;
40
+ let totalCreated = 0;
41
+ const total = files.length;
42
+ for (let i = 0; i < files.length; i++) {
43
+ const filePath = files[i];
44
+ const content = await readFile(filePath, 'utf8');
45
+ const sourceRef = filePath;
46
+ const result = await mcpCall('chain.ingestDocument', {
47
+ content,
48
+ sourceRef,
49
+ ingestionRunId,
50
+ sessionId,
51
+ });
52
+ const created = result?.entriesCreated?.length ?? 0;
53
+ const skipped = result?.skipped ?? 0;
54
+ const rejected = result?.rejected?.length ?? 0;
55
+ totalCreated += created;
56
+ const parts = [`${created} created`];
57
+ if (skipped > 0)
58
+ parts.push(`${skipped} skipped`);
59
+ if (rejected > 0)
60
+ parts.push(`${rejected} rejected`);
61
+ console.log(`Ingesting [${i + 1}/${total}]: ${filePath.split('/').pop()} — ${parts.join(', ')}`);
62
+ }
63
+ await mcpCall('agent.closeSession', { sessionId, status: 'closed' });
64
+ console.log(`\nDone. ${totalCreated} entries created as drafts. Open Cortex to review.`);
65
+ }
66
+ //# sourceMappingURL=ingest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.js","sourceRoot":"","sources":["../../src/commands/ingest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * pb login — save API key to ~/.config/productbrain/.env so pb works from any directory.
3
+ */
4
+ export declare function runLogin(): Promise<void>;
5
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAuD9C"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * pb login — save API key to ~/.config/productbrain/.env so pb works from any directory.
3
+ */
4
+ import { createInterface } from 'readline';
5
+ import { mkdirSync, writeFileSync } from 'fs';
6
+ import { HOME_CONFIG_DIR, HOME_ENV_PATH, getConfig } from '../lib/config.js';
7
+ const DEFAULT_SITE_URL = 'https://trustworthy-kangaroo-277.convex.site';
8
+ function question(rl, prompt) {
9
+ return new Promise((resolve) => {
10
+ rl.question(prompt, (answer) => resolve((answer ?? '').trim()));
11
+ });
12
+ }
13
+ export async function runLogin() {
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;
31
+ const content = [
32
+ `# Product Brain CLI — saved by "pb login"`,
33
+ `# Edit or delete this file to change or remove your key.`,
34
+ ``,
35
+ `PRODUCTBRAIN_API_KEY=${apiKey}`,
36
+ `CONVEX_SITE_URL=${url.replace(/\/$/, '')}`,
37
+ ``,
38
+ ].join('\n');
39
+ mkdirSync(HOME_CONFIG_DIR, { recursive: true });
40
+ writeFileSync(HOME_ENV_PATH, content, { mode: 0o600 });
41
+ process.env.PRODUCTBRAIN_API_KEY = apiKey;
42
+ process.env.CONVEX_SITE_URL = url.replace(/\/$/, '');
43
+ console.log(`\nSaved to ${HOME_ENV_PATH}`);
44
+ console.log('You can run pb from any directory now. Try: pb orient -b\n');
45
+ try {
46
+ getConfig();
47
+ console.log('Config looks good.');
48
+ }
49
+ catch {
50
+ // Should not happen after we set env above
51
+ }
52
+ }
53
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7E,MAAM,gBAAgB,GAAG,8CAA8C,CAAC;AAExE,SAAS,QAAQ,CAAC,EAAsC,EAAE,MAAc;IACtE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAE7E,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IAEtE,IAAI,MAAM,GAAG,MAAM,QAAQ,CACzB,EAAE,EACF,kCAAkC,CACnC,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1C,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,KAAK,CAAC,+EAA+E,CAAC,CAAC;QAC/F,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,EAAE,EACF,oCAAoC,CACrC,CAAC;IAEF,EAAE,CAAC,KAAK,EAAE,CAAC;IAEX,MAAM,GAAG,GAAG,OAAO,IAAI,gBAAgB,CAAC;IACxC,MAAM,OAAO,GAAG;QACd,2CAA2C;QAC3C,0DAA0D;QAC1D,EAAE;QACF,wBAAwB,MAAM,EAAE;QAChC,mBAAmB,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE;QAC3C,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,SAAS,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,aAAa,CAAC,aAAa,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAEvD,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,MAAM,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAErD,OAAO,CAAC,GAAG,CAAC,cAAc,aAAa,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;IAE1E,IAAI,CAAC;QACH,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,2CAA2C;IAC7C,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"orient.d.ts","sourceRoot":"","sources":["../../src/commands/orient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orient.d.ts","sourceRoot":"","sources":["../../src/commands/orient.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * pb orient — prints workspace stage and all orient sections per ARCH-25.
3
3
  */
4
+ import { getConfigOrGuide } from '../lib/config.js';
4
5
  import { mcpCall } from '../lib/client.js';
5
6
  import { formatOrient, formatOrientBrief } from '../formatters/orient.js';
6
7
  function normalizeView(raw) {
@@ -25,6 +26,9 @@ function normalizeView(raw) {
25
26
  };
26
27
  }
27
28
  export async function runOrient(options = {}) {
29
+ const config = await getConfigOrGuide(() => runOrient(options));
30
+ if (!config)
31
+ return;
28
32
  const raw = await mcpCall('chain.getOrientView', {});
29
33
  const view = normalizeView(raw);
30
34
  if (options.brief) {
@@ -1 +1 @@
1
- {"version":3,"file":"orient.js","sourceRoot":"","sources":["../../src/commands/orient.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AA4D1E,SAAS,aAAa,CAAC,GAAsB;IAC3C,OAAO;QACL,GAAG,GAAG;QACN,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI;YAC5B,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;YACb,aAAa,EAAE,EAAE;SAClB;QACD,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;QAC5B,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,IAAI,EAAE;QAC9C,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE;QAC9B,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,EAAE;QACxC,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI;YAC9B,iBAAiB,EAAE,EAAE;YACrB,iBAAiB,EAAE,EAAE;YACrB,YAAY,EAAE,EAAE;SACjB;QACD,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,EAAE;QACtC,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,IAAI;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAA+B,EAAE;IAC/D,MAAM,GAAG,GAAG,MAAM,OAAO,CAAoB,qBAAqB,EAAE,EAAE,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAEhC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"orient.js","sourceRoot":"","sources":["../../src/commands/orient.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AA4D1E,SAAS,aAAa,CAAC,GAAsB;IAC3C,OAAO;QACL,GAAG,GAAG;QACN,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI;YAC5B,UAAU,EAAE,EAAE;YACd,SAAS,EAAE,EAAE;YACb,aAAa,EAAE,EAAE;SAClB;QACD,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;QAC5B,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,IAAI,EAAE;QAC9C,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE;QAC9B,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,EAAE;QACxC,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI;YAC9B,iBAAiB,EAAE,EAAE;YACrB,iBAAiB,EAAE,EAAE;YACrB,YAAY,EAAE,EAAE;SACjB;QACD,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,EAAE;QACtC,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,IAAI;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,UAA+B,EAAE;IAC/D,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAoB,qBAAqB,EAAE,EAAE,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAEhC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IAClC,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAKzE"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAsB,SAAS,CAAC,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAQzE"}
@@ -1,9 +1,13 @@
1
1
  /**
2
2
  * pb search — full-text search across all collections via chain.searchEntries.
3
3
  */
4
+ import { getConfigOrGuide } from '../lib/config.js';
4
5
  import { mcpCall } from '../lib/client.js';
5
6
  import { formatSearchResults } from '../formatters/search.js';
6
7
  export async function runSearch(options) {
8
+ const config = await getConfigOrGuide(() => runSearch(options));
9
+ if (!config)
10
+ return;
7
11
  const results = await mcpCall('chain.searchEntries', {
8
12
  query: options.query,
9
13
  });
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAqB,MAAM,yBAAyB,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAA0B;IACxD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAiB,qBAAqB,EAAE;QACnE,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAqB,MAAM,yBAAyB,CAAC;AAEjF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAA0B;IACxD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAiB,qBAAqB,EAAE;QACnE,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;AAClD,CAAC"}
package/dist/index.js CHANGED
@@ -6,6 +6,7 @@
6
6
  import { Command } from 'commander';
7
7
  import { runContext } from './commands/context.js';
8
8
  import { runGet } from './commands/get.js';
9
+ import { runLogin } from './commands/login.js';
9
10
  import { runOrient } from './commands/orient.js';
10
11
  import { runSearch } from './commands/search.js';
11
12
  const program = new Command();
@@ -75,5 +76,17 @@ program
75
76
  process.exit(1);
76
77
  }
77
78
  });
79
+ program
80
+ .command('login')
81
+ .description('Save your API key to ~/.config/productbrain/.env (works from any directory)')
82
+ .action(async () => {
83
+ try {
84
+ await runLogin();
85
+ }
86
+ catch (err) {
87
+ console.error(err instanceof Error ? err.message : String(err));
88
+ process.exit(1);
89
+ }
90
+ });
78
91
  program.parse();
79
92
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,mDAAmD,CAAC;KAChE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,oEAAoE,CAAC;KACjF,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;IAChC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;QACzD,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,oBAAoB,CAAC;KAC7B,WAAW,CAAC,4FAA4F,CAAC;KACzG,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE;IAChC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;QACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC;QAC7D,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,KAAK,EAAE,aAAuB,EAAE,EAAE,EAAE;IAC1C,MAAM,KAAK,GAAG,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;QAC5D,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,qGAAqG,CAAC;KAClH,MAAM,CAAC,aAAa,EAAE,+DAA+D,CAAC;KACtF,MAAM,CAAC,KAAK,EAAE,IAAyB,EAAE,EAAE;IAC1C,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,6EAA6E,CAAC;KAC1F,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,QAAQ,EAAE,CAAC;IACnB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -1,9 +1,26 @@
1
1
  /**
2
- * CLI config — reads PRODUCTBRAIN_API_KEY + CONVEX_SITE_URL from env / .env.mcp.
3
- * Mirrors scripts/test-orient.mjs pattern.
2
+ * CLI config — reads PRODUCTBRAIN_API_KEY + CONVEX_SITE_URL from:
3
+ * 1. Environment variables
4
+ * 2. ~/.config/productbrain/.env (works from any directory)
5
+ * 3. CWD .env.mcp / packages/mcp-server/.env.mcp / .env
6
+ *
7
+ * When key is missing and retry is provided (TTY), runs guided flow per docs/cli-unauthenticated-user-journey.md.
4
8
  */
9
+ declare const HOME_CONFIG_DIR: string;
10
+ declare const HOME_ENV_PATH: string;
5
11
  export declare function getConfig(): {
6
12
  apiKey: string;
7
13
  siteUrl: string;
8
14
  };
15
+ export type Config = {
16
+ apiKey: string;
17
+ siteUrl: string;
18
+ };
19
+ /**
20
+ * Get config; if key is missing and stdin is a TTY, run guided flow (y/n → paste key → save → retry).
21
+ * @param retry Called after saving key so the original command runs in-process.
22
+ * @returns Config, or null if we ran retry (caller should return without running again).
23
+ */
24
+ export declare function getConfigOrGuide(retry: () => Promise<void>): Promise<Config | null>;
25
+ export { HOME_CONFIG_DIR, HOME_ENV_PATH };
9
26
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2BH,wBAAgB,SAAS,IAAI;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAiB/D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,QAAA,MAAM,eAAe,QAAgD,CAAC;AACtE,QAAA,MAAM,aAAa,QAAmC,CAAC;AA2FvD,wBAAgB,SAAS,IAAI;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAe/D;AAED,MAAM,MAAM,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAczF;AAED,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC"}
@@ -1,36 +1,117 @@
1
1
  /**
2
- * CLI config — reads PRODUCTBRAIN_API_KEY + CONVEX_SITE_URL from env / .env.mcp.
3
- * Mirrors scripts/test-orient.mjs pattern.
2
+ * CLI config — reads PRODUCTBRAIN_API_KEY + CONVEX_SITE_URL from:
3
+ * 1. Environment variables
4
+ * 2. ~/.config/productbrain/.env (works from any directory)
5
+ * 3. CWD .env.mcp / packages/mcp-server/.env.mcp / .env
6
+ *
7
+ * When key is missing and retry is provided (TTY), runs guided flow per docs/cli-unauthenticated-user-journey.md.
4
8
  */
5
- import { readFileSync, existsSync } from 'fs';
9
+ import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'fs';
6
10
  import { resolve } from 'path';
7
- const ENV_PATHS = ['.env.mcp', 'packages/mcp-server/.env.mcp', '.env'];
11
+ import { homedir } from 'os';
12
+ import { createInterface } from 'readline';
13
+ const DEFAULT_SITE_URL = 'https://trustworthy-kangaroo-277.convex.site';
14
+ const HOME_CONFIG_DIR = resolve(homedir(), '.config', 'productbrain');
15
+ const HOME_ENV_PATH = resolve(HOME_CONFIG_DIR, '.env');
16
+ const CWD_ENV_PATHS = ['.env.mcp', 'packages/mcp-server/.env.mcp', '.env'];
17
+ // Short error when not TTY (scripts/pipes must not hang)
18
+ const NON_TTY_MESSAGE = 'No API key. Set PRODUCTBRAIN_API_KEY or run pb login.';
19
+ function parseEnvContent(content) {
20
+ for (const line of content.split('\n')) {
21
+ const m = line.match(/^([^#=]+)=(.*)$/);
22
+ if (m && !process.env[m[1].trim()]) {
23
+ process.env[m[1].trim()] = m[2].trim().replace(/^["']|["']$/g, '');
24
+ }
25
+ }
26
+ }
8
27
  function loadEnv() {
9
- for (const p of ENV_PATHS) {
28
+ if (existsSync(HOME_ENV_PATH)) {
29
+ parseEnvContent(readFileSync(HOME_ENV_PATH, 'utf8'));
30
+ }
31
+ for (const p of CWD_ENV_PATHS) {
10
32
  const full = resolve(process.cwd(), p);
11
33
  if (existsSync(full)) {
12
- const content = readFileSync(full, 'utf8');
13
- for (const line of content.split('\n')) {
14
- const m = line.match(/^([^#=]+)=(.*)$/);
15
- if (m && !process.env[m[1].trim()]) {
16
- process.env[m[1].trim()] = m[2].trim().replace(/^["']|["']$/g, '');
17
- }
18
- }
34
+ parseEnvContent(readFileSync(full, 'utf8'));
19
35
  break;
20
36
  }
21
37
  }
22
38
  }
23
39
  loadEnv();
24
- const DEFAULT_SITE_URL = 'https://trustworthy-kangaroo-277.convex.site';
40
+ function question(rl, prompt) {
41
+ return new Promise((resolve) => {
42
+ rl.question(prompt, (answer) => resolve((answer ?? '').trim().toLowerCase()));
43
+ });
44
+ }
45
+ function questionRaw(rl, prompt) {
46
+ return new Promise((resolve) => {
47
+ rl.question(prompt, (answer) => resolve((answer ?? '').trim()));
48
+ });
49
+ }
50
+ /**
51
+ * Guided flow when key is missing (TTY only). Per docs/cli-unauthenticated-user-journey.md.
52
+ * Returns true if we saved and ran retry; false if user said No (caller should exit).
53
+ */
54
+ async function runGuidedFlow(retry) {
55
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
56
+ console.log('Do you have an API key from Product Brain? (y/n)');
57
+ console.log(' Get one: Product Brain app → Settings → API Keys');
58
+ const hasKey = await question(rl, '> ');
59
+ if (hasKey !== 'y' && hasKey !== 'yes') {
60
+ console.log('Get your key: Product Brain app → Settings → API Keys. Then run: pb login');
61
+ rl.close();
62
+ process.exit(0);
63
+ }
64
+ let apiKey = await questionRaw(rl, 'Paste your API key (pb_sk_...): ');
65
+ if (!apiKey || !apiKey.startsWith('pb_sk_')) {
66
+ console.log('Key must start with pb_sk_. Try again or run pb login.');
67
+ apiKey = await questionRaw(rl, 'Paste your API key (pb_sk_...): ');
68
+ }
69
+ rl.close();
70
+ if (!apiKey || !apiKey.startsWith('pb_sk_')) {
71
+ console.log('Get your key: Product Brain app → Settings → API Keys. Then run: pb login');
72
+ process.exit(0);
73
+ }
74
+ const content = [
75
+ `# Product Brain CLI — saved by guided setup`,
76
+ `PRODUCTBRAIN_API_KEY=${apiKey}`,
77
+ `CONVEX_SITE_URL=${DEFAULT_SITE_URL.replace(/\/$/, '')}`,
78
+ '',
79
+ ].join('\n');
80
+ mkdirSync(HOME_CONFIG_DIR, { recursive: true });
81
+ writeFileSync(HOME_ENV_PATH, content, { mode: 0o600 });
82
+ process.env.PRODUCTBRAIN_API_KEY = apiKey;
83
+ process.env.CONVEX_SITE_URL = DEFAULT_SITE_URL.replace(/\/$/, '');
84
+ console.log('Saved your key. Running your command…\n');
85
+ await retry();
86
+ return true;
87
+ }
25
88
  export function getConfig() {
26
89
  const apiKey = process.env.PRODUCTBRAIN_API_KEY ?? '';
27
90
  const siteUrl = (process.env.CONVEX_SITE_URL ?? DEFAULT_SITE_URL).replace(/\/$/, '');
28
91
  if (!apiKey || !apiKey.startsWith('pb_sk_')) {
29
- throw new Error('Missing PRODUCTBRAIN_API_KEY (pb_sk_*) — set it or add to .env.mcp');
92
+ throw new Error(NON_TTY_MESSAGE);
30
93
  }
31
94
  if (!siteUrl.startsWith('https://')) {
32
95
  throw new Error(`CONVEX_SITE_URL must use HTTPS (got "${siteUrl.slice(0, 30)}…"). API keys must not be sent over unencrypted connections.`);
33
96
  }
34
97
  return { apiKey, siteUrl };
35
98
  }
99
+ /**
100
+ * Get config; if key is missing and stdin is a TTY, run guided flow (y/n → paste key → save → retry).
101
+ * @param retry Called after saving key so the original command runs in-process.
102
+ * @returns Config, or null if we ran retry (caller should return without running again).
103
+ */
104
+ export async function getConfigOrGuide(retry) {
105
+ const apiKey = process.env.PRODUCTBRAIN_API_KEY ?? '';
106
+ const siteUrl = (process.env.CONVEX_SITE_URL ?? DEFAULT_SITE_URL).replace(/\/$/, '');
107
+ if (apiKey.startsWith('pb_sk_') && siteUrl.startsWith('https://')) {
108
+ return { apiKey, siteUrl };
109
+ }
110
+ if (!process.stdin.isTTY) {
111
+ throw new Error(NON_TTY_MESSAGE);
112
+ }
113
+ const didRetry = await runGuidedFlow(retry);
114
+ return didRetry ? null : null;
115
+ }
116
+ export { HOME_CONFIG_DIR, HOME_ENV_PATH };
36
117
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,SAAS,GAAG,CAAC,UAAU,EAAE,8BAA8B,EAAE,MAAM,CAAC,CAAC;AAEvE,SAAS,OAAO;IACd,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QACvC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBACxC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;oBACnC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;gBACrE,CAAC;YACH,CAAC;YACD,MAAM;QACR,CAAC;IACH,CAAC;AACH,CAAC;AAED,OAAO,EAAE,CAAC;AAEV,MAAM,gBAAgB,GAAG,8CAA8C,CAAC;AAExE,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC;IACtD,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAErF,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CACb,wCAAwC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,8DAA8D,CAC3H,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@productbrain/cli",
3
- "version": "0.1.0-beta.1",
3
+ "version": "0.1.0-beta.6",
4
4
  "description": "Product Brain — read-only CLI for Chain knowledge",
5
5
  "type": "module",
6
6
  "bin": {
7
- "pb": "./dist/index.js"
7
+ "pb": "dist/index.js"
8
8
  },
9
9
  "engines": {
10
10
  "node": ">=18"
@@ -19,7 +19,8 @@
19
19
  "version:prerelease": "npm version prerelease --no-git-tag-version"
20
20
  },
21
21
  "dependencies": {
22
- "commander": "^12.0.0"
22
+ "commander": "^12.0.0",
23
+ "glob": "^11.0.0"
23
24
  },
24
25
  "devDependencies": {
25
26
  "@types/node": "^25.3.0",