@productbrain/cli 0.1.0-beta.7 → 0.1.0-beta.9
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 +84 -1
- package/dist/__tests__/capture.test.d.ts +2 -0
- package/dist/__tests__/capture.test.d.ts.map +1 -0
- package/dist/__tests__/capture.test.js +86 -0
- package/dist/__tests__/capture.test.js.map +1 -0
- package/dist/__tests__/constellation.test.d.ts +2 -0
- package/dist/__tests__/constellation.test.d.ts.map +1 -0
- package/dist/__tests__/constellation.test.js +260 -0
- package/dist/__tests__/constellation.test.js.map +1 -0
- package/dist/__tests__/fields.test.d.ts +2 -0
- package/dist/__tests__/fields.test.d.ts.map +1 -0
- package/dist/__tests__/fields.test.js +238 -0
- package/dist/__tests__/fields.test.js.map +1 -0
- package/dist/__tests__/handshake.test.d.ts +2 -0
- package/dist/__tests__/handshake.test.d.ts.map +1 -0
- package/dist/__tests__/handshake.test.js +187 -0
- package/dist/__tests__/handshake.test.js.map +1 -0
- package/dist/__tests__/relate.test.d.ts +2 -0
- package/dist/__tests__/relate.test.d.ts.map +1 -0
- package/dist/__tests__/relate.test.js +79 -0
- package/dist/__tests__/relate.test.js.map +1 -0
- package/dist/__tests__/repo-detect.test.d.ts +2 -0
- package/dist/__tests__/repo-detect.test.d.ts.map +1 -0
- package/dist/__tests__/repo-detect.test.js +119 -0
- package/dist/__tests__/repo-detect.test.js.map +1 -0
- package/dist/__tests__/runner.test.d.ts +2 -0
- package/dist/__tests__/runner.test.d.ts.map +1 -0
- package/dist/__tests__/runner.test.js +215 -0
- package/dist/__tests__/runner.test.js.map +1 -0
- package/dist/__tests__/session-touch.test.d.ts +2 -0
- package/dist/__tests__/session-touch.test.d.ts.map +1 -0
- package/dist/__tests__/session-touch.test.js +134 -0
- package/dist/__tests__/session-touch.test.js.map +1 -0
- package/dist/__tests__/session.test.d.ts +2 -0
- package/dist/__tests__/session.test.d.ts.map +1 -0
- package/dist/__tests__/session.test.js +52 -0
- package/dist/__tests__/session.test.js.map +1 -0
- package/dist/__tests__/strip.test.d.ts +2 -0
- package/dist/__tests__/strip.test.d.ts.map +1 -0
- package/dist/__tests__/strip.test.js +136 -0
- package/dist/__tests__/strip.test.js.map +1 -0
- package/dist/__tests__/update.test.d.ts +2 -0
- package/dist/__tests__/update.test.d.ts.map +1 -0
- package/dist/__tests__/update.test.js +148 -0
- package/dist/__tests__/update.test.js.map +1 -0
- package/dist/commands/capture.d.ts +21 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +100 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/constellation.d.ts +11 -0
- package/dist/commands/constellation.d.ts.map +1 -0
- package/dist/commands/constellation.js +28 -0
- package/dist/commands/constellation.js.map +1 -0
- package/dist/commands/context.d.ts +2 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +15 -9
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/fields.d.ts +9 -0
- package/dist/commands/fields.d.ts.map +1 -0
- package/dist/commands/fields.js +26 -0
- package/dist/commands/fields.js.map +1 -0
- package/dist/commands/get.d.ts +8 -1
- package/dist/commands/get.d.ts.map +1 -1
- package/dist/commands/get.js +51 -6
- package/dist/commands/get.js.map +1 -1
- package/dist/commands/handshake.d.ts +18 -0
- package/dist/commands/handshake.d.ts.map +1 -0
- package/dist/commands/handshake.js +378 -0
- package/dist/commands/handshake.js.map +1 -0
- package/dist/commands/ingest.d.ts +1 -0
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +25 -8
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/orient.d.ts +1 -0
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +13 -8
- package/dist/commands/orient.js.map +1 -1
- package/dist/commands/relate.d.ts +15 -0
- package/dist/commands/relate.d.ts.map +1 -0
- package/dist/commands/relate.js +72 -0
- package/dist/commands/relate.js.map +1 -0
- package/dist/commands/search.d.ts +1 -0
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +5 -3
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/session.d.ts +20 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +134 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/update.d.ts +16 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +89 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/formatters/capture.d.ts +30 -0
- package/dist/formatters/capture.d.ts.map +1 -0
- package/dist/formatters/capture.js +58 -0
- package/dist/formatters/capture.js.map +1 -0
- package/dist/formatters/constellation.d.ts +34 -0
- package/dist/formatters/constellation.d.ts.map +1 -0
- package/dist/formatters/constellation.js +38 -0
- package/dist/formatters/constellation.js.map +1 -0
- package/dist/formatters/fields.d.ts +32 -0
- package/dist/formatters/fields.d.ts.map +1 -0
- package/dist/formatters/fields.js +49 -0
- package/dist/formatters/fields.js.map +1 -0
- package/dist/formatters/handshake.d.ts +17 -0
- package/dist/formatters/handshake.d.ts.map +1 -0
- package/dist/formatters/handshake.js +51 -0
- package/dist/formatters/handshake.js.map +1 -0
- package/dist/formatters/relate.d.ts +11 -0
- package/dist/formatters/relate.d.ts.map +1 -0
- package/dist/formatters/relate.js +10 -0
- package/dist/formatters/relate.js.map +1 -0
- package/dist/formatters/session.d.ts +11 -0
- package/dist/formatters/session.d.ts.map +1 -0
- package/dist/formatters/session.js +51 -0
- package/dist/formatters/session.js.map +1 -0
- package/dist/formatters/update.d.ts +17 -0
- package/dist/formatters/update.d.ts.map +1 -0
- package/dist/formatters/update.js +43 -0
- package/dist/formatters/update.js.map +1 -0
- package/dist/generators/adapters.d.ts +10 -0
- package/dist/generators/adapters.d.ts.map +1 -0
- package/dist/generators/adapters.js +102 -0
- package/dist/generators/adapters.js.map +1 -0
- package/dist/generators/briefing-md.d.ts +8 -0
- package/dist/generators/briefing-md.d.ts.map +1 -0
- package/dist/generators/briefing-md.js +51 -0
- package/dist/generators/briefing-md.js.map +1 -0
- package/dist/generators/context-md.d.ts +8 -0
- package/dist/generators/context-md.d.ts.map +1 -0
- package/dist/generators/context-md.js +123 -0
- package/dist/generators/context-md.js.map +1 -0
- package/dist/generators/portable-knowledge.d.ts +72 -0
- package/dist/generators/portable-knowledge.d.ts.map +1 -0
- package/dist/generators/portable-knowledge.js +246 -0
- package/dist/generators/portable-knowledge.js.map +1 -0
- package/dist/generators/portable-knowledge.test.d.ts +2 -0
- package/dist/generators/portable-knowledge.test.d.ts.map +1 -0
- package/dist/generators/portable-knowledge.test.js +399 -0
- package/dist/generators/portable-knowledge.test.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +231 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/client.d.ts +19 -0
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +102 -8
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/repo-detect.d.ts +14 -0
- package/dist/lib/repo-detect.d.ts.map +1 -0
- package/dist/lib/repo-detect.js +58 -0
- package/dist/lib/repo-detect.js.map +1 -0
- package/dist/lib/runner.d.ts +31 -0
- package/dist/lib/runner.d.ts.map +1 -0
- package/dist/lib/runner.js +65 -0
- package/dist/lib/runner.js.map +1 -0
- package/dist/lib/session.d.ts +17 -0
- package/dist/lib/session.d.ts.map +1 -0
- package/dist/lib/session.js +43 -0
- package/dist/lib/session.js.map +1 -0
- package/dist/lib/strip.d.ts +11 -0
- package/dist/lib/strip.d.ts.map +1 -0
- package/dist/lib/strip.js +26 -0
- package/dist/lib/strip.js.map +1 -0
- package/package.json +6 -3
package/dist/index.js
CHANGED
|
@@ -1,19 +1,44 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Product Brain CLI —
|
|
4
|
-
* BET-108
|
|
3
|
+
* Product Brain CLI — Chain knowledge + write-back in the terminal.
|
|
4
|
+
* Read: BET-108. Write: pb session + pb capture (TEN-27, INS-80).
|
|
5
|
+
* BET-181 Slice 0: global --json / --pretty flags for agent-native output (DEC-299).
|
|
5
6
|
*/
|
|
6
7
|
import { Command } from 'commander';
|
|
8
|
+
import { setOutputMode } from './lib/runner.js';
|
|
7
9
|
import { runContext } from './commands/context.js';
|
|
8
|
-
import { runGet } from './commands/get.js';
|
|
10
|
+
import { runGet, runGetMany } from './commands/get.js';
|
|
9
11
|
import { runLogin } from './commands/login.js';
|
|
10
12
|
import { runOrient } from './commands/orient.js';
|
|
11
13
|
import { runSearch } from './commands/search.js';
|
|
14
|
+
import { runHandshake, runHandshakeInit } from './commands/handshake.js';
|
|
15
|
+
import { runSessionStart, runSessionClose, runSessionId } from './commands/session.js';
|
|
16
|
+
import { runCapture } from './commands/capture.js';
|
|
17
|
+
import { runUpdate } from './commands/update.js';
|
|
18
|
+
import { runRelate, runUnrelate } from './commands/relate.js';
|
|
19
|
+
import { runIngest } from './commands/ingest.js';
|
|
20
|
+
import { runFields } from './commands/fields.js';
|
|
21
|
+
import { runConstellation } from './commands/constellation.js';
|
|
12
22
|
const program = new Command();
|
|
13
23
|
program
|
|
14
24
|
.name('pb')
|
|
15
|
-
.description('Product Brain —
|
|
16
|
-
.version('0.
|
|
25
|
+
.description('Product Brain — Chain knowledge + write-back CLI')
|
|
26
|
+
.version('0.2.0')
|
|
27
|
+
// Global output mode flags (DEC-299, BET-181)
|
|
28
|
+
.option('--json', 'Output machine-readable JSON (overrides TTY auto-detection)')
|
|
29
|
+
.option('--pretty', 'Force human-readable output even when piped');
|
|
30
|
+
// Apply global output mode BEFORE subcommand actions run
|
|
31
|
+
program.hook('preAction', (thisCommand) => {
|
|
32
|
+
const globalOpts = program.opts();
|
|
33
|
+
if (globalOpts.json) {
|
|
34
|
+
setOutputMode('json');
|
|
35
|
+
}
|
|
36
|
+
else if (globalOpts.pretty) {
|
|
37
|
+
setOutputMode('pretty');
|
|
38
|
+
}
|
|
39
|
+
// else: 'auto' (default) — TTY detection handles it
|
|
40
|
+
void thisCommand;
|
|
41
|
+
});
|
|
17
42
|
program
|
|
18
43
|
.command('get <entry-id>')
|
|
19
44
|
.description('Display full entry by ID (data, relations, last 10 history events)')
|
|
@@ -30,9 +55,21 @@ program
|
|
|
30
55
|
process.exit(1);
|
|
31
56
|
}
|
|
32
57
|
});
|
|
58
|
+
program
|
|
59
|
+
.command('get-many <entry-ids...>')
|
|
60
|
+
.description('Fetch multiple entries in parallel (space-separated IDs)')
|
|
61
|
+
.action(async (entryIds) => {
|
|
62
|
+
try {
|
|
63
|
+
await runGetMany({ entryIds: entryIds.map((id) => id.trim()).filter(Boolean) });
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
33
70
|
program
|
|
34
71
|
.command('context <entry-id>')
|
|
35
|
-
.description('Gather and display constellation context (pipe-friendly
|
|
72
|
+
.description('Gather and display constellation context (pipe-friendly: JSON when piped, human text in terminal)')
|
|
36
73
|
.action(async (entryId) => {
|
|
37
74
|
if (!entryId?.trim()) {
|
|
38
75
|
program.commands.find((c) => c.name() === 'context')?.help();
|
|
@@ -76,6 +113,26 @@ program
|
|
|
76
113
|
process.exit(1);
|
|
77
114
|
}
|
|
78
115
|
});
|
|
116
|
+
program
|
|
117
|
+
.command('handshake')
|
|
118
|
+
.description('Generate context files for AI developer tools (CLAUDE.md, .cursor/rules/, .github/copilot-instructions.md)')
|
|
119
|
+
.option('--force', 'Overwrite adapter files even if they exist without auto-generated marker')
|
|
120
|
+
.option('--dry-run', 'Show what would be generated without writing files')
|
|
121
|
+
.option('--init', 'Set up Claude Code integration: team hooks + personal trust level')
|
|
122
|
+
.option('--level <level>', 'With --init: trust level (guide|work|silent|full-trust). Without --init: content tier (beginner|intermediate|expert)')
|
|
123
|
+
.action(async (opts) => {
|
|
124
|
+
try {
|
|
125
|
+
if (opts.init) {
|
|
126
|
+
await runHandshakeInit({ level: opts.level, dryRun: opts.dryRun });
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
await runHandshake({ force: opts.force, dryRun: opts.dryRun, level: opts.level });
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
133
|
+
process.exit(1);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
79
136
|
program
|
|
80
137
|
.command('login')
|
|
81
138
|
.description('Save your API key to ~/.config/productbrain/.env (works from any directory)')
|
|
@@ -88,5 +145,173 @@ program
|
|
|
88
145
|
process.exit(1);
|
|
89
146
|
}
|
|
90
147
|
});
|
|
148
|
+
// --- Write commands (require active session) ---
|
|
149
|
+
const sessionCmd = program
|
|
150
|
+
.command('session')
|
|
151
|
+
.description('Manage write sessions (DEC-9: sessions required before write access)');
|
|
152
|
+
sessionCmd
|
|
153
|
+
.command('start')
|
|
154
|
+
.description('Start a tracked write session (opens session, refreshes context)')
|
|
155
|
+
.option('--json', 'Output machine-readable JSON (deprecated: use global --json flag)')
|
|
156
|
+
.action(async (opts) => {
|
|
157
|
+
try {
|
|
158
|
+
await runSessionStart({ json: opts.json });
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
sessionCmd
|
|
166
|
+
.command('id')
|
|
167
|
+
.description('Print current session ID to stdout (machine-readable, TEN-707)')
|
|
168
|
+
.action(() => {
|
|
169
|
+
try {
|
|
170
|
+
runSessionId();
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
sessionCmd
|
|
178
|
+
.command('close')
|
|
179
|
+
.description('Close the active session (wrapup, refresh context)')
|
|
180
|
+
.option('--force', 'Clear local session state even if server close fails')
|
|
181
|
+
.action(async (opts) => {
|
|
182
|
+
try {
|
|
183
|
+
await runSessionClose({ force: opts.force });
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
program
|
|
191
|
+
.command('capture [text...]')
|
|
192
|
+
.description('Capture knowledge to the Chain (requires active session)')
|
|
193
|
+
.option('-n, --name <name>', 'Entry name (defaults to capture text)')
|
|
194
|
+
.option('-d, --description <desc>', 'Entry description (defaults to capture text)')
|
|
195
|
+
.option('-c, --collection <slug>', 'Explicit collection (skip auto-classification)')
|
|
196
|
+
.option('-l, --link <entry-id>', 'Link new entry to an existing entry (TEN-705)')
|
|
197
|
+
.option('-t, --type <relation-type>', 'Relation type for --link (default: surfaces_tension_in)')
|
|
198
|
+
.option('--json', 'Output machine-readable JSON (deprecated: use global --json flag)')
|
|
199
|
+
.action(async (textParts = [], opts) => {
|
|
200
|
+
const text = textParts.join(' ').trim();
|
|
201
|
+
if (!text && !opts.name) {
|
|
202
|
+
program.commands.find((c) => c.name() === 'capture')?.help();
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
try {
|
|
206
|
+
await runCapture({
|
|
207
|
+
text: text || opts.name || '',
|
|
208
|
+
name: opts.name,
|
|
209
|
+
description: opts.description,
|
|
210
|
+
collection: opts.collection,
|
|
211
|
+
link: opts.link,
|
|
212
|
+
type: opts.type,
|
|
213
|
+
json: opts.json,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
218
|
+
process.exit(1);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
// --- Update command (TEN-703) ---
|
|
222
|
+
program
|
|
223
|
+
.command('update <entry-id>')
|
|
224
|
+
.description('Update fields on an existing Chain entry (requires active session)')
|
|
225
|
+
.option('-f, --field <key=value>', 'Set a data field (repeatable)', (val, prev) => [...prev, val], [])
|
|
226
|
+
.option('--name <name>', 'Update entry name')
|
|
227
|
+
.option('--status <status>', 'Update entry status (draft | active | deprecated | archived)')
|
|
228
|
+
.option('--note <text>', 'Change note for history')
|
|
229
|
+
.action(async (entryId, opts) => {
|
|
230
|
+
try {
|
|
231
|
+
await runUpdate({
|
|
232
|
+
entryId,
|
|
233
|
+
field: opts.field,
|
|
234
|
+
name: opts.name,
|
|
235
|
+
status: opts.status,
|
|
236
|
+
note: opts.note,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
241
|
+
process.exit(1);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
// --- Relate / Unrelate commands (TEN-704) ---
|
|
245
|
+
program
|
|
246
|
+
.command('relate <from-id> <type> <to-id>')
|
|
247
|
+
.description('Add a typed relation between two entries (requires active session)')
|
|
248
|
+
.action(async (fromId, type, toId) => {
|
|
249
|
+
try {
|
|
250
|
+
await runRelate({ fromId, type, toId });
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
254
|
+
process.exit(1);
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
program
|
|
258
|
+
.command('unrelate <from-id> <type> <to-id>')
|
|
259
|
+
.description('Remove a typed relation between two entries (requires active session)')
|
|
260
|
+
.action(async (fromId, type, toId) => {
|
|
261
|
+
try {
|
|
262
|
+
await runUnrelate({ fromId, type, toId });
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
266
|
+
process.exit(1);
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
// --- Ingest command (BET-81) ---
|
|
270
|
+
program
|
|
271
|
+
.command('ingest <pattern>')
|
|
272
|
+
.description('Bulk ingest documents to Chain as drafts')
|
|
273
|
+
.action(async (pattern) => {
|
|
274
|
+
try {
|
|
275
|
+
await runIngest({ pattern });
|
|
276
|
+
}
|
|
277
|
+
catch (err) {
|
|
278
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
279
|
+
process.exit(1);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
// --- Fields command (BET-181 Slice 2) ---
|
|
283
|
+
program
|
|
284
|
+
.command('fields <collection>')
|
|
285
|
+
.description('List all field definitions for a collection (schema discovery for agents)')
|
|
286
|
+
.action(async (collection) => {
|
|
287
|
+
if (!collection?.trim()) {
|
|
288
|
+
program.commands.find((c) => c.name() === 'fields')?.help();
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
try {
|
|
292
|
+
await runFields({ collectionSlug: collection.trim() });
|
|
293
|
+
}
|
|
294
|
+
catch (err) {
|
|
295
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
296
|
+
process.exit(1);
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
// --- Constellation command (BET-181 Slice 3) ---
|
|
300
|
+
program
|
|
301
|
+
.command('constellation <entry-id>')
|
|
302
|
+
.description('Compound view: entry + all related entries grouped by relation type (agent-native)')
|
|
303
|
+
.action(async (entryId) => {
|
|
304
|
+
if (!entryId?.trim()) {
|
|
305
|
+
program.commands.find((c) => c.name() === 'constellation')?.help();
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
try {
|
|
309
|
+
await runConstellation({ entryId: entryId.trim() });
|
|
310
|
+
}
|
|
311
|
+
catch (err) {
|
|
312
|
+
console.error(err instanceof Error ? err.message : String(err));
|
|
313
|
+
process.exit(1);
|
|
314
|
+
}
|
|
315
|
+
});
|
|
91
316
|
program.parse();
|
|
92
317
|
//# 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/client.d.ts
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP HTTP client — POST to Convex gateway with Bearer auth.
|
|
3
|
+
*
|
|
4
|
+
* TEN-729: Detects sandbox-blocked fetch (Claude Code, Cursor, etc.) and
|
|
5
|
+
* provides an actionable error instead of the opaque "fetch failed".
|
|
6
|
+
*
|
|
7
|
+
* Sandbox proxy support: Node.js fetch (undici) ignores proxy env vars by
|
|
8
|
+
* default. We detect HTTPS_PROXY and configure a ProxyAgent so pb works in
|
|
9
|
+
* sandboxed environments (Claude Code, Cursor) without requiring
|
|
10
|
+
* NODE_OPTIONS="--use-env-proxy".
|
|
3
11
|
*/
|
|
4
12
|
export declare function mcpCall<T = unknown>(fn: string, args?: Record<string, unknown>): Promise<T>;
|
|
13
|
+
/**
|
|
14
|
+
* mcpCall variant that injects X-Agent-Session-Id header for write operations.
|
|
15
|
+
* All write commands (update, relate, unrelate, capture) should use this.
|
|
16
|
+
*
|
|
17
|
+
* After a successful write, fires a non-blocking `agent.touchSession` call to
|
|
18
|
+
* renew the session TTL — mirroring MCP server behavior (DEC-299, BET-181 Slice 1).
|
|
19
|
+
* The touch is fire-and-forget: it does not block the write response, and errors
|
|
20
|
+
* are silently swallowed. No touch is attempted if no session is active or if
|
|
21
|
+
* the write itself fails.
|
|
22
|
+
*/
|
|
23
|
+
export declare function mcpCallWithSession<T = unknown>(fn: string, args?: Record<string, unknown>): Promise<T>;
|
|
5
24
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/lib/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA0CH,wBAAsB,OAAO,CAAC,CAAC,GAAG,OAAO,EACvC,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,CAAC,CAAC,CAsBZ;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,GAAG,OAAO,EAClD,EAAE,EAAE,MAAM,EACV,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,CAAC,CAAC,CAoCZ"}
|
package/dist/lib/client.js
CHANGED
|
@@ -1,21 +1,115 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* MCP HTTP client — POST to Convex gateway with Bearer auth.
|
|
3
|
+
*
|
|
4
|
+
* TEN-729: Detects sandbox-blocked fetch (Claude Code, Cursor, etc.) and
|
|
5
|
+
* provides an actionable error instead of the opaque "fetch failed".
|
|
6
|
+
*
|
|
7
|
+
* Sandbox proxy support: Node.js fetch (undici) ignores proxy env vars by
|
|
8
|
+
* default. We detect HTTPS_PROXY and configure a ProxyAgent so pb works in
|
|
9
|
+
* sandboxed environments (Claude Code, Cursor) without requiring
|
|
10
|
+
* NODE_OPTIONS="--use-env-proxy".
|
|
3
11
|
*/
|
|
4
12
|
import { getConfig } from './config.js';
|
|
13
|
+
import { readSession } from './session.js';
|
|
14
|
+
// Configure proxy at module load — runs once, before any fetch call.
|
|
15
|
+
// Node.js fetch (undici) ignores HTTPS_PROXY env vars. We detect the proxy
|
|
16
|
+
// and install a ProxyAgent as the global dispatcher so all fetch() calls
|
|
17
|
+
// route through the sandbox proxy automatically.
|
|
18
|
+
try {
|
|
19
|
+
const _proxy = process.env.https_proxy || process.env.HTTPS_PROXY;
|
|
20
|
+
if (_proxy) {
|
|
21
|
+
const { ProxyAgent, setGlobalDispatcher } = await import('undici');
|
|
22
|
+
setGlobalDispatcher(new ProxyAgent(_proxy));
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// undici unavailable or proxy config failed — rethrowWithGuidance handles it.
|
|
27
|
+
}
|
|
28
|
+
/** Detect a sandbox/network-blocked fetch and re-throw with guidance. */
|
|
29
|
+
function rethrowWithGuidance(err, siteUrl) {
|
|
30
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
31
|
+
if (msg === 'fetch failed' || msg.includes('ECONNREFUSED') || msg.includes('ENOTFOUND')) {
|
|
32
|
+
const host = new URL(siteUrl).hostname;
|
|
33
|
+
const proxy = process.env.https_proxy || process.env.HTTPS_PROXY;
|
|
34
|
+
// When a proxy is set, the sandbox is routing traffic through it.
|
|
35
|
+
// Node.js fetch (undici) does NOT respect proxy env vars by default.
|
|
36
|
+
// The fix is --use-env-proxy (Node 22.14+), not adding the host to the allowlist.
|
|
37
|
+
const proxyHint = proxy
|
|
38
|
+
? `A proxy is configured (${proxy}) but Node.js fetch() is not using it.\n` +
|
|
39
|
+
`Fix: set NODE_OPTIONS="--use-env-proxy" in your environment,\n` +
|
|
40
|
+
` or re-run with: NODE_OPTIONS="--use-env-proxy" pb <command>\n`
|
|
41
|
+
: `If you are running inside an AI code editor sandbox (Claude Code, Cursor, etc.),\n` +
|
|
42
|
+
`the sandbox may be blocking outbound connections.\n\n` +
|
|
43
|
+
`Fix: add "${host}" to your sandbox network allowlist.\n` +
|
|
44
|
+
` • Claude Code: run /sandbox → add network host\n` +
|
|
45
|
+
` • Or re-run: pb handshake --init (configures sandbox automatically)\n`;
|
|
46
|
+
throw new Error(`Could not reach ${host}.\n\n${proxyHint}`);
|
|
47
|
+
}
|
|
48
|
+
throw err;
|
|
49
|
+
}
|
|
5
50
|
export async function mcpCall(fn, args = {}) {
|
|
6
51
|
const { apiKey, siteUrl } = getConfig();
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
52
|
+
let res;
|
|
53
|
+
try {
|
|
54
|
+
res = await fetch(`${siteUrl}/api/mcp`, {
|
|
55
|
+
method: 'POST',
|
|
56
|
+
headers: {
|
|
57
|
+
'Content-Type': 'application/json',
|
|
58
|
+
Authorization: `Bearer ${apiKey}`,
|
|
59
|
+
},
|
|
60
|
+
body: JSON.stringify({ fn, args }),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
rethrowWithGuidance(err, siteUrl);
|
|
65
|
+
}
|
|
66
|
+
const json = (await res.json());
|
|
67
|
+
if (!res.ok || json.error) {
|
|
68
|
+
throw new Error(json.error ?? res.statusText);
|
|
69
|
+
}
|
|
70
|
+
return json.data;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* mcpCall variant that injects X-Agent-Session-Id header for write operations.
|
|
74
|
+
* All write commands (update, relate, unrelate, capture) should use this.
|
|
75
|
+
*
|
|
76
|
+
* After a successful write, fires a non-blocking `agent.touchSession` call to
|
|
77
|
+
* renew the session TTL — mirroring MCP server behavior (DEC-299, BET-181 Slice 1).
|
|
78
|
+
* The touch is fire-and-forget: it does not block the write response, and errors
|
|
79
|
+
* are silently swallowed. No touch is attempted if no session is active or if
|
|
80
|
+
* the write itself fails.
|
|
81
|
+
*/
|
|
82
|
+
export async function mcpCallWithSession(fn, args = {}) {
|
|
83
|
+
const { apiKey, siteUrl } = getConfig();
|
|
84
|
+
const session = readSession();
|
|
85
|
+
const headers = {
|
|
86
|
+
'Content-Type': 'application/json',
|
|
87
|
+
Authorization: `Bearer ${apiKey}`,
|
|
88
|
+
};
|
|
89
|
+
if (session?.sessionId) {
|
|
90
|
+
headers['X-Agent-Session-Id'] = session.sessionId;
|
|
91
|
+
}
|
|
92
|
+
let res;
|
|
93
|
+
try {
|
|
94
|
+
res = await fetch(`${siteUrl}/api/mcp`, {
|
|
95
|
+
method: 'POST',
|
|
96
|
+
headers,
|
|
97
|
+
body: JSON.stringify({ fn, args }),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
rethrowWithGuidance(err, siteUrl);
|
|
102
|
+
}
|
|
15
103
|
const json = (await res.json());
|
|
16
104
|
if (!res.ok || json.error) {
|
|
17
105
|
throw new Error(json.error ?? res.statusText);
|
|
18
106
|
}
|
|
107
|
+
// Fire-and-forget session touch — best-effort, never blocks the write response.
|
|
108
|
+
// Only touch when a session is active. Uses mcpCall (not mcpCallWithSession) to
|
|
109
|
+
// avoid recursion.
|
|
110
|
+
if (session?.sessionId) {
|
|
111
|
+
mcpCall('agent.touchSession', { sessionId: session.sessionId }).catch(() => { });
|
|
112
|
+
}
|
|
19
113
|
return json.data;
|
|
20
114
|
}
|
|
21
115
|
//# sourceMappingURL=client.js.map
|
package/dist/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/lib/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local repo detection — reads filesystem signals to build a RepoContext.
|
|
3
|
+
* No API calls. Pure filesystem inspection.
|
|
4
|
+
*/
|
|
5
|
+
export interface RepoContext {
|
|
6
|
+
name: string | null;
|
|
7
|
+
description: string | null;
|
|
8
|
+
gitRemote: string | null;
|
|
9
|
+
repoSlug: string | null;
|
|
10
|
+
detectedStack: string[];
|
|
11
|
+
isMonorepo: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function detectRepo(cwd?: string): RepoContext;
|
|
14
|
+
//# sourceMappingURL=repo-detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-detect.d.ts","sourceRoot":"","sources":["../../src/lib/repo-detect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,wBAAgB,UAAU,CAAC,GAAG,SAAgB,GAAG,WAAW,CAiD3D"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local repo detection — reads filesystem signals to build a RepoContext.
|
|
3
|
+
* No API calls. Pure filesystem inspection.
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync, readFileSync } from 'fs';
|
|
6
|
+
import { resolve, basename } from 'path';
|
|
7
|
+
import { execSync } from 'child_process';
|
|
8
|
+
export function detectRepo(cwd = process.cwd()) {
|
|
9
|
+
const ctx = {
|
|
10
|
+
name: null,
|
|
11
|
+
description: null,
|
|
12
|
+
gitRemote: null,
|
|
13
|
+
repoSlug: null,
|
|
14
|
+
detectedStack: [],
|
|
15
|
+
isMonorepo: false,
|
|
16
|
+
};
|
|
17
|
+
// package.json
|
|
18
|
+
const pkgPath = resolve(cwd, 'package.json');
|
|
19
|
+
if (existsSync(pkgPath)) {
|
|
20
|
+
try {
|
|
21
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
|
22
|
+
ctx.name = pkg.name?.replace(/^@[^/]+\//, '') ?? null;
|
|
23
|
+
ctx.description = pkg.description ?? null;
|
|
24
|
+
if (pkg.workspaces)
|
|
25
|
+
ctx.isMonorepo = true;
|
|
26
|
+
}
|
|
27
|
+
catch { /* ignore parse errors */ }
|
|
28
|
+
}
|
|
29
|
+
// git remote
|
|
30
|
+
try {
|
|
31
|
+
const remote = execSync('git remote get-url origin', { cwd, encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
32
|
+
ctx.gitRemote = remote;
|
|
33
|
+
// Extract owner/repo from SSH or HTTPS URL
|
|
34
|
+
const m = remote.match(/[:/]([^/]+\/[^/.]+?)(?:\.git)?$/);
|
|
35
|
+
if (m)
|
|
36
|
+
ctx.repoSlug = m[1];
|
|
37
|
+
}
|
|
38
|
+
catch { /* not a git repo or no remote */ }
|
|
39
|
+
// Stack detection
|
|
40
|
+
const checks = [
|
|
41
|
+
['sveltekit', ['svelte.config.js', 'svelte.config.ts']],
|
|
42
|
+
['convex', ['convex']],
|
|
43
|
+
['typescript', ['tsconfig.json']],
|
|
44
|
+
['nextjs', ['next.config.js', 'next.config.ts', 'next.config.mjs']],
|
|
45
|
+
['vite', ['vite.config.ts', 'vite.config.js']],
|
|
46
|
+
['react', ['src/App.tsx', 'src/App.jsx']],
|
|
47
|
+
];
|
|
48
|
+
for (const [tech, paths] of checks) {
|
|
49
|
+
if (paths.some((p) => existsSync(resolve(cwd, p)))) {
|
|
50
|
+
ctx.detectedStack.push(tech);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Fallback name from directory
|
|
54
|
+
if (!ctx.name)
|
|
55
|
+
ctx.name = basename(cwd);
|
|
56
|
+
return ctx;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=repo-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-detect.js","sourceRoot":"","sources":["../../src/lib/repo-detect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAWzC,MAAM,UAAU,UAAU,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC5C,MAAM,GAAG,GAAgB;QACvB,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,EAAE;QACjB,UAAU,EAAE,KAAK;KAClB,CAAC;IAEF,eAAe;IACf,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC7C,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;YACtD,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC;YACtD,GAAG,CAAC,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,IAAI,CAAC;YAC1C,IAAI,GAAG,CAAC,UAAU;gBAAE,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;IACvC,CAAC;IAED,aAAa;IACb,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,2BAA2B,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxH,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC;QACvB,2CAA2C;QAC3C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAC1D,IAAI,CAAC;YAAE,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC,CAAC,iCAAiC,CAAC,CAAC;IAE7C,kBAAkB;IAClB,MAAM,MAAM,GAA8B;QACxC,CAAC,WAAW,EAAE,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;QACvD,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC,YAAY,EAAE,CAAC,eAAe,CAAC,CAAC;QACjC,CAAC,QAAQ,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;QACnE,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;QAC9C,CAAC,OAAO,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;KAC1C,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC,GAAG,CAAC,IAAI;QAAE,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAExC,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runCliCommand — shared command runner for the Product Brain CLI.
|
|
3
|
+
*
|
|
4
|
+
* Owns:
|
|
5
|
+
* (a) TTY detection via process.stdout.isTTY
|
|
6
|
+
* (b) JSON vs human output branching
|
|
7
|
+
* (c) stripConvexInternals() application in JSON mode
|
|
8
|
+
* (d) --json and --pretty explicit overrides that take precedence over auto-detection
|
|
9
|
+
* (e) Error handling: JSON error object in JSON mode, formatted message in TTY mode
|
|
10
|
+
*
|
|
11
|
+
* Chain: DEC-299 (JSON-default), STD-65 (agent responses: structured, parseable, minimal)
|
|
12
|
+
*/
|
|
13
|
+
export declare function setOutputMode(mode: 'auto' | 'json' | 'pretty'): void;
|
|
14
|
+
export declare function getOutputMode(): 'auto' | 'json' | 'pretty';
|
|
15
|
+
/** Returns true if the current output mode resolves to JSON. */
|
|
16
|
+
export declare function isJsonMode(): boolean;
|
|
17
|
+
export interface RunCliCommandOptions<T> {
|
|
18
|
+
/** The async function that performs the MCP call and returns data. */
|
|
19
|
+
fn: () => Promise<T>;
|
|
20
|
+
/** Formats data for human-readable TTY output. */
|
|
21
|
+
formatPretty: (data: T) => string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Execute a CLI command with unified output handling.
|
|
25
|
+
*
|
|
26
|
+
* - JSON mode: strip Convex internals, JSON.stringify to stdout
|
|
27
|
+
* - Pretty mode: call formatPretty callback, print result
|
|
28
|
+
* - Errors: JSON error object in JSON mode, plain message in pretty mode
|
|
29
|
+
*/
|
|
30
|
+
export declare function runCliCommand<T>(options: RunCliCommandOptions<T>): Promise<void>;
|
|
31
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAEpE;AAED,wBAAgB,aAAa,IAAI,MAAM,GAAG,MAAM,GAAG,QAAQ,CAE1D;AAED,gEAAgE;AAChE,wBAAgB,UAAU,IAAI,OAAO,CAKpC;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,sEAAsE;IACtE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,kDAAkD;IAClD,YAAY,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBtF"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* runCliCommand — shared command runner for the Product Brain CLI.
|
|
3
|
+
*
|
|
4
|
+
* Owns:
|
|
5
|
+
* (a) TTY detection via process.stdout.isTTY
|
|
6
|
+
* (b) JSON vs human output branching
|
|
7
|
+
* (c) stripConvexInternals() application in JSON mode
|
|
8
|
+
* (d) --json and --pretty explicit overrides that take precedence over auto-detection
|
|
9
|
+
* (e) Error handling: JSON error object in JSON mode, formatted message in TTY mode
|
|
10
|
+
*
|
|
11
|
+
* Chain: DEC-299 (JSON-default), STD-65 (agent responses: structured, parseable, minimal)
|
|
12
|
+
*/
|
|
13
|
+
import { stripConvexInternals } from './strip.js';
|
|
14
|
+
/**
|
|
15
|
+
* Global output mode — set by the CLI entry point when --json or --pretty flags are parsed.
|
|
16
|
+
* 'auto' = detect via TTY; 'json' = force JSON; 'pretty' = force human.
|
|
17
|
+
*/
|
|
18
|
+
let outputMode = 'auto';
|
|
19
|
+
export function setOutputMode(mode) {
|
|
20
|
+
outputMode = mode;
|
|
21
|
+
}
|
|
22
|
+
export function getOutputMode() {
|
|
23
|
+
return outputMode;
|
|
24
|
+
}
|
|
25
|
+
/** Returns true if the current output mode resolves to JSON. */
|
|
26
|
+
export function isJsonMode() {
|
|
27
|
+
if (outputMode === 'json')
|
|
28
|
+
return true;
|
|
29
|
+
if (outputMode === 'pretty')
|
|
30
|
+
return false;
|
|
31
|
+
// auto: non-TTY (piped) → JSON, TTY → human
|
|
32
|
+
return !process.stdout.isTTY;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Execute a CLI command with unified output handling.
|
|
36
|
+
*
|
|
37
|
+
* - JSON mode: strip Convex internals, JSON.stringify to stdout
|
|
38
|
+
* - Pretty mode: call formatPretty callback, print result
|
|
39
|
+
* - Errors: JSON error object in JSON mode, plain message in pretty mode
|
|
40
|
+
*/
|
|
41
|
+
export async function runCliCommand(options) {
|
|
42
|
+
const json = isJsonMode();
|
|
43
|
+
try {
|
|
44
|
+
const data = await options.fn();
|
|
45
|
+
if (json) {
|
|
46
|
+
const stripped = stripConvexInternals(data);
|
|
47
|
+
process.stdout.write(JSON.stringify(stripped) + '\n');
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const formatted = options.formatPretty(data);
|
|
51
|
+
process.stdout.write(formatted + '\n');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
56
|
+
if (json) {
|
|
57
|
+
process.stderr.write(JSON.stringify({ error: message }) + '\n');
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
process.stderr.write(message + '\n');
|
|
61
|
+
}
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=runner.js.map
|