@nebulr-group/bridge-cli 0.6.6 → 1.0.0-alpha.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.
Files changed (293) hide show
  1. package/README.md +93 -460
  2. package/dist/api/accounts.d.ts +69 -0
  3. package/dist/api/accounts.d.ts.map +1 -0
  4. package/dist/api/accounts.js +42 -0
  5. package/dist/api/accounts.js.map +1 -0
  6. package/dist/api/apps.d.ts +50 -0
  7. package/dist/api/apps.d.ts.map +1 -0
  8. package/dist/api/apps.js +62 -0
  9. package/dist/api/apps.js.map +1 -0
  10. package/dist/api/billing.d.ts +131 -0
  11. package/dist/api/billing.d.ts.map +1 -0
  12. package/dist/api/billing.js +42 -0
  13. package/dist/api/billing.js.map +1 -0
  14. package/dist/api/flags.d.ts +73 -0
  15. package/dist/api/flags.d.ts.map +1 -0
  16. package/dist/api/flags.js +108 -0
  17. package/dist/api/flags.js.map +1 -0
  18. package/dist/api/keys.d.ts +48 -0
  19. package/dist/api/keys.d.ts.map +1 -0
  20. package/dist/api/keys.js +87 -0
  21. package/dist/api/keys.js.map +1 -0
  22. package/dist/auth/browser-open.d.ts +21 -4
  23. package/dist/auth/browser-open.d.ts.map +1 -1
  24. package/dist/auth/browser-open.js +45 -65
  25. package/dist/auth/browser-open.js.map +1 -1
  26. package/dist/auth/lock.d.ts +8 -0
  27. package/dist/auth/lock.d.ts.map +1 -0
  28. package/dist/auth/lock.js +43 -0
  29. package/dist/auth/lock.js.map +1 -0
  30. package/dist/auth/loopback.d.ts +8 -12
  31. package/dist/auth/loopback.d.ts.map +1 -1
  32. package/dist/auth/loopback.js +40 -45
  33. package/dist/auth/loopback.js.map +1 -1
  34. package/dist/auth/session.d.ts +61 -0
  35. package/dist/auth/session.d.ts.map +1 -0
  36. package/dist/auth/session.js +142 -0
  37. package/dist/auth/session.js.map +1 -0
  38. package/dist/auth/sign-in.d.ts +67 -0
  39. package/dist/auth/sign-in.d.ts.map +1 -0
  40. package/dist/auth/sign-in.js +113 -0
  41. package/dist/auth/sign-in.js.map +1 -0
  42. package/dist/auth/store.d.ts +89 -0
  43. package/dist/auth/store.d.ts.map +1 -0
  44. package/dist/auth/store.js +214 -0
  45. package/dist/auth/store.js.map +1 -0
  46. package/dist/bin.js +0 -2
  47. package/dist/bin.js.map +1 -1
  48. package/dist/cli.d.ts +1 -2
  49. package/dist/cli.d.ts.map +1 -1
  50. package/dist/cli.js +13 -17
  51. package/dist/cli.js.map +1 -1
  52. package/dist/client.d.ts +31 -0
  53. package/dist/client.d.ts.map +1 -0
  54. package/dist/client.js +67 -0
  55. package/dist/client.js.map +1 -0
  56. package/dist/commands/accounts.command.d.ts +4 -0
  57. package/dist/commands/accounts.command.d.ts.map +1 -0
  58. package/dist/commands/accounts.command.js +116 -0
  59. package/dist/commands/accounts.command.js.map +1 -0
  60. package/dist/commands/app.command.d.ts +3 -2
  61. package/dist/commands/app.command.d.ts.map +1 -1
  62. package/dist/commands/app.command.js +132 -233
  63. package/dist/commands/app.command.js.map +1 -1
  64. package/dist/commands/auth.command.d.ts +2 -12
  65. package/dist/commands/auth.command.d.ts.map +1 -1
  66. package/dist/commands/auth.command.js +147 -20
  67. package/dist/commands/auth.command.js.map +1 -1
  68. package/dist/commands/billing.command.d.ts +4 -0
  69. package/dist/commands/billing.command.d.ts.map +1 -0
  70. package/dist/commands/billing.command.js +185 -0
  71. package/dist/commands/billing.command.js.map +1 -0
  72. package/dist/commands/check.command.d.ts +2 -1
  73. package/dist/commands/check.command.d.ts.map +1 -1
  74. package/dist/commands/check.command.js +11 -14
  75. package/dist/commands/check.command.js.map +1 -1
  76. package/dist/commands/context.d.ts +58 -0
  77. package/dist/commands/context.d.ts.map +1 -0
  78. package/dist/commands/context.js +78 -0
  79. package/dist/commands/context.js.map +1 -0
  80. package/dist/commands/flag.command.d.ts +3 -62
  81. package/dist/commands/flag.command.d.ts.map +1 -1
  82. package/dist/commands/flag.command.js +181 -864
  83. package/dist/commands/flag.command.js.map +1 -1
  84. package/dist/commands/key.command.d.ts +4 -0
  85. package/dist/commands/key.command.d.ts.map +1 -0
  86. package/dist/commands/key.command.js +44 -0
  87. package/dist/commands/key.command.js.map +1 -0
  88. package/dist/commands/plan.command.d.ts +3 -203
  89. package/dist/commands/plan.command.d.ts.map +1 -1
  90. package/dist/commands/plan.command.js +200 -759
  91. package/dist/commands/plan.command.js.map +1 -1
  92. package/dist/config.d.ts +19 -101
  93. package/dist/config.d.ts.map +1 -1
  94. package/dist/config.js +51 -364
  95. package/dist/config.js.map +1 -1
  96. package/dist/core/discovery.d.ts +27 -0
  97. package/dist/core/discovery.d.ts.map +1 -0
  98. package/dist/core/discovery.js +97 -0
  99. package/dist/core/discovery.js.map +1 -0
  100. package/dist/core/errors.d.ts +26 -0
  101. package/dist/core/errors.d.ts.map +1 -0
  102. package/dist/core/errors.js +33 -0
  103. package/dist/core/errors.js.map +1 -0
  104. package/dist/core/http.d.ts +23 -0
  105. package/dist/core/http.d.ts.map +1 -0
  106. package/dist/core/http.js +153 -0
  107. package/dist/core/http.js.map +1 -0
  108. package/dist/core/private-files.d.ts +6 -0
  109. package/dist/core/private-files.d.ts.map +1 -0
  110. package/dist/core/private-files.js +96 -0
  111. package/dist/core/private-files.js.map +1 -0
  112. package/dist/core/routes.d.ts +94 -0
  113. package/dist/core/routes.d.ts.map +1 -0
  114. package/dist/core/routes.js +91 -0
  115. package/dist/core/routes.js.map +1 -0
  116. package/dist/core/urls.d.ts +15 -0
  117. package/dist/core/urls.d.ts.map +1 -0
  118. package/dist/core/urls.js +55 -0
  119. package/dist/core/urls.js.map +1 -0
  120. package/dist/gate-rules.d.ts +1 -2
  121. package/dist/gate-rules.d.ts.map +1 -1
  122. package/dist/gate-rules.js +4 -5
  123. package/dist/gate-rules.js.map +1 -1
  124. package/dist/index.d.ts +23 -3
  125. package/dist/index.d.ts.map +1 -1
  126. package/dist/index.js +18 -3
  127. package/dist/index.js.map +1 -1
  128. package/dist/io.d.ts +21 -0
  129. package/dist/io.d.ts.map +1 -0
  130. package/dist/io.js +59 -0
  131. package/dist/io.js.map +1 -0
  132. package/dist/money.d.ts +42 -0
  133. package/dist/money.d.ts.map +1 -0
  134. package/dist/money.js +112 -0
  135. package/dist/money.js.map +1 -0
  136. package/dist/program.d.ts +5 -24
  137. package/dist/program.d.ts.map +1 -1
  138. package/dist/program.js +25 -113
  139. package/dist/program.js.map +1 -1
  140. package/package.json +7 -8
  141. package/dist/auth/api-client.d.ts +0 -50
  142. package/dist/auth/api-client.d.ts.map +0 -1
  143. package/dist/auth/api-client.js +0 -109
  144. package/dist/auth/api-client.js.map +0 -1
  145. package/dist/auth/relative-time.d.ts +0 -2
  146. package/dist/auth/relative-time.d.ts.map +0 -1
  147. package/dist/auth/relative-time.js +0 -27
  148. package/dist/auth/relative-time.js.map +0 -1
  149. package/dist/auth/scopes.d.ts +0 -30
  150. package/dist/auth/scopes.d.ts.map +0 -1
  151. package/dist/auth/scopes.js +0 -39
  152. package/dist/auth/scopes.js.map +0 -1
  153. package/dist/auth/workspace-client.d.ts +0 -70
  154. package/dist/auth/workspace-client.d.ts.map +0 -1
  155. package/dist/auth/workspace-client.js +0 -105
  156. package/dist/auth/workspace-client.js.map +0 -1
  157. package/dist/commands/auth/config.command.d.ts +0 -8
  158. package/dist/commands/auth/config.command.d.ts.map +0 -1
  159. package/dist/commands/auth/config.command.js +0 -60
  160. package/dist/commands/auth/config.command.js.map +0 -1
  161. package/dist/commands/auth/login.command.d.ts +0 -46
  162. package/dist/commands/auth/login.command.d.ts.map +0 -1
  163. package/dist/commands/auth/login.command.js +0 -166
  164. package/dist/commands/auth/login.command.js.map +0 -1
  165. package/dist/commands/auth/logout.command.d.ts +0 -21
  166. package/dist/commands/auth/logout.command.d.ts.map +0 -1
  167. package/dist/commands/auth/logout.command.js +0 -97
  168. package/dist/commands/auth/logout.command.js.map +0 -1
  169. package/dist/commands/auth/methods.command.d.ts +0 -68
  170. package/dist/commands/auth/methods.command.d.ts.map +0 -1
  171. package/dist/commands/auth/methods.command.js +0 -91
  172. package/dist/commands/auth/methods.command.js.map +0 -1
  173. package/dist/commands/auth/status.command.d.ts +0 -18
  174. package/dist/commands/auth/status.command.d.ts.map +0 -1
  175. package/dist/commands/auth/status.command.js +0 -104
  176. package/dist/commands/auth/status.command.js.map +0 -1
  177. package/dist/commands/auth/use.command.d.ts +0 -17
  178. package/dist/commands/auth/use.command.d.ts.map +0 -1
  179. package/dist/commands/auth/use.command.js +0 -47
  180. package/dist/commands/auth/use.command.js.map +0 -1
  181. package/dist/commands/branding.command.d.ts +0 -3
  182. package/dist/commands/branding.command.d.ts.map +0 -1
  183. package/dist/commands/branding.command.js +0 -42
  184. package/dist/commands/branding.command.js.map +0 -1
  185. package/dist/commands/event.command.d.ts +0 -3
  186. package/dist/commands/event.command.d.ts.map +0 -1
  187. package/dist/commands/event.command.js +0 -27
  188. package/dist/commands/event.command.js.map +0 -1
  189. package/dist/commands/flag-init.command.d.ts +0 -13
  190. package/dist/commands/flag-init.command.d.ts.map +0 -1
  191. package/dist/commands/flag-init.command.js +0 -463
  192. package/dist/commands/flag-init.command.js.map +0 -1
  193. package/dist/commands/guide.command.d.ts +0 -61
  194. package/dist/commands/guide.command.d.ts.map +0 -1
  195. package/dist/commands/guide.command.js +0 -655
  196. package/dist/commands/guide.command.js.map +0 -1
  197. package/dist/commands/info.command.d.ts +0 -3
  198. package/dist/commands/info.command.d.ts.map +0 -1
  199. package/dist/commands/info.command.js +0 -70
  200. package/dist/commands/info.command.js.map +0 -1
  201. package/dist/commands/integration.command.d.ts +0 -35
  202. package/dist/commands/integration.command.d.ts.map +0 -1
  203. package/dist/commands/integration.command.js +0 -290
  204. package/dist/commands/integration.command.js.map +0 -1
  205. package/dist/commands/journeys.d.ts +0 -43
  206. package/dist/commands/journeys.d.ts.map +0 -1
  207. package/dist/commands/journeys.js +0 -221
  208. package/dist/commands/journeys.js.map +0 -1
  209. package/dist/commands/ops.command.d.ts +0 -17
  210. package/dist/commands/ops.command.d.ts.map +0 -1
  211. package/dist/commands/ops.command.js +0 -129
  212. package/dist/commands/ops.command.js.map +0 -1
  213. package/dist/commands/privilege.command.d.ts +0 -16
  214. package/dist/commands/privilege.command.d.ts.map +0 -1
  215. package/dist/commands/privilege.command.js +0 -86
  216. package/dist/commands/privilege.command.js.map +0 -1
  217. package/dist/commands/role.command.d.ts +0 -3
  218. package/dist/commands/role.command.d.ts.map +0 -1
  219. package/dist/commands/role.command.js +0 -101
  220. package/dist/commands/role.command.js.map +0 -1
  221. package/dist/commands/runtime-dir.d.ts +0 -16
  222. package/dist/commands/runtime-dir.d.ts.map +0 -1
  223. package/dist/commands/runtime-dir.js +0 -18
  224. package/dist/commands/runtime-dir.js.map +0 -1
  225. package/dist/commands/setup.command.d.ts +0 -63
  226. package/dist/commands/setup.command.d.ts.map +0 -1
  227. package/dist/commands/setup.command.js +0 -148
  228. package/dist/commands/setup.command.js.map +0 -1
  229. package/dist/commands/stripe.command.d.ts +0 -29
  230. package/dist/commands/stripe.command.d.ts.map +0 -1
  231. package/dist/commands/stripe.command.js +0 -99
  232. package/dist/commands/stripe.command.js.map +0 -1
  233. package/dist/commands/tenant.command.d.ts +0 -3
  234. package/dist/commands/tenant.command.d.ts.map +0 -1
  235. package/dist/commands/tenant.command.js +0 -135
  236. package/dist/commands/tenant.command.js.map +0 -1
  237. package/dist/commands/token.command.d.ts +0 -3
  238. package/dist/commands/token.command.d.ts.map +0 -1
  239. package/dist/commands/token.command.js +0 -54
  240. package/dist/commands/token.command.js.map +0 -1
  241. package/dist/commands/user.command.d.ts +0 -3
  242. package/dist/commands/user.command.d.ts.map +0 -1
  243. package/dist/commands/user.command.js +0 -117
  244. package/dist/commands/user.command.js.map +0 -1
  245. package/dist/credentials.d.ts +0 -141
  246. package/dist/credentials.d.ts.map +0 -1
  247. package/dist/credentials.js +0 -348
  248. package/dist/credentials.js.map +0 -1
  249. package/dist/flag-coherence.d.ts +0 -42
  250. package/dist/flag-coherence.d.ts.map +0 -1
  251. package/dist/flag-coherence.js +0 -103
  252. package/dist/flag-coherence.js.map +0 -1
  253. package/dist/output.d.ts +0 -17
  254. package/dist/output.d.ts.map +0 -1
  255. package/dist/output.js +0 -107
  256. package/dist/output.js.map +0 -1
  257. package/dist/preview.d.ts +0 -9
  258. package/dist/preview.d.ts.map +0 -1
  259. package/dist/preview.js +0 -63
  260. package/dist/preview.js.map +0 -1
  261. package/dist/product-decisions.d.ts +0 -40
  262. package/dist/product-decisions.d.ts.map +0 -1
  263. package/dist/product-decisions.js +0 -52
  264. package/dist/product-decisions.js.map +0 -1
  265. package/dist/prompt-urls.d.ts +0 -31
  266. package/dist/prompt-urls.d.ts.map +0 -1
  267. package/dist/prompt-urls.js +0 -35
  268. package/dist/prompt-urls.js.map +0 -1
  269. package/dist/prompts/auth-master-integration-prompt.md +0 -255
  270. package/dist/prompts/billing/master.md +0 -332
  271. package/dist/prompts/decisions/feature-control.md +0 -131
  272. package/dist/prompts/decisions/going-live.md +0 -60
  273. package/dist/prompts/decisions/login.md +0 -71
  274. package/dist/prompts/decisions/look-and-feel.md +0 -68
  275. package/dist/prompts/decisions/payments.md +0 -97
  276. package/dist/prompts/decisions/roles.md +0 -78
  277. package/dist/prompts/decisions/teams.md +0 -61
  278. package/dist/prompts/fit-together.md +0 -97
  279. package/dist/prompts/flags/master.md +0 -220
  280. package/dist/prompts/guide-coverage.json +0 -17
  281. package/dist/prompts/integration-success.md +0 -106
  282. package/dist/prompts/mcp-tools.json +0 -90
  283. package/dist/prompts/mechanisms.md +0 -304
  284. package/dist/prompts/orientation.md +0 -42
  285. package/dist/prompts/product-decisions.json +0 -338
  286. package/dist/resolve.d.ts +0 -110
  287. package/dist/resolve.d.ts.map +0 -1
  288. package/dist/resolve.js +0 -260
  289. package/dist/resolve.js.map +0 -1
  290. package/dist/shape.d.ts +0 -25
  291. package/dist/shape.d.ts.map +0 -1
  292. package/dist/shape.js +0 -74
  293. package/dist/shape.js.map +0 -1
