@nebulr-group/bridge-cli 0.1.4 → 0.4.0-beta.1

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.
Files changed (47) hide show
  1. package/README.md +26 -4
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +4 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/app.command.d.ts.map +1 -1
  6. package/dist/commands/app.command.js +2 -0
  7. package/dist/commands/app.command.js.map +1 -1
  8. package/dist/commands/flag-init.command.d.ts +13 -0
  9. package/dist/commands/flag-init.command.d.ts.map +1 -0
  10. package/dist/commands/flag-init.command.js +353 -0
  11. package/dist/commands/flag-init.command.js.map +1 -0
  12. package/dist/commands/flag.command.d.ts +92 -0
  13. package/dist/commands/flag.command.d.ts.map +1 -1
  14. package/dist/commands/flag.command.js +784 -25
  15. package/dist/commands/flag.command.js.map +1 -1
  16. package/dist/commands/guide.command.d.ts +21 -0
  17. package/dist/commands/guide.command.d.ts.map +1 -1
  18. package/dist/commands/guide.command.js +290 -23
  19. package/dist/commands/guide.command.js.map +1 -1
  20. package/dist/commands/integrate.command.js +3 -3
  21. package/dist/commands/integrate.command.js.map +1 -1
  22. package/dist/commands/ops.command.d.ts +17 -0
  23. package/dist/commands/ops.command.d.ts.map +1 -0
  24. package/dist/commands/ops.command.js +129 -0
  25. package/dist/commands/ops.command.js.map +1 -0
  26. package/dist/commands/plan.command.d.ts +31 -0
  27. package/dist/commands/plan.command.d.ts.map +1 -1
  28. package/dist/commands/plan.command.js +182 -1
  29. package/dist/commands/plan.command.js.map +1 -1
  30. package/dist/commands/runtime-dir.d.ts +16 -0
  31. package/dist/commands/runtime-dir.d.ts.map +1 -0
  32. package/dist/commands/runtime-dir.js +18 -0
  33. package/dist/commands/runtime-dir.js.map +1 -0
  34. package/dist/commands/stripe.command.d.ts +3 -0
  35. package/dist/commands/stripe.command.d.ts.map +1 -0
  36. package/dist/commands/stripe.command.js +43 -0
  37. package/dist/commands/stripe.command.js.map +1 -0
  38. package/dist/output.d.ts +8 -0
  39. package/dist/output.d.ts.map +1 -1
  40. package/dist/output.js +10 -0
  41. package/dist/output.js.map +1 -1
  42. package/dist/prompts/architecture.md +560 -0
  43. package/dist/prompts/auth-master-integration-prompt.md +251 -0
  44. package/dist/prompts/billing/master.md +269 -0
  45. package/dist/prompts/flags/master.md +215 -0
  46. package/dist/prompts/integration-success.md +107 -0
  47. 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 nextjs
198
- bridge guide express
199
- bridge guide custom
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;AAqBpC,eAAO,MAAM,OAAO,SAAgB,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;AAEpE,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"}
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,CAyC1D"}
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":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4D3D"}
1
+ {"version":3,"file":"flag.command.d.ts","sourceRoot":"","sources":["../../src/commands/flag.command.ts"],"names":[],"mappings":"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"}