@productbrain/cli 0.1.0-beta.39 → 0.1.0-beta.41
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 +13 -0
- package/dist/__tests__/constants.test.js +48 -1
- package/dist/__tests__/constants.test.js.map +1 -1
- package/dist/commands/admin/index.d.ts +17 -0
- package/dist/commands/admin/index.d.ts.map +1 -0
- package/dist/commands/admin/index.js +31 -0
- package/dist/commands/admin/index.js.map +1 -0
- package/dist/commands/admin/inspect.d.ts +12 -0
- package/dist/commands/admin/inspect.d.ts.map +1 -0
- package/dist/commands/admin/inspect.js +217 -0
- package/dist/commands/admin/inspect.js.map +1 -0
- package/dist/commands/admin/inspect.test.d.ts +5 -0
- package/dist/commands/admin/inspect.test.d.ts.map +1 -0
- package/dist/commands/admin/inspect.test.js +40 -0
- package/dist/commands/admin/inspect.test.js.map +1 -0
- package/dist/commands/admin/seed.d.ts +32 -0
- package/dist/commands/admin/seed.d.ts.map +1 -0
- package/dist/commands/admin/seed.js +363 -0
- package/dist/commands/admin/seed.js.map +1 -0
- package/dist/commands/admin/seed.test.d.ts +6 -0
- package/dist/commands/admin/seed.test.d.ts.map +1 -0
- package/dist/commands/admin/seed.test.js +65 -0
- package/dist/commands/admin/seed.test.js.map +1 -0
- package/dist/commands/connect-integration.test.js +54 -2
- package/dist/commands/connect-integration.test.js.map +1 -1
- package/dist/commands/connect.d.ts +5 -1
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +5 -6
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +3 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctor.test.js +3 -0
- package/dist/commands/doctor.test.js.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/client.d.ts +8 -0
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +29 -0
- package/dist/lib/client.js.map +1 -1
- package/dist/lib/constants.d.ts +22 -1
- package/dist/lib/constants.d.ts.map +1 -1
- package/dist/lib/constants.js +38 -2
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/style.d.ts +22 -0
- package/dist/lib/style.d.ts.map +1 -1
- package/dist/lib/style.js +52 -0
- package/dist/lib/style.js.map +1 -1
- package/dist/lib/style.test.js +57 -1
- package/dist/lib/style.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pb admin seed — workspace and platform seed operations (WP-312 S3, FEAT-970).
|
|
3
|
+
*
|
|
4
|
+
* Seed metadata is duplicated from `convex/admin/commandManifest.ts` for CLI help
|
|
5
|
+
* and ordering only — behavior is enforced server-side (STD-101).
|
|
6
|
+
*/
|
|
7
|
+
import { adminCall } from '../../lib/client.js';
|
|
8
|
+
import { getConfig } from '../../lib/config.js';
|
|
9
|
+
import { CLIError, ErrorCode } from '../../lib/errors.js';
|
|
10
|
+
import { readSession } from '../../lib/session.js';
|
|
11
|
+
import { isJsonMode } from '../../lib/runner.js';
|
|
12
|
+
import { withSpinner } from '../../lib/spinner.js';
|
|
13
|
+
import { adminBanner, bold, confirmProdAction, dim, green, hint, icons, red, } from '../../lib/style.js';
|
|
14
|
+
/**
|
|
15
|
+
* Order matches `ADMIN_COMMANDS` seed block in commandManifest.ts — dependency order for `seed all`.
|
|
16
|
+
*/
|
|
17
|
+
export const SEED_COMMAND_ENTRIES = [
|
|
18
|
+
{
|
|
19
|
+
name: 'seed:artifacts',
|
|
20
|
+
description: 'Seed Artifacts collection and related glossary entries (chainId, format, audience)',
|
|
21
|
+
requiresWorkspaceId: true,
|
|
22
|
+
dryRunSupported: false,
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'seed:chain-native-bet-constellation',
|
|
26
|
+
description: 'Seed the chain-native bet constellation for a workspace',
|
|
27
|
+
requiresWorkspaceId: false,
|
|
28
|
+
dryRunSupported: false,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
name: 'seed:definitions-chain',
|
|
32
|
+
description: 'Seed the definitions chain collection',
|
|
33
|
+
requiresWorkspaceId: true,
|
|
34
|
+
dryRunSupported: false,
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: 'seed:domain-teams',
|
|
38
|
+
description: 'Seed domain teams collection entries',
|
|
39
|
+
requiresWorkspaceId: true,
|
|
40
|
+
dryRunSupported: true,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'seed:features',
|
|
44
|
+
description: 'Seed Features collection and initial trust-audit entries',
|
|
45
|
+
requiresWorkspaceId: true,
|
|
46
|
+
dryRunSupported: false,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'seed:hierarchy-tier1',
|
|
50
|
+
description: 'Apply Tier 1 hierarchy migrations (landscape thinkingLayer, key-results fields)',
|
|
51
|
+
requiresWorkspaceId: false,
|
|
52
|
+
dryRunSupported: true,
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: 'seed:id-prefixes',
|
|
56
|
+
description: 'Seed collection ID prefixes for a workspace',
|
|
57
|
+
requiresWorkspaceId: true,
|
|
58
|
+
dryRunSupported: false,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: 'seed:knowledge',
|
|
62
|
+
description: 'Seed initial knowledge base (Standards, Features collections + labels)',
|
|
63
|
+
requiresWorkspaceId: true,
|
|
64
|
+
dryRunSupported: false,
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'seed:methodology-preset',
|
|
68
|
+
description: 'Install a methodology preset (e.g. cagan-tt) into a workspace — requires --preset-id',
|
|
69
|
+
requiresWorkspaceId: true,
|
|
70
|
+
dryRunSupported: false,
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: 'seed:process-templates',
|
|
74
|
+
description: 'Seed process templates collection for a workspace',
|
|
75
|
+
requiresWorkspaceId: true,
|
|
76
|
+
dryRunSupported: false,
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'seed:proposals',
|
|
80
|
+
description: 'Seed governance proposals collection',
|
|
81
|
+
requiresWorkspaceId: true,
|
|
82
|
+
dryRunSupported: false,
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: 'seed:readiness-config',
|
|
86
|
+
description: 'Migrate readiness config (readinessFloor, readinessWeight, readinessLayer) on all collections',
|
|
87
|
+
requiresWorkspaceId: false,
|
|
88
|
+
dryRunSupported: true,
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'seed:semantic-types-all',
|
|
92
|
+
description: 'Seed semantic types into all workspaces (cross-workspace action)',
|
|
93
|
+
requiresWorkspaceId: false,
|
|
94
|
+
dryRunSupported: false,
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'seed:writing-guidance',
|
|
98
|
+
description: 'Seed writing guidance entries for a workspace',
|
|
99
|
+
requiresWorkspaceId: true,
|
|
100
|
+
dryRunSupported: true,
|
|
101
|
+
},
|
|
102
|
+
];
|
|
103
|
+
const SEED_BY_NAME = new Map(SEED_COMMAND_ENTRIES.map((e) => [e.name, e]));
|
|
104
|
+
/** Manifest order for `pb admin seed all`. */
|
|
105
|
+
export const SEED_MANIFEST_ORDER = SEED_COMMAND_ENTRIES.map((e) => e.name);
|
|
106
|
+
function isProductionSite(siteUrl) {
|
|
107
|
+
try {
|
|
108
|
+
const host = new URL(siteUrl).hostname;
|
|
109
|
+
return host !== 'localhost' && host !== '127.0.0.1' && host !== '[::1]';
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function shortLabel(manifestName) {
|
|
116
|
+
return manifestName.startsWith('seed:') ? manifestName.slice('seed:'.length) : manifestName;
|
|
117
|
+
}
|
|
118
|
+
/** Accept `knowledge` or `seed:knowledge`. */
|
|
119
|
+
export function normalizeSeedCommandName(input) {
|
|
120
|
+
const t = input.trim();
|
|
121
|
+
if (!t) {
|
|
122
|
+
throw new CLIError('Seed operation name is required.', {
|
|
123
|
+
code: ErrorCode.VALIDATION_FAILED,
|
|
124
|
+
category: 'validation',
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
const full = t.startsWith('seed:') ? t : `seed:${t}`;
|
|
128
|
+
if (!SEED_BY_NAME.has(full)) {
|
|
129
|
+
const known = SEED_MANIFEST_ORDER.map((n) => shortLabel(n)).join(', ');
|
|
130
|
+
throw new CLIError(`Unknown seed operation "${input}". Known short names: ${known}`, {
|
|
131
|
+
code: ErrorCode.VALIDATION_FAILED,
|
|
132
|
+
category: 'validation',
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return full;
|
|
136
|
+
}
|
|
137
|
+
function resolveWorkspaceId(explicit) {
|
|
138
|
+
if (explicit)
|
|
139
|
+
return explicit;
|
|
140
|
+
return readSession()?.workspaceId;
|
|
141
|
+
}
|
|
142
|
+
function requireWorkspaceId(explicit) {
|
|
143
|
+
const id = resolveWorkspaceId(explicit);
|
|
144
|
+
if (!id) {
|
|
145
|
+
throw new CLIError('Workspace id required — pass --workspace-id or run `pb session start` in this project.', { code: ErrorCode.VALIDATION_FAILED, category: 'validation' });
|
|
146
|
+
}
|
|
147
|
+
return id;
|
|
148
|
+
}
|
|
149
|
+
export function buildSeedArgs(manifestName, opts) {
|
|
150
|
+
const def = SEED_BY_NAME.get(manifestName);
|
|
151
|
+
if (!def) {
|
|
152
|
+
throw new CLIError(`Unknown seed command: ${manifestName}`, {
|
|
153
|
+
code: ErrorCode.VALIDATION_FAILED,
|
|
154
|
+
category: 'validation',
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
const args = {};
|
|
158
|
+
if (manifestName === 'seed:methodology-preset') {
|
|
159
|
+
const ws = requireWorkspaceId(opts.workspaceId);
|
|
160
|
+
if (!opts.presetId) {
|
|
161
|
+
throw new CLIError('seed:methodology-preset requires --preset-id <id>.', {
|
|
162
|
+
code: ErrorCode.VALIDATION_FAILED,
|
|
163
|
+
category: 'validation',
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
args.workspaceId = ws;
|
|
167
|
+
args.presetId = opts.presetId;
|
|
168
|
+
return args;
|
|
169
|
+
}
|
|
170
|
+
if (def.requiresWorkspaceId) {
|
|
171
|
+
args.workspaceId = requireWorkspaceId(opts.workspaceId);
|
|
172
|
+
}
|
|
173
|
+
else if (opts.workspaceId && manifestName === 'seed:chain-native-bet-constellation') {
|
|
174
|
+
args.workspaceId = opts.workspaceId;
|
|
175
|
+
}
|
|
176
|
+
if (def.dryRunSupported && opts.dryRun) {
|
|
177
|
+
args.dryRun = true;
|
|
178
|
+
}
|
|
179
|
+
return args;
|
|
180
|
+
}
|
|
181
|
+
function printSeedList() {
|
|
182
|
+
const rows = SEED_COMMAND_ENTRIES.map((e) => ({
|
|
183
|
+
name: shortLabel(e.name),
|
|
184
|
+
description: e.description,
|
|
185
|
+
workspace: e.requiresWorkspaceId ? 'yes' : 'no',
|
|
186
|
+
dryRun: e.dryRunSupported ? 'yes' : '—',
|
|
187
|
+
}));
|
|
188
|
+
if (isJsonMode()) {
|
|
189
|
+
process.stdout.write(JSON.stringify({ commands: rows }, null, 2) + '\n');
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const wName = Math.max(8, ...rows.map((r) => r.name.length));
|
|
193
|
+
const wWs = 9;
|
|
194
|
+
const wDr = 6;
|
|
195
|
+
process.stdout.write(`${bold('Name'.padEnd(wName))} ${bold('Workspace'.padEnd(wWs))} ${bold('Dry-run'.padEnd(wDr))} ${bold('Description')}\n`);
|
|
196
|
+
for (const r of rows) {
|
|
197
|
+
process.stdout.write(`${r.name.padEnd(wName)} ${r.workspace.padEnd(wWs)} ${r.dryRun.padEnd(wDr)} ${dim(r.description)}\n`);
|
|
198
|
+
}
|
|
199
|
+
hint('Behavior is enforced by convex/admin/commandManifest.ts on the server.');
|
|
200
|
+
}
|
|
201
|
+
async function printSeedStatus(workspaceIdOpt) {
|
|
202
|
+
const readiness = await adminCall('inspect:readiness-config', {});
|
|
203
|
+
let collection = null;
|
|
204
|
+
const wsId = resolveWorkspaceId(workspaceIdOpt);
|
|
205
|
+
if (wsId) {
|
|
206
|
+
collection = await adminCall('inspect:collection', { workspaceId: wsId });
|
|
207
|
+
}
|
|
208
|
+
const note = 'Per-seed run history is not tracked server-side yet — use workspace totals and readiness diagnose as signals.';
|
|
209
|
+
if (isJsonMode()) {
|
|
210
|
+
process.stdout.write(JSON.stringify({
|
|
211
|
+
note,
|
|
212
|
+
readinessConfig: readiness,
|
|
213
|
+
workspaceCollections: collection,
|
|
214
|
+
workspaceId: wsId ?? null,
|
|
215
|
+
}, null, 2) + '\n');
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
process.stdout.write(`${bold('Seed status')}\n\n`);
|
|
219
|
+
process.stdout.write(` ${dim(note)}\n\n`);
|
|
220
|
+
process.stdout.write(`${bold('Readiness config migration (inspect:readiness-config)')}\n`);
|
|
221
|
+
process.stdout.write(` ${dim(JSON.stringify(readiness, null, 2).split('\n').join('\n '))}\n\n`);
|
|
222
|
+
if (collection && typeof collection === 'object' && collection !== null && 'workspace' in collection) {
|
|
223
|
+
const c = collection;
|
|
224
|
+
process.stdout.write(`${bold('Workspace')}\n`);
|
|
225
|
+
process.stdout.write(` ${c.workspace.name} (${c.workspace.slug})\n`);
|
|
226
|
+
process.stdout.write(` Collections: ${c.totalCollections} — Entries: ${c.totalEntries}\n\n`);
|
|
227
|
+
}
|
|
228
|
+
else if (!wsId) {
|
|
229
|
+
process.stdout.write(`${dim('No workspace id — pass --workspace-id or use an active session for collection breakdown.')}\n\n`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
async function runSeedOperation(manifestName, opts) {
|
|
233
|
+
const args = buildSeedArgs(manifestName, opts);
|
|
234
|
+
return adminCall(manifestName, args);
|
|
235
|
+
}
|
|
236
|
+
/** Attach seed subcommands to the `seed` Commander node. */
|
|
237
|
+
export function attachSeedCommands(seed) {
|
|
238
|
+
seed
|
|
239
|
+
.command('list')
|
|
240
|
+
.description('List registered seed operations (names match server manifest)')
|
|
241
|
+
.action(() => {
|
|
242
|
+
printSeedList();
|
|
243
|
+
});
|
|
244
|
+
seed
|
|
245
|
+
.command('status')
|
|
246
|
+
.description('Readiness + workspace collection signals (no per-seed run log yet)')
|
|
247
|
+
.option('--workspace-id <id>', 'Workspace id (defaults to session workspace when set)')
|
|
248
|
+
.action(async (options) => {
|
|
249
|
+
await printSeedStatus(options.workspaceId);
|
|
250
|
+
});
|
|
251
|
+
seed
|
|
252
|
+
.command('run')
|
|
253
|
+
.description('Run one seed operation by short or full manifest name')
|
|
254
|
+
.argument('<name>', 'e.g. knowledge or seed:knowledge')
|
|
255
|
+
.option('--dry-run', 'Pass dryRun when supported', false)
|
|
256
|
+
.option('--workspace-id <id>', 'Workspace id for workspace-scoped seeds')
|
|
257
|
+
.option('--preset-id <id>', 'Required for methodology-preset')
|
|
258
|
+
.option('--confirm', 'Non-interactive prod acknowledgment for dangerous ops', false)
|
|
259
|
+
.action(async (name, options) => {
|
|
260
|
+
const { siteUrl } = getConfig();
|
|
261
|
+
const manifestName = normalizeSeedCommandName(name);
|
|
262
|
+
const meta = SEED_BY_NAME.get(manifestName);
|
|
263
|
+
const isProd = isProductionSite(siteUrl);
|
|
264
|
+
// All seed ops on prod require confirmation — same policy as `seed all`.
|
|
265
|
+
if (isProd) {
|
|
266
|
+
const ok = await confirmProdAction({
|
|
267
|
+
confirm: options.confirm,
|
|
268
|
+
isProduction: true,
|
|
269
|
+
message: `Run ${manifestName} on production?`,
|
|
270
|
+
});
|
|
271
|
+
if (!ok) {
|
|
272
|
+
process.stderr.write('Cancelled.\n');
|
|
273
|
+
process.exitCode = 1;
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
adminBanner(siteUrl);
|
|
278
|
+
const label = `Running ${manifestName}`;
|
|
279
|
+
const data = await withSpinner(label, () => runSeedOperation(manifestName, {
|
|
280
|
+
workspaceId: options.workspaceId,
|
|
281
|
+
dryRun: options.dryRun,
|
|
282
|
+
presetId: options.presetId,
|
|
283
|
+
}));
|
|
284
|
+
if (isJsonMode()) {
|
|
285
|
+
process.stdout.write(JSON.stringify({ command: manifestName, data }, null, 2) + '\n');
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
process.stdout.write(`\n${green(icons.pass)} ${bold(manifestName)} complete.\n`);
|
|
289
|
+
process.stdout.write(dim(JSON.stringify(data, null, 2)) + '\n');
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
seed
|
|
293
|
+
.command('all')
|
|
294
|
+
.description('Run all seed operations in manifest order (skips methodology-preset unless --preset-id)')
|
|
295
|
+
.option('--workspace-id <id>', 'Workspace id for workspace-scoped seeds')
|
|
296
|
+
.option('--preset-id <id>', 'If set, runs seed:methodology-preset with this preset')
|
|
297
|
+
.option('--dry-run', 'Pass dryRun to operations that support it', false)
|
|
298
|
+
.option('--confirm', 'Required in production (non-interactive)', false)
|
|
299
|
+
.action(async (options) => {
|
|
300
|
+
const { siteUrl } = getConfig();
|
|
301
|
+
const isProd = isProductionSite(siteUrl);
|
|
302
|
+
if (isProd) {
|
|
303
|
+
const ok = await confirmProdAction({
|
|
304
|
+
confirm: options.confirm,
|
|
305
|
+
isProduction: true,
|
|
306
|
+
message: 'Run ALL seed operations on production?',
|
|
307
|
+
});
|
|
308
|
+
if (!ok) {
|
|
309
|
+
process.stderr.write('Cancelled.\n');
|
|
310
|
+
process.exitCode = 1;
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
adminBanner(siteUrl);
|
|
315
|
+
const results = [];
|
|
316
|
+
for (const cmd of SEED_MANIFEST_ORDER) {
|
|
317
|
+
if (cmd === 'seed:methodology-preset' && !options.presetId) {
|
|
318
|
+
results.push({
|
|
319
|
+
command: cmd,
|
|
320
|
+
ok: true,
|
|
321
|
+
skipped: true,
|
|
322
|
+
note: 'pass --preset-id to include methodology preset',
|
|
323
|
+
});
|
|
324
|
+
if (!isJsonMode()) {
|
|
325
|
+
process.stdout.write(`${dim(icons.dot)} ${cmd} skipped (no --preset-id)\n`);
|
|
326
|
+
}
|
|
327
|
+
continue;
|
|
328
|
+
}
|
|
329
|
+
try {
|
|
330
|
+
await withSpinner(`Running ${cmd}`, async () => {
|
|
331
|
+
const args = buildSeedArgs(cmd, {
|
|
332
|
+
workspaceId: options.workspaceId,
|
|
333
|
+
dryRun: options.dryRun,
|
|
334
|
+
presetId: options.presetId,
|
|
335
|
+
});
|
|
336
|
+
await adminCall(cmd, args);
|
|
337
|
+
});
|
|
338
|
+
results.push({ command: cmd, ok: true });
|
|
339
|
+
if (!isJsonMode()) {
|
|
340
|
+
process.stdout.write(`${green(icons.pass)} ${cmd}\n`);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
catch (e) {
|
|
344
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
345
|
+
results.push({ command: cmd, ok: false, error: msg });
|
|
346
|
+
if (!isJsonMode()) {
|
|
347
|
+
process.stdout.write(`${red(icons.fail)} ${cmd} — ${msg}\n`);
|
|
348
|
+
}
|
|
349
|
+
break;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
if (results.some((r) => !r.ok)) {
|
|
353
|
+
process.exitCode = 1;
|
|
354
|
+
}
|
|
355
|
+
if (isJsonMode()) {
|
|
356
|
+
process.stdout.write(JSON.stringify({ results }, null, 2) + '\n');
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
hint('seed all stops on first failure. Fix the error and re-run, or run individual `pb admin seed run` commands.');
|
|
360
|
+
}
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../../src/commands/admin/seed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.test.d.ts","sourceRoot":"","sources":["../../../src/commands/admin/seed.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for pb admin seed helpers — normalizeSeedCommandName and buildSeedArgs.
|
|
3
|
+
* These gate prod operations so they need coverage (WP-312 S3, FEAT-970).
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
6
|
+
import { normalizeSeedCommandName, buildSeedArgs, SEED_MANIFEST_ORDER } from './seed.js';
|
|
7
|
+
// Mock readSession so workspace resolution is predictable in tests
|
|
8
|
+
vi.mock('../../lib/session.js', () => ({
|
|
9
|
+
readSession: vi.fn(() => null),
|
|
10
|
+
}));
|
|
11
|
+
describe('normalizeSeedCommandName', () => {
|
|
12
|
+
it('accepts short form and expands to seed: prefix', () => {
|
|
13
|
+
expect(normalizeSeedCommandName('knowledge')).toBe('seed:knowledge');
|
|
14
|
+
});
|
|
15
|
+
it('accepts fully qualified form as-is', () => {
|
|
16
|
+
expect(normalizeSeedCommandName('seed:knowledge')).toBe('seed:knowledge');
|
|
17
|
+
});
|
|
18
|
+
it('accepts all 14 known short names', () => {
|
|
19
|
+
const shortNames = SEED_MANIFEST_ORDER.map((n) => n.replace('seed:', ''));
|
|
20
|
+
for (const name of shortNames) {
|
|
21
|
+
expect(() => normalizeSeedCommandName(name)).not.toThrow();
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
it('throws on unknown name', () => {
|
|
25
|
+
expect(() => normalizeSeedCommandName('nonexistent')).toThrow('Unknown seed operation');
|
|
26
|
+
});
|
|
27
|
+
it('throws on empty string', () => {
|
|
28
|
+
expect(() => normalizeSeedCommandName('')).toThrow('required');
|
|
29
|
+
});
|
|
30
|
+
it('trims whitespace before checking', () => {
|
|
31
|
+
expect(normalizeSeedCommandName(' knowledge ')).toBe('seed:knowledge');
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe('buildSeedArgs', () => {
|
|
35
|
+
it('returns empty args for a non-workspace command with no options', () => {
|
|
36
|
+
// seed:hierarchy-tier1 does not requiresWorkspaceId and no dryRun
|
|
37
|
+
const args = buildSeedArgs('seed:hierarchy-tier1', {});
|
|
38
|
+
expect(args).toEqual({});
|
|
39
|
+
});
|
|
40
|
+
it('adds workspaceId for workspace-required commands when explicitly provided', () => {
|
|
41
|
+
const args = buildSeedArgs('seed:knowledge', { workspaceId: 'ws-123' });
|
|
42
|
+
expect(args).toMatchObject({ workspaceId: 'ws-123' });
|
|
43
|
+
});
|
|
44
|
+
it('throws when workspace-required command has no workspaceId and no session', () => {
|
|
45
|
+
// session is mocked to return null above
|
|
46
|
+
expect(() => buildSeedArgs('seed:knowledge', {})).toThrow();
|
|
47
|
+
});
|
|
48
|
+
it('adds dryRun flag when supported and requested', () => {
|
|
49
|
+
// seed:hierarchy-tier1 has dryRunSupported: true and no workspace requirement
|
|
50
|
+
const args = buildSeedArgs('seed:hierarchy-tier1', { dryRun: true });
|
|
51
|
+
expect(args).toMatchObject({ dryRun: true });
|
|
52
|
+
});
|
|
53
|
+
it('does not add dryRun when command does not support it', () => {
|
|
54
|
+
// seed:chain-native-bet-constellation has dryRunSupported: false
|
|
55
|
+
const args = buildSeedArgs('seed:chain-native-bet-constellation', { dryRun: true });
|
|
56
|
+
expect(args).not.toHaveProperty('dryRun');
|
|
57
|
+
});
|
|
58
|
+
it('throws for methodology-preset without presetId', () => {
|
|
59
|
+
expect(() => buildSeedArgs('seed:methodology-preset', { workspaceId: 'ws-123' })).toThrow('preset-id');
|
|
60
|
+
});
|
|
61
|
+
it('throws for unknown manifest name', () => {
|
|
62
|
+
expect(() => buildSeedArgs('seed:does-not-exist', {})).toThrow('Unknown seed command');
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=seed.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.test.js","sourceRoot":"","sources":["../../../src/commands/admin/seed.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,19 @@ vi.mock('fs', () => ({
|
|
|
19
19
|
}));
|
|
20
20
|
vi.mock('../lib/constants.js', () => ({
|
|
21
21
|
resolveAppUrl: () => 'https://test.convex.site',
|
|
22
|
+
resolveSiteUrl: () => 'https://gateway.productbrain.io',
|
|
23
|
+
DEFAULT_SITE_URL: 'https://gateway.productbrain.io',
|
|
24
|
+
resolveConnectRedeemUrl: (cli) => {
|
|
25
|
+
if (cli?.trim())
|
|
26
|
+
return cli.trim().replace(/\/$/, '');
|
|
27
|
+
const fromEnv = process.env.PB_CONNECT_GATEWAY_URL?.trim();
|
|
28
|
+
if (fromEnv)
|
|
29
|
+
return fromEnv.replace(/\/$/, '');
|
|
30
|
+
const fromConvex = process.env.CONVEX_SITE_URL?.trim();
|
|
31
|
+
if (fromConvex)
|
|
32
|
+
return fromConvex.replace(/\/$/, '');
|
|
33
|
+
return 'https://gateway.productbrain.io';
|
|
34
|
+
},
|
|
22
35
|
}));
|
|
23
36
|
vi.mock('../lib/spinner.js', () => ({
|
|
24
37
|
withSpinner: async (_msg, fn) => fn(),
|
|
@@ -49,13 +62,17 @@ import * as clack from '@clack/prompts';
|
|
|
49
62
|
const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
50
63
|
const stdoutSpy = vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
51
64
|
const originalEnv = { ...process.env };
|
|
65
|
+
const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
|
|
52
66
|
describe('pb connect — integration', () => {
|
|
53
67
|
beforeEach(() => {
|
|
54
68
|
vi.clearAllMocks();
|
|
55
69
|
consoleSpy.mockClear();
|
|
56
70
|
stdoutSpy.mockClear();
|
|
71
|
+
stderrSpy.mockClear();
|
|
57
72
|
clackSelectCallCount = 0;
|
|
58
73
|
process.env.CONVEX_SITE_URL = 'https://test.convex.site';
|
|
74
|
+
delete process.env.PB_ENV;
|
|
75
|
+
delete process.env.PB_CONNECT_GATEWAY_URL;
|
|
59
76
|
});
|
|
60
77
|
afterEach(() => {
|
|
61
78
|
process.env = { ...originalEnv };
|
|
@@ -71,8 +88,8 @@ describe('pb connect — integration', () => {
|
|
|
71
88
|
}),
|
|
72
89
|
});
|
|
73
90
|
await runConnect(token);
|
|
74
|
-
// fetch called with /auth/redeem-connect-token
|
|
75
|
-
expect(mockFetch).toHaveBeenCalledWith(
|
|
91
|
+
// fetch called with CONVEX_SITE_URL + /auth/redeem-connect-token
|
|
92
|
+
expect(mockFetch).toHaveBeenCalledWith('https://test.convex.site/auth/redeem-connect-token', expect.objectContaining({
|
|
76
93
|
method: 'POST',
|
|
77
94
|
body: JSON.stringify({ token }),
|
|
78
95
|
}));
|
|
@@ -144,5 +161,40 @@ describe('pb connect — integration', () => {
|
|
|
144
161
|
expect(exitSpy).toHaveBeenCalledWith(130);
|
|
145
162
|
exitSpy.mockRestore();
|
|
146
163
|
});
|
|
164
|
+
it('includes deployment hint in error when token is invalid', async () => {
|
|
165
|
+
const token = 'pb_ct_' + 'a'.repeat(40);
|
|
166
|
+
mockFetch.mockResolvedValueOnce({
|
|
167
|
+
ok: false,
|
|
168
|
+
status: 400,
|
|
169
|
+
json: async () => ({
|
|
170
|
+
error: { code: 'invalid_token', message: 'Token expired' },
|
|
171
|
+
}),
|
|
172
|
+
});
|
|
173
|
+
let caught;
|
|
174
|
+
try {
|
|
175
|
+
await runConnect(token);
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
caught = err;
|
|
179
|
+
}
|
|
180
|
+
expect(caught).toBeInstanceOf(CLIError);
|
|
181
|
+
expect(caught.guidance).toContain('Tried gateway:');
|
|
182
|
+
expect(caught.guidance).toContain('CONVEX_SITE_URL');
|
|
183
|
+
expect(caught.guidance).toContain('--gateway');
|
|
184
|
+
});
|
|
185
|
+
it('uses CONVEX_SITE_URL for redeem when set', async () => {
|
|
186
|
+
process.env.CONVEX_SITE_URL = 'https://my-dev.convex.site';
|
|
187
|
+
const token = 'pb_ct_' + 'a'.repeat(40);
|
|
188
|
+
mockFetch.mockResolvedValueOnce({
|
|
189
|
+
ok: true,
|
|
190
|
+
json: async () => ({
|
|
191
|
+
apiKey: 'pb_sk_convex',
|
|
192
|
+
workspaceId: 'ws-convex',
|
|
193
|
+
workspaceName: 'Convex WS',
|
|
194
|
+
}),
|
|
195
|
+
});
|
|
196
|
+
await runConnect(token);
|
|
197
|
+
expect(mockFetch).toHaveBeenCalledWith('https://my-dev.convex.site/auth/redeem-connect-token', expect.objectContaining({ method: 'POST' }));
|
|
198
|
+
});
|
|
147
199
|
});
|
|
148
200
|
//# sourceMappingURL=connect-integration.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect-integration.test.js","sourceRoot":"","sources":["../../src/commands/connect-integration.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEzE,8BAA8B;AAC9B,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC1B,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;AAEzB,MAAM,iBAAiB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAClC,MAAM,gBAAgB,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,EAAc,CAAC,CAAC;AAErD,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACnB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;IAClB,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;IACtB,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;IAC9B,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC,CAAC;CACH,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC,CAAC;IACpC,aAAa,EAAE,GAAG,EAAE,CAAC,0BAA0B;
|
|
1
|
+
{"version":3,"file":"connect-integration.test.js","sourceRoot":"","sources":["../../src/commands/connect-integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,10 +8,14 @@
|
|
|
8
8
|
* S3: Wizard flow (surface detection + trust level).
|
|
9
9
|
* S4: Final handshake (pb handshake).
|
|
10
10
|
*/
|
|
11
|
+
export interface ConnectOptions {
|
|
12
|
+
/** Override redeem gateway (`pb connect --gateway`). */
|
|
13
|
+
gateway?: string;
|
|
14
|
+
}
|
|
11
15
|
/**
|
|
12
16
|
* Main entrypoint for `pb connect <token>`.
|
|
13
17
|
* Validates token format, redeems it via /auth/redeem-connect-token,
|
|
14
18
|
* saves the key, and runs the wizard (S3).
|
|
15
19
|
*/
|
|
16
|
-
export declare function runConnect(token: string): Promise<void>;
|
|
20
|
+
export declare function runConnect(token: string, options?: ConnectOptions): Promise<void>;
|
|
17
21
|
//# sourceMappingURL=connect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiNH;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAiNH,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmG3F"}
|
package/dist/commands/connect.js
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
12
12
|
import { resolve } from 'path';
|
|
13
|
-
import { resolveAppUrl,
|
|
13
|
+
import { resolveAppUrl, resolveConnectRedeemUrl } from '../lib/constants.js';
|
|
14
14
|
import { CLIError, ErrorCode } from '../lib/errors.js';
|
|
15
15
|
import { createProfile, listProfiles, PROFILES_DIR } from '../lib/profiles.js';
|
|
16
16
|
import { withSpinner } from '../lib/spinner.js';
|
|
@@ -67,7 +67,7 @@ async function redeemToken(token, siteUrl) {
|
|
|
67
67
|
throw new CLIError('Token is invalid, expired, or already used. Get a new token from your onboarding link.', {
|
|
68
68
|
code: ErrorCode.AUTH_INVALID,
|
|
69
69
|
category: 'auth',
|
|
70
|
-
guidance: `
|
|
70
|
+
guidance: `Tried gateway: ${siteUrl}\nVisit ${APP_URL} to get a new onboarding link, or contact support.\n\nIf your token came from a different Convex deployment, use:\n pb connect --gateway <your-deployment>.convex.site <token>\nor set CONVEX_SITE_URL in your environment.`,
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
73
|
if (errorCode === 'workspace_not_found' || res.status === 404) {
|
|
@@ -182,7 +182,7 @@ function saveProjectConfig(siteUrl, profileName) {
|
|
|
182
182
|
* Validates token format, redeems it via /auth/redeem-connect-token,
|
|
183
183
|
* saves the key, and runs the wizard (S3).
|
|
184
184
|
*/
|
|
185
|
-
export async function runConnect(token) {
|
|
185
|
+
export async function runConnect(token, options = {}) {
|
|
186
186
|
// 1. Validate token format
|
|
187
187
|
const formatError = validateTokenFormat(token);
|
|
188
188
|
if (formatError) {
|
|
@@ -192,9 +192,8 @@ export async function runConnect(token) {
|
|
|
192
192
|
guidance: `Usage: pb connect <token>\nToken must start with '${TOKEN_PREFIX}' and be at least 30 characters long.`,
|
|
193
193
|
});
|
|
194
194
|
}
|
|
195
|
-
// 2.
|
|
196
|
-
const siteUrl =
|
|
197
|
-
// 3. Redeem token
|
|
195
|
+
// 2. Resolve cloud Convex gateway (--gateway → env → CONVEX_SITE_URL → production)
|
|
196
|
+
const siteUrl = resolveConnectRedeemUrl(options.gateway);
|
|
198
197
|
const result = await redeemToken(token, siteUrl);
|
|
199
198
|
// 4. Save API key as named profile + pin project config
|
|
200
199
|
const profileName = slugify(result.workspaceName);
|