package/README.md CHANGED
@@ -2,518 +2,151 @@
2
2
  <a href="https://thebridge.dev/?utm_source=npm&utm_medium=readme&utm_campaign=bridge-cli"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/thebridgedev/bridge-cli/main/.github/assets/banner.png"><img src="https://raw.githubusercontent.com/thebridgedev/bridge-cli/main/.github/assets/banner-light.png" alt="The Bridge CLI" width="100%"></picture></a>
3
3
  </p>
4
4
 
5
- <p align="center">
6
- <a href="https://www.npmjs.com/package/@nebulr-group/bridge-cli"><img src="https://img.shields.io/npm/v/@nebulr-group/bridge-cli?color=20006b&label=npm" alt="npm version"></a>
7
- <a href="https://github.com/thebridgedev/bridge-cli/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/@nebulr-group/bridge-cli?color=20006b" alt="MIT license"></a>
8
- </p>
9
-
10
- <p align="center">
11
- <a href="https://thebridge.dev/?utm_source=npm&utm_medium=readme&utm_campaign=bridge-cli"><b>Website</b></a> ·
12
- <a href="https://thebridge.dev/docs/getting-started/?utm_source=npm&utm_medium=readme&utm_campaign=bridge-cli"><b>Getting started</b></a> ·
13
- <a href="https://thebridge.dev/docs/?utm_source=npm&utm_medium=readme&utm_campaign=bridge-cli"><b>Docs</b></a> ·
14
- <a href="https://thebridge.dev/docs/ai-assistants/mcp/?utm_source=npm&utm_medium=readme&utm_campaign=bridge-cli"><b>Set up with your AI assistant</b></a>
15
- </p>
5
+ # The Bridge CLI 1.0 (alpha)
16
6
 
