@getbrevo/cli 1.0.1 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +16 -4
  3. package/agent-context/AGENTS.md +23 -5
  4. package/agent-context/SKILL.md +23 -3
  5. package/dist/api/client.d.ts +2 -0
  6. package/dist/api/client.d.ts.map +1 -1
  7. package/dist/api/client.js +50 -36
  8. package/dist/api/client.js.map +1 -1
  9. package/dist/bin/index.js +9 -5
  10. package/dist/bin/index.js.map +1 -1
  11. package/dist/commands/app/create.d.ts +1 -0
  12. package/dist/commands/app/create.d.ts.map +1 -1
  13. package/dist/commands/app/create.js +257 -201
  14. package/dist/commands/app/create.js.map +1 -1
  15. package/dist/commands/app/delete.d.ts.map +1 -1
  16. package/dist/commands/app/delete.js +81 -62
  17. package/dist/commands/app/delete.js.map +1 -1
  18. package/dist/commands/app/list.d.ts.map +1 -1
  19. package/dist/commands/app/list.js +10 -2
  20. package/dist/commands/app/list.js.map +1 -1
  21. package/dist/commands/app/scaffold.d.ts.map +1 -1
  22. package/dist/commands/app/scaffold.js +14 -3
  23. package/dist/commands/app/scaffold.js.map +1 -1
  24. package/dist/commands/app/scopes.d.ts +2 -0
  25. package/dist/commands/app/scopes.d.ts.map +1 -0
  26. package/dist/commands/app/scopes.js +81 -0
  27. package/dist/commands/app/scopes.js.map +1 -0
  28. package/dist/commands/app/start.d.ts.map +1 -1
  29. package/dist/commands/app/start.js +7 -0
  30. package/dist/commands/app/start.js.map +1 -1
  31. package/dist/commands/app/update.d.ts.map +1 -1
  32. package/dist/commands/app/update.js +305 -189
  33. package/dist/commands/app/update.js.map +1 -1
  34. package/dist/commands/definitions.d.ts.map +1 -1
  35. package/dist/commands/definitions.js +44 -1
  36. package/dist/commands/definitions.js.map +1 -1
  37. package/dist/commands/init.d.ts.map +1 -1
  38. package/dist/commands/init.js +15 -2
  39. package/dist/commands/init.js.map +1 -1
  40. package/dist/commands/login.d.ts.map +1 -1
  41. package/dist/commands/login.js +154 -138
  42. package/dist/commands/login.js.map +1 -1
  43. package/dist/commands/whoami.d.ts.map +1 -1
  44. package/dist/commands/whoami.js +27 -20
  45. package/dist/commands/whoami.js.map +1 -1
  46. package/dist/lang/en.d.ts +43 -3
  47. package/dist/lang/en.d.ts.map +1 -1
  48. package/dist/lang/en.js +44 -3
  49. package/dist/lang/en.js.map +1 -1
  50. package/dist/lib/auth-guard.d.ts.map +1 -1
  51. package/dist/lib/auth-guard.js +10 -1
  52. package/dist/lib/auth-guard.js.map +1 -1
  53. package/dist/lib/cli-version.d.ts +2 -0
  54. package/dist/lib/cli-version.d.ts.map +1 -0
  55. package/dist/lib/cli-version.js +59 -0
  56. package/dist/lib/cli-version.js.map +1 -0
  57. package/dist/lib/config.d.ts +1 -1
  58. package/dist/lib/config.d.ts.map +1 -1
  59. package/dist/lib/config.js +15 -1
  60. package/dist/lib/config.js.map +1 -1
  61. package/dist/lib/constants.d.ts +12 -1
  62. package/dist/lib/constants.d.ts.map +1 -1
  63. package/dist/lib/constants.js +26 -2
  64. package/dist/lib/constants.js.map +1 -1
  65. package/dist/lib/logger.d.ts.map +1 -1
  66. package/dist/lib/logger.js +16 -3
  67. package/dist/lib/logger.js.map +1 -1
  68. package/dist/lib/telemetry.d.ts +9 -0
  69. package/dist/lib/telemetry.d.ts.map +1 -0
  70. package/dist/lib/telemetry.js +57 -0
  71. package/dist/lib/telemetry.js.map +1 -0
  72. package/dist/lib/update-notifier.d.ts.map +1 -1
  73. package/dist/lib/update-notifier.js +24 -20
  74. package/dist/lib/update-notifier.js.map +1 -1
  75. package/dist/lib/validators.d.ts +23 -0
  76. package/dist/lib/validators.d.ts.map +1 -1
  77. package/dist/lib/validators.js +75 -0
  78. package/dist/lib/validators.js.map +1 -1
  79. package/dist/services/app.d.ts +3 -0
  80. package/dist/services/app.d.ts.map +1 -1
  81. package/dist/services/app.js +6 -1
  82. package/dist/services/app.js.map +1 -1
  83. package/dist/services/oauth-metadata.d.ts +7 -0
  84. package/dist/services/oauth-metadata.d.ts.map +1 -0
  85. package/dist/services/oauth-metadata.js +43 -0
  86. package/dist/services/oauth-metadata.js.map +1 -0
  87. package/dist/services/scopes-html.d.ts +3 -0
  88. package/dist/services/scopes-html.d.ts.map +1 -0
  89. package/dist/services/scopes-html.js +516 -0
  90. package/dist/services/scopes-html.js.map +1 -0
  91. package/dist/services/scopes-web.d.ts +12 -0
  92. package/dist/services/scopes-web.d.ts.map +1 -0
  93. package/dist/services/scopes-web.js +95 -0
  94. package/dist/services/scopes-web.js.map +1 -0
  95. package/dist/services/skill.js +1 -1
  96. package/dist/services/skill.js.map +1 -1
  97. package/dist/skills/index.d.ts +2 -1
  98. package/dist/skills/index.d.ts.map +1 -1
  99. package/dist/skills/index.js +3 -22
  100. package/dist/skills/index.js.map +1 -1
  101. package/dist/templates/files/AGENTS.md.tmpl +1 -1
  102. package/dist/templates/files/CLAUDE.md.tmpl +1 -1
  103. package/dist/templates/files/README.md.tmpl +2 -1
  104. package/dist/templates/files/app-config.json.tmpl +1 -1
  105. package/dist/types.d.ts +2 -0
  106. package/dist/types.d.ts.map +1 -1
  107. package/package.json +1 -2
  108. package/dist/lib/min-version-check.d.ts +0 -15
  109. package/dist/lib/min-version-check.d.ts.map +0 -1
  110. package/dist/lib/min-version-check.js +0 -33
  111. package/dist/lib/min-version-check.js.map +0 -1
@@ -0,0 +1,516 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopes-html.js","sourceRoot":"","sources":["../../src/services/scopes-html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,95 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scopes-web.js","sourceRoot":"","sources":["../../src/services/scopes-web.ts"],"names":[],"mappings":"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"}
@@ -48,7 +48,7 @@ const skills_1 = require("../skills");
48
48
  // can target a different root without monkey-patching `os.homedir`.
49
49
  function getClaudeSkillsRoot() {
50
50
  const override = process.env.BREVO_CLAUDE_HOME;
51
- if (override && override.trim()) {
51
+ if (override?.trim()) {
52
52
  return path.join(override, 'skills');
53
53
  }
54
54
  return path.join(os.homedir(), '.claude', 'skills');
@@ -1 +1 @@
1
- {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/services/skill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/services/skill.ts"],"names":[],"mappings":"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"}