@getbrevo/cli 2.0.2 → 2.1.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 (217) hide show
  1. package/CHANGELOG.md +209 -0
  2. package/README.md +8 -5
  3. package/agent-context/AGENTS.md +59 -15
  4. package/agent-context/SKILL.md +70 -14
  5. package/dist/{templates → bin}/files/AGENTS.md.tmpl +11 -1
  6. package/dist/{templates → bin}/files/CLAUDE.md.tmpl +8 -0
  7. package/dist/{templates → bin}/files/README.md.tmpl +11 -14
  8. package/dist/bin/files/app-config.json.tmpl +16 -0
  9. package/dist/{templates → bin}/files/src/oauth/.env.example.tmpl +8 -0
  10. package/dist/{templates → bin}/files/src/oauth/.env.local.tmpl +2 -0
  11. package/dist/{templates → bin}/files/src/oauth/handler.js.tmpl +49 -7
  12. package/dist/{templates → bin}/files/src/oauth/server.js.tmpl +20 -14
  13. package/dist/{templates → bin}/files/src/oauth/token-store.js.tmpl +19 -0
  14. package/dist/bin/index.js +660 -235
  15. package/dist/bin/index.js.map +7 -1
  16. package/package.json +6 -4
  17. package/dist/api/client.d.ts +0 -25
  18. package/dist/api/client.d.ts.map +0 -1
  19. package/dist/api/client.js +0 -205
  20. package/dist/api/client.js.map +0 -1
  21. package/dist/bin/index.d.ts +0 -3
  22. package/dist/bin/index.d.ts.map +0 -1
  23. package/dist/commands/app/create.d.ts +0 -8
  24. package/dist/commands/app/create.d.ts.map +0 -1
  25. package/dist/commands/app/create.js +0 -325
  26. package/dist/commands/app/create.js.map +0 -1
  27. package/dist/commands/app/credentials.d.ts +0 -6
  28. package/dist/commands/app/credentials.d.ts.map +0 -1
  29. package/dist/commands/app/credentials.js +0 -114
  30. package/dist/commands/app/credentials.js.map +0 -1
  31. package/dist/commands/app/delete.d.ts +0 -6
  32. package/dist/commands/app/delete.d.ts.map +0 -1
  33. package/dist/commands/app/delete.js +0 -167
  34. package/dist/commands/app/delete.js.map +0 -1
  35. package/dist/commands/app/list.d.ts +0 -4
  36. package/dist/commands/app/list.d.ts.map +0 -1
  37. package/dist/commands/app/list.js +0 -71
  38. package/dist/commands/app/list.js.map +0 -1
  39. package/dist/commands/app/scaffold.d.ts +0 -5
  40. package/dist/commands/app/scaffold.d.ts.map +0 -1
  41. package/dist/commands/app/scaffold.js +0 -213
  42. package/dist/commands/app/scaffold.js.map +0 -1
  43. package/dist/commands/app/scopes.d.ts +0 -2
  44. package/dist/commands/app/scopes.d.ts.map +0 -1
  45. package/dist/commands/app/scopes.js +0 -81
  46. package/dist/commands/app/scopes.js.map +0 -1
  47. package/dist/commands/app/start.d.ts +0 -5
  48. package/dist/commands/app/start.d.ts.map +0 -1
  49. package/dist/commands/app/start.js +0 -220
  50. package/dist/commands/app/start.js.map +0 -1
  51. package/dist/commands/app/update.d.ts +0 -2
  52. package/dist/commands/app/update.d.ts.map +0 -1
  53. package/dist/commands/app/update.js +0 -444
  54. package/dist/commands/app/update.js.map +0 -1
  55. package/dist/commands/definitions.d.ts +0 -5
  56. package/dist/commands/definitions.d.ts.map +0 -1
  57. package/dist/commands/definitions.js +0 -262
  58. package/dist/commands/definitions.js.map +0 -1
  59. package/dist/commands/init.d.ts +0 -2
  60. package/dist/commands/init.d.ts.map +0 -1
  61. package/dist/commands/init.js +0 -138
  62. package/dist/commands/init.js.map +0 -1
  63. package/dist/commands/login.d.ts +0 -6
  64. package/dist/commands/login.d.ts.map +0 -1
  65. package/dist/commands/login.js +0 -251
  66. package/dist/commands/login.js.map +0 -1
  67. package/dist/commands/logout.d.ts +0 -5
  68. package/dist/commands/logout.d.ts.map +0 -1
  69. package/dist/commands/logout.js +0 -54
  70. package/dist/commands/logout.js.map +0 -1
  71. package/dist/commands/skill/install.d.ts +0 -4
  72. package/dist/commands/skill/install.d.ts.map +0 -1
  73. package/dist/commands/skill/install.js +0 -29
  74. package/dist/commands/skill/install.js.map +0 -1
  75. package/dist/commands/skill/uninstall.d.ts +0 -4
  76. package/dist/commands/skill/uninstall.d.ts.map +0 -1
  77. package/dist/commands/skill/uninstall.js +0 -23
  78. package/dist/commands/skill/uninstall.js.map +0 -1
  79. package/dist/commands/whoami.d.ts +0 -4
  80. package/dist/commands/whoami.d.ts.map +0 -1
  81. package/dist/commands/whoami.js +0 -85
  82. package/dist/commands/whoami.js.map +0 -1
  83. package/dist/container.d.ts +0 -7
  84. package/dist/container.d.ts.map +0 -1
  85. package/dist/container.js +0 -28
  86. package/dist/container.js.map +0 -1
  87. package/dist/lang/en.d.ts +0 -162
  88. package/dist/lang/en.d.ts.map +0 -1
  89. package/dist/lang/en.js +0 -189
  90. package/dist/lang/en.js.map +0 -1
  91. package/dist/lib/abort.d.ts +0 -3
  92. package/dist/lib/abort.d.ts.map +0 -1
  93. package/dist/lib/abort.js +0 -30
  94. package/dist/lib/abort.js.map +0 -1
  95. package/dist/lib/auth-guard.d.ts +0 -13
  96. package/dist/lib/auth-guard.d.ts.map +0 -1
  97. package/dist/lib/auth-guard.js +0 -60
  98. package/dist/lib/auth-guard.js.map +0 -1
  99. package/dist/lib/browser.d.ts +0 -2
  100. package/dist/lib/browser.d.ts.map +0 -1
  101. package/dist/lib/browser.js +0 -16
  102. package/dist/lib/browser.js.map +0 -1
  103. package/dist/lib/cli-version.d.ts +0 -2
  104. package/dist/lib/cli-version.d.ts.map +0 -1
  105. package/dist/lib/cli-version.js +0 -59
  106. package/dist/lib/cli-version.js.map +0 -1
  107. package/dist/lib/command-handler.d.ts +0 -10
  108. package/dist/lib/command-handler.d.ts.map +0 -1
  109. package/dist/lib/command-handler.js +0 -16
  110. package/dist/lib/command-handler.js.map +0 -1
  111. package/dist/lib/command-registry.d.ts +0 -28
  112. package/dist/lib/command-registry.d.ts.map +0 -1
  113. package/dist/lib/command-registry.js +0 -54
  114. package/dist/lib/command-registry.js.map +0 -1
  115. package/dist/lib/config.d.ts +0 -83
  116. package/dist/lib/config.d.ts.map +0 -1
  117. package/dist/lib/config.js +0 -430
  118. package/dist/lib/config.js.map +0 -1
  119. package/dist/lib/constants.d.ts +0 -48
  120. package/dist/lib/constants.d.ts.map +0 -1
  121. package/dist/lib/constants.js +0 -121
  122. package/dist/lib/constants.js.map +0 -1
  123. package/dist/lib/errors.d.ts +0 -30
  124. package/dist/lib/errors.d.ts.map +0 -1
  125. package/dist/lib/errors.js +0 -66
  126. package/dist/lib/errors.js.map +0 -1
  127. package/dist/lib/exit-codes.d.ts +0 -9
  128. package/dist/lib/exit-codes.d.ts.map +0 -1
  129. package/dist/lib/exit-codes.js +0 -12
  130. package/dist/lib/exit-codes.js.map +0 -1
  131. package/dist/lib/hidden-input.d.ts +0 -2
  132. package/dist/lib/hidden-input.d.ts.map +0 -1
  133. package/dist/lib/hidden-input.js +0 -78
  134. package/dist/lib/hidden-input.js.map +0 -1
  135. package/dist/lib/json-output.d.ts +0 -6
  136. package/dist/lib/json-output.d.ts.map +0 -1
  137. package/dist/lib/json-output.js +0 -11
  138. package/dist/lib/json-output.js.map +0 -1
  139. package/dist/lib/logger.d.ts +0 -11
  140. package/dist/lib/logger.d.ts.map +0 -1
  141. package/dist/lib/logger.js +0 -110
  142. package/dist/lib/logger.js.map +0 -1
  143. package/dist/lib/oauth-freshness.d.ts +0 -30
  144. package/dist/lib/oauth-freshness.d.ts.map +0 -1
  145. package/dist/lib/oauth-freshness.js +0 -61
  146. package/dist/lib/oauth-freshness.js.map +0 -1
  147. package/dist/lib/port.d.ts +0 -25
  148. package/dist/lib/port.d.ts.map +0 -1
  149. package/dist/lib/port.js +0 -103
  150. package/dist/lib/port.js.map +0 -1
  151. package/dist/lib/telemetry.d.ts +0 -9
  152. package/dist/lib/telemetry.d.ts.map +0 -1
  153. package/dist/lib/telemetry.js +0 -57
  154. package/dist/lib/telemetry.js.map +0 -1
  155. package/dist/lib/ui.d.ts +0 -14
  156. package/dist/lib/ui.d.ts.map +0 -1
  157. package/dist/lib/ui.js +0 -75
  158. package/dist/lib/ui.js.map +0 -1
  159. package/dist/lib/update-notifier.d.ts +0 -37
  160. package/dist/lib/update-notifier.d.ts.map +0 -1
  161. package/dist/lib/update-notifier.js +0 -298
  162. package/dist/lib/update-notifier.js.map +0 -1
  163. package/dist/lib/validators.d.ts +0 -55
  164. package/dist/lib/validators.d.ts.map +0 -1
  165. package/dist/lib/validators.js +0 -166
  166. package/dist/lib/validators.js.map +0 -1
  167. package/dist/services/account.d.ts +0 -8
  168. package/dist/services/account.d.ts.map +0 -1
  169. package/dist/services/account.js +0 -15
  170. package/dist/services/account.js.map +0 -1
  171. package/dist/services/app.d.ts +0 -38
  172. package/dist/services/app.d.ts.map +0 -1
  173. package/dist/services/app.js +0 -145
  174. package/dist/services/app.js.map +0 -1
  175. package/dist/services/browser-auth.d.ts +0 -15
  176. package/dist/services/browser-auth.d.ts.map +0 -1
  177. package/dist/services/browser-auth.js +0 -188
  178. package/dist/services/browser-auth.js.map +0 -1
  179. package/dist/services/normalize-app-id.d.ts +0 -12
  180. package/dist/services/normalize-app-id.d.ts.map +0 -1
  181. package/dist/services/normalize-app-id.js +0 -38
  182. package/dist/services/normalize-app-id.js.map +0 -1
  183. package/dist/services/oauth-metadata.d.ts +0 -7
  184. package/dist/services/oauth-metadata.d.ts.map +0 -1
  185. package/dist/services/oauth-metadata.js +0 -43
  186. package/dist/services/oauth-metadata.js.map +0 -1
  187. package/dist/services/oauth-refresh.d.ts +0 -14
  188. package/dist/services/oauth-refresh.d.ts.map +0 -1
  189. package/dist/services/oauth-refresh.js +0 -70
  190. package/dist/services/oauth-refresh.js.map +0 -1
  191. package/dist/services/scopes-html.d.ts +0 -3
  192. package/dist/services/scopes-html.d.ts.map +0 -1
  193. package/dist/services/scopes-html.js +0 -516
  194. package/dist/services/scopes-html.js.map +0 -1
  195. package/dist/services/scopes-web.d.ts +0 -12
  196. package/dist/services/scopes-web.d.ts.map +0 -1
  197. package/dist/services/scopes-web.js +0 -95
  198. package/dist/services/scopes-web.js.map +0 -1
  199. package/dist/services/skill.d.ts +0 -48
  200. package/dist/services/skill.d.ts.map +0 -1
  201. package/dist/services/skill.js +0 -223
  202. package/dist/services/skill.js.map +0 -1
  203. package/dist/skills/index.d.ts +0 -47
  204. package/dist/skills/index.d.ts.map +0 -1
  205. package/dist/skills/index.js +0 -61
  206. package/dist/skills/index.js.map +0 -1
  207. package/dist/templates/files/app-config.json.tmpl +0 -25
  208. package/dist/templates/index.d.ts +0 -36
  209. package/dist/templates/index.d.ts.map +0 -1
  210. package/dist/templates/index.js +0 -105
  211. package/dist/templates/index.js.map +0 -1
  212. package/dist/types.d.ts +0 -32
  213. package/dist/types.d.ts.map +0 -1
  214. package/dist/types.js +0 -3
  215. package/dist/types.js.map +0 -1
  216. /package/dist/{templates → bin}/files/gitignore.tmpl +0 -0
  217. /package/dist/{templates → bin}/files/src/oauth/package.json.tmpl +0 -0
