@productbrain/cli 0.1.0-beta.4806 → 0.1.0-beta.4818
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/dist/__tests__/config-prod-fallthrough.test.js +23 -12
- package/dist/__tests__/config-prod-fallthrough.test.js.map +1 -1
- package/dist/__tests__/config.test.js +354 -11
- package/dist/__tests__/config.test.js.map +1 -1
- package/dist/__tests__/init.test.js +51 -14
- package/dist/__tests__/init.test.js.map +1 -1
- package/dist/__tests__/session-switch.test.js +29 -1
- package/dist/__tests__/session-switch.test.js.map +1 -1
- package/dist/__tests__/state.test.js +21 -1
- package/dist/__tests__/state.test.js.map +1 -1
- package/dist/commands/__tests__/setup-state.test.js +1 -1
- package/dist/commands/__tests__/setup-state.test.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +101 -35
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/doctor.test.js +182 -6
- package/dist/commands/doctor.test.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +20 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +8 -10
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +102 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/status.test.d.ts +2 -0
- package/dist/commands/status.test.d.ts.map +1 -0
- package/dist/commands/status.test.js +75 -0
- package/dist/commands/status.test.js.map +1 -0
- package/dist/commands/welcome.d.ts.map +1 -1
- package/dist/commands/welcome.js +5 -2
- package/dist/commands/welcome.js.map +1 -1
- package/dist/index.js +3 -112
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +17 -30
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +47 -109
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/configResult.d.ts +80 -0
- package/dist/lib/configResult.d.ts.map +1 -0
- package/dist/lib/configResult.js +176 -0
- package/dist/lib/configResult.js.map +1 -0
- package/dist/lib/localBinding.d.ts +51 -0
- package/dist/lib/localBinding.d.ts.map +1 -0
- package/dist/lib/localBinding.js +90 -0
- package/dist/lib/localBinding.js.map +1 -0
- package/dist/lib/projectConfig.d.ts +6 -0
- package/dist/lib/projectConfig.d.ts.map +1 -1
- package/dist/lib/projectConfig.js +14 -2
- package/dist/lib/projectConfig.js.map +1 -1
- package/dist/lib/state.d.ts +7 -0
- package/dist/lib/state.d.ts.map +1 -1
- package/dist/lib/state.js +7 -2
- package/dist/lib/state.js.map +1 -1
- package/package.json +1 -1
package/dist/lib/config.js
CHANGED
|
@@ -18,12 +18,14 @@
|
|
|
18
18
|
import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
19
19
|
import { resolve } from 'path';
|
|
20
20
|
import { homedir } from 'os';
|
|
21
|
-
import { DEFAULT_SITE_URL
|
|
21
|
+
import { DEFAULT_SITE_URL } from './constants.js';
|
|
22
22
|
import { API_KEY_PREFIX } from './tokenConstants.js';
|
|
23
23
|
import { resolveProfileConfig, resolveNamedProfileConfig, getGlobalActiveProfile } from './profiles.js';
|
|
24
24
|
import { findProjectRoot, readProjectConfig, readLocalProjectConfig } from './projectConfig.js';
|
|
25
|
+
import { resolveLocalBinding, resolvePinnedProfile } from './localBinding.js';
|
|
25
26
|
import { CLIError, ErrorCode } from './errors.js';
|
|
26
27
|
import { confirm as promptConfirm, password as promptPassword } from './prompts.js';
|
|
28
|
+
import { isInsecureSiteUrl, pickSiteUrl, resolveConfigResult, } from './configResult.js';
|
|
27
29
|
const HOME_CONFIG_DIR = resolve(homedir(), '.config', 'productbrain');
|
|
28
30
|
const HOME_ENV_PATH = resolve(HOME_CONFIG_DIR, '.env');
|
|
29
31
|
const CWD_ENV_PATHS = ['.env.mcp', 'packages/mcp-server/.env.mcp', '.env'];
|
|
@@ -165,21 +167,21 @@ export function refreshPreviewApiKeyFromDisk() {
|
|
|
165
167
|
}
|
|
166
168
|
}
|
|
167
169
|
/**
|
|
168
|
-
* Resolve the effective profile NAME + where it came from.
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
173
|
-
*
|
|
174
|
-
* the
|
|
170
|
+
* Resolve the effective profile NAME + where it came from. PRECEDENCE — local pin > env >
|
|
171
|
+
* global > default: the pin outranks `PB_PROFILE` because resolveConfig() 2b / loadEnv() 1b
|
|
172
|
+
* bind the pinned key before the profile system (the only step reading `PB_PROFILE`), so
|
|
173
|
+
* under both the env name never supplies the credential and must not be reported. Unlike
|
|
174
|
+
* resolveConfig() this names the *configured* pin even when unresolvable (deleted / missing
|
|
175
|
+
* key): a dangling pin must be surfaced by `pb whoami`, never masked by the global profile
|
|
176
|
+
* — the TEN-2163 silent-drift bug. Used by `pb whoami`, session labels, "now using" prints.
|
|
175
177
|
*/
|
|
176
178
|
export function resolveEffectiveProfile() {
|
|
177
|
-
const envProfile = process.env.PB_PROFILE?.trim();
|
|
178
|
-
if (envProfile)
|
|
179
|
-
return { profile: envProfile, source: 'env' };
|
|
180
179
|
const localProfile = readLocalProjectConfig()?.profile;
|
|
181
180
|
if (localProfile)
|
|
182
181
|
return { profile: localProfile, source: 'local' };
|
|
182
|
+
const envProfile = process.env.PB_PROFILE?.trim();
|
|
183
|
+
if (envProfile)
|
|
184
|
+
return { profile: envProfile, source: 'env' };
|
|
183
185
|
const globalProfile = getGlobalActiveProfile();
|
|
184
186
|
if (globalProfile)
|
|
185
187
|
return { profile: globalProfile, source: 'global' };
|
|
@@ -187,41 +189,6 @@ export function resolveEffectiveProfile() {
|
|
|
187
189
|
return { profile: 'default', source: 'default' };
|
|
188
190
|
return { profile: null, source: 'none' };
|
|
189
191
|
}
|
|
190
|
-
/**
|
|
191
|
-
* Resolve the repo-local profile pin to a credential, or refuse outright.
|
|
192
|
-
*
|
|
193
|
-
* FAILS CLOSED on a DANGLING pin: a pin naming a profile that has since been deleted, or
|
|
194
|
-
* whose file carries no key, must NEVER fall through to the global active profile. The repo
|
|
195
|
-
* has explicitly declared its tenant; substituting a different one silently retargets every
|
|
196
|
-
* read AND write at a foreign workspace, and the gateway derives the workspace from the
|
|
197
|
-
* credential (BR-18) — so nothing downstream catches it. Fail loud, fail closed, fail fast
|
|
198
|
-
* (PRI-24); default closed, explicitly opened (PRI-22).
|
|
199
|
-
*
|
|
200
|
-
* INS-2455 is the admin-path instance of exactly this fall-through. `resolveAdminConfig()`
|
|
201
|
-
* was hardened on its own, which left the two cascades every other command uses — the
|
|
202
|
-
* `resolveConfig()` return path and the `loadEnv()` process.env path — still fail-open.
|
|
203
|
-
* Those two now share this helper so they cannot drift apart again (STD-3). `adminConfig.ts`
|
|
204
|
-
* still keeps its own inline copy: it deliberately excludes config.json's siteUrl and CWD
|
|
205
|
-
* .env files, so it is a narrower cascade, not this one. Folding it in is the remaining step
|
|
206
|
-
* toward a single code path (STA-3).
|
|
207
|
-
*/
|
|
208
|
-
function resolvePinnedProfile(profileName) {
|
|
209
|
-
const namedConfig = resolveNamedProfileConfig(profileName);
|
|
210
|
-
// Same validity bar as adminConfig.ts: a present-but-malformed key is a broken pin, not a
|
|
211
|
-
// credential. Accepting it here would surface as a generic "no API key, run pb login" far
|
|
212
|
-
// downstream, pointing the operator away from the pin that actually broke.
|
|
213
|
-
if (!namedConfig?.apiKey?.startsWith(API_KEY_PREFIX)) {
|
|
214
|
-
throw new CLIError(`This repo is pinned to profile "${profileName}" (.productbrain/config.local.json), ` +
|
|
215
|
-
`but that profile has no valid API key — it may have been deleted or never fully set up. ` +
|
|
216
|
-
`Refusing to silently fall back to a different workspace. ` +
|
|
217
|
-
`Run \`pb profile use --local <profile>\` to fix the pin, or \`pb profile create ${profileName}\` to restore it.`, {
|
|
218
|
-
code: ErrorCode.AUTH_MISSING,
|
|
219
|
-
category: 'auth',
|
|
220
|
-
guidance: 'Run `pb profile use --local <profile>` to fix the repo pin.',
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
return { apiKey: namedConfig.apiKey, siteUrl: namedConfig.siteUrl };
|
|
224
|
-
}
|
|
225
192
|
/**
|
|
226
193
|
* Run the full config resolution cascade and return a typed result.
|
|
227
194
|
* Resolution order:
|
|
@@ -232,22 +199,21 @@ function resolvePinnedProfile(profileName) {
|
|
|
232
199
|
* 4. Legacy home config (~/.config/productbrain/.env)
|
|
233
200
|
* 5. CWD .env files (.env.mcp, packages/mcp-server/.env.mcp, .env)
|
|
234
201
|
*
|
|
235
|
-
* siteUrl always has a value (falls back to DEFAULT_SITE_URL)
|
|
202
|
+
* siteUrl always has a value (falls back to DEFAULT_SITE_URL) and reports its OWN origin in
|
|
203
|
+
* `siteUrlSource` — not `source`, because most branches prefer config.json's URL over their own.
|
|
236
204
|
*
|
|
237
|
-
* THROWS
|
|
238
|
-
*
|
|
239
|
-
*
|
|
205
|
+
* THROWS at step 2 rather than substituting a different workspace, in either of two shapes:
|
|
206
|
+
* CONFIG_INVALID at 2a when config.local.json claims a direct binding it cannot complete, and
|
|
207
|
+
* AUTH_MISSING at 2b when the repo pins a profile that does not resolve to a valid key.
|
|
208
|
+
* Callers that must degrade rather than crash go through getConfigSafe(), which reports both
|
|
209
|
+
* refusals as `ok: false` and preserves the kind.
|
|
240
210
|
*/
|
|
241
211
|
export function resolveConfig() {
|
|
242
212
|
// 1. Env vars — check directly, don't mutate process.env
|
|
243
213
|
const envKey = process.env.PRODUCTBRAIN_API_KEY;
|
|
244
214
|
const envSite = process.env.CONVEX_SITE_URL;
|
|
245
215
|
if (envKey) {
|
|
246
|
-
return {
|
|
247
|
-
apiKey: envKey,
|
|
248
|
-
siteUrl: (envSite || DEFAULT_SITE_URL).replace(/\/$/, ''),
|
|
249
|
-
source: 'env',
|
|
250
|
-
};
|
|
216
|
+
return { apiKey: envKey, source: 'env', ...pickSiteUrl([['env', envSite]]) };
|
|
251
217
|
}
|
|
252
218
|
// 2. Local project config — check for direct preview binding first, then profile pin.
|
|
253
219
|
const localConfig = readLocalProjectConfig();
|
|
@@ -258,25 +224,26 @@ export function resolveConfig() {
|
|
|
258
224
|
//
|
|
259
225
|
// Atomic apiKey+siteUrl (SF-3): only honor the preview key when its OWN siteUrl is present.
|
|
260
226
|
// Never let a preview key borrow config.json's (real-dev) siteUrl — that would send a
|
|
261
|
-
// preview credential to a non-preview gateway (STD-261).
|
|
262
|
-
//
|
|
263
|
-
|
|
264
|
-
if (
|
|
227
|
+
// preview credential to a non-preview gateway (STD-261). A claimed but incomplete binding
|
|
228
|
+
// refuses before the profile pin, so neither credential nor tenant can silently change.
|
|
229
|
+
const localBinding = resolveLocalBinding(localConfig);
|
|
230
|
+
if (localBinding) {
|
|
231
|
+
// The binding carries its own atomic siteUrl (SF-3), so it is also the URL's origin.
|
|
265
232
|
return {
|
|
266
|
-
apiKey:
|
|
267
|
-
siteUrl:
|
|
233
|
+
apiKey: localBinding.apiKey,
|
|
234
|
+
siteUrl: localBinding.siteUrl,
|
|
268
235
|
source: 'project',
|
|
236
|
+
siteUrlSource: 'local-binding',
|
|
269
237
|
};
|
|
270
238
|
}
|
|
271
239
|
// 2b. Profile pin (config.local.json profile field, gitignored)
|
|
272
240
|
if (localConfig?.profile) {
|
|
273
241
|
const pinned = resolvePinnedProfile(localConfig.profile);
|
|
274
|
-
// siteUrl: local.profile.siteUrl || config.json.siteUrl || env || default
|
|
275
242
|
const projectConfig = readProjectConfig();
|
|
276
243
|
return {
|
|
277
244
|
apiKey: pinned.apiKey,
|
|
278
|
-
|
|
279
|
-
|
|
245
|
+
source: 'project', profileName: localConfig.profile,
|
|
246
|
+
...pickSiteUrl([['profile-pin', pinned.siteUrl], ['project-config', projectConfig?.siteUrl], ['env', envSite]]),
|
|
280
247
|
};
|
|
281
248
|
}
|
|
282
249
|
// 2b. config.json — siteUrl gateway override only (no apiKey, no profile)
|
|
@@ -287,8 +254,8 @@ export function resolveConfig() {
|
|
|
287
254
|
if (profileConfig?.apiKey) {
|
|
288
255
|
return {
|
|
289
256
|
apiKey: profileConfig.apiKey,
|
|
290
|
-
|
|
291
|
-
|
|
257
|
+
source: 'profile', profileName: profileConfig.profileName ?? undefined,
|
|
258
|
+
...pickSiteUrl([['project-config', projectConfig?.siteUrl], ['profile', profileConfig.siteUrl], ['env', envSite]]),
|
|
292
259
|
};
|
|
293
260
|
}
|
|
294
261
|
// 4. Legacy home config
|
|
@@ -297,8 +264,8 @@ export function resolveConfig() {
|
|
|
297
264
|
if (vars['PRODUCTBRAIN_API_KEY']) {
|
|
298
265
|
return {
|
|
299
266
|
apiKey: vars['PRODUCTBRAIN_API_KEY'],
|
|
300
|
-
siteUrl: (projectConfig?.siteUrl || vars['CONVEX_SITE_URL'] || envSite || DEFAULT_SITE_URL).replace(/\/$/, ''),
|
|
301
267
|
source: 'profile',
|
|
268
|
+
...pickSiteUrl([['project-config', projectConfig?.siteUrl], ['legacy', vars['CONVEX_SITE_URL']], ['env', envSite]]),
|
|
302
269
|
};
|
|
303
270
|
}
|
|
304
271
|
}
|
|
@@ -310,29 +277,18 @@ export function resolveConfig() {
|
|
|
310
277
|
if (vars['PRODUCTBRAIN_API_KEY']) {
|
|
311
278
|
return {
|
|
312
279
|
apiKey: vars['PRODUCTBRAIN_API_KEY'],
|
|
313
|
-
siteUrl: (projectConfig?.siteUrl || vars['CONVEX_SITE_URL'] || envSite || DEFAULT_SITE_URL).replace(/\/$/, ''),
|
|
314
280
|
source: 'cwd',
|
|
281
|
+
...pickSiteUrl([['project-config', projectConfig?.siteUrl], ['cwd', vars['CONVEX_SITE_URL'], p], ['env', envSite]]),
|
|
315
282
|
};
|
|
316
283
|
}
|
|
317
284
|
break;
|
|
318
285
|
}
|
|
319
286
|
}
|
|
320
|
-
// 6. No API key found anywhere —
|
|
321
|
-
const resolvedSiteUrl = (projectConfig?.siteUrl || envSite || DEFAULT_SITE_URL).replace(/\/$/, '');
|
|
322
|
-
// TEN-2382: the published CLI's prod default is intended (WP-301), so we do NOT
|
|
323
|
-
// warn on prod fall-through in general. The ONE exception is the preview-scrub
|
|
324
|
-
// misroute — a preview binding whose apiKey is present but whose siteUrl was
|
|
325
|
-
// scrubbed (the STD-261 atomic guard at step 2a dropped the key), now silently
|
|
326
|
-
// resolving to the production gateway. That single case is a real misroute.
|
|
327
|
-
if (localConfig?.apiKey && resolvedSiteUrl === DEFAULT_SITE_URL.replace(/\/$/, '')) {
|
|
328
|
-
process.stderr.write(`Warning: a preview API key is configured but its deployment URL is missing — ` +
|
|
329
|
-
`defaulting to the production gateway ${DEFAULT_SITE_URL}. Run ` +
|
|
330
|
-
`\`npm run pb:preview\` to rebind the preview, or set CONVEX_SITE_URL.\n`);
|
|
331
|
-
}
|
|
287
|
+
// 6. No API key found anywhere — siteUrl still resolves so diagnostics can report a gateway.
|
|
332
288
|
return {
|
|
333
289
|
apiKey: undefined,
|
|
334
|
-
siteUrl: resolvedSiteUrl,
|
|
335
290
|
source: 'default',
|
|
291
|
+
...pickSiteUrl([['project-config', projectConfig?.siteUrl], ['env', envSite]]),
|
|
336
292
|
};
|
|
337
293
|
}
|
|
338
294
|
/** Parse env file content and return key-value pairs (without mutating process.env). */
|
|
@@ -363,14 +319,15 @@ function loadEnv() {
|
|
|
363
319
|
// Atomic apiKey+siteUrl (SF-3): only bind the preview key when its OWN siteUrl is present —
|
|
364
320
|
// never let it fall through to config.json's (real-dev) siteUrl (STD-261). Mirror of the
|
|
365
321
|
// resolveConfig() 2a guard so loadEnv() and resolveConfig() agree on what counts as a binding.
|
|
366
|
-
|
|
367
|
-
|
|
322
|
+
const localBinding = process.env.PRODUCTBRAIN_API_KEY ? null : resolveLocalBinding(localConfig);
|
|
323
|
+
if (localBinding) {
|
|
324
|
+
process.env.PRODUCTBRAIN_API_KEY = localBinding.apiKey;
|
|
368
325
|
// SF-3 atomic pair: when we accept the preview key, we MUST pair it with
|
|
369
326
|
// its OWN siteUrl — even if CONVEX_SITE_URL is already exported. Otherwise
|
|
370
327
|
// a stale/real exported CONVEX_SITE_URL would silently route the preview
|
|
371
328
|
// credential to a non-preview gateway. Mirror of resolveConfig() step 2a,
|
|
372
329
|
// which returns localConfig.siteUrl unconditionally inside this branch.
|
|
373
|
-
process.env.CONVEX_SITE_URL =
|
|
330
|
+
process.env.CONVEX_SITE_URL = localBinding.siteUrl;
|
|
374
331
|
}
|
|
375
332
|
// 1b. Profile pin — refuses on a dangling pin rather than letting step 2 below adopt the
|
|
376
333
|
// global active profile. Shares resolvePinnedProfile() with resolveConfig() step 2b so
|
|
@@ -481,12 +438,12 @@ export function getConfig() {
|
|
|
481
438
|
guidance: 'Set PRODUCTBRAIN_API_KEY or run `pb login`.',
|
|
482
439
|
});
|
|
483
440
|
}
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
throw new CLIError(`
|
|
441
|
+
if (isInsecureSiteUrl(siteUrl)) {
|
|
442
|
+
// loadEnv() exports a file-sourced URL into CONVEX_SITE_URL, so only `pb doctor` can name the origin.
|
|
443
|
+
throw new CLIError(`Site URL must use HTTPS (got "${siteUrl.slice(0, 30)}…"). API keys must not be sent over unencrypted connections.`, {
|
|
487
444
|
code: ErrorCode.CONFIG_INVALID,
|
|
488
445
|
category: 'config',
|
|
489
|
-
guidance: '
|
|
446
|
+
guidance: 'Run `pb doctor` to see which source supplied the URL, then set an https:// URL there.',
|
|
490
447
|
});
|
|
491
448
|
}
|
|
492
449
|
return { apiKey, siteUrl };
|
|
@@ -509,25 +466,7 @@ export function getConfig() {
|
|
|
509
466
|
* credential, so nothing can proceed against the wrong workspace.
|
|
510
467
|
*/
|
|
511
468
|
export function getConfigSafe() {
|
|
512
|
-
|
|
513
|
-
try {
|
|
514
|
-
resolved = resolveConfig();
|
|
515
|
-
}
|
|
516
|
-
catch (err) {
|
|
517
|
-
return { ok: false, reason: err instanceof Error ? err.message : String(err) };
|
|
518
|
-
}
|
|
519
|
-
if (!resolved.apiKey || !resolved.apiKey.startsWith(API_KEY_PREFIX)) {
|
|
520
|
-
return { ok: false, reason: 'No API key. Run pb login or set PRODUCTBRAIN_API_KEY.' };
|
|
521
|
-
}
|
|
522
|
-
const siteUrl = resolved.siteUrl;
|
|
523
|
-
const allowHttp = isDevMode() && siteUrl.startsWith('http://localhost');
|
|
524
|
-
if (!siteUrl.startsWith('https://') && !allowHttp) {
|
|
525
|
-
return {
|
|
526
|
-
ok: false,
|
|
527
|
-
reason: `CONVEX_SITE_URL must use HTTPS (got "${siteUrl.slice(0, 30)}…"). API keys must not be sent over unencrypted connections.`,
|
|
528
|
-
};
|
|
529
|
-
}
|
|
530
|
-
return { ok: true, apiKey: resolved.apiKey, siteUrl, source: resolved.source };
|
|
469
|
+
return resolveConfigResult(resolveConfig);
|
|
531
470
|
}
|
|
532
471
|
/**
|
|
533
472
|
* Get config; if key is missing and stdin is a TTY, run guided flow (y/n → paste key → save → retry).
|
|
@@ -538,8 +477,7 @@ export async function getConfigOrGuide(retry) {
|
|
|
538
477
|
loadEnv();
|
|
539
478
|
const apiKey = process.env.PRODUCTBRAIN_API_KEY ?? '';
|
|
540
479
|
const siteUrl = (process.env.CONVEX_SITE_URL ?? DEFAULT_SITE_URL).replace(/\/$/, '');
|
|
541
|
-
|
|
542
|
-
if (apiKey.startsWith(API_KEY_PREFIX) && (siteUrl.startsWith('https://') || allowHttp)) {
|
|
480
|
+
if (apiKey.startsWith(API_KEY_PREFIX) && !isInsecureSiteUrl(siteUrl)) {
|
|
543
481
|
return { apiKey, siteUrl };
|
|
544
482
|
}
|
|
545
483
|
if (!process.stdin.isTTY) {
|
package/dist/lib/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/** Structured, non-throwing view of the CLI configuration cascade. */
|
|
2
|
+
import { CLIError, type ErrorCategory, type ErrorCodeValue } from './errors.js';
|
|
3
|
+
export type ConfigSource = 'env' | 'project' | 'profile' | 'cwd' | 'default';
|
|
4
|
+
/**
|
|
5
|
+
* Where the resolved `siteUrl` came from — tracked SEPARATELY from `ConfigSource`.
|
|
6
|
+
*
|
|
7
|
+
* The credential and the gateway are picked by two different fallback chains: almost every
|
|
8
|
+
* credential branch prefers `.productbrain/config.json`'s siteUrl over its own. So a result
|
|
9
|
+
* labelled `profile`/`cwd` can be carrying a URL that came from config.json, and naming the
|
|
10
|
+
* credential's source in a URL repair would send the operator to edit a file that does not
|
|
11
|
+
* control the failing URL.
|
|
12
|
+
*/
|
|
13
|
+
export type SiteUrlSource = 'env' | 'local-binding' | 'profile-pin' | 'project-config' | 'profile' | 'legacy' | 'cwd' | 'default';
|
|
14
|
+
export interface ResolvedConfig {
|
|
15
|
+
apiKey?: string;
|
|
16
|
+
siteUrl: string;
|
|
17
|
+
source: ConfigSource;
|
|
18
|
+
/**
|
|
19
|
+
* Which candidate supplied `siteUrl`. Optional because a caller may construct a
|
|
20
|
+
* ResolvedConfig without observing the cascade; diagnostics must then name NO source
|
|
21
|
+
* rather than guess one.
|
|
22
|
+
*/
|
|
23
|
+
siteUrlSource?: SiteUrlSource;
|
|
24
|
+
/**
|
|
25
|
+
* The concrete file a source resolved to, where the source alone is ambiguous — `cwd` covers
|
|
26
|
+
* three different candidate paths, so naming the generic one would point the operator at a
|
|
27
|
+
* file that is not the one being read.
|
|
28
|
+
*/
|
|
29
|
+
siteUrlDetail?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Which named profile supplied a `profile`-sourced credential or URL. Absent when the profile
|
|
32
|
+
* cascade landed on the nameless legacy `~/.config/productbrain/.env`, so diagnostics can name
|
|
33
|
+
* the profile that actually won instead of an "active profile" that may not be the one read.
|
|
34
|
+
*/
|
|
35
|
+
profileName?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Pick the first present siteUrl candidate and record which one won, so the URL and its
|
|
39
|
+
* reported origin are produced by one expression and cannot disagree. Candidates are given
|
|
40
|
+
* in the caller's existing precedence order; `DEFAULT_SITE_URL` closes every chain.
|
|
41
|
+
*/
|
|
42
|
+
export declare function pickSiteUrl(candidates: ReadonlyArray<readonly [SiteUrlSource, string | undefined, string?]>): {
|
|
43
|
+
siteUrl: string;
|
|
44
|
+
siteUrlSource: SiteUrlSource;
|
|
45
|
+
siteUrlDetail?: string;
|
|
46
|
+
};
|
|
47
|
+
export type ConfigFailureKind = 'missing-key' | 'invalid-key' | 'profile-pin' | 'preview-binding' | 'invalid-url' | 'unknown';
|
|
48
|
+
export type ConfigResult = {
|
|
49
|
+
ok: true;
|
|
50
|
+
apiKey: string;
|
|
51
|
+
siteUrl: string;
|
|
52
|
+
source: ConfigSource;
|
|
53
|
+
} | {
|
|
54
|
+
ok: false;
|
|
55
|
+
kind: ConfigFailureKind;
|
|
56
|
+
reason: string;
|
|
57
|
+
guidance: string;
|
|
58
|
+
nextCommand: string;
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* The transport-security bar every cascade enforces: HTTPS, or http://localhost while in dev mode.
|
|
62
|
+
* Both the structured result below and `getConfigOrGuide()`'s throwing path read it from here so
|
|
63
|
+
* the two can never diverge on what counts as a safe gateway to send an API key to.
|
|
64
|
+
*/
|
|
65
|
+
export declare function isInsecureSiteUrl(siteUrl: string): boolean;
|
|
66
|
+
/** A resolution refusal that diagnostic surfaces must preserve instead of relabelling. */
|
|
67
|
+
export declare class ConfigResolutionError extends CLIError {
|
|
68
|
+
readonly kind: ConfigFailureKind;
|
|
69
|
+
readonly nextCommand: string;
|
|
70
|
+
constructor(message: string, options: {
|
|
71
|
+
kind: ConfigFailureKind;
|
|
72
|
+
nextCommand: string;
|
|
73
|
+
code?: ErrorCodeValue;
|
|
74
|
+
category?: ErrorCategory;
|
|
75
|
+
guidance: string;
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/** Convert a throwing resolution cascade into the single diagnostic contract. */
|
|
79
|
+
export declare function resolveConfigResult(resolveConfig: () => ResolvedConfig): ConfigResult;
|
|
80
|
+
//# sourceMappingURL=configResult.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configResult.d.ts","sourceRoot":"","sources":["../../src/lib/configResult.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAGtE,OAAO,EAAE,QAAQ,EAAa,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAG3F,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,CAAC;AAE7E;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GACrB,KAAK,GACL,eAAe,GACf,aAAa,GACb,gBAAgB,GAChB,SAAS,GACT,QAAQ,GACR,KAAK,GACL,SAAS,CAAC;AAEd,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,GAC/E;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,aAAa,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAK3E;AAED,MAAM,MAAM,iBAAiB,GACzB,aAAa,GACb,aAAa,GACb,aAAa,GACb,iBAAiB,GACjB,aAAa,GACb,SAAS,CAAC;AAEd,MAAM,MAAM,YAAY,GACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GACnE;IACE,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,iBAAiB,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AA2EN;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,0FAA0F;AAC1F,qBAAa,qBAAsB,SAAQ,QAAQ;IACjD,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAG3B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,IAAI,EAAE,iBAAiB,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,CAAC,EAAE,cAAc,CAAC;QACtB,QAAQ,CAAC,EAAE,aAAa,CAAC;QACzB,QAAQ,EAAE,MAAM,CAAC;KAClB;CAOJ;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,cAAc,GAAG,YAAY,CAqErF"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/** Structured, non-throwing view of the CLI configuration cascade. */
|
|
2
|
+
import { DEFAULT_SITE_URL, isDevMode } from './constants.js';
|
|
3
|
+
import { CLIError } from './errors.js';
|
|
4
|
+
import { API_KEY_PREFIX } from './tokenConstants.js';
|
|
5
|
+
/**
|
|
6
|
+
* Pick the first present siteUrl candidate and record which one won, so the URL and its
|
|
7
|
+
* reported origin are produced by one expression and cannot disagree. Candidates are given
|
|
8
|
+
* in the caller's existing precedence order; `DEFAULT_SITE_URL` closes every chain.
|
|
9
|
+
*/
|
|
10
|
+
export function pickSiteUrl(candidates) {
|
|
11
|
+
for (const [siteUrlSource, value, siteUrlDetail] of candidates) {
|
|
12
|
+
if (value)
|
|
13
|
+
return { siteUrl: value.replace(/\/$/, ''), siteUrlSource, siteUrlDetail };
|
|
14
|
+
}
|
|
15
|
+
return { siteUrl: DEFAULT_SITE_URL.replace(/\/$/, ''), siteUrlSource: 'default' };
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* What to call a `profile` source that has no name.
|
|
19
|
+
*
|
|
20
|
+
* `resolveProfileConfig()` reaches a credential four ways — `PB_PROFILE`, the active-profile
|
|
21
|
+
* marker, a `default` fallback, and the legacy `~/.config/productbrain/.env` — and `resolveConfig()`
|
|
22
|
+
* reports the legacy home file as `profile` too. Only the first three have a name, so a fixed
|
|
23
|
+
* "the active profile" label would claim the operator's active profile supplied a credential that
|
|
24
|
+
* came from `PB_PROFILE`, from `default`, or from a file that is not a profile at all.
|
|
25
|
+
*/
|
|
26
|
+
const UNNAMED_PROFILE_ORIGIN = 'the stored profile configuration';
|
|
27
|
+
/** Name the profile that won, or fall back to the nameless label above. */
|
|
28
|
+
function describeProfileOrigin(profileName) {
|
|
29
|
+
return profileName ? `the profile "${profileName}"` : UNNAMED_PROFILE_ORIGIN;
|
|
30
|
+
}
|
|
31
|
+
/** The repo pin knows which profile it names, so say so rather than "the profile it pins". */
|
|
32
|
+
function describePinnedOrigin(profileName) {
|
|
33
|
+
return profileName
|
|
34
|
+
? `the profile "${profileName}" pinned by .productbrain/config.local.json`
|
|
35
|
+
: 'the profile pinned by .productbrain/config.local.json';
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The operator-facing name of each siteUrl origin.
|
|
39
|
+
*
|
|
40
|
+
* Only an environment API key outranks a file in the cascade, so every file-sourced URL keeps
|
|
41
|
+
* winning over `CONVEX_SITE_URL`. Telling every caller to set that variable would send the
|
|
42
|
+
* operator around the same failure again — the repair has to name the origin that actually won.
|
|
43
|
+
*/
|
|
44
|
+
const SITE_URL_ORIGIN = {
|
|
45
|
+
env: 'the CONVEX_SITE_URL environment variable',
|
|
46
|
+
'local-binding': '.productbrain/config.local.json',
|
|
47
|
+
'profile-pin': 'the profile pinned by .productbrain/config.local.json',
|
|
48
|
+
'project-config': '.productbrain/config.json',
|
|
49
|
+
profile: UNNAMED_PROFILE_ORIGIN,
|
|
50
|
+
legacy: 'the legacy config at ~/.config/productbrain/.env',
|
|
51
|
+
cwd: 'the .env file in this directory',
|
|
52
|
+
default: 'the built-in default',
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Name the origin, preferring the concrete file or profile when the source covers several.
|
|
56
|
+
* `cwd` spans three candidate paths (`.env.mcp`, `packages/mcp-server/.env.mcp`, `.env`), so the
|
|
57
|
+
* generic label would send the operator to edit a file the cascade never read.
|
|
58
|
+
*/
|
|
59
|
+
function describeSiteUrlOrigin(source, detail, profileName) {
|
|
60
|
+
if (detail)
|
|
61
|
+
return `${detail} in this directory`;
|
|
62
|
+
if (source === 'profile')
|
|
63
|
+
return describeProfileOrigin(profileName);
|
|
64
|
+
if (source === 'profile-pin')
|
|
65
|
+
return describePinnedOrigin(profileName);
|
|
66
|
+
return SITE_URL_ORIGIN[source];
|
|
67
|
+
}
|
|
68
|
+
/** The operator-facing name of each credential origin, for `invalid-key` messages. */
|
|
69
|
+
const API_KEY_ORIGIN = {
|
|
70
|
+
env: 'the PRODUCTBRAIN_API_KEY environment variable',
|
|
71
|
+
project: '.productbrain/config.local.json (or the profile it pins)',
|
|
72
|
+
profile: UNNAMED_PROFILE_ORIGIN,
|
|
73
|
+
cwd: 'the .env file in this directory',
|
|
74
|
+
default: 'the built-in default',
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Name the credential's origin, preferring the profile that actually supplied it.
|
|
78
|
+
* `project` covers both the direct local binding (no profile) and the repo pin (which names one),
|
|
79
|
+
* so the pin is only claimed when a profile name is actually present.
|
|
80
|
+
*/
|
|
81
|
+
function describeApiKeyOrigin(source, profileName) {
|
|
82
|
+
if (source === 'profile')
|
|
83
|
+
return describeProfileOrigin(profileName);
|
|
84
|
+
if (source === 'project' && profileName)
|
|
85
|
+
return describePinnedOrigin(profileName);
|
|
86
|
+
return API_KEY_ORIGIN[source];
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The transport-security bar every cascade enforces: HTTPS, or http://localhost while in dev mode.
|
|
90
|
+
* Both the structured result below and `getConfigOrGuide()`'s throwing path read it from here so
|
|
91
|
+
* the two can never diverge on what counts as a safe gateway to send an API key to.
|
|
92
|
+
*/
|
|
93
|
+
export function isInsecureSiteUrl(siteUrl) {
|
|
94
|
+
return !siteUrl.startsWith('https://') && !(isDevMode() && siteUrl.startsWith('http://localhost'));
|
|
95
|
+
}
|
|
96
|
+
/** A resolution refusal that diagnostic surfaces must preserve instead of relabelling. */
|
|
97
|
+
export class ConfigResolutionError extends CLIError {
|
|
98
|
+
kind;
|
|
99
|
+
nextCommand;
|
|
100
|
+
constructor(message, options) {
|
|
101
|
+
super(message, options);
|
|
102
|
+
this.name = 'ConfigResolutionError';
|
|
103
|
+
this.kind = options.kind;
|
|
104
|
+
this.nextCommand = options.nextCommand;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Convert a throwing resolution cascade into the single diagnostic contract. */
|
|
108
|
+
export function resolveConfigResult(resolveConfig) {
|
|
109
|
+
let resolved;
|
|
110
|
+
try {
|
|
111
|
+
resolved = resolveConfig();
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (error instanceof ConfigResolutionError) {
|
|
115
|
+
return {
|
|
116
|
+
ok: false,
|
|
117
|
+
kind: error.kind,
|
|
118
|
+
reason: error.message,
|
|
119
|
+
guidance: error.guidance ?? `Run \`${error.nextCommand}\`.`,
|
|
120
|
+
nextCommand: error.nextCommand,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
124
|
+
return {
|
|
125
|
+
ok: false,
|
|
126
|
+
kind: 'unknown',
|
|
127
|
+
reason,
|
|
128
|
+
guidance: 'Run `pb doctor` to diagnose the configuration.',
|
|
129
|
+
nextCommand: 'pb doctor',
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
if (!resolved.apiKey) {
|
|
133
|
+
return {
|
|
134
|
+
ok: false,
|
|
135
|
+
kind: 'missing-key',
|
|
136
|
+
reason: 'No API key configured.',
|
|
137
|
+
guidance: 'Run `pb login` to configure your API key, or set PRODUCTBRAIN_API_KEY.',
|
|
138
|
+
nextCommand: 'pb login',
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (!resolved.apiKey.startsWith(API_KEY_PREFIX)) {
|
|
142
|
+
// `source` IS the credential's origin by definition, so it can be named without hedging.
|
|
143
|
+
// An exported key wins step 1 of the cascade, which `pb login` cannot outrank: login
|
|
144
|
+
// persists into a profile or the legacy home file, both of which lose to the env var —
|
|
145
|
+
// so telling the operator to log in would replay the identical failure forever.
|
|
146
|
+
const fromEnv = resolved.source === 'env';
|
|
147
|
+
return {
|
|
148
|
+
ok: false,
|
|
149
|
+
kind: 'invalid-key',
|
|
150
|
+
reason: `Invalid API key format (expected ${API_KEY_PREFIX}..., from ${describeApiKeyOrigin(resolved.source, resolved.profileName)}).`,
|
|
151
|
+
guidance: fromEnv
|
|
152
|
+
? `Unset PRODUCTBRAIN_API_KEY, or replace it with a valid ${API_KEY_PREFIX} key — it outranks every stored profile, so \`pb login\` cannot repair this.`
|
|
153
|
+
: 'Run `pb login` to configure a valid API key.',
|
|
154
|
+
nextCommand: fromEnv ? 'pb doctor' : 'pb login',
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
if (isInsecureSiteUrl(resolved.siteUrl)) {
|
|
158
|
+
const got = `got "${resolved.siteUrl.slice(0, 30)}…"`;
|
|
159
|
+
// No recorded provenance means the URL's origin was never observed. Naming a specific file
|
|
160
|
+
// here would be a guess, and a wrong repair target is worse than an unnamed one.
|
|
161
|
+
const origin = resolved.siteUrlSource
|
|
162
|
+
? describeSiteUrlOrigin(resolved.siteUrlSource, resolved.siteUrlDetail, resolved.profileName)
|
|
163
|
+
: null;
|
|
164
|
+
return {
|
|
165
|
+
ok: false,
|
|
166
|
+
kind: 'invalid-url',
|
|
167
|
+
reason: `Site URL must use HTTPS (${got}${origin ? `, from ${origin}` : ''}). API keys must not be sent over unencrypted connections.`,
|
|
168
|
+
guidance: origin
|
|
169
|
+
? `Set an https:// URL in ${origin}.`
|
|
170
|
+
: 'Run `pb doctor` to see which source supplied the URL, then set an https:// URL there.',
|
|
171
|
+
nextCommand: 'pb doctor',
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
return { ok: true, ...resolved, apiKey: resolved.apiKey };
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=configResult.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configResult.js","sourceRoot":"","sources":["../../src/lib/configResult.ts"],"names":[],"mappings":"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"}
|