@nebulr-group/bridge-cli 0.6.5 → 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 -298
  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
@@ -1,42 +0,0 @@
1
- import type { Rule } from '@nebulr-group/bridge-auth-core';
2
- /** The fields a coherence check reads. Values as stored; defaults applied here. */
3
- export interface FlagLike {
4
- key: string;
5
- state?: string;
6
- valueType?: string;
7
- onValue?: unknown;
8
- offValue?: unknown;
9
- rule?: Rule | null;
10
- }
11
- /** What the app actually has, for the dangling-reference check. */
12
- export interface CoherenceCatalog {
13
- /** Rules compare the KEY; the name is kept to say which key was meant. */
14
- plans: Array<{
15
- key: string;
16
- name?: string;
17
- }>;
18
- roles: Array<{
19
- key: string;
20
- name?: string;
21
- }>;
22
- }
23
- /**
24
- * The warnings for one flag. Pure. `catalog` omitted skips the
25
- * dangling-reference check (the caller could not read plans/roles).
26
- */
27
- export declare function flagCoherenceWarnings(flag: FlagLike, catalog?: CoherenceCatalog): string[];
28
- /** True when any condition reads a plan or role attribute (worth fetching the catalog). */
29
- export declare function ruleReadsPlanOrRole(rule: Rule | null | undefined): boolean;
30
- /**
31
- * Plans and roles for the dangling-reference check. Never throws: a login
32
- * that cannot read plans or roles gets no dangling-reference warning rather
33
- * than a failed flag command — a warning never blocks.
34
- */
35
- export declare function loadCoherenceCatalog(): Promise<CoherenceCatalog | undefined>;
36
- /** Warnings for a list of flags, fetching the catalog once and only if a rule needs it. */
37
- export declare function warningsForFlags(flags: FlagLike[]): Promise<string[][]>;
38
- /** A flag with its warnings attached — only when there are any, so a coherent flag prints as before. */
39
- export declare function withFlagWarnings<T extends FlagLike>(flag: T): Promise<T | (T & {
40
- warnings: string[];
41
- })>;
42
- //# sourceMappingURL=flag-coherence.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"flag-coherence.d.ts","sourceRoot":"","sources":["../src/flag-coherence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAgB3D,mFAAmF;AACnF,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB;AAED,mEAAmE;AACnE,MAAM,WAAW,gBAAgB;IAC/B,0EAA0E;IAC1E,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7C,KAAK,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9C;AAiBD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAuD1F;AAED,2FAA2F;AAC3F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAO1E;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAWlF;AAED,2FAA2F;AAC3F,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAG7E;AAED,wGAAwG;AACxG,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAAC,CAI7G"}
@@ -1,103 +0,0 @@
1
- import { getManagementClient } from './config.js';
2
- /** Attributes whose value names a plan (the JWT `plan` claim, billing slug). */
3
- const PLAN_ATTRIBUTES = ['tenant.plan', 'bridge:billing.plan'];
4
- /** Attributes whose value names a role (the JWT `role` claim). */
5
- const ROLE_ATTRIBUTES = ['user.role'];
6
- /** Operators whose values are compared for equality with the attribute. */
7
- const EQUALITY_OPERATORS = ['eq', 'neq', 'in', 'not_in'];
8
- function sameValue(a, b) {
9
- return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);
10
- }
11
- function listed(entries) {
12
- return entries.length ? entries.map((e) => e.key).join(', ') : '(none)';
13
- }
14
- /**
15
- * The warnings for one flag. Pure. `catalog` omitted skips the
16
- * dangling-reference check (the caller could not read plans/roles).
17
- */
18
- export function flagCoherenceWarnings(flag, catalog) {
19
- const warnings = [];
20
- const state = flag.state ?? 'off';
21
- const valueType = flag.valueType ?? 'boolean';
22
- const onValue = flag.onValue !== undefined ? flag.onValue : true;
23
- const offValue = flag.offValue !== undefined ? flag.offValue : false;
24
- if (state === 'on') {
25
- if (valueType === 'boolean' && onValue === false) {
26
- warnings.push(`Flag "${flag.key}" is switched on, but its onValue is false, so it returns false for ` +
27
- 'everyone: it looks on and behaves off. Set onValue to true, or switch the flag off.');
28
- }
29
- else if (sameValue(onValue, offValue)) {
30
- warnings.push(`Flag "${flag.key}" is switched on, but its onValue equals its offValue ` +
31
- `(${JSON.stringify(onValue)}), so switching it on or off changes nothing.`);
32
- }
33
- }
34
- if (catalog && flag.rule) {
35
- for (const branch of flag.rule.branches ?? []) {
36
- for (const condition of branch.conditions ?? []) {
37
- if (!EQUALITY_OPERATORS.includes(condition.operator))
38
- continue;
39
- const isPlan = PLAN_ATTRIBUTES.includes(condition.attribute);
40
- const isRole = ROLE_ATTRIBUTES.includes(condition.attribute);
41
- if (!isPlan && !isRole)
42
- continue;
43
- const known = isPlan ? catalog.plans : catalog.roles;
44
- const keys = new Set(known.map((k) => k.key));
45
- const what = isPlan ? 'plan' : 'role';
46
- for (const value of condition.values ?? []) {
47
- if (typeof value !== 'string' || keys.has(value))
48
- continue;
49
- // The token carries the plan/role KEY, so a display name never matches.
50
- const byName = known.find((k) => k.name === value);
51
- if (byName) {
52
- warnings.push(`Flag "${flag.key}" has a rule on ${condition.attribute} ${condition.operator} ` +
53
- `"${value}", which matches the ${what} named "${value}" by name; rules compare the ` +
54
- `${what} key — use "${byName.key}".`);
55
- continue;
56
- }
57
- warnings.push(`Flag "${flag.key}" has a rule on ${condition.attribute} ${condition.operator} ` +
58
- `"${value}", but the app has no ${what} "${value}", so no real ` +
59
- `${isPlan ? 'workspace' : 'user'} can carry it. Existing ${what} keys: ` +
60
- `${listed(known)}.`);
61
- }
62
- }
63
- }
64
- }
65
- return warnings;
66
- }
67
- /** True when any condition reads a plan or role attribute (worth fetching the catalog). */
68
- export function ruleReadsPlanOrRole(rule) {
69
- if (!rule)
70
- return false;
71
- return (rule.branches ?? []).some((b) => (b.conditions ?? []).some((c) => PLAN_ATTRIBUTES.includes(c.attribute) || ROLE_ATTRIBUTES.includes(c.attribute)));
72
- }
73
- /**
74
- * Plans and roles for the dangling-reference check. Never throws: a login
75
- * that cannot read plans or roles gets no dangling-reference warning rather
76
- * than a failed flag command — a warning never blocks.
77
- */
78
- export async function loadCoherenceCatalog() {
79
- try {
80
- const client = getManagementClient();
81
- const [plans, roles] = await Promise.all([client.plans.list(), client.roles.list()]);
82
- return {
83
- plans: (plans ?? []).map((p) => ({ key: String(p.key), name: p.name })),
84
- roles: (roles ?? []).map((r) => ({ key: String(r.key), name: r.name })),
85
- };
86
- }
87
- catch {
88
- return undefined;
89
- }
90
- }
91
- /** Warnings for a list of flags, fetching the catalog once and only if a rule needs it. */
92
- export async function warningsForFlags(flags) {
93
- const catalog = flags.some((f) => ruleReadsPlanOrRole(f.rule)) ? await loadCoherenceCatalog() : undefined;
94
- return flags.map((f) => flagCoherenceWarnings(f, catalog));
95
- }
96
- /** A flag with its warnings attached — only when there are any, so a coherent flag prints as before. */
97
- export async function withFlagWarnings(flag) {
98
- if (!flag || typeof flag !== 'object')
99
- return flag;
100
- const [warnings] = await warningsForFlags([flag]);
101
- return warnings.length ? { ...flag, warnings } : flag;
102
- }
103
- //# sourceMappingURL=flag-coherence.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"flag-coherence.js","sourceRoot":"","sources":["../src/flag-coherence.ts"],"names":[],"mappings":"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"}
package/dist/output.d.ts DELETED
@@ -1,17 +0,0 @@
1
- export declare function outputSuccess(data: unknown): void;
2
- /**
3
- * Emit a prompt body verbatim to stdout — used by `bridge guide …` commands
4
- * whose output is intended to be read by a human or pasted to an AI agent.
5
- * Wrapping the markdown in a JSON envelope makes it unreadable in a terminal
6
- * and forces scripts to parse JSON to recover the original text. Use the
7
- * `--json` flag on each guide command if the envelope is needed for tooling.
8
- */
9
- export declare function outputPrompt(content: string): void;
10
- /**
11
- * Turn "Privilege 'TOKEN_WRITE' required" into something the reader can act
12
- * on. Without this the message is a dead end: it names a privilege but not how
13
- * to obtain one, and the answer ("log in again, differently") is not guessable.
14
- */
15
- export declare function privilegeHint(message: string): string | undefined;
16
- export declare function outputError(error: unknown): void;
17
- //# sourceMappingURL=output.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAIA,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAGjD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAGD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUjE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAwEhD"}
package/dist/output.js DELETED
@@ -1,107 +0,0 @@
1
- import { HttpError } from '@nebulr-group/bridge-auth-core';
2
- import { ConfigError } from './config.js';
3
- import { ADMIN_SCOPE_PRIVILEGES } from './auth/scopes.js';
4
- export function outputSuccess(data) {
5
- const output = { success: true, data };
6
- process.stdout.write(JSON.stringify(output, null, 2) + '\n');
7
- }
8
- /**
9
- * Emit a prompt body verbatim to stdout — used by `bridge guide …` commands
10
- * whose output is intended to be read by a human or pasted to an AI agent.
11
- * Wrapping the markdown in a JSON envelope makes it unreadable in a terminal
12
- * and forces scripts to parse JSON to recover the original text. Use the
13
- * `--json` flag on each guide command if the envelope is needed for tooling.
14
- */
15
- export function outputPrompt(content) {
16
- process.stdout.write(content.endsWith('\n') ? content : content + '\n');
17
- }
18
- /**
19
- * Turn "Privilege 'TOKEN_WRITE' required" into something the reader can act
20
- * on. Without this the message is a dead end: it names a privilege but not how
21
- * to obtain one, and the answer ("log in again, differently") is not guessable.
22
- */
23
- export function privilegeHint(message) {
24
- const match = /Privilege '([A-Z_]+)' required/.exec(message);
25
- const privilege = match?.[1];
26
- if (!privilege || !ADMIN_SCOPE_PRIVILEGES.has(privilege))
27
- return undefined;
28
- return (`Your login token does not carry ${privilege}. ` +
29
- 'Re-authenticate with `bridge auth login --admin` to request delete authority ' +
30
- 'and the ability to create API tokens. The default login deliberately omits ' +
31
- 'them — the token is stored on disk and lives for 10 days.');
32
- }
33
- export function outputError(error) {
34
- let code = 'UNKNOWN_ERROR';
35
- let message = 'An unknown error occurred';
36
- let details = undefined;
37
- let hint;
38
- let fields;
39
- let exitCode = 1;
40
- if (error instanceof ConfigError) {
41
- code = 'CONFIG_ERROR';
42
- message = error.message;
43
- exitCode = 3;
44
- // TBP-769 — a config error may name its own code and next step.
45
- const carriedCode = error.code;
46
- if (typeof carriedCode === 'string' && carriedCode.length > 0)
47
- code = carriedCode;
48
- const carriedHint = error.hint;
49
- if (typeof carriedHint === 'string' && carriedHint.length > 0)
50
- hint = carriedHint;
51
- }
52
- else if (error instanceof HttpError) {
53
- code = `HTTP_${error.status}`;
54
- message = error.message;
55
- details = error.body;
56
- exitCode = error.status >= 500 ? 2 : 1;
57
- // Extract nblocksCode if present
58
- if (typeof error.body === 'object' && error.body && 'nblocksCode' in error.body) {
59
- code = error.body.nblocksCode;
60
- }
61
- // TBP-541 — the server named the fix itself; that beats any generic hint.
62
- const serverFix = typeof error.body === 'object' && error.body && 'fix' in error.body
63
- ? error.body.fix
64
- : undefined;
65
- if (typeof serverFix === 'string' && serverFix.length > 0) {
66
- hint = serverFix;
67
- }
68
- else if (error.status === 403) {
69
- // The server's message is the authoritative one; check the body too,
70
- // since the privilege name sometimes only appears there.
71
- const bodyMessage = typeof error.body === 'object' && error.body && 'message' in error.body
72
- ? String(error.body.message)
73
- : '';
74
- hint = privilegeHint(message) ?? privilegeHint(bodyMessage);
75
- }
76
- }
77
- else if (error instanceof Error) {
78
- message = error.message;
79
- // TBP-586: errors that carry their own machine-readable `code` (e.g.
80
- // ResolveError's FLAG_NOT_FOUND / TENANT_AMBIGUOUS / INVALID_OPTIONS)
81
- // report it instead of collapsing to UNKNOWN_ERROR.
82
- const carried = error.code;
83
- if (typeof carried === 'string' && carried.length > 0) {
84
- code = carried;
85
- }
86
- // TBP-713: a DecisionNeededError carries the next step and the questions.
87
- const carriedHint = error.hint;
88
- if (typeof carriedHint === 'string' && carriedHint.length > 0)
89
- hint = carriedHint;
90
- const carriedFields = error.fields;
91
- if (Array.isArray(carriedFields))
92
- fields = carriedFields;
93
- }
94
- const output = {
95
- success: false,
96
- error: {
97
- code,
98
- message,
99
- ...(hint !== undefined ? { hint } : {}),
100
- ...(fields !== undefined ? { fields } : {}),
101
- ...(details !== undefined ? { details } : {}),
102
- },
103
- };
104
- process.stderr.write(JSON.stringify(output, null, 2) + '\n');
105
- process.exitCode = exitCode;
106
- }
107
- //# sourceMappingURL=output.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
package/dist/preview.d.ts DELETED
@@ -1,9 +0,0 @@
1
- export declare class PreviewNotSupportedError extends Error {
2
- readonly path: string;
3
- readonly serverBody?: unknown | undefined;
4
- readonly code = "PREVIEW_NOT_SUPPORTED";
5
- constructor(path: string, serverBody?: unknown | undefined);
6
- }
7
- export declare function previewPath(path: string): string;
8
- export declare function dryRunPreview(path: string, headers?: Record<string, string>): Promise<unknown>;
9
- //# sourceMappingURL=preview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"AAmBA,qBAAa,wBAAyB,SAAQ,KAAK;IAErC,QAAQ,CAAC,IAAI,EAAE,MAAM;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO;IADhE,QAAQ,CAAC,IAAI,2BAA2B;gBACnB,IAAI,EAAE,MAAM,EAAW,UAAU,CAAC,EAAE,OAAO,YAAA;CAOjE;AAcD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBpG"}
package/dist/preview.js DELETED
@@ -1,63 +0,0 @@
1
- import { HttpError } from '@nebulr-group/bridge-auth-core';
2
- import { getManagementHttp } from './config.js';
3
- /*
4
- * TBP-709 (E) — `--dry-run` on the destructive commands.
5
- *
6
- * The preview is the server's: every delete route has a read-only sibling,
7
- * `GET <route>/deletion-preview`, that answers with what the delete would
8
- * remove and removes nothing. It passes the same guards as the delete, so a
9
- * login without the destructive privilege gets the same 403 — and it is the
10
- * same answer the MCP tools' `dryRun` shows.
11
- *
12
- * Why a GET on its own path, and never `?dryRun=true` on the DELETE: this CLI
13
- * is released separately from the server and is pointed at servers that
14
- * predate previews. Such a server ignores an unknown query parameter and
15
- * PERFORMS THE DELETE; it answers an unknown path with 404. So a 404 here
16
- * means "no previews on this server", and the command stops — it never falls
17
- * back to the delete.
18
- */
19
- export class PreviewNotSupportedError extends Error {
20
- path;
21
- serverBody;
22
- code = 'PREVIEW_NOT_SUPPORTED';
23
- constructor(path, serverBody) {
24
- super(`This Bridge server does not support deletion previews yet (GET ${path} answered 404). ` +
25
- 'Nothing was deleted. Run without --dry-run only if you mean to delete.');
26
- this.path = path;
27
- this.serverBody = serverBody;
28
- this.name = 'PreviewNotSupportedError';
29
- }
30
- }
31
- /*
32
- * A server that HAS the route still 404s a record that does not exist, with
33
- * its own message ("tenant not found"). An unknown route gets the framework's
34
- * "Cannot GET …" (or a bare "Not Found" from a proxy in front). Only the
35
- * former is passed through as-is; either way the command fails and deletes
36
- * nothing — this only decides which message the user reads.
37
- */
38
- function isRecordNotFound(body) {
39
- const message = body && typeof body === 'object' ? body.message : undefined;
40
- return typeof message === 'string' && !/^Cannot GET\b/.test(message) && message !== 'Not Found';
41
- }
42
- export function previewPath(path) {
43
- return `${path}/deletion-preview`;
44
- }
45
- export async function dryRunPreview(path, headers) {
46
- const route = previewPath(path);
47
- let preview;
48
- try {
49
- preview = await getManagementHttp().get(route, headers);
50
- }
51
- catch (err) {
52
- if (err instanceof HttpError && err.status === 404 && !isRecordNotFound(err.body)) {
53
- throw new PreviewNotSupportedError(route, err.body);
54
- }
55
- throw err;
56
- }
57
- return {
58
- ...(preview && typeof preview === 'object' ? preview : {}),
59
- dryRun: true,
60
- next: 'Nothing was changed. Run the same command without --dry-run to go ahead.',
61
- };
62
- }
63
- //# sourceMappingURL=preview.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preview.js","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IAE5B;IAAuB;IADnC,IAAI,GAAG,uBAAuB,CAAC;IACxC,YAAqB,IAAY,EAAW,UAAoB;QAC9D,KAAK,CACH,kEAAkE,IAAI,kBAAkB;YACtF,wEAAwE,CAC3E,CAAC;QAJiB,SAAI,GAAJ,IAAI,CAAQ;QAAW,eAAU,GAAV,UAAU,CAAU;QAK9D,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AAED;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,IAAa;IACrC,MAAM,OAAO,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,IAA8B,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACvG,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,WAAW,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,GAAG,IAAI,mBAAmB,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,OAAgC;IAChF,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,OAAgC,CAAC;IACrC,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,iBAAiB,EAAE,CAAC,GAAG,CAA0B,KAAK,EAAE,OAAO,CAAC,CAAC;IACnF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAClF,MAAM,IAAI,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,OAAO;QACL,GAAG,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,0EAA0E;KACjF,CAAC;AACJ,CAAC"}
@@ -1,40 +0,0 @@
1
- /**
2
- * TBP-713 — the product decisions a command never makes for the developer.
3
- *
4
- * The list is bridge-api's PRODUCT_DECISIONS, shipped here as the generated
5
- * `prompts/product-decisions.json` (bridge-api's guide-currency.spec.ts fails
6
- * when the two differ). A command missing one of these stops before writing
7
- * anything, exits non-zero with `DECISION_NEEDED`, and lists the same fields
8
- * the MCP tool would, plus the flag that answers each.
9
- */
10
- export interface ProductDecision {
11
- tool: string;
12
- cli?: string;
13
- field: string;
14
- guide: string;
15
- enforcement: 'ask' | 'only-when-given';
16
- question: string;
17
- type: 'string' | 'number' | 'boolean' | 'enum';
18
- options?: string[];
19
- }
20
- export interface DecisionField {
21
- name: string;
22
- question: string;
23
- type: ProductDecision['type'];
24
- options?: string[];
25
- /** The flag (or spec key) that answers it on this command. */
26
- flag?: string;
27
- }
28
- /** `prompts/product-decisions.json`, from `dist/prompts` or the source tree. */
29
- export declare function loadProductDecisions(): ProductDecision[];
30
- /** One missing decision, by the MCP tool's field name; throws on a name not in the list. */
31
- export declare function decisionField(tool: string, field: string, flag?: string, name?: string): DecisionField;
32
- /** Thrown before any write; outputError prints code, message, hint and fields and exits 1. */
33
- export declare class DecisionNeededError extends Error {
34
- readonly command: string;
35
- readonly fields: DecisionField[];
36
- readonly code = "DECISION_NEEDED";
37
- readonly hint: string;
38
- constructor(command: string, fields: DecisionField[], context?: string);
39
- }
40
- //# sourceMappingURL=product-decisions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"product-decisions.d.ts","sourceRoot":"","sources":["../src/product-decisions.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,KAAK,GAAG,iBAAiB,CAAC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAID,gFAAgF;AAChF,wBAAgB,oBAAoB,IAAI,eAAe,EAAE,CAexD;AAED,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,MAAc,GAAG,aAAa,CAI7G;AAED,8FAA8F;AAC9F,qBAAa,mBAAoB,SAAQ,KAAK;IAIhC,QAAQ,CAAC,OAAO,EAAE,MAAM;IAAE,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE;IAHtE,QAAQ,CAAC,IAAI,qBAAqB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAED,OAAO,EAAE,MAAM,EAAW,MAAM,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM;CAczF"}
@@ -1,52 +0,0 @@
1
- import { readFileSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { commandsDir } from './commands/runtime-dir.js';
4
- let cached;
5
- /** `prompts/product-decisions.json`, from `dist/prompts` or the source tree. */
6
- export function loadProductDecisions() {
7
- if (cached)
8
- return cached;
9
- const candidates = [
10
- join(commandsDir, '..', 'prompts', 'product-decisions.json'),
11
- join(commandsDir, '..', '..', 'prompts', 'product-decisions.json'),
12
- ];
13
- for (const path of candidates) {
14
- try {
15
- cached = JSON.parse(readFileSync(path, 'utf-8')).decisions;
16
- return cached;
17
- }
18
- catch {
19
- /* try next */
20
- }
21
- }
22
- throw new Error(`product-decisions.json not found. Tried: ${candidates.join(', ')}`);
23
- }
24
- /** One missing decision, by the MCP tool's field name; throws on a name not in the list. */
25
- export function decisionField(tool, field, flag, name = field) {
26
- const d = loadProductDecisions().find((x) => x.tool === tool && x.field === field);
27
- if (!d)
28
- throw new Error(`No product decision ${tool}.${field} in product-decisions.json`);
29
- return { name, question: d.question, type: d.type, ...(d.options ? { options: [...d.options] } : {}), ...(flag ? { flag } : {}) };
30
- }
31
- /** Thrown before any write; outputError prints code, message, hint and fields and exits 1. */
32
- export class DecisionNeededError extends Error {
33
- command;
34
- fields;
35
- code = 'DECISION_NEEDED';
36
- hint;
37
- constructor(command, fields, context) {
38
- const names = fields.map((f) => f.name).join(', ');
39
- super(`${command} needs ${fields.length === 1 ? 'a product decision' : `${fields.length} product decisions`} ` +
40
- `the developer has not made: ${names}.${context ? ` ${context}` : ''} Nothing was changed.`);
41
- this.command = command;
42
- this.fields = fields;
43
- this.name = 'DecisionNeededError';
44
- const guide = loadProductDecisions().find((d) => d.cli === command)?.guide;
45
- const flags = fields.map((f) => f.flag ?? f.name).join(' ');
46
- this.hint =
47
- `Ask the developer each question in fields and wait for the answers; do not choose values for them. ` +
48
- `Then run ${command} again with ${flags}.` +
49
- (guide ? ` \`bridge guide decision ${guide}\` says what each choice means.` : '');
50
- }
51
- }
52
- //# sourceMappingURL=product-decisions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"product-decisions.js","sourceRoot":"","sources":["../src/product-decisions.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- /**
2
- * Single source of truth for every raw.githubusercontent.com URL the CLI builds.
3
- *
4
- * TBP-585: `bridge integrate` and `bridge guide` each hardcoded their own copy
5
- * of the base URL and drifted — integrate pointed at the wrong GitHub org
6
- * (`nebulr-group`) *and* the wrong path (missing the nested package dir), so its
7
- * remote fallback was a permanent 404. The fallback is invisible in normal use
8
- * (an installed CLI reads the bundled prompt first), which is exactly why it
9
- * must be derived rather than retyped.
10
- *
11
- * Nothing outside this module should contain a raw.githubusercontent literal;
12
- * `src/__tests__/prompt-urls.test.ts` enforces that.
13
- */
14
- /** GitHub org that owns every Bridge repo the CLI reads content from. */
15
- export declare const GITHUB_RAW_BASE_URL = "https://raw.githubusercontent.com/thebridgedev";
16
- /**
17
- * The published npm package lives in a `bridge-cli/` subdirectory of the
18
- * `bridge-cli` repo — hence the doubled segment. Dropping it yields a 404.
19
- */
20
- export declare const CLI_PROMPTS_BASE_URL = "https://raw.githubusercontent.com/thebridgedev/bridge-cli/main/bridge-cli/prompts";
21
- /** URL of a prompt bundled in this repo, e.g. cliPromptUrl('flags', 'master.md'). */
22
- export declare function cliPromptUrl(...segments: string[]): string;
23
- /**
24
- * URL of a per-framework prompt owned by a plugin repo. `repoPrefix` is the
25
- * `<repo>/<ref>` pair from GUIDE_REPOS, e.g. `bridge-svelte/main`.
26
- */
27
- export declare function pluginGuideUrl(repoPrefix: string, filename: string): string;
28
- /** Master auth integration prompt — shared by `bridge integrate` and `bridge guide`. */
29
- export declare const AUTH_MASTER_PROMPT_FILENAME = "auth-master-integration-prompt.md";
30
- export declare const AUTH_MASTER_PROMPT_URL: string;
31
- //# sourceMappingURL=prompt-urls.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt-urls.d.ts","sourceRoot":"","sources":["../src/prompt-urls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,yEAAyE;AACzE,eAAO,MAAM,mBAAmB,mDAAmD,CAAC;AAEpF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,sFAA8D,CAAC;AAEhG,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,GAAG,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAE1D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,wFAAwF;AACxF,eAAO,MAAM,2BAA2B,sCAAsC,CAAC;AAC/E,eAAO,MAAM,sBAAsB,QAA4C,CAAC"}
@@ -1,35 +0,0 @@
1
- /**
2
- * Single source of truth for every raw.githubusercontent.com URL the CLI builds.
3
- *
4
- * TBP-585: `bridge integrate` and `bridge guide` each hardcoded their own copy
5
- * of the base URL and drifted — integrate pointed at the wrong GitHub org
6
- * (`nebulr-group`) *and* the wrong path (missing the nested package dir), so its
7
- * remote fallback was a permanent 404. The fallback is invisible in normal use
8
- * (an installed CLI reads the bundled prompt first), which is exactly why it
9
- * must be derived rather than retyped.
10
- *
11
- * Nothing outside this module should contain a raw.githubusercontent literal;
12
- * `src/__tests__/prompt-urls.test.ts` enforces that.
13
- */
14
- /** GitHub org that owns every Bridge repo the CLI reads content from. */
15
- export const GITHUB_RAW_BASE_URL = 'https://raw.githubusercontent.com/thebridgedev';
16
- /**
17
- * The published npm package lives in a `bridge-cli/` subdirectory of the
18
- * `bridge-cli` repo — hence the doubled segment. Dropping it yields a 404.
19
- */
20
- export const CLI_PROMPTS_BASE_URL = `${GITHUB_RAW_BASE_URL}/bridge-cli/main/bridge-cli/prompts`;
21
- /** URL of a prompt bundled in this repo, e.g. cliPromptUrl('flags', 'master.md'). */
22
- export function cliPromptUrl(...segments) {
23
- return [CLI_PROMPTS_BASE_URL, ...segments].join('/');
24
- }
25
- /**
26
- * URL of a per-framework prompt owned by a plugin repo. `repoPrefix` is the
27
- * `<repo>/<ref>` pair from GUIDE_REPOS, e.g. `bridge-svelte/main`.
28
- */
29
- export function pluginGuideUrl(repoPrefix, filename) {
30
- return `${GITHUB_RAW_BASE_URL}/${repoPrefix}/mcp/${filename}`;
31
- }
32
- /** Master auth integration prompt — shared by `bridge integrate` and `bridge guide`. */
33
- export const AUTH_MASTER_PROMPT_FILENAME = 'auth-master-integration-prompt.md';
34
- export const AUTH_MASTER_PROMPT_URL = cliPromptUrl(AUTH_MASTER_PROMPT_FILENAME);
35
- //# sourceMappingURL=prompt-urls.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt-urls.js","sourceRoot":"","sources":["../src/prompt-urls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,yEAAyE;AACzE,MAAM,CAAC,MAAM,mBAAmB,GAAG,gDAAgD,CAAC;AAEpF;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,mBAAmB,qCAAqC,CAAC;AAEhG,qFAAqF;AACrF,MAAM,UAAU,YAAY,CAAC,GAAG,QAAkB;IAChD,OAAO,CAAC,oBAAoB,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,QAAgB;IACjE,OAAO,GAAG,mBAAmB,IAAI,UAAU,QAAQ,QAAQ,EAAE,CAAC;AAChE,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,MAAM,2BAA2B,GAAG,mCAAmC,CAAC;AAC/E,MAAM,CAAC,MAAM,sBAAsB,GAAG,YAAY,CAAC,2BAA2B,CAAC,CAAC"}