@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 +59 -0
- package/dist/__tests__/ingest.test.d.ts +2 -0
- package/dist/__tests__/ingest.test.d.ts.map +1 -0
- package/dist/__tests__/ingest.test.js +87 -0
- package/dist/__tests__/ingest.test.js.map +1 -0
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +4 -0
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/get.d.ts.map +1 -1
- package/dist/commands/get.js +4 -0
- package/dist/commands/get.js.map +1 -1
- package/dist/commands/ingest.d.ts +8 -0
- package/dist/commands/ingest.d.ts.map +1 -0
- package/dist/commands/ingest.js +66 -0
- package/dist/commands/ingest.js.map +1 -0
- package/dist/commands/login.d.ts +5 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +53 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +4 -0
- package/dist/commands/orient.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +4 -0
- package/dist/commands/search.js.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +19 -2
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +95 -14
- package/dist/lib/config.js.map +1 -1
- package/package.json +4 -3
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 @@
|
|
|
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":"AAAA;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAE5B,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,OAAO,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC;CACtD,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,gBAAgB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAA0B,EAAE,EAAE,CACrD,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAC/E;CACF,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,MAAc,CAAC;IAEnB,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;QACnD,WAAW;aACR,qBAAqB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,mBAAmB;aAC1E,qBAAqB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,eAAe;aAC9G,iBAAiB,CAAC,EAAE,cAAc,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,+BAA+B;IACrG,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACnF,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACjC,aAAa,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAE5C,MAAM,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAEhC,MAAM,CAAC,WAAW,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE,kBAAkB,EAAE,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,WAAW,CAAC,CAAC,uBAAuB,CAAC,CAAC,EAAE,oBAAoB,EAAE;YACnE,WAAW,EAAE,MAAM;YACnB,QAAQ,EAAE,OAAO;YACjB,UAAU,EAAE,KAAK;SAClB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC7F,WAAW;aACR,qBAAqB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;aACtD,qBAAqB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;aAC9F,iBAAiB,CAAC,EAAE,cAAc,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG,kCAAkC,CAAC;QACnD,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAE1B,MAAM,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAEhC,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAC5C,CAAC,CAAY,EAAE,EAAE,CAAE,CAAc,CAAC,CAAC,CAAC,KAAK,sBAAsB,CAChE,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,UAA+C,CAAC;QACjE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,cAAwB,CAAC,CAAC,OAAO,CAAC,gEAAgE,CAAC,CAAC;QAChH,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,WAAW;aACR,qBAAqB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;aACtD,qBAAqB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;aAC9F,iBAAiB,CAAC,EAAE,cAAc,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACnE,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACjC,aAAa,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAE3B,MAAM,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QAEhC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAC3C,CAAC,CAAY,EAAE,EAAE,CAAE,CAAc,CAAC,CAAC,CAAC,KAAK,oBAAoB,CAC9D,CAAC;QACF,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,WAAW;aACR,qBAAqB,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;aACtD,qBAAqB,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;aAC9F,iBAAiB,CAAC,EAAE,cAAc,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;QACnE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACzB,aAAa,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAEzB,MAAM,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QAEnD,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAC/C,CAAC,CAAY,EAAE,EAAE,CAAE,CAAc,CAAC,CAAC,CAAC,KAAK,sBAAsB,CAChE,CAAC;QACF,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAC9B,CAAC,CAAY,EAAE,EAAE,CAAE,CAAuC,CAAC,CAAC,CAAC,CAAC,OAAiB,CAChF,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
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"}
|
package/dist/commands/context.js
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/commands/get.js
CHANGED
|
@@ -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
|
});
|
package/dist/commands/get.js.map
CHANGED
|
@@ -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 @@
|
|
|
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":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"orient.d.ts","sourceRoot":"","sources":["../../src/commands/orient.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/orient.js
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/commands/search.js
CHANGED
|
@@ -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":"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"}
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -1,9 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CLI config — reads PRODUCTBRAIN_API_KEY + CONVEX_SITE_URL from
|
|
3
|
-
*
|
|
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
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|
package/dist/lib/config.js
CHANGED
|
@@ -1,36 +1,117 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* CLI config — reads PRODUCTBRAIN_API_KEY + CONVEX_SITE_URL from
|
|
3
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA
|
|
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.
|
|
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": "
|
|
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",
|