17
- # The Bridge CLI
7
+ `@nebulr-group/bridge-cli` sets up your app on Bridge from the terminal. You sign in, then create your app and its addresses, its keys, plans with prices and trials, Stripe in test mode, and the feature flags your code gates on. It works the same for you and for a coding agent: every result is JSON.
18
8
 
19
- `@nebulr-group/bridge-cli` sets up and manages your Bridge app from the terminal: apps, sign-in methods, roles, plans and prices, feature flags and API tokens. Built for AI coding agents (Claude Code, Cursor, Copilot) as much as for people.
20
-
21
- **[The Bridge](https://thebridge.dev/?utm_source=npm&utm_medium=readme&utm_campaign=bridge-cli)** is a hosted backend for SaaS apps. It gives you sign-in (passwords, magic links, passkeys, social login and SSO), multi-tenant workspaces with roles, Stripe subscriptions with plan limits, and feature flags, all managed from one dashboard. Your AI coding assistant can set it up for you through the [Bridge MCP server](https://thebridge.dev/docs/ai-assistants/mcp/?utm_source=npm&utm_medium=readme&utm_campaign=bridge-cli).
22
-
23
- ## Installation
24
-
25
- ```bash
26
- npm install -g @nebulr-group/bridge-cli
27
- ```
9
+ > **This is the 1.0 alpha.** It talks to version 2 of Bridge's API only. For the Bridge you use today, stay on 0.x: `npm install -g @nebulr-group/bridge-cli` installs it (`latest`).
28
10
 
29
- Or run directly with npx:
11
+ ## Install
30
12
 
31
13
  ```bash
32
- npx @nebulr-group/bridge-cli tenant list
14
+ npm install -g @nebulr-group/bridge-cli@alpha
15
+ # or, without installing
16
+ npx @nebulr-group/bridge-cli@alpha --help
33
17
  ```
34
18
 
35
- ## Authentication
36
-
37
- bridge-cli supports two authentication paths.
38
-
39
- ### 1. Interactive (recommended for humans + AI agents) — `bridge auth login`
19
+ It needs Node.js 20 or later.
40
20
 
41
- ```bash
42
- bridge auth login
43
- ```
21
+ ## Sign in
44
22
 
45
- Opens your default browser, runs through a PKCE-secured loopback flow (RFC 8252), and stores a 10-day token at `~/.config/bridge/credentials.json` (mode `0600`). After that, every subsequent `bridge` command picks the token up automatically — no env vars needed.
23
+ The CLI needs one address: your **issuer**, the address Bridge signs you in at. Every other endpoint is read from the issuer's published metadata. Give it once; it is saved for the commands that follow.
46
24
 
47
25
  ```bash
48
- bridge auth status # show every stored app, and which one is active
49
- bridge auth logout # revoke the active token and remove it locally
26
+ bridge auth login --issuer https://<your Bridge>/identity-access/apps/<app id>
50
27
  ```
51
28
 
52
- #### One login, every app of the workspace
29
+ This opens Bridge's sign-in page in your browser: the page your issuer publishes, and the CLI says its address before it opens it. You sign in there, and the browser comes back to the CLI on `127.0.0.1`. The sign-in is bound to this process with PKCE, so a code that leaks is no use to anyone else. If the browser cannot be opened, the CLI prints the address to open.
53
30
 
54
- By default the consent screen preselects **Every app in &lt;workspace&gt;**, so one
55
- login covers all your apps — the same way the MCP server does. The app you pin
56
- at login (`--app`) is the *home* app; switch between the others locally:
31
+ If no browser is at hand (a server, a container, CI), sign in in the terminal:
57
32
 
58
33
  ```bash
59
- bridge auth login # Logged in as you@acme.com. Workspace: every app (home app: Acme)
60
- bridge app list # every app, marking home and current
61
- bridge app use "Acme Stage" # the default for every command, no re-login
62
- bridge app create --name "Acme Prod" --use
63
- bridge --app 66f0c0ffee0000000000abcd role list # one command on another app
34
+ bridge auth login --password --email you@example.com # asks for the password, without echo
35
+ echo "$PASSWORD" | bridge auth login --password --email you@example.com --password-stdin
64
36
  ```
65
37
 
66
- Precedence: `--app` > `bridge app use` > the home app. `--profile` still picks
67
- *which stored login*; `--app` picks the app *within* it. Acting on a non-home
68
- app prints `bridge: Acting on app <name> (<id>)` to stderr. Per-app tokens live
69
- only in memory for that one command and are never written to disk.
70
-
71
- `bridge auth login --single-app` asks for a login that covers only the home app
72
- (the user can still change the choice on the consent screen). On such a login,
73
- `--app` / `bridge app use` for another app fail and tell you to log in again.
74
- `BRIDGE_API_KEY` is always bound to its one app.
75
-
76
- #### Several apps at once
77
-
78
- The credentials file holds one credential per app, so you can log in to your
79
- local, stage and prod apps and move between them without a browser round-trip —
80
- the tokens are already on disk with days left on them.
38
+ If you belong to several workspaces, the CLI asks which one, or takes `--workspace <id>`.
81
39
 
82
40
  ```bash
83
- bridge auth login --label northwhistle-local # once per app
84
- bridge auth login --label northwhistle-prod
85
-
86
- bridge auth status # lists both, marks the active one
87
- bridge auth use northwhistle-local # switch the default, offline
88
- bridge --profile northwhistle-prod app get # target ONE command, default untouched
41
+ bridge auth whoami # who you are, which workspace, which app commands act on
42
+ bridge auth workspace # your workspaces
43
+ bridge auth workspace <id> # switch to one
44
+ bridge auth logout # ends the session at Bridge and removes it from this machine
89
45
  ```
90
46
 
91
- A profile is selected by its `--label`, its app id, or its app name, in that
92
- order. An ambiguous name is an error rather than a guess. `BRIDGE_PROFILE` does
93
- the same thing as `--profile` for a whole shell session.
47
+ **Where the session is kept.** In your operating system's keychain (the macOS keychain, or the Secret Service keyring on Linux) when there is one, else in `~/.config/bridge/v1/sessions.json`, readable only by you (mode 0600). Set `BRIDGE_TOKEN_STORE=file` to use the file. The CLI renews the session as it goes; each renewal replaces the refresh token, and the old one stops working.
94
48
 
95
- Prefer `--profile` over `bridge auth use` in scripts and long-running agent
96
- sessions: `use` mutates state another process may be reading, `--profile` does
97
- not.
98
-
99
- Every command prints one line to **stderr** naming the app that answered:
100
-
101
- ```
102
- bridge: northwhistle-prod (606b4416fabdc800087d09ec) · https://api.thebridge.dev · via saved default
103
- ```
104
-
105
- stdout stays pure JSON, so this does not disturb anything parsing it. Silence it
106
- with `BRIDGE_NO_BANNER=true` if you are already certain which app you are on.
107
-
108
- `bridge auth logout` removes the active app only. Use `--profile <name>` for a
109
- specific one, or `--all` to clear the file.
110
-
111
- Existing single-app credentials files keep working and are upgraded in place the
112
- next time something writes.
113
-
114
- #### `bridge auth login` flags
115
-
116
- | Flag | Description |
117
- |------|-------------|
118
- | `--app <id\|name>` | Pin the home app, skipping the picker on the consent screen. |
119
- | `--single-app` | Preselect "only this app" instead of "every app in the workspace" on the consent screen. |
120
- | `--label <text>` | Friendly label stored on the token (default: `bridge-cli`). Useful when listing CLI tokens at `app.thebridge.dev/keys`. |
121
- | `--no-browser` | Print the authorization URL instead of opening a browser. Use this on headless boxes or over SSH. |
122
-
123
- When the token expires (10 days), the next command fails with a friendly `Token expired. Run `bridge auth login` to re-authenticate.` message.
124
-
125
- The credentials file location honors `XDG_CONFIG_HOME`:
126
-
127
- ```bash
128
- $XDG_CONFIG_HOME/bridge/credentials.json # if XDG_CONFIG_HOME is set
129
- ~/.config/bridge/credentials.json # otherwise
130
- ```
131
-
132
- ### 2. Service-account / CI — `BRIDGE_API_KEY`
133
-
134
- For non-interactive contexts (CI/CD pipelines, Docker images, headless agents) set the API key directly in the environment:
49
+ ## Set up an app
135
50
 
136
51
  ```bash
137
- export BRIDGE_API_KEY=<your-api-token>
138
- ```
52
+ # 1. Create the app. Commands act on it from now on (`bridge app use <id>` switches).
53
+ bridge app create --name "My App" \
54
+ --sign-in-return http://localhost:5173/auth/callback \
55
+ --email-links http://localhost:5173/auth/link \
56
+ --browser-origin http://localhost:5173
139
57
 
140
- If you have logged in via `bridge auth login`, the credentials file always wins — a fresh login takes effect immediately, even when `BRIDGE_API_KEY` is still exported in your shell. `BRIDGE_API_KEY` is only used when no credentials file is present (the typical CI runner shape). To switch back to env-var auth on a developer machine, run `bridge auth logout --all` first.
58
+ # 2. Add your production addresses next to the development ones.
59
+ bridge app address add https://myapp.com/auth/callback --use sign-in-return
60
+ bridge app address add https://myapp.com --use browser-origin
61
+ bridge app address list
141
62
 
142
- Because that trips people up, the CLI now says so at the moment it happens: with
143
- both present you get a line on stderr telling you `BRIDGE_API_KEY` is set and
144
- being ignored, and what to do instead. To point the CLI at a different app, use
145
- `--profile`, not the env vars.
63
+ # 3. A key for your server. The secret is shown once: put it in your server's secrets.
64
+ bridge key create --name "production server"
146
65
 
147
- **`BRIDGE_APP_ID` has no effect on any path.** The app is carried by the
148
- credential itself — a login token and an API key are both already scoped to one
149
- app, so there is nothing for it to change. It is called out on stderr whenever it
150
- is set, rather than being quietly ignored.
66
+ # 4. Plans: prices, a trial, a per-unit usage price, features and limits.
67
+ bridge metric set exports --kind counter --name "Exports"
68
+ bridge plan create pro --name Pro \
69
+ --price "19 EUR/month" --price "190 EUR/year" \
70
+ --usage-price "exports 0.05 EUR/month included 100" \
71
+ --trial-days 14 \
72
+ --feature analytics --limit seats=10
151
73
 
152
- Optional configuration (applies to both auth paths):
74
+ # 5. Take payments: connect Stripe in test mode with your test secret key (asked for without echo).
75
+ bridge stripe connect
153
76
 
154
- ```bash
155
- export BRIDGE_BASE_URL=https://api.thebridge.dev # default
156
- export BRIDGE_TENANT_ID=<tenant-id> # for user commands
157
- export BRIDGE_DEBUG=true # enable debug logging
77
+ # 6. Flags: every gate in your code is a flag, and its rule says who gets it.
78
+ bridge flag create analytics --when "bridge:billing.entitlement.analytics eq true"
79
+ bridge flag create team-admin --when "privileges contains USER_WRITE"
158
80
  ```
159
81
 
160
- ### 3. Targeting a local stack
82
+ ## Commands
161
83
 
162
- Two exports, then log in as usual — the browser flow works against a local
163
- stack the same way it does against production:
84
+ | Command | What it does |
85
+ |---|---|
86
+ | `auth login` · `logout` · `whoami` · `workspace` | Sign in and out, see who you are, switch workspace |
87
+ | `app list` · `create` · `use` · `get` · `update` · `delete` | Your apps; `update` sets the name, logo, website, privacy policy and terms |
88
+ | `app address list` · `add` · `remove` | Sign-in returns, email links, browser origins, sign-out and checkout returns |
89
+ | `app default-return <url>` | The sign-in return used when a sign-in names none |
90
+ | `key list` · `create` · `revoke` | App keys, for your server |
91
+ | `plan list` · `get` · `create` · `update` · `apply` · `archive` · `delete` | Plans as one document; `apply <file>` creates or replaces one from JSON |
92
+ | `plan price` · `usage-price` · `feature` · `limit` (`set`/`add`, `remove`) | Change one entry of a plan |
93
+ | `product` · `metric` · `tax` · `billing settings` | Add-ons, what you count, tax rates, billing settings |
94
+ | `stripe status` · `connect` · `disconnect` | Stripe, in test mode by your pasted test key |
95
+ | `flag list` · `get` · `create` · `update` · `on` · `off` · `restore` · `delete` | Feature flags |
96
+ | `flag rule show` · `add` · `set` · `clear` | A flag's rule: ordered branches of conditions, the first match wins |
97
+ | `role` · `privilege` · `workspace list` · `member` | Roles, privileges, your customers' workspaces and their members |
98
+ | `check gates` | Lists every direct role, privilege or plan check in your project, with the flag to use instead |
164
99
 
165
- ```bash
166
- export BRIDGE_BASE_URL=http://localhost:3200 # bridge-api
167
- export BRIDGE_AUTH_BASE_URL=http://localhost:3091 # consent screen (cloud-views)
100
+ `bridge <command> --help` has every option.
168
101
 
169
- bridge auth login
170
- ```
102
+ ### Prices
171
103
 
172
- `BRIDGE_BASE_URL` is where commands send their API calls; `BRIDGE_AUTH_BASE_URL`
173
- is where `bridge auth login` opens the consent screen. Set the second one too,
174
- or you will authenticate against production and then issue commands against
175
- your local API with a token it does not accept.
104
+ Write prices the way you say them: `"19.99 EUR/month"`, `"190 EUR/year"`, or `"49 EUR"` for a one-time product. A usage price is a price per unit on top of a plan's price: `"api.calls 0.002 EUR/month included 10000"` charges 0.002 EUR per call above 10,000 a month. Limits are `metric=n` or `metric=unlimited`.
176
105
 
177
- There is deliberately **no config file to source** (TBP-121). A sourceable file
178
- mixed CLI settings with two demo apps' settings, pinned an undocumented app id,
179
- and kept a long-lived API key on disk in plaintext; two exports cover the same
180
- ground without any of that. For CI, use `BRIDGE_API_KEY` as described above.
106
+ ### Flag rules
181
107
 
182
- One more, for working on the integration guides themselves:
108
+ `--when "<attribute> <operator> <value>"` writes a one-branch rule; repeat `--when` to require every condition. The operators are `eq`, `neq`, `contains`, `not_contains`, `in`, `not_in`, `gt`, `lt`, `between`, `regex`, `exists` and `not_exists`. `flag rule add` adds a branch, `--rollout 25` gives it to a share of the people it matches, and `--rule`/`--rule-file` take a whole rule as JSON.
183
109
 
184
- ```bash
185
- export BRIDGE_GUIDE_LOCAL_DIR=/path/to/thebridge-platform/bridge-plugins
186
- ```
187
-
188
- `bridge guide` then reads prompts from that directory
189
- instead of fetching them from GitHub (or the copies bundled with the CLI), so edits show up without a release.
110
+ ### Roles, members and the pasted Stripe key
190
111
 
191
- ## Usage
112
+ Bridge offers roles, privileges, workspaces, members and a pasted Stripe key to your app's own server, so these commands call Bridge with an app key. Set `BRIDGE_APP_KEY` to one of your app's keys, or leave it unset: the CLI then makes a key that lasts one day and holds only what the command needs, and revokes it as soon as the command is done. Making a key needs a recent sign-in; if yours is older, the CLI says so.
192
113
 
193
- All output is JSON by default for management commands. AI agents parse it directly; humans can pipe through `jq`. The `bridge auth status` and `bridge auth login` commands print human-readable text, since their primary audience is a human in a terminal.
114
+ ## Output
194
115
 
195
- ```bash
196
- bridge <command> <subcommand> [options]
197
- ```
116
+ Results are JSON on stdout: `{ "success": true, "data": … }`. Errors are JSON on stderr: `{ "success": false, "error": { "code", "message", "hint" } }`. Messages meant for you go to stderr as plain text.
198
117
 
199
- ### Addressing a resource
118
+ Exit codes: `0` done, `1` refused or failed, `2` Bridge could not be reached or could not answer, `3` the CLI is not set up (no issuer, not signed in, a wrong setting).
200
119
 
201
- Every command that acts on a single resource takes **either** its opaque id
202
- **or** its human-readable identifier — you never have to run a `list` first just
203
- to look up an id.
120
+ ## Settings
204
121
 
205
- | Noun | Human-readable option | Id option |
122
+ | Variable | Flag | What it is |
206
123
  |---|---|---|
207
- | flag | `--key <key>` (or a positional `<key>` on `get` / `eval` / `schedule`) | `--id` |
208
- | role | `--key <key>` (or a positional `<idOrKey>` on `get`) | `--id` |
209
- | plan | positional `<key>` — plans are key-native, no id anywhere | — |
210
- | tenant | `--name <name>` | `--id` |
211
- | user | `--email <email>` | `--user-id` |
212
- | token | `--name <name>` | `--id` |
213
-
214
- Rules, the same for every noun:
215
-
216
- - Pass exactly one. Both together, or neither, is an error.
217
- - An identifier that matches nothing fails and names the `list` command to run.
218
- - An identifier that matches **more than one** resource fails, lists the
219
- candidates, and changes nothing. The CLI never picks one for you — pass `--id`
220
- to disambiguate.
221
-
222
- `--name` and `--email` exist because tenants, users and tokens have no key
223
- field. Of those, only a user's email is unique; tenant and token names are free
224
- text, which is exactly why the ambiguity check is a hard failure.
225
-
226
- ### Auth (interactive credentials)
227
-
228
- ```bash
229
- bridge auth login # default: open browser, complete PKCE flow
230
- bridge auth login --app acme # pin to a specific app
231
- bridge auth login --label "work laptop"
232
- bridge auth login --no-browser # print the URL (headless / SSH)
233
- bridge auth status # show every stored app, active one marked
234
- bridge auth use <label|app-id> # switch the default app, no browser
235
- bridge auth logout # revoke + remove the active app
236
- bridge auth logout --all # ...or every stored app
237
- bridge --profile <label> <cmd> # target one stored login for one command
238
- bridge app list # apps this login covers (home + current marked)
239
- bridge app use <id|name> # switch app within a workspace login, no browser
240
- bridge app create --name <n> [--callback-url <url>] [--use]
241
- bridge --app <id|name> <cmd> # one command on another app of the workspace
242
- ```
243
-
244
- ### Auth Configuration (app-level — separate from `auth login`)
245
-
246
- ```bash
247
- bridge auth config
248
- bridge auth mfa --enabled true
249
- bridge auth password-policy --access-token-ttl 3600
250
- ```
251
-
252
- ### App
253
-
254
- ```bash
255
- bridge app get
256
- bridge app update --name "My App" --mfa-enabled true
257
- ```
258
-
259
- ### Tenants
260
-
261
- ```bash
262
- bridge tenant list
263
- bridge tenant get --name "Acme Corp" # or --id <tenant-id>
264
- bridge tenant create --owner-email admin@acme.com --name "Acme Corp" --plan enterprise
265
- bridge tenant update --name "Acme Corp" --locale sv
266
- bridge tenant update --name "Acme Corp" --new-name "Acme Corp Updated"
267
- bridge tenant delete --name "Acme Corp" # or --id <tenant-id>
268
- ```
269
-
270
- Tenants have no key field, so they are addressed by `--name`. Names are **not**
271
- enforced unique — if two tenants share one, the command fails and lists both
272
- rather than guessing. Use `--id` to disambiguate.
273
-
274
- `tenant update --name` addresses the tenant when `--id` is absent; passed
275
- alongside `--id` it keeps its original meaning and renames the tenant.
276
- `--new-name` always renames, whichever way you addressed it.
277
-
278
- ### Users
279
-
280
- Requires tenant context via `--tenant-id` or `BRIDGE_TENANT_ID`.
281
-
282
- ```bash
283
- bridge user list --tenant-id <tenant-id>
284
- bridge user get --email alice@acme.com --tenant-id <tenant-id> # or --user-id <user-id>
285
- bridge user invite --email alice@acme.com --role ADMIN --tenant-id <tenant-id>
286
- bridge user update --email alice@acme.com --role OWNER --tenant-id <tenant-id>
287
- bridge user remove --email alice@acme.com --tenant-id <tenant-id>
288
- ```
289
-
290
- Users have no key field either; `--email` is the human-readable address and is
291
- unique within a tenant (matched case-insensitively).
292
-
293
- ### Access Roles
294
-
295
- ```bash
296
- bridge role list
297
- bridge role get ADMIN
298
- bridge role create --name Editor --key editor --privileges READ,WRITE
299
- bridge role update --key editor --privileges READ,WRITE,DELETE # or --id <role-id>
300
- bridge role delete --key editor # or --id <role-id>
301
- ```
302
-
303
- ### Feature Flags
304
-
305
- ```bash
306
- bridge flag list
307
- bridge flag create --key dark-mode --description "Dark mode UI" --enabled
308
- bridge flag update --key dark-mode --state on # or --id <flag-id>
309
- bridge flag update --key dark-mode --new-key dark-theme # rename
310
- bridge flag toggle --key dark-mode --enabled true # or --id <flag-id>
311
- bridge flag delete --key dark-mode # or --id <flag-id>
312
- ```
124
+ | `BRIDGE_ISSUER` | `--issuer` | Your issuer. Saved at sign-in |
125
+ | `BRIDGE_APP` | `--app` | The app commands act on. Default: the one chosen with `bridge app use` |
126
+ | `BRIDGE_SIGN_IN_PAGE` | `auth login --sign-in-page` | Bridge's sign-in page, only when the issuer publishes none, and only on the issuer's own address or on localhost. Never saved |
127
+ | `BRIDGE_APP_KEY` | | An app key for the commands that need one |
128
+ | `BRIDGE_TOKEN_STORE` | | `file` to keep the session in the 0600 file, `keychain` to require the keychain |
129
+ | `BRIDGE_CONFIG_DIR` | | Where settings are kept. Default `~/.config/bridge/v1` |
313
130
 
314
- `flag update --key` addresses the flag when `--id` is absent; passed alongside
315
- `--id` it keeps its original meaning and renames the flag. `--new-key` always
316
- renames, whichever way you addressed it.
131
+ ## Security
317
132
 
318
- ### Branding
133
+ - The issuer and every endpoint must be `https`; plain `http` only on `localhost`, `127.0.0.1` and `[::1]`, for local development.
134
+ - The CLI never follows a redirect, so your token goes only to the addresses your issuer lists.
135
+ - Browser sign-in opens the sign-in page the issuer publishes. Another page is taken only on the issuer's own address, or on localhost for development, and is never saved.
136
+ - The browser is opened with no shell: the address is one argument to `open`, `xdg-open`, or `rundll32 url.dll,FileProtocolHandler` on Windows.
137
+ - Browser sign-in listens on `127.0.0.1` only, checks the `state` it sent, requires the issuer to name itself on the callback (`iss`, RFC 9207), and uses PKCE (S256).
138
+ - The session and settings files are written with no symlink followed: to a new 0600 file in a 0700 directory you own, then renamed into place.
139
+ - A temporary app key is revoked when the command ends, fails or is stopped with Ctrl-C; if it cannot be, the CLI prints the key's id to revoke.
140
+ - Passwords and Stripe keys are read without echo or from stdin, never from arguments, and never kept.
319
141
 
320
- ```bash
321
- bridge branding get
322
- bridge branding update --bg-color "#ffffff" --text-color "#000000"
323
- ```
142
+ ## Use it from code
324
143
 
325
- ### Subscription Plans
144
+ Every command is a plain function over one client, exported from the package:
326
145
 
327
- ```bash
328
- bridge plan list
329
- # A plan needs at least one price — `create` takes the first one.
330
- # A free tier is a zero-amount price: --amount 0
331
- bridge plan create --key pro --name "Pro Plan" --amount 29 --interval month
332
- bridge plan update --key pro --name "Pro Plan v2"
333
- # Remove a plan. Only a plan no workspace is on is deleted (needs
334
- # `bridge auth login --admin`); with workspaces on it the delete is refused.
335
- bridge plan delete --key pro --dry-run # would it go through, and who is on it
336
- bridge plan delete --key pro
337
- # Stop selling it instead: workspaces on it keep it, nobody new can choose it.
338
- bridge plan archive --key pro # --undo brings it back
339
- # Or move the workspaces off it first (a paid subscription moves too).
340
- bridge tenant set-plan --name "Acme Corp" --plan free
341
-
342
- # Prices — a plan can have several (one per currency + interval). Idempotent.
343
- bridge plan price set pro --amount 290 --currency usd --interval year
344
- # Removing the last price is refused: a priceless plan can't be assigned.
345
- bridge plan price rm pro --interval year
346
-
347
- # Usage quotas (hard | metered caps)
348
- # hard = block at the cap; metered = bill overage per unit (needs --price-amount)
349
- bridge plan quota set pro --metric ai_completions --limit 1000 --policy hard
350
- # Metered: first 1000 free, then $0.002/unit (currency from the plan's price)
351
- bridge plan quota set pro --metric ai_completions --limit 1000 --policy metered --price-amount 0.002
352
- # Pure per-unit (billed from unit 1)
353
- bridge plan quota set pro --metric api_calls --limit 0 --policy metered --price-amount 0.01 --price-currency usd
354
- bridge plan quota rm pro --metric ai_completions
355
-
356
- # Included on/off features — each is `bridge:billing.entitlement.<key>` in flag rules
357
- bridge plan feature add pro analytics --name "Analytics"
358
- bridge plan feature list pro
359
- bridge plan feature remove pro analytics
360
- bridge plan create --key team --name Team --amount 0 --interval month --features "analytics,sso:Single sign-on"
146
+ ```ts
147
+ import { BridgeClient, Sessions, FileStore, discover, plans } from '@nebulr-group/bridge-cli';
361
148
  ```
362
149
 
363
- ### API Tokens
364
-
365
- ```bash
366
- bridge token list
367
- bridge token create --name "CI Token" --privileges USER_READ,TENANT_READ
368
- bridge token revoke --name "CI Token" # or --id <token-id>
369
- ```
370
-
371
- Token names are free text and not enforced unique — a duplicate name fails and
372
- lists the candidates instead of revoking one at random.
373
-
374
- ### Events
375
-
376
- ```bash
377
- bridge event list
378
- bridge event list --type USER_CREATED --since 24h --limit 50
379
- ```
380
-
381
- ### Setup Workflows (multi-step)
382
-
383
- ```bash
384
- bridge setup sso --provider google --client-id <id> --client-secret <secret>
385
- bridge setup sso --provider azure --client-id <id> --client-secret <secret> --tenant-id <entra-directory-id>
386
- bridge setup payments --stripe-key sk_test_xxx
387
- bridge setup communication --from-address noreply@acme.com --from-name "Acme"
388
- ```
389
-
390
- `setup sso` supports google, github, linkedin, facebook and azure (azure also
391
- needs the Entra ID Directory (tenant) ID). SAML and OIDC are not supported by
392
- the Bridge API; set them up in the Bridge admin UI. The command prints the
393
- callback URL to register in the provider's console.
394
-
395
- `setup communication` sets only the sender name and address. Bridge sends all
396
- email through its own provider, so there is no provider or API key to
397
- configure. A new sender address is verified by email before Bridge uses it.
398
-
399
- ### Info (context for AI agents)
400
-
401
- ```bash
402
- bridge info app
403
- bridge info auth-config
404
- bridge info flags
405
- bridge info plans
406
- bridge info roles
407
- ```
408
-
409
- ### Integration Guides
410
-
411
- Three master prompts orchestrate the per-framework guides:
412
-
413
- ```bash
414
- bridge guide # Bridge Auth master prompt (auth, RBAC, tenants)
415
- bridge guide flags # Feature Flags 2.0 master prompt
416
- bridge guide billing # Billing 2.0 master prompt (subscriptions, quotas, webhooks)
417
- ```
418
-
419
- One page explains the mechanisms all of them build on — the server decides limits and the client decorates, a POST increments the limit, counter vs gauge, the three ways to show a limit in the UI, and the four levels of customising Bridge's pages:
420
-
421
- ```bash
422
- bridge guide mechanisms
423
- ```
424
-
425
- Per-framework guides:
426
-
427
- ```bash
428
- bridge guide list
429
- bridge guide <framework> # auth guide (svelte | react | nextjs | angular | nestjs | express)
430
- bridge guide <framework> sdk-auth # in-app auth UI (frontend frameworks only)
431
- bridge guide flags --framework <name> # flags-specific guide
432
- bridge guide billing --framework <name> # billing-specific guide
433
- bridge guide custom # REST API fallback for any language
434
- ```
435
-
436
- `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.
437
-
438
- ## Output Format
439
-
440
- **Success:**
441
-
442
- ```json
443
- {
444
- "success": true,
445
- "data": { ... }
446
- }
447
- ```
448
-
449
- **Error:**
450
-
451
- ```json
452
- {
453
- "success": false,
454
- "error": {
455
- "code": "TENANT_HAS_ACTIVE_SUBSCRIPTION",
456
- "message": "Cannot delete tenant with active subscription.",
457
- "details": { ... }
458
- }
459
- }
460
- ```
461
-
462
- `bridge auth login`, `bridge auth logout`, and `bridge auth status` print plain text (they're the only commands aimed primarily at humans).
463
-
464
- ## Exit Codes
465
-
466
- | Code | Meaning |
467
- |------|---------|
468
- | 0 | Success |
469
- | 1 | Client error (4xx), or `bridge auth login` failed/cancelled |
470
- | 2 | Server error (5xx) |
471
- | 3 | Configuration error (missing API key, expired credentials, etc.) |
472
-
473
- ## Security notes
474
-
475
- - `bridge auth login` uses RFC 8252 loopback PKCE — the loopback URL is always `http://127.0.0.1:<random-port>/callback` (never `localhost`, to avoid DNS spoofing).
476
- - The loopback HTTP server handles a single request, then closes — no port stays bound.
477
- - The CSRF `state` parameter is verified on the callback before the code is exchanged.
478
- - The credentials file is written with mode `0600` (owner-only). Its parent directory is created with mode `0700`.
479
- - The CLI never logs the JWT or the PKCE `code_verifier`.
480
-
481
- ## Development
482
-
483
- ```bash
484
- # Install dependencies
485
- npm install
486
-
487
- # Build
488
- npm run build
489
-
490
- # Run locally
491
- node bridge-cli/dist/bin.js --help
492
-
493
- # Test
494
- npm test
495
- ```
496
-
497
- ## Learn more
498
-
499
- - [Getting started](https://thebridge.dev/docs/getting-started/?utm_source=npm&utm_medium=readme&utm_campaign=bridge-cli)
500
- - [Set up Bridge with your AI assistant](https://thebridge.dev/docs/ai-assistants/mcp/?utm_source=npm&utm_medium=readme&utm_campaign=bridge-cli)
501
- - [Feature flags](https://thebridge.dev/docs/feature-flags/?utm_source=npm&utm_medium=readme&utm_campaign=bridge-cli)
502
- - [Subscriptions and plan limits](https://thebridge.dev/docs/billing/how-it-works/?utm_source=npm&utm_medium=readme&utm_campaign=bridge-cli)
503
- - [API reference](https://thebridge.dev/docs/api-reference/?utm_source=npm&utm_medium=readme&utm_campaign=bridge-cli)
504
-
505
- ## Other Bridge packages
506
-
507
- | Package | For |
508
- |---|---|
509
- | [`@nebulr-group/bridge-svelte`](https://www.npmjs.com/package/@nebulr-group/bridge-svelte) | SvelteKit |
510
- | [`@nebulr-group/bridge-react`](https://www.npmjs.com/package/@nebulr-group/bridge-react) | React |
511
- | [`@nebulr-group/bridge-nextjs`](https://www.npmjs.com/package/@nebulr-group/bridge-nextjs) | Next.js |
512
- | [`@nebulr-group/bridge-angular`](https://www.npmjs.com/package/@nebulr-group/bridge-angular) | Angular |
513
- | [`@nebulr-group/bridge-nestjs`](https://www.npmjs.com/package/@nebulr-group/bridge-nestjs) | NestJS |
514
- | [`@nebulr-group/bridge-express`](https://www.npmjs.com/package/@nebulr-group/bridge-express) | Express |
515
- | [`@nebulr-group/bridge-auth-core`](https://www.npmjs.com/package/@nebulr-group/bridge-auth-core) | Any JavaScript app (core) |
516
-
517
150
  ## License
518
151
 
519
- [MIT](https://github.com/thebridgedev/bridge-cli/blob/main/LICENSE) © Nebulr. Built by [The Bridge](https://thebridge.dev/?utm_source=npm&utm_medium=readme&utm_campaign=bridge-cli).
152
+ MIT