@nebulr-group/bridge-cli 0.5.1 → 0.6.0-beta.0
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 +4 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +2 -32
- package/dist/cli.js.map +1 -1
- package/dist/commands/app.command.d.ts.map +1 -1
- package/dist/commands/app.command.js +63 -1
- package/dist/commands/app.command.js.map +1 -1
- package/dist/commands/flag-init.command.d.ts.map +1 -1
- package/dist/commands/flag-init.command.js +14 -10
- package/dist/commands/flag-init.command.js.map +1 -1
- package/dist/commands/guide.command.d.ts +13 -0
- package/dist/commands/guide.command.d.ts.map +1 -1
- package/dist/commands/guide.command.js +35 -27
- package/dist/commands/guide.command.js.map +1 -1
- package/dist/commands/integration.command.d.ts +27 -0
- package/dist/commands/integration.command.d.ts.map +1 -0
- package/dist/commands/integration.command.js +201 -0
- package/dist/commands/integration.command.js.map +1 -0
- package/dist/commands/plan.command.d.ts +63 -0
- package/dist/commands/plan.command.d.ts.map +1 -1
- package/dist/commands/plan.command.js +120 -16
- package/dist/commands/plan.command.js.map +1 -1
- package/dist/config.d.ts +22 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +46 -1
- package/dist/config.js.map +1 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +8 -1
- package/dist/output.js.map +1 -1
- package/dist/program.d.ts +10 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +45 -0
- package/dist/program.js.map +1 -0
- package/dist/prompts/auth-master-integration-prompt.md +5 -3
- package/dist/prompts/billing/master.md +8 -6
- package/dist/prompts/guide-coverage.json +12 -0
- package/dist/prompts/integration-success.md +1 -1
- package/package.json +1 -1
- package/dist/commands/integrate.command.d.ts +0 -3
- package/dist/commands/integrate.command.d.ts.map +0 -1
- package/dist/commands/integrate.command.js +0 -49
- package/dist/commands/integrate.command.js.map +0 -1
- package/dist/prompts/architecture.md +0 -560
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { basename, resolve } from 'node:path';
|
|
3
|
+
import { getManagementHttp } from '../config.js';
|
|
4
|
+
import { outputError, outputSuccess } from '../output.js';
|
|
5
|
+
import { detectFramework } from './flag-init.command.js';
|
|
6
|
+
/*
|
|
7
|
+
* TBP-541 — "prove login works, and say why it failed", from a shell.
|
|
8
|
+
*
|
|
9
|
+
* bridge diagnose compare the project's .env files with the app
|
|
10
|
+
* bridge setup status readiness checklist, with next steps
|
|
11
|
+
* bridge test-user create a marked test user with a generated password
|
|
12
|
+
* bridge test-user verify a real sign-in, verified against the JWKS
|
|
13
|
+
* bridge event auth-attempts a user's recent attempts and why each failed
|
|
14
|
+
*
|
|
15
|
+
* Thin callers of bridge-api `/v1/account/integration/*` — the same routes the
|
|
16
|
+
* MCP tools (diagnose_integration, get_setup_status, create_test_user,
|
|
17
|
+
* verify_login, debug_auth_issue) call, so the two answer identically. The
|
|
18
|
+
* server writes each remediation as `fix`; the CLI's contract calls it `hint`
|
|
19
|
+
* (see output.ts), so results are renamed on the way out.
|
|
20
|
+
*/
|
|
21
|
+
const BASE = '/v1/account/integration';
|
|
22
|
+
/** The .env files read by default, lowest precedence first (later files win). */
|
|
23
|
+
export const DEFAULT_ENV_FILES = ['.env', '.env.local', '.env.development', '.env.development.local'];
|
|
24
|
+
const FRAMEWORKS = ['svelte', 'react', 'nextjs', 'angular', 'nestjs', 'express'];
|
|
25
|
+
/** A variable whose value is a secret: only its presence is ever sent. */
|
|
26
|
+
export function isSecretName(name) {
|
|
27
|
+
return /API_KEY|SECRET|TOKEN|PASSWORD/i.test(name);
|
|
28
|
+
}
|
|
29
|
+
/** The placeholder sent instead of a secret's value. */
|
|
30
|
+
export const SECRET_PLACEHOLDER = '<set>';
|
|
31
|
+
/** Parse dotenv text: KEY=VALUE lines, optional `export`, quotes, comments. */
|
|
32
|
+
export function parseDotenv(text) {
|
|
33
|
+
const out = {};
|
|
34
|
+
for (const raw of text.split(/\r?\n/)) {
|
|
35
|
+
const line = raw.trim();
|
|
36
|
+
if (!line || line.startsWith('#'))
|
|
37
|
+
continue;
|
|
38
|
+
const m = /^(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/.exec(line);
|
|
39
|
+
if (!m)
|
|
40
|
+
continue;
|
|
41
|
+
let value = m[2].trim();
|
|
42
|
+
const quoted = /^(['"])(.*)\1$/.exec(value);
|
|
43
|
+
if (quoted)
|
|
44
|
+
value = quoted[2];
|
|
45
|
+
else
|
|
46
|
+
value = value.replace(/\s+#.*$/, '');
|
|
47
|
+
out[m[1]] = value;
|
|
48
|
+
}
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* What `bridge diagnose` sends: Bridge-related variables only, and for a
|
|
53
|
+
* secret nothing but the fact that it is set. The value of BRIDGE_API_KEY
|
|
54
|
+
* (or any *_KEY / *_SECRET) never leaves the machine.
|
|
55
|
+
*/
|
|
56
|
+
export function bridgeEnvToSend(env) {
|
|
57
|
+
const out = {};
|
|
58
|
+
for (const [name, value] of Object.entries(env)) {
|
|
59
|
+
if (!/BRIDGE/i.test(name))
|
|
60
|
+
continue;
|
|
61
|
+
if (isSecretName(name)) {
|
|
62
|
+
if (value.trim() !== '')
|
|
63
|
+
out[name] = SECRET_PLACEHOLDER;
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
out[name] = value;
|
|
67
|
+
}
|
|
68
|
+
return out;
|
|
69
|
+
}
|
|
70
|
+
/** Rename every `fix` key to `hint`, the CLI's word for it. */
|
|
71
|
+
export function fixToHint(value) {
|
|
72
|
+
if (Array.isArray(value))
|
|
73
|
+
return value.map(fixToHint);
|
|
74
|
+
if (value && typeof value === 'object') {
|
|
75
|
+
return Object.fromEntries(Object.entries(value).map(([k, v]) => [k === 'fix' ? 'hint' : k, fixToHint(v)]));
|
|
76
|
+
}
|
|
77
|
+
return value;
|
|
78
|
+
}
|
|
79
|
+
async function readEnvFiles(cwd, files) {
|
|
80
|
+
const explicit = !!files && files.length > 0;
|
|
81
|
+
const candidates = explicit ? files : DEFAULT_ENV_FILES;
|
|
82
|
+
const env = {};
|
|
83
|
+
const read = [];
|
|
84
|
+
for (const file of candidates) {
|
|
85
|
+
const path = resolve(cwd, file);
|
|
86
|
+
let text;
|
|
87
|
+
try {
|
|
88
|
+
text = await readFile(path, 'utf8');
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
if (explicit) {
|
|
92
|
+
throw Object.assign(new Error(`Cannot read env file ${file}.`), { code: 'ENV_FILE_NOT_FOUND' });
|
|
93
|
+
}
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
Object.assign(env, parseDotenv(text));
|
|
97
|
+
read.push(explicit ? file : basename(path));
|
|
98
|
+
}
|
|
99
|
+
return { env, read };
|
|
100
|
+
}
|
|
101
|
+
export async function diagnose(opts) {
|
|
102
|
+
const cwd = opts.dir ? resolve(opts.dir) : process.cwd();
|
|
103
|
+
if (opts.framework && !FRAMEWORKS.includes(opts.framework)) {
|
|
104
|
+
throw Object.assign(new Error(`Unknown framework "${opts.framework}". Use one of: ${FRAMEWORKS.join(', ')}.`), {
|
|
105
|
+
code: 'INVALID_ARGUMENT',
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
const { env, read } = await readEnvFiles(cwd, opts.envFile);
|
|
109
|
+
const detected = opts.framework ?? (await detectFramework(cwd));
|
|
110
|
+
const framework = detected && detected !== 'unknown' ? detected : undefined;
|
|
111
|
+
const sent = bridgeEnvToSend(env);
|
|
112
|
+
const result = await getManagementHttp().post(`${BASE}/diagnose`, {
|
|
113
|
+
env: sent,
|
|
114
|
+
...(framework ? { framework } : {}),
|
|
115
|
+
});
|
|
116
|
+
return {
|
|
117
|
+
...fixToHint(result),
|
|
118
|
+
envFilesRead: read,
|
|
119
|
+
// Names only: what was compared, never the values of secrets.
|
|
120
|
+
secretsSentAsPresenceOnly: Object.keys(sent).filter(isSecretName),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
export function registerIntegrationCommands(program) {
|
|
124
|
+
program.command('diagnose')
|
|
125
|
+
.description("Check this project's Bridge env vars against the app and list every difference with a fix")
|
|
126
|
+
.option('--env-file <path...>', `Env file(s) to read, later ones winning (default: ${DEFAULT_ENV_FILES.join(', ')} if present)`)
|
|
127
|
+
.option('--framework <name>', `Framework: ${FRAMEWORKS.join(', ')} (default: detected from package.json)`)
|
|
128
|
+
.option('--dir <path>', 'Project directory (default: current directory)')
|
|
129
|
+
.action(async (opts) => {
|
|
130
|
+
try {
|
|
131
|
+
const result = await diagnose(opts);
|
|
132
|
+
outputSuccess(result);
|
|
133
|
+
if (result.ok === false)
|
|
134
|
+
process.exitCode = 1;
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
outputError(err);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
const setup = program.commands.find((c) => c.name() === 'setup') ?? program.command('setup');
|
|
141
|
+
setup.command('status')
|
|
142
|
+
.description('Readiness checklist: what is configured, what is missing, the next step for each, and what production needs')
|
|
143
|
+
.action(async () => {
|
|
144
|
+
try {
|
|
145
|
+
outputSuccess(fixToHint(await getManagementHttp().get(`${BASE}/status`)));
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
outputError(err);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
const testUser = program.command('test-user').description('Create a test user and prove sign-in works');
|
|
152
|
+
testUser.command('create')
|
|
153
|
+
.description('Create a marked test user ("[test] …" workspace, no plan, no emails) with a generated password')
|
|
154
|
+
.option('--confirm <app name>', "Required on production or with live Stripe keys: the app's exact name")
|
|
155
|
+
.action(async (opts) => {
|
|
156
|
+
try {
|
|
157
|
+
const body = opts.confirm !== undefined ? { confirm: opts.confirm } : {};
|
|
158
|
+
outputSuccess(fixToHint(await getManagementHttp().post(`${BASE}/test-user`, body)));
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
outputError(err);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
testUser.command('verify')
|
|
165
|
+
.description('Sign in for real and verify the token against the JWKS; prints evidence, never tokens')
|
|
166
|
+
.requiredOption('--email <email>', 'Email of the user to sign in as')
|
|
167
|
+
.requiredOption('--password <password>', 'Their password (used once, never stored or printed)')
|
|
168
|
+
.option('--origin <origin>', "Origin to sign in from; must be one of the app's allowed origins")
|
|
169
|
+
.action(async (opts) => {
|
|
170
|
+
try {
|
|
171
|
+
const body = { email: opts.email, password: opts.password, ...(opts.origin ? { origin: opts.origin } : {}) };
|
|
172
|
+
const result = await getManagementHttp().post(`${BASE}/verify-login`, body);
|
|
173
|
+
outputSuccess(fixToHint(result));
|
|
174
|
+
if (result?.verified === false)
|
|
175
|
+
process.exitCode = 1;
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
outputError(err);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
const event = program.commands.find((c) => c.name() === 'event') ?? program.command('event');
|
|
182
|
+
event.command('auth-attempts')
|
|
183
|
+
.description("A user's recent sign-in attempts, each failure with its reason and a hint")
|
|
184
|
+
.requiredOption('--user <email|id>', "The user's email address (or user id)")
|
|
185
|
+
.option('--since <duration>', 'How far back: 24h, 7d, 2w or an ISO date')
|
|
186
|
+
.option('--limit <n>', 'Most attempts to return (default 20, max 100)', (v) => parseInt(v, 10))
|
|
187
|
+
.action(async (opts) => {
|
|
188
|
+
try {
|
|
189
|
+
const query = new URLSearchParams({ user: opts.user });
|
|
190
|
+
if (opts.since)
|
|
191
|
+
query.set('since', opts.since);
|
|
192
|
+
if (opts.limit)
|
|
193
|
+
query.set('limit', String(opts.limit));
|
|
194
|
+
outputSuccess(fixToHint(await getManagementHttp().get(`${BASE}/auth-attempts?${query.toString()}`)));
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
outputError(err);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=integration.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.command.js","sourceRoot":"","sources":["../../src/commands/integration.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,17 +5,53 @@ export interface QuotaPricing {
|
|
|
5
5
|
amount: number;
|
|
6
6
|
currency: string;
|
|
7
7
|
}
|
|
8
|
+
/**
|
|
9
|
+
* TBP-699 — how a quota's metric is counted. `counter`: reported events summed
|
|
10
|
+
* per billing period, reset each period. `gauge`: an absolute value the app
|
|
11
|
+
* sets, never reset. If deleting it frees room, it's a gauge and your app
|
|
12
|
+
* counts it; if it happened, it's a counter and Bridge counts it.
|
|
13
|
+
*/
|
|
14
|
+
export type QuotaKind = 'counter' | 'gauge';
|
|
8
15
|
export interface Quota {
|
|
9
16
|
metric: string;
|
|
10
17
|
limit: number;
|
|
11
18
|
policy: QuotaPolicy;
|
|
19
|
+
/** TBP-699 — absent on quotas created before kinds existed: a counter. */
|
|
20
|
+
kind?: QuotaKind;
|
|
12
21
|
/** Required for `metered`, forbidden for `hard`. */
|
|
13
22
|
pricing?: QuotaPricing;
|
|
14
23
|
}
|
|
24
|
+
/** TBP-699 — the built-in seats gauge: Bridge counts it from workspace membership. */
|
|
25
|
+
export declare const SEATS_METRIC = "users";
|
|
26
|
+
/** The kind a quota resolves to — same rule as the server. */
|
|
27
|
+
export declare function quotaKindOf(quota: {
|
|
28
|
+
metric: string;
|
|
29
|
+
kind?: string;
|
|
30
|
+
}): QuotaKind;
|
|
31
|
+
export interface MetricSummary {
|
|
32
|
+
metric: string;
|
|
33
|
+
/** `mixed` when the plans disagree on the metric's kind. */
|
|
34
|
+
kind: QuotaKind | 'mixed';
|
|
35
|
+
plans: Array<{
|
|
36
|
+
planKey: string;
|
|
37
|
+
kind: QuotaKind;
|
|
38
|
+
limit: number;
|
|
39
|
+
policy: QuotaPolicy;
|
|
40
|
+
}>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* TBP-699 — every metric configured on any plan, once each, with its kind and
|
|
44
|
+
* the plans that limit it. Pure; mirrors the MCP `list_plan_quotas` tool.
|
|
45
|
+
*/
|
|
46
|
+
export declare function listMetrics(plans: Array<{
|
|
47
|
+
key?: unknown;
|
|
48
|
+
quotas?: Quota[];
|
|
49
|
+
}>): MetricSummary[];
|
|
15
50
|
export declare function validateQuotaEntry(entry: {
|
|
16
51
|
metric?: string;
|
|
17
52
|
limit?: number;
|
|
18
53
|
policy?: string;
|
|
54
|
+
kind?: string;
|
|
19
55
|
priceAmount?: number;
|
|
20
56
|
currency?: string;
|
|
21
57
|
}): Quota;
|
|
@@ -37,6 +73,33 @@ export declare function buildPriceEntry(opts: {
|
|
|
37
73
|
currency?: string;
|
|
38
74
|
interval?: string;
|
|
39
75
|
}): PlanPriceInput;
|
|
76
|
+
/**
|
|
77
|
+
* TBP-617 — build the price list for `plan create`.
|
|
78
|
+
*
|
|
79
|
+
* The server rejects an explicitly empty `prices` array (a plan with no prices
|
|
80
|
+
* can never be assigned to a workspace), so `plan create` must never send one.
|
|
81
|
+
* Mirrors the MCP `create_plan` tool, which takes one flat price up front as
|
|
82
|
+
* `amount` / `interval` / `currency`; further prices go through `plan price set`.
|
|
83
|
+
*
|
|
84
|
+
* Fails client-side when no price flags were passed, so the user gets the flags
|
|
85
|
+
* that fix it instead of a `BAD_USER_INPUT` from the API.
|
|
86
|
+
*/
|
|
87
|
+
export declare function buildCreatePlanPrices(opts: {
|
|
88
|
+
amount?: number;
|
|
89
|
+
currency?: string;
|
|
90
|
+
interval?: string;
|
|
91
|
+
}): PlanPriceInput[];
|
|
92
|
+
/**
|
|
93
|
+
* TBP-617 — remove one price by currency + interval.
|
|
94
|
+
*
|
|
95
|
+
* Throws when the price is absent, and when it is the plan's LAST price: the
|
|
96
|
+
* server rejects an empty price list with a 400 the user cannot act on, so say
|
|
97
|
+
* why here. Mirrors the MCP `remove_plan_price` `LAST_PRICE` guard. Pure.
|
|
98
|
+
*/
|
|
99
|
+
export declare function removePrice(prices: PlanPriceInput[], entry: {
|
|
100
|
+
currency: string;
|
|
101
|
+
interval: RecurrenceInterval;
|
|
102
|
+
}, planKey: string): PlanPriceInput[];
|
|
40
103
|
/** Upsert a price by (currency + interval): replace if present, append otherwise. Pure. */
|
|
41
104
|
export declare function upsertPrice(prices: PlanPriceInput[], entry: PlanPriceInput): PlanPriceInput[];
|
|
42
105
|
export declare function registerPlanCommands(program: Command): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.command.d.ts","sourceRoot":"","sources":["../../src/commands/plan.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUpC,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AAE7C,oDAAoD;AACpD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,oDAAoD;IACpD,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;
|
|
1
|
+
{"version":3,"file":"plan.command.d.ts","sourceRoot":"","sources":["../../src/commands/plan.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,33 @@
|
|
|
1
1
|
import { getManagementClient } from '../config.js';
|
|
2
2
|
import { outputSuccess, outputError } from '../output.js';
|
|
3
3
|
const QUOTA_POLICIES = ['hard', 'metered'];
|
|
4
|
+
const QUOTA_KINDS = ['counter', 'gauge'];
|
|
5
|
+
/** TBP-699 — the built-in seats gauge: Bridge counts it from workspace membership. */
|
|
6
|
+
export const SEATS_METRIC = 'users';
|
|
7
|
+
/** The kind a quota resolves to — same rule as the server. */
|
|
8
|
+
export function quotaKindOf(quota) {
|
|
9
|
+
if (quota.metric === SEATS_METRIC)
|
|
10
|
+
return 'gauge';
|
|
11
|
+
return quota.kind === 'gauge' ? 'gauge' : 'counter';
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* TBP-699 — every metric configured on any plan, once each, with its kind and
|
|
15
|
+
* the plans that limit it. Pure; mirrors the MCP `list_plan_quotas` tool.
|
|
16
|
+
*/
|
|
17
|
+
export function listMetrics(plans) {
|
|
18
|
+
const byMetric = new Map();
|
|
19
|
+
for (const plan of plans) {
|
|
20
|
+
for (const q of plan.quotas ?? []) {
|
|
21
|
+
const kind = quotaKindOf(q);
|
|
22
|
+
const entry = byMetric.get(q.metric) ?? { metric: q.metric, kind, plans: [] };
|
|
23
|
+
if (entry.kind !== kind)
|
|
24
|
+
entry.kind = 'mixed';
|
|
25
|
+
entry.plans.push({ planKey: String(plan.key), kind, limit: q.limit, policy: q.policy });
|
|
26
|
+
byMetric.set(q.metric, entry);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return [...byMetric.values()].sort((a, b) => a.metric.localeCompare(b.metric));
|
|
30
|
+
}
|
|
4
31
|
export function validateQuotaEntry(entry) {
|
|
5
32
|
const metric = (entry.metric ?? '').trim();
|
|
6
33
|
if (!metric)
|
|
@@ -16,6 +43,25 @@ export function validateQuotaEntry(entry) {
|
|
|
16
43
|
if (!QUOTA_POLICIES.includes(policy)) {
|
|
17
44
|
throw new Error(`--policy must be one of ${QUOTA_POLICIES.join(', ')}, got "${entry.policy}".`);
|
|
18
45
|
}
|
|
46
|
+
// TBP-699 — counter vs gauge. Only sent when given (or implied by `users`),
|
|
47
|
+
// so an omitted kind leaves the server's default/stored kind in charge.
|
|
48
|
+
let kind;
|
|
49
|
+
if (entry.kind !== undefined) {
|
|
50
|
+
if (!QUOTA_KINDS.includes(entry.kind)) {
|
|
51
|
+
throw new Error(`--kind must be one of ${QUOTA_KINDS.join(', ')}, got "${entry.kind}".`);
|
|
52
|
+
}
|
|
53
|
+
kind = entry.kind;
|
|
54
|
+
}
|
|
55
|
+
if (metric === SEATS_METRIC) {
|
|
56
|
+
if (kind === 'counter') {
|
|
57
|
+
throw new Error(`"${SEATS_METRIC}" is the built-in seats gauge (Bridge counts the workspace's enabled members); it cannot be a counter.`);
|
|
58
|
+
}
|
|
59
|
+
kind = 'gauge';
|
|
60
|
+
}
|
|
61
|
+
if (policy === 'metered' && kind === 'gauge') {
|
|
62
|
+
throw new Error(`"${metric}" is a gauge and a gauge cannot be metered: metered billing charges for usage that happened during a period, which only a counter records. Use --policy hard, or --kind counter.`);
|
|
63
|
+
}
|
|
64
|
+
const withKind = kind ? { kind } : {};
|
|
19
65
|
// TBP-275 — metered quotas carry a per-unit price; hard quotas must not.
|
|
20
66
|
if (policy === 'metered') {
|
|
21
67
|
const amount = entry.priceAmount;
|
|
@@ -26,12 +72,12 @@ export function validateQuotaEntry(entry) {
|
|
|
26
72
|
if (!currency) {
|
|
27
73
|
throw new Error('A currency is required for metered pricing. The plan has no single price currency to derive from — pass --price-currency.');
|
|
28
74
|
}
|
|
29
|
-
return { metric, limit, policy, pricing: { amount, currency } };
|
|
75
|
+
return { metric, limit, policy, ...withKind, pricing: { amount, currency } };
|
|
30
76
|
}
|
|
31
77
|
if (entry.priceAmount !== undefined) {
|
|
32
78
|
throw new Error('--price-amount is only valid with --policy metered.');
|
|
33
79
|
}
|
|
34
|
-
return { metric, limit, policy };
|
|
80
|
+
return { metric, limit, policy, ...withKind };
|
|
35
81
|
}
|
|
36
82
|
/** Upsert a quota by metric (replace if present, append otherwise). Pure. */
|
|
37
83
|
export function upsertQuota(quotas, entry) {
|
|
@@ -62,6 +108,45 @@ export function buildPriceEntry(opts) {
|
|
|
62
108
|
throw new Error('--currency must be non-empty.');
|
|
63
109
|
return { amount, currency, recurrenceInterval: interval };
|
|
64
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* TBP-617 — build the price list for `plan create`.
|
|
113
|
+
*
|
|
114
|
+
* The server rejects an explicitly empty `prices` array (a plan with no prices
|
|
115
|
+
* can never be assigned to a workspace), so `plan create` must never send one.
|
|
116
|
+
* Mirrors the MCP `create_plan` tool, which takes one flat price up front as
|
|
117
|
+
* `amount` / `interval` / `currency`; further prices go through `plan price set`.
|
|
118
|
+
*
|
|
119
|
+
* Fails client-side when no price flags were passed, so the user gets the flags
|
|
120
|
+
* that fix it instead of a `BAD_USER_INPUT` from the API.
|
|
121
|
+
*/
|
|
122
|
+
export function buildCreatePlanPrices(opts) {
|
|
123
|
+
if (opts.amount === undefined && opts.interval === undefined) {
|
|
124
|
+
throw new Error('A plan needs at least one price. Pass --amount and --interval ' +
|
|
125
|
+
`(one of ${VALID_INTERVALS.join(', ')}), e.g. --amount 29 --interval month. ` +
|
|
126
|
+
'Use --amount 0 for a free or contact-sales tier; --currency defaults to USD.');
|
|
127
|
+
}
|
|
128
|
+
return [buildPriceEntry(opts)];
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* TBP-617 — remove one price by currency + interval.
|
|
132
|
+
*
|
|
133
|
+
* Throws when the price is absent, and when it is the plan's LAST price: the
|
|
134
|
+
* server rejects an empty price list with a 400 the user cannot act on, so say
|
|
135
|
+
* why here. Mirrors the MCP `remove_plan_price` `LAST_PRICE` guard. Pure.
|
|
136
|
+
*/
|
|
137
|
+
export function removePrice(prices, entry, planKey) {
|
|
138
|
+
const currency = entry.currency.trim().toUpperCase();
|
|
139
|
+
const next = prices.filter((p) => !(p.currency === currency && p.recurrenceInterval === entry.interval));
|
|
140
|
+
if (next.length === prices.length) {
|
|
141
|
+
throw new Error(`No ${currency} ${entry.interval} price on plan "${planKey}".`);
|
|
142
|
+
}
|
|
143
|
+
if (next.length === 0) {
|
|
144
|
+
throw new Error(`Cannot remove the only price on plan "${planKey}": a plan needs at least one price. ` +
|
|
145
|
+
`Add the replacement first with \`bridge plan price set ${planKey} --amount <n> --interval <interval>\`, ` +
|
|
146
|
+
'or set this price to --amount 0 for a free tier.');
|
|
147
|
+
}
|
|
148
|
+
return next;
|
|
149
|
+
}
|
|
65
150
|
/** Upsert a price by (currency + interval): replace if present, append otherwise. Pure. */
|
|
66
151
|
export function upsertPrice(prices, entry) {
|
|
67
152
|
return [
|
|
@@ -105,23 +190,31 @@ export function registerPlanCommands(program) {
|
|
|
105
190
|
}
|
|
106
191
|
});
|
|
107
192
|
plan.command('create')
|
|
108
|
-
.description('Create a new plan
|
|
193
|
+
.description('Create a new plan with its first price (add more with `plan price set`)')
|
|
109
194
|
.requiredOption('--key <key>', 'Plan key')
|
|
110
195
|
.requiredOption('--name <name>', 'Plan name')
|
|
196
|
+
.option('--amount <amount>', 'First price amount (>= 0). Use 0 for a free or contact-sales tier', parseFloat)
|
|
197
|
+
.option('--interval <interval>', `Billing interval for the first price: ${VALID_INTERVALS.join(' | ')}`)
|
|
198
|
+
.option('--currency <currency>', 'Currency for the first price (default USD)')
|
|
111
199
|
.option('--description <desc>', 'Description')
|
|
112
200
|
.option('--trial', 'Include trial period', false)
|
|
113
201
|
.option('--trial-days <days>', 'Trial period in days', parseInt)
|
|
114
202
|
.action(async (opts) => {
|
|
115
203
|
try {
|
|
204
|
+
// TBP-617 — the server rejects an explicitly empty price list, so build
|
|
205
|
+
// (and validate) the first price here rather than sending `prices: []`.
|
|
206
|
+
const prices = buildCreatePlanPrices({
|
|
207
|
+
amount: opts.amount,
|
|
208
|
+
interval: opts.interval,
|
|
209
|
+
currency: opts.currency,
|
|
210
|
+
});
|
|
116
211
|
outputSuccess(await getManagementClient().plans.create({
|
|
117
212
|
key: opts.key,
|
|
118
213
|
name: opts.name,
|
|
119
214
|
description: opts.description,
|
|
120
215
|
trial: opts.trial,
|
|
121
216
|
trialDays: opts.trialDays,
|
|
122
|
-
|
|
123
|
-
// placeholder price; add prices explicitly via `plan price set`.
|
|
124
|
-
prices: [],
|
|
217
|
+
prices,
|
|
125
218
|
}));
|
|
126
219
|
}
|
|
127
220
|
catch (err) {
|
|
@@ -179,13 +272,13 @@ function registerPriceCommands(plan) {
|
|
|
179
272
|
.option('--currency <currency>', 'Currency (default USD)', 'USD')
|
|
180
273
|
.action(async (key, opts) => {
|
|
181
274
|
try {
|
|
182
|
-
const currency = String(opts.currency ?? 'USD').trim().toUpperCase();
|
|
183
|
-
const interval = opts.interval;
|
|
184
275
|
const { prices } = await getPlan(key);
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
276
|
+
// TBP-617 — removing the last price empties the list, which the server
|
|
277
|
+
// rejects with a 400; removePrice says why before we get there.
|
|
278
|
+
const next = removePrice(prices, {
|
|
279
|
+
currency: String(opts.currency ?? 'USD'),
|
|
280
|
+
interval: opts.interval,
|
|
281
|
+
}, key);
|
|
189
282
|
outputSuccess(await getManagementClient().plans.update(key, { prices: next }));
|
|
190
283
|
}
|
|
191
284
|
catch (err) {
|
|
@@ -197,14 +290,19 @@ function registerPriceCommands(plan) {
|
|
|
197
290
|
function registerQuotaCommands(plan) {
|
|
198
291
|
const quota = plan
|
|
199
292
|
.command('quota')
|
|
200
|
-
.description('Manage a plan\'s usage quotas (hard | metered caps)');
|
|
293
|
+
.description('Manage a plan\'s usage quotas (hard | metered caps, counter | gauge kinds)');
|
|
201
294
|
quota.command('list')
|
|
202
|
-
.description('List the usage quotas on a plan')
|
|
203
|
-
.argument('
|
|
295
|
+
.description('List the usage quotas on a plan, or with no key every metric across all plans with its kind')
|
|
296
|
+
.argument('[key]', 'Plan key (omit to list every metric name and kind across all plans)')
|
|
204
297
|
.action(async (key) => {
|
|
205
298
|
try {
|
|
299
|
+
if (key === undefined) {
|
|
300
|
+
const plans = (await getManagementClient().plans.list());
|
|
301
|
+
outputSuccess(listMetrics(plans));
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
206
304
|
const { quotas } = await getPlan(key);
|
|
207
|
-
outputSuccess(quotas);
|
|
305
|
+
outputSuccess(quotas.map((q) => ({ ...q, kind: quotaKindOf(q) })));
|
|
208
306
|
}
|
|
209
307
|
catch (err) {
|
|
210
308
|
outputError(err);
|
|
@@ -216,6 +314,9 @@ function registerQuotaCommands(plan) {
|
|
|
216
314
|
.requiredOption('--metric <metric>', 'Metric key (e.g. num.clicks)')
|
|
217
315
|
.requiredOption('--limit <n>', 'Limit (integer >= 0). 0 = pure per-unit metered (billed from unit 1)', parseInt)
|
|
218
316
|
.requiredOption('--policy <policy>', `Cap policy: ${QUOTA_POLICIES.join(' | ')}`)
|
|
317
|
+
.option('--kind <kind>', `${QUOTA_KINDS.join(' | ')}. counter (default) = summed per billing period; gauge = absolute value your app sets, never reset. ` +
|
|
318
|
+
"If deleting it frees room, it's a gauge and your app counts it; if it happened, it's a counter and Bridge counts it. " +
|
|
319
|
+
'Omit to keep an existing quota\'s kind')
|
|
219
320
|
.option('--price-amount <n>', 'Per-unit price for metered quotas (required with --policy metered)', parseFloat)
|
|
220
321
|
.option('--price-currency <currency>', 'Currency for the metered price (defaults to the plan\'s price currency when unambiguous)')
|
|
221
322
|
.action(async (key, opts) => {
|
|
@@ -228,10 +329,13 @@ function registerQuotaCommands(plan) {
|
|
|
228
329
|
];
|
|
229
330
|
const currency = opts.priceCurrency?.toUpperCase() ??
|
|
230
331
|
(planCurrencies.length === 1 ? planCurrencies[0] : undefined);
|
|
332
|
+
// TBP-699 — an omitted --kind keeps the existing quota's kind.
|
|
333
|
+
const existingKind = quotas.find((q) => q.metric === String(opts.metric ?? '').trim())?.kind;
|
|
231
334
|
const entry = validateQuotaEntry({
|
|
232
335
|
metric: opts.metric,
|
|
233
336
|
limit: opts.limit,
|
|
234
337
|
policy: opts.policy,
|
|
338
|
+
kind: opts.kind ?? existingKind,
|
|
235
339
|
priceAmount: opts.priceAmount,
|
|
236
340
|
currency,
|
|
237
341
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.command.js","sourceRoot":"","sources":["../../src/commands/plan.command.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plan.command.js","sourceRoot":"","sources":["../../src/commands/plan.command.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BridgeManagement } from '@nebulr-group/bridge-auth-core';
|
|
1
|
+
import { BridgeManagement, ManagementHttpClient } from '@nebulr-group/bridge-auth-core';
|
|
2
2
|
export declare const DEFAULT_BASE_URL = "https://api.thebridge.dev";
|
|
3
3
|
/** Called once from the CLI entrypoint, before any action runs. */
|
|
4
4
|
export declare function setProfileOverride(profile: string | null | undefined): void;
|
|
@@ -26,6 +26,27 @@ export declare function setProfileOverride(profile: string | null | undefined):
|
|
|
26
26
|
* to answer. See `writeContextBanner`.
|
|
27
27
|
*/
|
|
28
28
|
export declare function getManagementClient(): BridgeManagement;
|
|
29
|
+
/**
|
|
30
|
+
* The Bridge API base URL the management client talks to, resolved exactly as
|
|
31
|
+
* `getManagementClient()` resolves it: `--profile`, then the active credential,
|
|
32
|
+
* then `BRIDGE_API_KEY`, with `BRIDGE_BASE_URL` overriding each.
|
|
33
|
+
*
|
|
34
|
+
* Anything the CLI writes into a project (`bridge flag init`) takes its base
|
|
35
|
+
* URL from here, so a project is wired to the environment the command just
|
|
36
|
+
* read the app from. Re-reading the credentials file instead ignored
|
|
37
|
+
* `--profile` and `BRIDGE_BASE_URL`, and wrote production into a project
|
|
38
|
+
* scaffolded against stage (TBP-708).
|
|
39
|
+
*/
|
|
40
|
+
export declare function getResolvedBaseUrl(): string;
|
|
41
|
+
/**
|
|
42
|
+
* A raw authenticated HTTP client, resolved exactly as `getManagementClient()`
|
|
43
|
+
* resolves (same `--profile`, credential, key and base URL, same banner).
|
|
44
|
+
*
|
|
45
|
+
* For routes auth-core has no typed service for yet — the integration checks
|
|
46
|
+
* (TBP-541) — so the CLI can call them without waiting on an auth-core
|
|
47
|
+
* release. The MCP tools use the same client type over the same routes.
|
|
48
|
+
*/
|
|
49
|
+
export declare function getManagementHttp(): ManagementHttpClient;
|
|
29
50
|
/**
|
|
30
51
|
* For tests and for `bridge auth logout` / `bridge auth status` — they need
|
|
31
52
|
* to reset the cached client between operations.
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AASxF,eAAO,MAAM,gBAAgB,8BAA8B,CAAC;AAgB5D,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAE3E;AAQD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CA4EtD;AAoDD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAG3C;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,oBAAoB,CAYxD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAK5C;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAQnE;AAED,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B"}
|