@nebulr-group/bridge-cli 0.1.4 → 0.4.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 +26 -4
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/app.command.d.ts.map +1 -1
- package/dist/commands/app.command.js +2 -0
- package/dist/commands/app.command.js.map +1 -1
- package/dist/commands/flag-init.command.d.ts +13 -0
- package/dist/commands/flag-init.command.d.ts.map +1 -0
- package/dist/commands/flag-init.command.js +353 -0
- package/dist/commands/flag-init.command.js.map +1 -0
- package/dist/commands/flag.command.d.ts +92 -0
- package/dist/commands/flag.command.d.ts.map +1 -1
- package/dist/commands/flag.command.js +784 -25
- package/dist/commands/flag.command.js.map +1 -1
- package/dist/commands/guide.command.d.ts +21 -0
- package/dist/commands/guide.command.d.ts.map +1 -1
- package/dist/commands/guide.command.js +297 -21
- package/dist/commands/guide.command.js.map +1 -1
- package/dist/commands/integrate.command.js +3 -3
- package/dist/commands/integrate.command.js.map +1 -1
- package/dist/commands/ops.command.d.ts +17 -0
- package/dist/commands/ops.command.d.ts.map +1 -0
- package/dist/commands/ops.command.js +129 -0
- package/dist/commands/ops.command.js.map +1 -0
- package/dist/commands/plan.command.d.ts +31 -0
- package/dist/commands/plan.command.d.ts.map +1 -1
- package/dist/commands/plan.command.js +182 -1
- package/dist/commands/plan.command.js.map +1 -1
- package/dist/commands/stripe.command.d.ts +3 -0
- package/dist/commands/stripe.command.d.ts.map +1 -0
- package/dist/commands/stripe.command.js +43 -0
- package/dist/commands/stripe.command.js.map +1 -0
- package/dist/output.d.ts +8 -0
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +10 -0
- package/dist/output.js.map +1 -1
- package/dist/prompts/architecture.md +560 -0
- package/dist/prompts/auth-master-integration-prompt.md +251 -0
- package/dist/prompts/billing/master.md +269 -0
- package/dist/prompts/flags/master.md +215 -0
- package/dist/prompts/integration-success.md +107 -0
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -154,6 +154,15 @@ bridge branding update --bg-color "#ffffff" --text-color "#000000"
|
|
|
154
154
|
bridge plan list
|
|
155
155
|
bridge plan create --key pro --name "Pro Plan"
|
|
156
156
|
bridge plan update --key pro --name "Pro Plan v2"
|
|
157
|
+
|
|
158
|
+
# Prices — a plan can have several (one per currency + interval). Idempotent.
|
|
159
|
+
bridge plan price set pro --amount 29 --currency usd --interval month
|
|
160
|
+
bridge plan price set pro --amount 290 --currency usd --interval year
|
|
161
|
+
bridge plan price rm pro --interval year
|
|
162
|
+
|
|
163
|
+
# Usage quotas (hard | metered caps)
|
|
164
|
+
bridge plan quota set pro --metric ai_completions --limit 1000 --policy hard
|
|
165
|
+
bridge plan quota rm pro --metric ai_completions
|
|
157
166
|
```
|
|
158
167
|
|
|
159
168
|
### API Tokens
|
|
@@ -191,14 +200,27 @@ bridge info roles
|
|
|
191
200
|
|
|
192
201
|
### Integration Guides
|
|
193
202
|
|
|
203
|
+
Three master prompts orchestrate the per-framework guides:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
bridge guide # Bridge Auth master prompt (auth, RBAC, tenants)
|
|
207
|
+
bridge guide flags # Feature Flags 2.0 master prompt
|
|
208
|
+
bridge guide billing # Billing 2.0 master prompt (subscriptions, quotas, webhooks)
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Per-framework guides:
|
|
212
|
+
|
|
194
213
|
```bash
|
|
195
214
|
bridge guide list
|
|
196
|
-
bridge guide react
|
|
197
|
-
bridge guide
|
|
198
|
-
bridge guide
|
|
199
|
-
bridge guide
|
|
215
|
+
bridge guide <framework> # auth guide (svelte | react | nextjs | angular | nestjs | express)
|
|
216
|
+
bridge guide <framework> sdk-auth # in-app auth UI (frontend frameworks only)
|
|
217
|
+
bridge guide flags --framework <name> # flags-specific guide
|
|
218
|
+
bridge guide billing --framework <name> # billing-specific guide
|
|
219
|
+
bridge guide custom # REST API fallback for any language
|
|
200
220
|
```
|
|
201
221
|
|
|
222
|
+
`bridge guide flags` and `bridge guide billing` auto-detect the framework from `package.json` when `--framework` is omitted — they fall back to the generic master prompt if no framework signal is found.
|
|
223
|
+
|
|
202
224
|
## Output Format
|
|
203
225
|
|
|
204
226
|
**Success:**
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBpC,eAAO,MAAM,OAAO,SAAgB,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -15,6 +15,8 @@ import { registerEventCommands } from './commands/event.command.js';
|
|
|
15
15
|
import { registerSetupCommands } from './commands/setup.command.js';
|
|
16
16
|
import { registerInfoCommands } from './commands/info.command.js';
|
|
17
17
|
import { registerGuideCommands } from './commands/guide.command.js';
|
|
18
|
+
import { registerOpsCommands } from './commands/ops.command.js';
|
|
19
|
+
import { registerStripeCommands } from './commands/stripe.command.js';
|
|
18
20
|
// Read version from package.json so `bridge --version` never drifts from the
|
|
19
21
|
// published package. dist/cli.js lives at <pkg>/dist/cli.js, so `../package.json`
|
|
20
22
|
// resolves to the package root in both the published tarball and during dev.
|
|
@@ -38,4 +40,6 @@ registerEventCommands(program);
|
|
|
38
40
|
registerSetupCommands(program);
|
|
39
41
|
registerInfoCommands(program);
|
|
40
42
|
registerGuideCommands(program);
|
|
43
|
+
registerOpsCommands(program);
|
|
44
|
+
registerStripeCommands(program);
|
|
41
45
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAEtE,6EAA6E;AAC7E,kFAAkF;AAClF,6EAA6E;AAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;AACpF,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAwB,CAAC;AAErF,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAErC,OAAO;KACJ,IAAI,CAAC,QAAQ,CAAC;KACd,WAAW,CAAC,sDAAsD,CAAC;KACnE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,sBAAsB,CAAC,OAAO,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.command.d.ts","sourceRoot":"","sources":["../../src/commands/app.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"app.command.d.ts","sourceRoot":"","sources":["../../src/commands/app.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2C1D"}
|
|
@@ -22,6 +22,7 @@ export function registerAppCommands(program) {
|
|
|
22
22
|
.option('--mfa-enabled <bool>', 'Enable MFA', parseBool)
|
|
23
23
|
.option('--passkeys-enabled <bool>', 'Enable passkeys', parseBool)
|
|
24
24
|
.option('--magic-link-enabled <bool>', 'Enable magic links', parseBool)
|
|
25
|
+
.option('--payments-auto-redirect <bool>', 'Force new users to pick a plan before entering the app (billing paywall)', parseBool)
|
|
25
26
|
.option('--redirect-uris <uris>', 'Comma-separated list of allowed OAuth callback URIs', parseList)
|
|
26
27
|
.option('--allowed-origins <origins>', 'Comma-separated list of allowed CORS origins', parseList)
|
|
27
28
|
.option('--default-callback-uri <uri>', 'Default OAuth callback URI')
|
|
@@ -36,6 +37,7 @@ export function registerAppCommands(program) {
|
|
|
36
37
|
mfaEnabled: opts.mfaEnabled,
|
|
37
38
|
passkeysEnabled: opts.passkeysEnabled,
|
|
38
39
|
magicLinkEnabled: opts.magicLinkEnabled,
|
|
40
|
+
paymentsAutoRedirect: opts.paymentsAutoRedirect,
|
|
39
41
|
redirectUris: opts.redirectUris,
|
|
40
42
|
allowedOrigins: opts.allowedOrigins,
|
|
41
43
|
defaultCallbackUri: opts.defaultCallbackUri,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.command.js","sourceRoot":"","sources":["../../src/commands/app.command.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app.command.js","sourceRoot":"","sources":["../../src/commands/app.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAE3E,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;SACf,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YAAC,aAAa,CAAC,MAAM,mBAAmB,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QAAC,CAAC;QAC7D,OAAO,GAAG,EAAE,CAAC;YAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEL,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;SAClB,WAAW,CAAC,qBAAqB,CAAC;SAClC,MAAM,CAAC,eAAe,EAAE,UAAU,CAAC;SACnC,MAAM,CAAC,iBAAiB,EAAE,SAAS,CAAC;SACpC,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC;SAClC,MAAM,CAAC,qBAAqB,EAAE,aAAa,CAAC;SAC5C,MAAM,CAAC,6BAA6B,EAAE,0BAA0B,EAAE,SAAS,CAAC;SAC5E,MAAM,CAAC,sBAAsB,EAAE,YAAY,EAAE,SAAS,CAAC;SACvD,MAAM,CAAC,2BAA2B,EAAE,iBAAiB,EAAE,SAAS,CAAC;SACjE,MAAM,CAAC,6BAA6B,EAAE,oBAAoB,EAAE,SAAS,CAAC;SACtE,MAAM,CAAC,iCAAiC,EAAE,0EAA0E,EAAE,SAAS,CAAC;SAChI,MAAM,CAAC,wBAAwB,EAAE,qDAAqD,EAAE,SAAS,CAAC;SAClG,MAAM,CAAC,6BAA6B,EAAE,8CAA8C,EAAE,SAAS,CAAC;SAChG,MAAM,CAAC,8BAA8B,EAAE,4BAA4B,CAAC;SACpE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,cAAc,CAAC;gBAC1B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;gBAC/C,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;aAC5C,CAAC,CAAC;YACH,aAAa,CAAC,MAAM,mBAAmB,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG,KAAK,MAAM,CAAC;AACxB,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,cAAc,CAAC,GAA4B;IAClD,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;AACpF,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
export type FlagsFramework = 'svelte' | 'react' | 'nextjs' | 'angular' | 'nestjs' | 'express' | 'unknown';
|
|
3
|
+
export declare function registerFlagInitCommand(flagParent: Command): void;
|
|
4
|
+
export declare function detectFramework(cwd: string): Promise<FlagsFramework>;
|
|
5
|
+
interface SnippetCtx {
|
|
6
|
+
appId: string;
|
|
7
|
+
baseUrl: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function renderSnippet(framework: FlagsFramework, ctx: SnippetCtx): string;
|
|
10
|
+
/** Probe whether a path exists (used by tests). */
|
|
11
|
+
export declare function pathExists(path: string): Promise<boolean>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=flag-init.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flag-init.command.d.ts","sourceRoot":"","sources":["../../src/commands/flag-init.command.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,SAAS,GACT,SAAS,CAAC;AAEd,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,CA+DjE;AAID,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAwB1E;AAID,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,EAAE,UAAU,GAAG,MAAM,CAsOhF;AA2BD,mDAAmD;AACnD,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO/D"}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
// TBP-198 — Flags-only integration scaffold.
|
|
2
|
+
//
|
|
3
|
+
// `bridge flag init` (alias for the eventual `bridge init --flags-only`).
|
|
4
|
+
// Detects the project framework from package.json and prints:
|
|
5
|
+
// - The appropriate `bridge.flag(...)` setup snippet for the framework
|
|
6
|
+
// - A `bridge-flags.config.json` next to package.json with appId + baseUrl
|
|
7
|
+
// + suggested provider config
|
|
8
|
+
//
|
|
9
|
+
// The command is deliberately NON-destructive: it never overwrites source
|
|
10
|
+
// files. The "scaffold" is text output (snippet + config file) for the agent
|
|
11
|
+
// or the developer to apply.
|
|
12
|
+
import { readFile, writeFile, access } from 'node:fs/promises';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { getManagementClient, DEFAULT_BASE_URL } from '../config.js';
|
|
15
|
+
import { outputSuccess, outputError } from '../output.js';
|
|
16
|
+
import { readCredentials } from '../credentials.js';
|
|
17
|
+
export function registerFlagInitCommand(flagParent) {
|
|
18
|
+
flagParent
|
|
19
|
+
.command('init')
|
|
20
|
+
.description('Scaffold a flags-only Bridge integration (no auth setup) — detects framework, prints setup snippet, writes bridge-flags.config.json')
|
|
21
|
+
.option('--framework <name>', 'Override framework detection: svelte | react | nextjs | angular | nestjs | express')
|
|
22
|
+
.option('--cwd <path>', 'Project directory (defaults to current)', process.cwd())
|
|
23
|
+
.option('--no-config', 'Skip writing bridge-flags.config.json')
|
|
24
|
+
.option('--base-url <url>', 'Override the base URL written to config')
|
|
25
|
+
.action(async (opts) => {
|
|
26
|
+
try {
|
|
27
|
+
const cwd = opts.cwd;
|
|
28
|
+
const framework = opts.framework ?? (await detectFramework(cwd));
|
|
29
|
+
const client = getManagementClient();
|
|
30
|
+
const app = (await client.app.get());
|
|
31
|
+
const appId = app.id ?? '';
|
|
32
|
+
const appName = app.name ?? '';
|
|
33
|
+
const baseUrl = opts.baseUrl ??
|
|
34
|
+
// Pull the credentials file's baseUrl when available; falls back to
|
|
35
|
+
// the public default. (BRIDGE_BASE_URL is honored by getManagementClient
|
|
36
|
+
// already; we don't re-read it here to avoid divergence.)
|
|
37
|
+
readCredentials()?.baseUrl ??
|
|
38
|
+
DEFAULT_BASE_URL;
|
|
39
|
+
const snippet = renderSnippet(framework, { appId, baseUrl });
|
|
40
|
+
let configPath;
|
|
41
|
+
if (opts.config !== false) {
|
|
42
|
+
configPath = join(cwd, 'bridge-flags.config.json');
|
|
43
|
+
await writeFile(configPath, JSON.stringify({
|
|
44
|
+
appId,
|
|
45
|
+
appName,
|
|
46
|
+
baseUrl,
|
|
47
|
+
framework,
|
|
48
|
+
provider: suggestedProviderConfig(framework),
|
|
49
|
+
}, null, 2) + '\n', 'utf8');
|
|
50
|
+
}
|
|
51
|
+
outputSuccess({
|
|
52
|
+
framework,
|
|
53
|
+
app: { id: appId, name: appName },
|
|
54
|
+
baseUrl,
|
|
55
|
+
configFile: configPath,
|
|
56
|
+
nextSteps: nextStepsFor(framework),
|
|
57
|
+
snippet,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
outputError(err);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
// ── Framework detection ─────────────────────────────────────────────────────
|
|
66
|
+
export async function detectFramework(cwd) {
|
|
67
|
+
const pkgPath = join(cwd, 'package.json');
|
|
68
|
+
let pkgRaw;
|
|
69
|
+
try {
|
|
70
|
+
pkgRaw = await readFile(pkgPath, 'utf8');
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return 'unknown';
|
|
74
|
+
}
|
|
75
|
+
let pkg;
|
|
76
|
+
try {
|
|
77
|
+
pkg = JSON.parse(pkgRaw);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return 'unknown';
|
|
81
|
+
}
|
|
82
|
+
const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };
|
|
83
|
+
// Order matters: Next.js + React is detected as Next.js.
|
|
84
|
+
if ('next' in deps)
|
|
85
|
+
return 'nextjs';
|
|
86
|
+
if ('@sveltejs/kit' in deps || 'svelte' in deps)
|
|
87
|
+
return 'svelte';
|
|
88
|
+
if ('@nestjs/core' in deps)
|
|
89
|
+
return 'nestjs';
|
|
90
|
+
if ('@angular/core' in deps)
|
|
91
|
+
return 'angular';
|
|
92
|
+
if ('react' in deps)
|
|
93
|
+
return 'react';
|
|
94
|
+
if ('express' in deps)
|
|
95
|
+
return 'express';
|
|
96
|
+
return 'unknown';
|
|
97
|
+
}
|
|
98
|
+
export function renderSnippet(framework, ctx) {
|
|
99
|
+
const pkgFor = {
|
|
100
|
+
svelte: '@nebulr-group/bridge-svelte/flags',
|
|
101
|
+
react: '@nebulr-group/bridge-react/flags',
|
|
102
|
+
nextjs: '@nebulr-group/bridge-nextjs/flags',
|
|
103
|
+
angular: '@nebulr-group/bridge-angular/flags',
|
|
104
|
+
nestjs: '@nebulr-group/bridge-nestjs/flags',
|
|
105
|
+
express: '@nebulr-group/bridge-express/flags',
|
|
106
|
+
};
|
|
107
|
+
if (framework === 'unknown') {
|
|
108
|
+
return [
|
|
109
|
+
`# Bridge Flags — generic setup`,
|
|
110
|
+
``,
|
|
111
|
+
`Couldn't auto-detect your framework. Use the core SDK directly:`,
|
|
112
|
+
``,
|
|
113
|
+
'```ts',
|
|
114
|
+
`import { BridgeFlags } from '@nebulr-group/bridge-auth-core';`,
|
|
115
|
+
``,
|
|
116
|
+
`export const bridge = new BridgeFlags();`,
|
|
117
|
+
`bridge.setContext({ identity: 'user-id', attributes: { /* ... */ } });`,
|
|
118
|
+
``,
|
|
119
|
+
`// Read a flag — type is inferred from defaultValue.`,
|
|
120
|
+
`const newDashboard = bridge.flag('new-dashboard', false);`,
|
|
121
|
+
'```',
|
|
122
|
+
``,
|
|
123
|
+
`Then point the SDK at appId=${ctx.appId} via ${ctx.baseUrl}/cloud-views/flags.`,
|
|
124
|
+
].join('\n');
|
|
125
|
+
}
|
|
126
|
+
const pkg = pkgFor[framework];
|
|
127
|
+
// Per-framework idiomatic snippet.
|
|
128
|
+
switch (framework) {
|
|
129
|
+
case 'svelte':
|
|
130
|
+
return [
|
|
131
|
+
'# Bridge Flags — SvelteKit (flags-only)',
|
|
132
|
+
'',
|
|
133
|
+
`1. Install:`,
|
|
134
|
+
' ```bash',
|
|
135
|
+
' bun add @nebulr-group/bridge-svelte',
|
|
136
|
+
' ```',
|
|
137
|
+
'',
|
|
138
|
+
'2. In `src/routes/+layout.ts`:',
|
|
139
|
+
' ```ts',
|
|
140
|
+
` import { BridgeFlags } from '${pkg}';`,
|
|
141
|
+
'',
|
|
142
|
+
' export const bridge = new BridgeFlags();',
|
|
143
|
+
` bridge.configure({ appId: '${ctx.appId}', baseUrl: '${ctx.baseUrl}' });`,
|
|
144
|
+
' ```',
|
|
145
|
+
'',
|
|
146
|
+
'3. Use anywhere:',
|
|
147
|
+
' ```ts',
|
|
148
|
+
' const enabled = bridge.flag("new-dashboard", false);',
|
|
149
|
+
' ```',
|
|
150
|
+
].join('\n');
|
|
151
|
+
case 'react':
|
|
152
|
+
return [
|
|
153
|
+
'# Bridge Flags — React (flags-only)',
|
|
154
|
+
'',
|
|
155
|
+
`1. Install:`,
|
|
156
|
+
' ```bash',
|
|
157
|
+
' bun add @nebulr-group/bridge-react',
|
|
158
|
+
' ```',
|
|
159
|
+
'',
|
|
160
|
+
'2. In `src/main.tsx`:',
|
|
161
|
+
' ```tsx',
|
|
162
|
+
` import { BridgeFlagsProvider } from '${pkg}';`,
|
|
163
|
+
'',
|
|
164
|
+
' <BridgeFlagsProvider',
|
|
165
|
+
` appId="${ctx.appId}"`,
|
|
166
|
+
` baseUrl="${ctx.baseUrl}"`,
|
|
167
|
+
' >',
|
|
168
|
+
' <App />',
|
|
169
|
+
' </BridgeFlagsProvider>',
|
|
170
|
+
' ```',
|
|
171
|
+
'',
|
|
172
|
+
'3. Use the hook in any component:',
|
|
173
|
+
' ```tsx',
|
|
174
|
+
` import { useFlag } from '${pkg}';`,
|
|
175
|
+
'',
|
|
176
|
+
' function NewDashboard() {',
|
|
177
|
+
' const enabled = useFlag("new-dashboard", false);',
|
|
178
|
+
' return enabled ? <V2 /> : <V1 />;',
|
|
179
|
+
' }',
|
|
180
|
+
' ```',
|
|
181
|
+
].join('\n');
|
|
182
|
+
case 'nextjs':
|
|
183
|
+
return [
|
|
184
|
+
'# Bridge Flags — Next.js (flags-only)',
|
|
185
|
+
'',
|
|
186
|
+
`1. Install:`,
|
|
187
|
+
' ```bash',
|
|
188
|
+
' bun add @nebulr-group/bridge-nextjs',
|
|
189
|
+
' ```',
|
|
190
|
+
'',
|
|
191
|
+
'2. Client side — `app/providers.tsx`:',
|
|
192
|
+
' ```tsx',
|
|
193
|
+
` "use client";`,
|
|
194
|
+
` import { BridgeFlagsProvider } from '${pkg}';`,
|
|
195
|
+
'',
|
|
196
|
+
' export function Providers({ children }: { children: React.ReactNode }) {',
|
|
197
|
+
' return (',
|
|
198
|
+
' <BridgeFlagsProvider',
|
|
199
|
+
` appId="${ctx.appId}"`,
|
|
200
|
+
` baseUrl="${ctx.baseUrl}"`,
|
|
201
|
+
' >',
|
|
202
|
+
' {children}',
|
|
203
|
+
' </BridgeFlagsProvider>',
|
|
204
|
+
' );',
|
|
205
|
+
' }',
|
|
206
|
+
' ```',
|
|
207
|
+
'',
|
|
208
|
+
'3. Server side — anywhere in a Server Component / Route Handler:',
|
|
209
|
+
' ```ts',
|
|
210
|
+
` import { getServerBridgeFlags } from '${pkg}/server';`,
|
|
211
|
+
' const bridge = await getServerBridgeFlags({',
|
|
212
|
+
` appId: '${ctx.appId}',`,
|
|
213
|
+
` baseUrl: '${ctx.baseUrl}',`,
|
|
214
|
+
' });',
|
|
215
|
+
' const enabled = bridge.flag("new-dashboard", false);',
|
|
216
|
+
' ```',
|
|
217
|
+
].join('\n');
|
|
218
|
+
case 'angular':
|
|
219
|
+
return [
|
|
220
|
+
'# Bridge Flags — Angular (flags-only)',
|
|
221
|
+
'',
|
|
222
|
+
`1. Install:`,
|
|
223
|
+
' ```bash',
|
|
224
|
+
' bun add @nebulr-group/bridge-angular',
|
|
225
|
+
' ```',
|
|
226
|
+
'',
|
|
227
|
+
'2. In `app.config.ts`:',
|
|
228
|
+
' ```ts',
|
|
229
|
+
` import { provideBridgeFlags } from '${pkg}';`,
|
|
230
|
+
'',
|
|
231
|
+
' export const appConfig: ApplicationConfig = {',
|
|
232
|
+
' providers: [',
|
|
233
|
+
' provideBridgeFlags({',
|
|
234
|
+
` appId: '${ctx.appId}',`,
|
|
235
|
+
` baseUrl: '${ctx.baseUrl}',`,
|
|
236
|
+
' }),',
|
|
237
|
+
' ],',
|
|
238
|
+
' };',
|
|
239
|
+
' ```',
|
|
240
|
+
'',
|
|
241
|
+
'3. Inject the service:',
|
|
242
|
+
' ```ts',
|
|
243
|
+
` import { BridgeFlagsService } from '${pkg}';`,
|
|
244
|
+
'',
|
|
245
|
+
' constructor(private flags: BridgeFlagsService) {}',
|
|
246
|
+
'',
|
|
247
|
+
' newDashboard = this.flags.flag("new-dashboard", false);',
|
|
248
|
+
' ```',
|
|
249
|
+
].join('\n');
|
|
250
|
+
case 'nestjs':
|
|
251
|
+
return [
|
|
252
|
+
'# Bridge Flags — NestJS (flags-only, backend mode)',
|
|
253
|
+
'',
|
|
254
|
+
`1. Install:`,
|
|
255
|
+
' ```bash',
|
|
256
|
+
' bun add @nebulr-group/bridge-nestjs',
|
|
257
|
+
' ```',
|
|
258
|
+
'',
|
|
259
|
+
'2. Import the module in `app.module.ts`:',
|
|
260
|
+
' ```ts',
|
|
261
|
+
` import { BridgeFlagsModule } from '${pkg}';`,
|
|
262
|
+
'',
|
|
263
|
+
' @Module({',
|
|
264
|
+
' imports: [',
|
|
265
|
+
' BridgeFlagsModule.forRoot({',
|
|
266
|
+
` appId: '${ctx.appId}',`,
|
|
267
|
+
` baseUrl: '${ctx.baseUrl}',`,
|
|
268
|
+
' mode: "backend",',
|
|
269
|
+
' }),',
|
|
270
|
+
' ],',
|
|
271
|
+
' })',
|
|
272
|
+
' export class AppModule {}',
|
|
273
|
+
' ```',
|
|
274
|
+
'',
|
|
275
|
+
'3. Inject in any service / controller:',
|
|
276
|
+
' ```ts',
|
|
277
|
+
` import { BridgeFlagsService } from '${pkg}';`,
|
|
278
|
+
'',
|
|
279
|
+
' constructor(private flags: BridgeFlagsService) {}',
|
|
280
|
+
'',
|
|
281
|
+
' async handleRequest(req) {',
|
|
282
|
+
' const enabled = this.flags.flag("new-checkout", false, {',
|
|
283
|
+
' identity: req.user?.id,',
|
|
284
|
+
' attributes: { plan: req.user?.plan },',
|
|
285
|
+
' });',
|
|
286
|
+
' }',
|
|
287
|
+
' ```',
|
|
288
|
+
].join('\n');
|
|
289
|
+
case 'express':
|
|
290
|
+
return [
|
|
291
|
+
'# Bridge Flags — Express (flags-only, backend mode)',
|
|
292
|
+
'',
|
|
293
|
+
`1. Install:`,
|
|
294
|
+
' ```bash',
|
|
295
|
+
' bun add @nebulr-group/bridge-express',
|
|
296
|
+
' ```',
|
|
297
|
+
'',
|
|
298
|
+
'2. At app bootstrap:',
|
|
299
|
+
' ```ts',
|
|
300
|
+
` import { createBridgeFlags } from '${pkg}';`,
|
|
301
|
+
'',
|
|
302
|
+
' const bridge = createBridgeFlags({',
|
|
303
|
+
` appId: '${ctx.appId}',`,
|
|
304
|
+
` baseUrl: '${ctx.baseUrl}',`,
|
|
305
|
+
' mode: "backend",',
|
|
306
|
+
' });',
|
|
307
|
+
'',
|
|
308
|
+
' app.use(bridge.middleware());',
|
|
309
|
+
' ```',
|
|
310
|
+
'',
|
|
311
|
+
'3. In a handler:',
|
|
312
|
+
' ```ts',
|
|
313
|
+
' app.get("/", (req, res) => {',
|
|
314
|
+
' const enabled = req.bridge.flag("new-home", false);',
|
|
315
|
+
' res.send(enabled ? "v2" : "v1");',
|
|
316
|
+
' });',
|
|
317
|
+
' ```',
|
|
318
|
+
].join('\n');
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
// ── Provider config + next-steps blurbs ─────────────────────────────────────
|
|
322
|
+
function suggestedProviderConfig(framework) {
|
|
323
|
+
if (framework === 'nestjs' || framework === 'express') {
|
|
324
|
+
return { mode: 'backend', telemetry: { enabled: true, flushIntervalMs: 5000 } };
|
|
325
|
+
}
|
|
326
|
+
return { mode: 'frontend', telemetry: { enabled: true, flushIntervalMs: 5000 } };
|
|
327
|
+
}
|
|
328
|
+
function nextStepsFor(framework) {
|
|
329
|
+
const base = [
|
|
330
|
+
'Apply the printed snippet to the file noted above.',
|
|
331
|
+
'Run `bridge guide flags' + (framework !== 'unknown' ? ` --framework ${framework}` : '') + '` for the full integration prompt.',
|
|
332
|
+
'Create your first flag: `bridge flag create --key hello-flag --state on --value-type boolean --on-value true --off-value false`',
|
|
333
|
+
'Eval it locally: `bridge flag eval hello-flag --identity demo-user`',
|
|
334
|
+
];
|
|
335
|
+
if (framework === 'unknown') {
|
|
336
|
+
return [
|
|
337
|
+
'Could not auto-detect your framework — pass --framework <name> to scope the snippet.',
|
|
338
|
+
...base,
|
|
339
|
+
];
|
|
340
|
+
}
|
|
341
|
+
return base;
|
|
342
|
+
}
|
|
343
|
+
/** Probe whether a path exists (used by tests). */
|
|
344
|
+
export async function pathExists(path) {
|
|
345
|
+
try {
|
|
346
|
+
await access(path);
|
|
347
|
+
return true;
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=flag-init.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flag-init.command.js","sourceRoot":"","sources":["../../src/commands/flag-init.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,95 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
import type { FlagState, FlagValueType } from '@nebulr-group/bridge-auth-core';
|
|
3
|
+
interface Condition {
|
|
4
|
+
attribute: string;
|
|
5
|
+
operator: string;
|
|
6
|
+
value?: unknown;
|
|
7
|
+
}
|
|
8
|
+
interface Branch {
|
|
9
|
+
conditions: Condition[];
|
|
10
|
+
returnValue: unknown;
|
|
11
|
+
}
|
|
12
|
+
interface Rule {
|
|
13
|
+
branches: Branch[];
|
|
14
|
+
otherwiseValue: unknown;
|
|
15
|
+
rolloutPct: number;
|
|
16
|
+
groupRef?: string;
|
|
17
|
+
}
|
|
2
18
|
export declare function registerFlagCommands(program: Command): void;
|
|
19
|
+
interface FlagDoc {
|
|
20
|
+
key: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
state: FlagState;
|
|
23
|
+
valueType: FlagValueType;
|
|
24
|
+
offValue?: unknown;
|
|
25
|
+
onValue?: unknown;
|
|
26
|
+
rule?: Rule | null;
|
|
27
|
+
schedule?: unknown;
|
|
28
|
+
}
|
|
29
|
+
/** Build the canonical, portable doc from a remote flag record. Pure. */
|
|
30
|
+
export declare function toFlagDoc(f: Record<string, unknown>): FlagDoc;
|
|
31
|
+
/** Build a create/update write payload from a doc. Pure. */
|
|
32
|
+
export declare function buildWritePayloadFromDoc(doc: FlagDoc): Record<string, unknown>;
|
|
33
|
+
/** Validate + normalize a doc parsed from a file. Throws on the first problem. */
|
|
34
|
+
export declare function validateFlagDoc(input: unknown, index: number): FlagDoc;
|
|
35
|
+
interface FlagDiff {
|
|
36
|
+
create: FlagDoc[];
|
|
37
|
+
update: {
|
|
38
|
+
id: string;
|
|
39
|
+
doc: FlagDoc;
|
|
40
|
+
changes: string[];
|
|
41
|
+
}[];
|
|
42
|
+
prune: {
|
|
43
|
+
id: string;
|
|
44
|
+
key: string;
|
|
45
|
+
}[];
|
|
46
|
+
unchanged: string[];
|
|
47
|
+
}
|
|
48
|
+
/** Diff file docs against remote flags (matched by key). Pure. */
|
|
49
|
+
export declare function diffFlags(remote: Record<string, unknown>[], docs: FlagDoc[], opts?: {
|
|
50
|
+
prune?: boolean;
|
|
51
|
+
}): FlagDiff;
|
|
52
|
+
interface FlagWriteOpts {
|
|
53
|
+
key?: string;
|
|
54
|
+
description?: string;
|
|
55
|
+
state?: string;
|
|
56
|
+
valueType?: string;
|
|
57
|
+
onValue?: string;
|
|
58
|
+
offValue?: string;
|
|
59
|
+
rule?: string;
|
|
60
|
+
enabled?: boolean;
|
|
61
|
+
defaultValue?: boolean;
|
|
62
|
+
}
|
|
63
|
+
export declare function buildFlagWritePayload(opts: FlagWriteOpts, { partial }?: {
|
|
64
|
+
partial?: boolean;
|
|
65
|
+
}): Record<string, unknown>;
|
|
66
|
+
export declare function coerceValue(raw: string, type: FlagValueType): unknown;
|
|
67
|
+
export declare function parseRuleArg(raw: string): Rule;
|
|
68
|
+
export declare function parseAttributes(pairs: string[]): Record<string, unknown>;
|
|
69
|
+
interface RuleValidationError {
|
|
70
|
+
branchIndex: number;
|
|
71
|
+
conditionIndex: number;
|
|
72
|
+
message: string;
|
|
73
|
+
}
|
|
74
|
+
export declare function validateRule(rule: unknown): RuleValidationError[];
|
|
75
|
+
interface EvalContext {
|
|
76
|
+
identity?: string;
|
|
77
|
+
attributes: Record<string, unknown>;
|
|
78
|
+
}
|
|
79
|
+
interface EvalResult {
|
|
80
|
+
value: unknown;
|
|
81
|
+
variantIndex: number;
|
|
82
|
+
matched: boolean;
|
|
83
|
+
excludedByRollout: boolean;
|
|
84
|
+
}
|
|
85
|
+
interface CachedFlag {
|
|
86
|
+
key: string;
|
|
87
|
+
state: FlagState;
|
|
88
|
+
valueType: FlagValueType;
|
|
89
|
+
offValue: unknown;
|
|
90
|
+
onValue: unknown;
|
|
91
|
+
rule?: Rule;
|
|
92
|
+
}
|
|
93
|
+
export declare function evaluateLocally(cached: CachedFlag, ctx: EvalContext): EvalResult;
|
|
94
|
+
export {};
|
|
3
95
|
//# sourceMappingURL=flag.command.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flag.command.d.ts","sourceRoot":"","sources":["../../src/commands/flag.command.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"flag.command.d.ts","sourceRoot":"","sources":["../../src/commands/flag.command.ts"],"names":[],"mappings":"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"}
|