@@ -1,516 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.renderScopesHtml = renderScopesHtml;
4
- const constants_1 = require("../lib/constants");
5
- const en_1 = require("../lang/en");
6
- function escapeHtml(value) {
7
- return value
8
- .replaceAll('&', '&')
9
- .replaceAll('<', '&lt;')
10
- .replaceAll('>', '&gt;')
11
- .replaceAll('"', '&quot;')
12
- .replaceAll("'", '&#39;');
13
- }
14
- function safeJson(value) {
15
- // Safe for embedding inside <script type="application/json">: only
16
- // </script> can end the block, so we just neutralise '<'.
17
- return JSON.stringify(value).replaceAll('<', String.raw `\u003c`);
18
- }
19
- // Styling matches the Brevo developers docs (developers.brevo.com) — Brevo
20
- // green accent, pale-green hero, and charcoal-grey neutrals. Fonts use a
21
- // system stack (no CDN fetch or web-font download) so the page renders the
22
- // same with or without network.
23
- const STYLES = `
24
- :root {
25
- color-scheme: light dark;
26
- --bg: #ffffff;
27
- --hero-bg: #e6f6ec;
28
- --fg: #1b1b1b;
29
- --muted: #696969;
30
- --border: #e3e3e3;
31
- --accent: #0b996e;
32
- --card: #ffffff;
33
- --card-shadow: 0 1px 2px rgba(28, 28, 28, .08);
34
- --chip-bg: #e1f3e8;
35
- --chip-fg: #00734a;
36
- --section-header-bg: #f6fbf8;
37
- --error: #cf1a3b;
38
- --radius-card: 16px;
39
- --radius-input: 16px;
40
- --radius-chip: 20px;
41
- }
42
- @media (prefers-color-scheme: dark) {
43
- :root {
44
- --bg: #0e1613;
45
- --hero-bg: #142119;
46
- --fg: #f1f5f2;
47
- --muted: #94a89c;
48
- --border: #25382d;
49
- --accent: #3ddc97;
50
- --card: #16241c;
51
- --card-shadow: 0 1px 2px rgba(0, 0, 0, .4);
52
- --chip-bg: #1d3327;
53
- --chip-fg: #a7e3c5;
54
- --section-header-bg: #121f18;
55
- --error: #ff8d9a;
56
- }
57
- }
58
- * { box-sizing: border-box; }
59
- body {
60
- margin: 0;
61
- padding: 0;
62
- font: 15px/1.55 system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
63
- background: var(--bg);
64
- color: var(--fg);
65
- -webkit-font-smoothing: antialiased;
66
- -moz-osx-font-smoothing: grayscale;
67
- }
68
- .hero {
69
- background: var(--hero-bg);
70
- padding: 2.5rem 1.5rem 2rem;
71
- }
72
- .hero-inner {
73
- max-width: 880px;
74
- margin: 0 auto;
75
- display: flex;
76
- align-items: center;
77
- justify-content: space-between;
78
- gap: 1.5rem;
79
- flex-wrap: wrap;
80
- }
81
- .hero-copy { flex: 1 1 24rem; min-width: 0; }
82
- h1 {
83
- font-size: 2rem;
84
- line-height: 2.5rem;
85
- font-weight: 600;
86
- margin: 0 0 .5rem;
87
- }
88
- .intro { color: var(--muted); margin: 0; word-break: break-word; }
89
- a.docs-cta {
90
- display: inline-block;
91
- flex: none;
92
- white-space: nowrap;
93
- padding: .5rem 1.1rem;
94
- font-weight: 600;
95
- font-size: .9rem;
96
- color: #ffffff;
97
- background: var(--accent);
98
- border-radius: var(--radius-input);
99
- text-decoration: none;
100
- box-shadow: var(--card-shadow);
101
- }
102
- a.docs-cta:hover { opacity: .9; }
103
- @media (prefers-color-scheme: dark) {
104
- a.docs-cta { color: #0e1613; }
105
- }
106
- main {
107
- max-width: 880px;
108
- margin: 0 auto;
109
- padding: 1.5rem 1.5rem 4rem;
110
- }
111
- .toolbar {
112
- display: flex;
113
- gap: .75rem;
114
- align-items: center;
115
- margin-bottom: 1.5rem;
116
- }
117
- input[type="search"] {
118
- flex: 1;
119
- padding: .55rem .9rem;
120
- font: inherit;
121
- font-size: 1rem;
122
- border: 1px solid var(--border);
123
- border-radius: var(--radius-input);
124
- background: var(--card);
125
- color: var(--fg);
126
- }
127
- input[type="search"]:focus {
128
- outline: none;
129
- border-color: var(--accent);
130
- box-shadow: inset 0 0 0 1px var(--accent);
131
- }
132
- button.refresh {
133
- padding: .5rem 1rem;
134
- font: inherit;
135
- font-weight: 600;
136
- font-size: .9rem;
137
- border: 1px solid var(--border);
138
- border-radius: var(--radius-input);
139
- background: var(--card);
140
- color: var(--fg);
141
- cursor: pointer;
142
- box-shadow: var(--card-shadow);
143
- }
144
- button.refresh:hover { background: var(--chip-bg); border-color: var(--chip-bg); }
145
- button.refresh:disabled { opacity: .55; cursor: progress; }
146
- .refresh-error {
147
- margin: -.75rem 0 1rem;
148
- color: var(--error);
149
- font-size: .85rem;
150
- }
151
- section {
152
- border: 1px solid var(--border);
153
- border-radius: var(--radius-card);
154
- margin-bottom: 1rem;
155
- background: var(--card);
156
- box-shadow: var(--card-shadow);
157
- overflow: hidden;
158
- }
159
- section[hidden] { display: none; }
160
- .section-head {
161
- display: flex;
162
- align-items: center;
163
- justify-content: space-between;
164
- gap: .75rem;
165
- padding: .55rem 1rem;
166
- background: var(--section-header-bg);
167
- border-bottom: 1px solid var(--border);
168
- }
169
- .section-head h2 {
170
- font-size: .75rem;
171
- font-weight: 600;
172
- text-transform: uppercase;
173
- letter-spacing: .06em;
174
- color: var(--muted);
175
- margin: 0;
176
- }
177
- button.copy {
178
- font: inherit;
179
- font-size: .75rem;
180
- font-weight: 600;
181
- padding: .2rem .7rem;
182
- border: 1px solid var(--border);
183
- border-radius: var(--radius-chip);
184
- background: var(--card);
185
- color: var(--accent);
186
- cursor: pointer;
187
- white-space: nowrap;
188
- }
189
- button.copy:hover { background: var(--chip-bg); border-color: var(--chip-bg); }
190
- button.copy:disabled { opacity: .55; cursor: default; }
191
- .selection-bar {
192
- display: flex;
193
- gap: .75rem;
194
- align-items: center;
195
- margin-bottom: 1.5rem;
196
- }
197
- .selection-bar input[type="text"] {
198
- flex: 1;
199
- padding: .55rem .9rem;
200
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
201
- font-size: .85rem;
202
- border: 1px solid var(--border);
203
- border-radius: var(--radius-input);
204
- background: var(--card);
205
- color: var(--fg);
206
- }
207
- .selection-bar button.copy { padding: .5rem 1rem; font-size: .9rem; }
208
- ul { list-style: none; margin: 0; padding: .5rem 0; }
209
- li { padding: .4rem 1rem; }
210
- li[hidden] { display: none; }
211
- .scope-row { display: flex; align-items: flex-start; gap: .55rem; }
212
- .scope-row input[type="checkbox"] {
213
- accent-color: var(--accent);
214
- margin-top: .25rem;
215
- flex: none;
216
- cursor: pointer;
217
- }
218
- .scope-row details { flex: 1; min-width: 0; }
219
- .badge {
220
- font-size: .68rem;
221
- font-weight: 600;
222
- text-transform: uppercase;
223
- letter-spacing: .04em;
224
- color: var(--error);
225
- border: 1px solid currentColor;
226
- border-radius: var(--radius-chip);
227
- padding: 0 .45rem;
228
- margin-left: .5rem;
229
- vertical-align: middle;
230
- }
231
- details > summary {
232
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
233
- font-size: .9rem;
234
- cursor: pointer;
235
- list-style: revert;
236
- }
237
- details[open] > summary { margin-bottom: .35rem; }
238
- .endpoints {
239
- margin: .25rem 0 .25rem 1.1rem;
240
- padding: 0;
241
- display: flex;
242
- flex-wrap: wrap;
243
- gap: .35rem;
244
- }
245
- .endpoints .ep {
246
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
247
- font-size: .78rem;
248
- background: var(--chip-bg);
249
- color: var(--chip-fg);
250
- padding: .15rem .55rem;
251
- border-radius: var(--radius-chip);
252
- }
253
- .endpoints .none {
254
- font-size: .8rem;
255
- color: var(--muted);
256
- font-style: italic;
257
- }
258
- .empty { color: var(--muted); padding: 2rem 0; text-align: center; }
259
- footer {
260
- margin-top: 3rem;
261
- padding-top: 1.5rem;
262
- border-top: 1px solid var(--border);
263
- font-size: .8rem;
264
- color: var(--muted);
265
- }
266
- footer a { color: var(--accent); }
267
- `.trim();
268
- const SCRIPT = `
269
- (function () {
270
- var dataNode = document.getElementById('scopes-data');
271
- var state = dataNode ? JSON.parse(dataNode.textContent || '[]') : [];
272
-
273
- var listEl = document.getElementById('scopes-list');
274
- var searchEl = document.querySelector('input[type="search"]');
275
- var refreshBtn = document.getElementById('refresh-btn');
276
- var errorEl = document.getElementById('refresh-error');
277
- var introCountEl = document.getElementById('scopes-count');
278
- var selectedEl = document.getElementById('selected-scopes');
279
- var copySelectedBtn = document.getElementById('copy-selected');
280
- var labels = JSON.parse(document.getElementById('labels').textContent);
281
-
282
- // Selected scope names, in click order. Rendered as '"a","b"' — pastes
283
- // straight into app-config.json's auth.scopes array, and shells strip the
284
- // quotes so "brevo app update --scope" accepts the same paste.
285
- var selected = [];
286
-
287
- function quoted(names) {
288
- return names.map(function (n) { return '"' + n + '"'; }).join(',');
289
- }
290
-
291
- function escapeHtml(s) {
292
- return String(s).replace(/[&<>"']/g, function (c) {
293
- return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c];
294
- });
295
- }
296
-
297
- function render(entries) {
298
- if (!entries.length) {
299
- listEl.innerHTML = '<p class="empty">' + escapeHtml(labels.empty) + '</p>';
300
- return;
301
- }
302
- var byCategory = new Map();
303
- entries.forEach(function (e) {
304
- var list = byCategory.get(e.category);
305
- if (list) list.push(e);
306
- else byCategory.set(e.category, [e]);
307
- });
308
- var html = '';
309
- byCategory.forEach(function (items, cat) {
310
- var copyAria = labels.copyCategoryAria.replace('{category}', cat);
311
- html += '<section><div class="section-head"><h2>' + escapeHtml(cat) + '</h2>';
312
- html +=
313
- '<button type="button" class="copy copy-category" data-category="' + escapeHtml(cat) +
314
- '" aria-label="' + escapeHtml(copyAria) + '">' + escapeHtml(labels.copy) + '</button></div><ul>';
315
- items.forEach(function (e) {
316
- var endpoints = Array.isArray(e.apiEndpoints) ? e.apiEndpoints : [];
317
- var isLegacy = e.name === labels.legacyScope;
318
- html += '<li><div class="scope-row">';
319
- if (isLegacy) {
320
- // The legacy catch-all scope is deprecated: badge it, no checkbox,
321
- // and copy CTAs skip it so pasted lists never reintroduce it.
322
- html += '<details><summary>' + escapeHtml(e.name) +
323
- '<span class="badge" title="' + escapeHtml(labels.legacyTitle) + '">' +
324
- escapeHtml(labels.legacyBadge) + '</span></summary>';
325
- } else {
326
- var selectAria = labels.selectScopeAria.replace('{scope}', e.name);
327
- html += '<input type="checkbox" class="scope-check" data-scope="' + escapeHtml(e.name) +
328
- '" aria-label="' + escapeHtml(selectAria) + '"' +
329
- (selected.indexOf(e.name) !== -1 ? ' checked' : '') + '>';
330
- html += '<details><summary>' + escapeHtml(e.name) + '</summary>';
331
- }
332
- if (endpoints.length) {
333
- html += '<div class="endpoints" aria-label="' + escapeHtml(labels.endpointsLabel) + '">';
334
- endpoints.forEach(function (ep) {
335
- html += '<span class="ep">' + escapeHtml(ep) + '</span>';
336
- });
337
- html += '</div>';
338
- } else {
339
- html += '<div class="endpoints"><span class="none">' + escapeHtml(labels.noEndpoints) + '</span></div>';
340
- }
341
- html += '</details></div></li>';
342
- });
343
- html += '</ul></section>';
344
- });
345
- listEl.innerHTML = html;
346
- applyFilter();
347
- }
348
-
349
- function copyText(text, btn) {
350
- if (!navigator.clipboard || !navigator.clipboard.writeText) return;
351
- navigator.clipboard.writeText(text).then(function () {
352
- var original = btn.textContent;
353
- btn.textContent = labels.copied;
354
- setTimeout(function () {
355
- btn.textContent = original;
356
- }, 1200);
357
- }).catch(function () { /* clipboard denied — leave the button as-is */ });
358
- }
359
-
360
- function updateSelection() {
361
- selectedEl.value = quoted(selected);
362
- copySelectedBtn.disabled = selected.length === 0;
363
- }
364
-
365
- function applyFilter() {
366
- var q = searchEl ? searchEl.value.toLowerCase().trim() : '';
367
- var sections = listEl.querySelectorAll('section');
368
- sections.forEach(function (section) {
369
- var items = section.querySelectorAll('li');
370
- var anyVisible = false;
371
- items.forEach(function (li) {
372
- var text = li.textContent.toLowerCase();
373
- var match = q === '' || text.indexOf(q) !== -1;
374
- li.hidden = !match;
375
- if (match) anyVisible = true;
376
- });
377
- section.hidden = !anyVisible;
378
- });
379
- }
380
-
381
- function setCount(n) {
382
- if (introCountEl) introCountEl.textContent = String(n);
383
- }
384
-
385
- render(state);
386
- setCount(state.length);
387
- updateSelection();
388
-
389
- if (searchEl) {
390
- searchEl.addEventListener('input', applyFilter);
391
- }
392
-
393
- // Delegated handlers survive re-renders (refresh replaces listEl's HTML).
394
- listEl.addEventListener('click', function (ev) {
395
- var btn = ev.target.closest ? ev.target.closest('button.copy-category') : null;
396
- if (!btn) return;
397
- var cat = btn.getAttribute('data-category');
398
- var names = state
399
- .filter(function (e) { return e.category === cat && e.name !== labels.legacyScope; })
400
- .map(function (e) { return e.name; });
401
- copyText(quoted(names), btn);
402
- });
403
-
404
- listEl.addEventListener('change', function (ev) {
405
- var box = ev.target.closest ? ev.target.closest('input.scope-check') : null;
406
- if (!box) return;
407
- var name = box.getAttribute('data-scope');
408
- var idx = selected.indexOf(name);
409
- if (box.checked && idx === -1) selected.push(name);
410
- if (!box.checked && idx !== -1) selected.splice(idx, 1);
411
- updateSelection();
412
- });
413
-
414
- copySelectedBtn.addEventListener('click', function () {
415
- if (selected.length) copyText(quoted(selected), copySelectedBtn);
416
- });
417
-
418
- if (refreshBtn) {
419
- var defaultLabel = refreshBtn.textContent;
420
- refreshBtn.addEventListener('click', function () {
421
- refreshBtn.disabled = true;
422
- refreshBtn.textContent = labels.refreshing;
423
- if (errorEl) errorEl.hidden = true;
424
- fetch('/scopes.json', { headers: { Accept: 'application/json' } })
425
- .then(function (res) {
426
- if (!res.ok) throw new Error('HTTP ' + res.status);
427
- return res.json();
428
- })
429
- .then(function (body) {
430
- var entries = Array.isArray(body && body.scopes) ? body.scopes : [];
431
- state = entries;
432
- // Drop selections for scopes the IdP no longer returns.
433
- selected = selected.filter(function (name) {
434
- return state.some(function (e) { return e.name === name; });
435
- });
436
- render(state);
437
- setCount(state.length);
438
- updateSelection();
439
- })
440
- .catch(function () {
441
- if (errorEl) errorEl.hidden = false;
442
- })
443
- .then(function () {
444
- refreshBtn.disabled = false;
445
- refreshBtn.textContent = defaultLabel;
446
- });
447
- });
448
- }
449
- })();
450
- `.trim();
451
- function renderScopesHtml(entries) {
452
- const title = escapeHtml(en_1.messages.APP_SCOPES_WEB_TITLE);
453
- const intro = en_1.messages.APP_SCOPES_WEB_INTRO(entries.length, constants_1.OAUTH_SCOPES_URL);
454
- // The intro is rendered with a dynamic count span so refresh can update it
455
- // in place without re-rendering the source URL.
456
- const introWithSpan = escapeHtml(intro).replace(String(entries.length), `<span id="scopes-count">${entries.length}</span>`);
457
- const searchPlaceholder = escapeHtml(en_1.messages.APP_SCOPES_WEB_SEARCH_PLACEHOLDER);
458
- const refreshLabel = escapeHtml(en_1.messages.APP_SCOPES_WEB_REFRESH);
459
- const refreshError = escapeHtml(en_1.messages.APP_SCOPES_WEB_REFRESH_FAILED);
460
- const footer = escapeHtml(en_1.messages.APP_SCOPES_WEB_FOOTER);
461
- const docsLink = escapeHtml(en_1.messages.APP_SCOPES_WEB_DOCS_LINK);
462
- const catalogDocsCta = escapeHtml(en_1.messages.APP_SCOPES_WEB_CATALOG_DOCS_CTA);
463
- const selectedPlaceholder = escapeHtml(en_1.messages.APP_SCOPES_WEB_SELECTED_PLACEHOLDER);
464
- const copySelected = escapeHtml(en_1.messages.APP_SCOPES_WEB_COPY_SELECTED);
465
- const labels = {
466
- empty: en_1.messages.APP_SCOPES_WEB_EMPTY,
467
- refreshing: en_1.messages.APP_SCOPES_WEB_REFRESHING,
468
- endpointsLabel: en_1.messages.APP_SCOPES_WEB_ENDPOINTS_LABEL,
469
- noEndpoints: en_1.messages.APP_SCOPES_WEB_NO_ENDPOINTS,
470
- copy: en_1.messages.APP_SCOPES_WEB_COPY,
471
- copied: en_1.messages.APP_SCOPES_WEB_COPIED,
472
- copyCategoryAria: en_1.messages.APP_SCOPES_WEB_COPY_CATEGORY_ARIA,
473
- selectScopeAria: en_1.messages.APP_SCOPES_WEB_SELECT_SCOPE_ARIA,
474
- legacyScope: constants_1.LEGACY_ALL_SCOPE,
475
- legacyBadge: en_1.messages.APP_SCOPES_WEB_LEGACY_BADGE,
476
- legacyTitle: en_1.messages.APP_SCOPES_WEB_LEGACY_TITLE,
477
- };
478
- return `<!doctype html>
479
- <html lang="en">
480
- <head>
481
- <meta charset="utf-8">
482
- <meta name="viewport" content="width=device-width, initial-scale=1">
483
- <title>${title}</title>
484
- <style>${STYLES}</style>
485
- </head>
486
- <body>
487
- <header class="hero">
488
- <div class="hero-inner">
489
- <div class="hero-copy">
490
- <h1>${title}</h1>
491
- <p class="intro">${introWithSpan}</p>
492
- </div>
493
- <a class="docs-cta" href="${constants_1.BREVO_OAUTH_SCOPES_DOCS_URL}" target="_blank" rel="noopener noreferrer">${catalogDocsCta} ↗</a>
494
- </div>
495
- </header>
496
- <main>
497
- <div class="toolbar">
498
- <input type="search" placeholder="${searchPlaceholder}" autofocus>
499
- <button id="refresh-btn" class="refresh" type="button">${refreshLabel}</button>
500
- </div>
501
- <p id="refresh-error" class="refresh-error" hidden>${refreshError}</p>
502
- <div class="selection-bar">
503
- <input id="selected-scopes" type="text" readonly placeholder="${selectedPlaceholder}" aria-label="${selectedPlaceholder}">
504
- <button id="copy-selected" class="copy" type="button" disabled>${copySelected}</button>
505
- </div>
506
- <div id="scopes-list"></div>
507
- <footer>${footer} <a href="${constants_1.BREVO_CLI_REFERENCE_URL}">${docsLink}</a></footer>
508
- </main>
509
- <script type="application/json" id="scopes-data">${safeJson(entries)}</script>
510
- <script type="application/json" id="labels">${safeJson(labels)}</script>
511
- <script>${SCRIPT}</script>
512
- </body>
513
- </html>
514
- `;
515
- }
516
- //# sourceMappingURL=scopes-html.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scopes-html.js","sourceRoot":"","sources":["../../src/services/scopes-html.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import type { ScopeEntry } from './oauth-metadata';
2
- export interface ScopesWebServer {
3
- url: string;
4
- close: () => Promise<void>;
5
- }
6
- export interface ScopesWebOptions {
7
- /** Called by GET /scopes.json to re-fetch scopes on demand. Optional —
8
- * when omitted, the refresh button returns the initial entries unchanged. */
9
- refetch?: () => Promise<ScopeEntry[]>;
10
- }
11
- export declare function startScopesWebServer(initialEntries: ScopeEntry[], options?: ScopesWebOptions): Promise<ScopesWebServer>;
12
- //# sourceMappingURL=scopes-web.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scopes-web.d.ts","sourceRoot":"","sources":["../../src/services/scopes-web.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B;kFAC8E;IAC9E,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;CACvC;AAQD,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,UAAU,EAAE,EAC5B,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,eAAe,CAAC,CAyD1B"}
@@ -1,95 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.startScopesWebServer = startScopesWebServer;
37
- const http = __importStar(require("node:http"));
38
- const scopes_html_1 = require("./scopes-html");
39
- const logger_1 = require("../lib/logger");
40
- function closeServer(server) {
41
- return new Promise((resolveClose) => {
42
- server.close(() => resolveClose());
43
- });
44
- }
45
- function startScopesWebServer(initialEntries, options = {}) {
46
- const html = (0, scopes_html_1.renderScopesHtml)(initialEntries);
47
- const refetch = options.refetch;
48
- return new Promise((resolve, reject) => {
49
- const server = http.createServer((req, res) => {
50
- const pathname = new URL(req.url ?? '/', 'http://127.0.0.1').pathname;
51
- (0, logger_1.logDebug)('scopes-web request', { method: req.method, pathname });
52
- if (req.method === 'GET' && pathname === '/') {
53
- res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
54
- res.end(html);
55
- return;
56
- }
57
- if (req.method === 'GET' && pathname === '/scopes.json') {
58
- const respond = (entries) => {
59
- res.writeHead(200, {
60
- 'Content-Type': 'application/json; charset=utf-8',
61
- 'Cache-Control': 'no-store',
62
- });
63
- res.end(JSON.stringify({ scopes: entries }));
64
- };
65
- if (!refetch) {
66
- respond(initialEntries);
67
- return;
68
- }
69
- refetch()
70
- .then(respond)
71
- .catch((err) => {
72
- (0, logger_1.logDebug)('scopes-web refetch failed', { message: err.message });
73
- res.writeHead(502, { 'Content-Type': 'application/json; charset=utf-8' });
74
- res.end(JSON.stringify({ error: 'refetch_failed' }));
75
- });
76
- return;
77
- }
78
- res.writeHead(404).end();
79
- });
80
- server.once('error', (err) => {
81
- (0, logger_1.logDebug)('scopes-web server error', { message: err.message });
82
- reject(err);
83
- });
84
- server.listen(0, '127.0.0.1', () => {
85
- const port = server.address().port;
86
- const url = `http://127.0.0.1:${port}/`;
87
- (0, logger_1.logDebug)('scopes-web listening', { host: '127.0.0.1', port });
88
- resolve({
89
- url,
90
- close: () => closeServer(server),
91
- });
92
- });
93
- });
94
- }
95
- //# sourceMappingURL=scopes-web.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scopes-web.js","sourceRoot":"","sources":["../../src/services/scopes-web.ts"],"names":[],"mappings":"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"}
@@ -1,48 +0,0 @@
1
- export declare function getClaudeSkillsRoot(): string;
2
- export type InstallStatus = 'installed' | 'already-installed' | 'overwritten';
3
- export interface InstallResult {
4
- name: string;
5
- version: string;
6
- status: InstallStatus;
7
- path: string;
8
- }
9
- export interface UninstallResult {
10
- name: string;
11
- path: string;
12
- }
13
- export interface OutdatedSkill {
14
- name: string;
15
- installedVersion: string;
16
- latestVersion: string;
17
- }
18
- export declare const skillService: {
19
- /**
20
- * Installed skills whose marker version is behind the bundled catalog.
21
- * Pure file read — safe to call on every CLI invocation for auto-refresh.
22
- */
23
- getOutdatedSkills(): OutdatedSkill[];
24
- /** True when the named skill is installed (marker present). */
25
- isInstalled(name: string): boolean;
26
- install(name: string, options?: {
27
- force?: boolean;
28
- }): InstallResult;
29
- installAll(options?: {
30
- force?: boolean;
31
- }): InstallResult[];
32
- uninstallAll(): UninstallResult[];
33
- /**
34
- * Refresh installed skills whose marker version drifts from the bundled
35
- * catalog. Pure local file ops — safe to call after every CLI invocation.
36
- * Errors during the refresh emit a single error line and never throw,
37
- * so a broken refresh can't block the user's actual command.
38
- */
39
- autoRefreshOutdated(opts?: AutoRefreshOptions): void;
40
- };
41
- export type SkillService = typeof skillService;
42
- export interface AutoRefreshOptions {
43
- argv?: readonly string[];
44
- env?: NodeJS.ProcessEnv;
45
- output?: NodeJS.WriteStream;
46
- }
47
- export declare function shouldSkipAutoRefresh(opts?: AutoRefreshOptions): boolean;
48
- //# sourceMappingURL=skill.d.ts.map