@babelize/cli 1.0.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 (179) hide show
  1. package/LICENSE +6 -0
  2. package/README.md +137 -0
  3. package/dist/client.d.ts +6 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +137 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/commands/account.d.ts +3 -0
  8. package/dist/commands/account.d.ts.map +1 -0
  9. package/dist/commands/account.js +133 -0
  10. package/dist/commands/account.js.map +1 -0
  11. package/dist/commands/admin.d.ts +3 -0
  12. package/dist/commands/admin.d.ts.map +1 -0
  13. package/dist/commands/admin.js +233 -0
  14. package/dist/commands/admin.js.map +1 -0
  15. package/dist/commands/analytics.d.ts +3 -0
  16. package/dist/commands/analytics.d.ts.map +1 -0
  17. package/dist/commands/analytics.js +122 -0
  18. package/dist/commands/analytics.js.map +1 -0
  19. package/dist/commands/api-keys.d.ts +3 -0
  20. package/dist/commands/api-keys.d.ts.map +1 -0
  21. package/dist/commands/api-keys.js +240 -0
  22. package/dist/commands/api-keys.js.map +1 -0
  23. package/dist/commands/auth.d.ts +3 -0
  24. package/dist/commands/auth.d.ts.map +1 -0
  25. package/dist/commands/auth.js +384 -0
  26. package/dist/commands/auth.js.map +1 -0
  27. package/dist/commands/babels.d.ts +3 -0
  28. package/dist/commands/babels.d.ts.map +1 -0
  29. package/dist/commands/babels.js +119 -0
  30. package/dist/commands/babels.js.map +1 -0
  31. package/dist/commands/billing.d.ts +3 -0
  32. package/dist/commands/billing.d.ts.map +1 -0
  33. package/dist/commands/billing.js +125 -0
  34. package/dist/commands/billing.js.map +1 -0
  35. package/dist/commands/checkout.d.ts +3 -0
  36. package/dist/commands/checkout.d.ts.map +1 -0
  37. package/dist/commands/checkout.js +64 -0
  38. package/dist/commands/checkout.js.map +1 -0
  39. package/dist/commands/comments.d.ts +3 -0
  40. package/dist/commands/comments.d.ts.map +1 -0
  41. package/dist/commands/comments.js +219 -0
  42. package/dist/commands/comments.js.map +1 -0
  43. package/dist/commands/glossary.d.ts +3 -0
  44. package/dist/commands/glossary.d.ts.map +1 -0
  45. package/dist/commands/glossary.js +189 -0
  46. package/dist/commands/glossary.js.map +1 -0
  47. package/dist/commands/init.d.ts +3 -0
  48. package/dist/commands/init.d.ts.map +1 -0
  49. package/dist/commands/init.js +210 -0
  50. package/dist/commands/init.js.map +1 -0
  51. package/dist/commands/invitations.d.ts +3 -0
  52. package/dist/commands/invitations.d.ts.map +1 -0
  53. package/dist/commands/invitations.js +177 -0
  54. package/dist/commands/invitations.js.map +1 -0
  55. package/dist/commands/languages.d.ts +3 -0
  56. package/dist/commands/languages.d.ts.map +1 -0
  57. package/dist/commands/languages.js +128 -0
  58. package/dist/commands/languages.js.map +1 -0
  59. package/dist/commands/members.d.ts +3 -0
  60. package/dist/commands/members.d.ts.map +1 -0
  61. package/dist/commands/members.js +156 -0
  62. package/dist/commands/members.js.map +1 -0
  63. package/dist/commands/notifications.d.ts +3 -0
  64. package/dist/commands/notifications.d.ts.map +1 -0
  65. package/dist/commands/notifications.js +114 -0
  66. package/dist/commands/notifications.js.map +1 -0
  67. package/dist/commands/pr.d.ts +3 -0
  68. package/dist/commands/pr.d.ts.map +1 -0
  69. package/dist/commands/pr.js +111 -0
  70. package/dist/commands/pr.js.map +1 -0
  71. package/dist/commands/privacy.d.ts +3 -0
  72. package/dist/commands/privacy.d.ts.map +1 -0
  73. package/dist/commands/privacy.js +62 -0
  74. package/dist/commands/privacy.js.map +1 -0
  75. package/dist/commands/projects.d.ts +3 -0
  76. package/dist/commands/projects.d.ts.map +1 -0
  77. package/dist/commands/projects.js +444 -0
  78. package/dist/commands/projects.js.map +1 -0
  79. package/dist/commands/roles.d.ts +3 -0
  80. package/dist/commands/roles.d.ts.map +1 -0
  81. package/dist/commands/roles.js +78 -0
  82. package/dist/commands/roles.js.map +1 -0
  83. package/dist/commands/run.d.ts +3 -0
  84. package/dist/commands/run.d.ts.map +1 -0
  85. package/dist/commands/run.js +345 -0
  86. package/dist/commands/run.js.map +1 -0
  87. package/dist/commands/status.d.ts +3 -0
  88. package/dist/commands/status.d.ts.map +1 -0
  89. package/dist/commands/status.js +126 -0
  90. package/dist/commands/status.js.map +1 -0
  91. package/dist/commands/subscriptions.d.ts +3 -0
  92. package/dist/commands/subscriptions.d.ts.map +1 -0
  93. package/dist/commands/subscriptions.js +141 -0
  94. package/dist/commands/subscriptions.js.map +1 -0
  95. package/dist/commands/tm.d.ts +3 -0
  96. package/dist/commands/tm.d.ts.map +1 -0
  97. package/dist/commands/tm.js +114 -0
  98. package/dist/commands/tm.js.map +1 -0
  99. package/dist/commands/users.d.ts +3 -0
  100. package/dist/commands/users.d.ts.map +1 -0
  101. package/dist/commands/users.js +122 -0
  102. package/dist/commands/users.js.map +1 -0
  103. package/dist/completion.d.ts +4 -0
  104. package/dist/completion.d.ts.map +1 -0
  105. package/dist/completion.js +135 -0
  106. package/dist/completion.js.map +1 -0
  107. package/dist/config.d.ts +25 -0
  108. package/dist/config.d.ts.map +1 -0
  109. package/dist/config.js +47 -0
  110. package/dist/config.js.map +1 -0
  111. package/dist/exit-codes.d.ts +11 -0
  112. package/dist/exit-codes.d.ts.map +1 -0
  113. package/dist/exit-codes.js +11 -0
  114. package/dist/exit-codes.js.map +1 -0
  115. package/dist/formatters.d.ts +3 -0
  116. package/dist/formatters.d.ts.map +1 -0
  117. package/dist/formatters.js +5 -0
  118. package/dist/formatters.js.map +1 -0
  119. package/dist/global-options.d.ts +9 -0
  120. package/dist/global-options.d.ts.map +1 -0
  121. package/dist/global-options.js +15 -0
  122. package/dist/global-options.js.map +1 -0
  123. package/dist/index.d.ts +3 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +5 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/oauth.d.ts +13 -0
  128. package/dist/oauth.d.ts.map +1 -0
  129. package/dist/oauth.js +187 -0
  130. package/dist/oauth.js.map +1 -0
  131. package/dist/program.d.ts +7 -0
  132. package/dist/program.d.ts.map +1 -0
  133. package/dist/program.js +165 -0
  134. package/dist/program.js.map +1 -0
  135. package/dist/tui/brand.d.ts +3 -0
  136. package/dist/tui/brand.d.ts.map +1 -0
  137. package/dist/tui/brand.js +14 -0
  138. package/dist/tui/brand.js.map +1 -0
  139. package/dist/tui/display.d.ts +19 -0
  140. package/dist/tui/display.d.ts.map +1 -0
  141. package/dist/tui/display.js +57 -0
  142. package/dist/tui/display.js.map +1 -0
  143. package/dist/tui/help.d.ts +27 -0
  144. package/dist/tui/help.d.ts.map +1 -0
  145. package/dist/tui/help.js +84 -0
  146. package/dist/tui/help.js.map +1 -0
  147. package/dist/tui/home.d.ts +15 -0
  148. package/dist/tui/home.d.ts.map +1 -0
  149. package/dist/tui/home.js +130 -0
  150. package/dist/tui/home.js.map +1 -0
  151. package/dist/tui/index.d.ts +11 -0
  152. package/dist/tui/index.d.ts.map +1 -0
  153. package/dist/tui/index.js +11 -0
  154. package/dist/tui/index.js.map +1 -0
  155. package/dist/tui/prompt.d.ts +15 -0
  156. package/dist/tui/prompt.d.ts.map +1 -0
  157. package/dist/tui/prompt.js +45 -0
  158. package/dist/tui/prompt.js.map +1 -0
  159. package/dist/tui/repl.d.ts +23 -0
  160. package/dist/tui/repl.d.ts.map +1 -0
  161. package/dist/tui/repl.js +265 -0
  162. package/dist/tui/repl.js.map +1 -0
  163. package/dist/tui/table.d.ts +16 -0
  164. package/dist/tui/table.d.ts.map +1 -0
  165. package/dist/tui/table.js +68 -0
  166. package/dist/tui/table.js.map +1 -0
  167. package/dist/tui/task-list.d.ts +20 -0
  168. package/dist/tui/task-list.d.ts.map +1 -0
  169. package/dist/tui/task-list.js +31 -0
  170. package/dist/tui/task-list.js.map +1 -0
  171. package/dist/tui/theme.d.ts +26 -0
  172. package/dist/tui/theme.d.ts.map +1 -0
  173. package/dist/tui/theme.js +54 -0
  174. package/dist/tui/theme.js.map +1 -0
  175. package/dist/update-notifier.d.ts +2 -0
  176. package/dist/update-notifier.d.ts.map +1 -0
  177. package/dist/update-notifier.js +28 -0
  178. package/dist/update-notifier.js.map +1 -0
  179. package/package.json +61 -0
@@ -0,0 +1,345 @@
1
+ import * as clack from '@clack/prompts';
2
+ import chalk from 'chalk';
3
+ import { success as successColor, error as errorColor, statusBadge } from '../tui/theme.js';
4
+ import { table, keyValue } from '../tui/table.js';
5
+ import { section, dim, divider, success, warning } from '../tui/display.js';
6
+ import { createPipeline, delay, renderRunTitle } from '../tui/task-list.js';
7
+ import { config } from '../config.js';
8
+ import { getClient, handleApiError } from '../client.js';
9
+ import { isJsonMode, printJson } from '../formatters.js';
10
+ import { renderCommandHelp } from '../tui/help.js';
11
+ import { ExitCode } from '../exit-codes.js';
12
+ const PHASES = [
13
+ 'Phase 0: Workspace Validation',
14
+ 'Phase 1: String Extraction',
15
+ 'Phase 2: Key Generation',
16
+ 'Phase 3: Base Locale Handling',
17
+ 'Phase 4: Translation',
18
+ 'Phase 5: AST Injection',
19
+ 'Phase 6: Summary',
20
+ 'Phase 7: Finalization',
21
+ ];
22
+ export function registerRunCommands(program) {
23
+ const run = program
24
+ .command('run')
25
+ .description('Engine commands — start and monitor babel runs');
26
+ run.helpInformation = () => renderCommandHelp('run', 'Engine commands — start, preview, and monitor babel runs', [
27
+ {
28
+ name: 'start',
29
+ desc: 'Start a full Babelize engine run (triggers i18n pipeline)',
30
+ options: [
31
+ { name: '-p, --project <id>', desc: 'Project ID (defaults to .babelize/config.json)' },
32
+ { name: '-l, --languages <codes>', desc: 'Comma-separated target language codes (e.g. es,fr,de,ja)' },
33
+ { name: '--branch <branch>', desc: 'Git branch to run on' },
34
+ { name: '--no-poll', desc: "Return immediately (don't wait for completion)" },
35
+ { name: '--no-pr', desc: 'Skip auto-creating a GitHub PR after completion' },
36
+ ],
37
+ },
38
+ {
39
+ name: 'status <babelId>',
40
+ desc: 'Get status of a running or completed babel job',
41
+ options: [
42
+ { name: '--watch', desc: 'Keep polling until job completes' },
43
+ ],
44
+ },
45
+ { name: 'analyze', desc: 'Analyze source code for i18n detection', options: [
46
+ { name: '-p, --project <id>', desc: 'Project ID' },
47
+ ] },
48
+ ]);
49
+ run
50
+ .command('start')
51
+ .description('Start a full Babelize engine run (triggers i18n pipeline)')
52
+ .option('-p, --project <id>', 'Project ID (defaults to .babelize/config.json)')
53
+ .option('-l, --languages <codes>', 'Comma-separated target language codes (e.g. es,fr,de,ja)')
54
+ .option('--branch <branch>', 'Git branch to run on')
55
+ .option('--no-poll', "Return immediately after starting (don't poll for status)")
56
+ .option('--no-pr', "Skip auto-creating a GitHub PR after run completes")
57
+ .action(async (opts) => {
58
+ const localProject = config.getLocalProjectConfig();
59
+ let projectId = opts.project || localProject?.projectId;
60
+ let languages = opts.languages || (localProject?.targetLanguageIds ? localProject.targetLanguageIds.join(',') : undefined);
61
+ if (!projectId) {
62
+ const result = await clack.text({ message: 'Project ID:' });
63
+ if (clack.isCancel(result))
64
+ process.exit(ExitCode.SUCCESS);
65
+ projectId = result;
66
+ }
67
+ if (!languages) {
68
+ const result = await clack.text({ message: 'Target languages (comma-sep, e.g. es,fr,de):' });
69
+ if (clack.isCancel(result))
70
+ process.exit(ExitCode.SUCCESS);
71
+ languages = result;
72
+ }
73
+ const langs = languages.split(',').map((l) => l.trim()).filter(Boolean);
74
+ const s = clack.spinner();
75
+ s.start('Starting engine run…');
76
+ try {
77
+ const client = getClient();
78
+ const res = await client.post('/engine/babel', {
79
+ project_id: projectId,
80
+ target_locales: langs,
81
+ ...(opts.branch ? { branch: opts.branch } : {}),
82
+ }); // codeql[js/file-access-to-http] — intentional CLI request to own API
83
+ const babelId = res.data?.babel_id ?? res.data?.run_id ?? res.data?.id;
84
+ s.stop(successColor(`Engine run started — Job ID: ${chalk.bold(babelId)}`));
85
+ if (!opts.poll) {
86
+ dim('Use `babelize run status ' + babelId + '` to check progress.');
87
+ if (isJsonMode())
88
+ printJson(res.data);
89
+ return;
90
+ }
91
+ const lastData = await pollRunStatus(client, babelId);
92
+ printCompletionBanner(lastData);
93
+ if (lastData?.status === 'completed' && opts.pr !== false) {
94
+ await autoRaisePR(client, projectId, langs, lastData);
95
+ }
96
+ }
97
+ catch (err) {
98
+ s.stop('Failed to start engine run.');
99
+ handleApiError(err);
100
+ }
101
+ });
102
+ run
103
+ .command('status <babelId>')
104
+ .description('Get status of a running or completed babel job')
105
+ .option('--watch', 'Keep polling until job completes')
106
+ .action(async (babelId, opts) => {
107
+ const client = getClient();
108
+ if (opts.watch) {
109
+ const lastData = await pollRunStatus(client, babelId);
110
+ printCompletionBanner(lastData);
111
+ }
112
+ else {
113
+ const s = clack.spinner();
114
+ s.start('Fetching status…');
115
+ try {
116
+ const res = await client.get(`/engine/status/${babelId}`);
117
+ s.stop();
118
+ const data = res.data;
119
+ if (isJsonMode()) {
120
+ printJson(data);
121
+ return;
122
+ }
123
+ renderRunStatus(data);
124
+ }
125
+ catch (err) {
126
+ s.stop('Failed to fetch status.');
127
+ handleApiError(err);
128
+ }
129
+ }
130
+ });
131
+ run
132
+ .command('analyze')
133
+ .description('Analyze source code for i18n detection (frameworks, configs)')
134
+ .option('-p, --project <id>', 'Project ID')
135
+ .action(async (opts) => {
136
+ let projectId = opts.project;
137
+ if (!projectId) {
138
+ const result = await clack.text({ message: 'Project ID:' });
139
+ if (clack.isCancel(result))
140
+ process.exit(ExitCode.SUCCESS);
141
+ projectId = result;
142
+ }
143
+ const s = clack.spinner();
144
+ s.start('Analyzing source…');
145
+ try {
146
+ const client = getClient();
147
+ const res = await client.post('/engine/analyze', { project_id: projectId });
148
+ s.stop();
149
+ if (isJsonMode()) {
150
+ printJson(res.data);
151
+ return;
152
+ }
153
+ keyValue(res.data ?? {}, 'Source Analysis');
154
+ }
155
+ catch (err) {
156
+ s.stop('Analysis failed.');
157
+ handleApiError(err);
158
+ }
159
+ });
160
+ }
161
+ async function pollRunStatus(client, babelId) {
162
+ let lastData = null;
163
+ const MAX_RETRIES = 60;
164
+ let retryCount = 0;
165
+ const pipeline = createPipeline(PHASES.map((phaseTitle) => ({
166
+ title: phaseTitle,
167
+ task: async (_ctx, task) => {
168
+ const phaseShort = phaseTitle.split(':')[1]?.trim()?.toLowerCase() ?? '';
169
+ while (true) {
170
+ try {
171
+ const res = await client.get(`/engine/status/${babelId}`);
172
+ lastData = res.data;
173
+ const data = res.data;
174
+ const status = (data?.status ?? data?.run?.status);
175
+ const logs = ((data?.logs ?? data?.run?.logs) ?? []);
176
+ if (status === 'completed')
177
+ return;
178
+ const phaseLog = logs.find((l) => l.step?.toLowerCase().includes(phaseShort));
179
+ if (phaseLog?.status === 'completed')
180
+ return;
181
+ if (phaseLog?.status === 'failed') {
182
+ throw new Error(phaseLog.message || `Phase failed: ${phaseTitle}`);
183
+ }
184
+ if (status === 'failed') {
185
+ throw new Error(data?.error ?? data?.run?.error ?? 'Pipeline failed');
186
+ }
187
+ if (phaseLog?.message) {
188
+ task.output = phaseLog.message;
189
+ }
190
+ retryCount = 0;
191
+ }
192
+ catch (err) {
193
+ const pollErr = err;
194
+ if (pollErr.message?.includes('failed') || pollErr.message?.includes('Pipeline')) {
195
+ throw err;
196
+ }
197
+ retryCount++;
198
+ if (retryCount >= MAX_RETRIES) {
199
+ throw new Error(`Timed out waiting for pipeline to complete after ${MAX_RETRIES} retries`, { cause: err });
200
+ }
201
+ task.output = `Transient error, retrying (${retryCount}/${MAX_RETRIES})…`;
202
+ }
203
+ await delay(2500);
204
+ }
205
+ },
206
+ })));
207
+ try {
208
+ console.log(`\n ${renderRunTitle(babelId)}\n`);
209
+ await pipeline.run();
210
+ divider();
211
+ if (lastData)
212
+ renderRunStatus(lastData);
213
+ return lastData;
214
+ }
215
+ catch (err) {
216
+ console.log(errorColor(`Babel run failed: ${err.message}`));
217
+ process.exit(ExitCode.API_ERROR);
218
+ }
219
+ }
220
+ function printCompletionBanner(lastData) {
221
+ const status = lastData?.status ?? 'unknown';
222
+ if (status === 'completed') {
223
+ console.log('');
224
+ success('All done! Translation run completed successfully.');
225
+ }
226
+ }
227
+ async function autoRaisePR(client, projectId, targetLocales, lastData) {
228
+ const run = (lastData?.run ?? lastData);
229
+ if (run?.pr_url) {
230
+ success(`PR already created: ${chalk.cyan.underline(run.pr_url)}`);
231
+ return;
232
+ }
233
+ const s = clack.spinner();
234
+ s.start('Auto-creating GitHub PR with translations…');
235
+ try {
236
+ const res = await client.post(`/projects/${projectId}/raise-pr`, {
237
+ title: `chore(i18n): update translations for ${targetLocales.join(', ')} [babelize]`,
238
+ });
239
+ s.stop();
240
+ const prUrl = res.data?.pr_url ?? res.data?.url;
241
+ if (prUrl) {
242
+ success(`PR created: ${chalk.cyan.underline(prUrl)}`);
243
+ }
244
+ else {
245
+ success('PR created successfully. Check your GitHub repository.');
246
+ }
247
+ }
248
+ catch (err) {
249
+ s.stop();
250
+ const apiErr = err;
251
+ if (apiErr?.response?.status === 409) {
252
+ dim('PR already exists for this project.');
253
+ }
254
+ else if (apiErr?.response?.data?.requires_app_install) {
255
+ warning('GitHub App not installed. Install it from the project page to enable auto-PR.');
256
+ dim('Run `babelize pr raise ' + projectId + '` after installing.');
257
+ }
258
+ else {
259
+ dim('Could not auto-create PR. Run `babelize pr raise ' + projectId + '` to try manually.');
260
+ }
261
+ }
262
+ }
263
+ function renderRunStatus(data) {
264
+ const run = (data.run ?? data);
265
+ keyValue({
266
+ id: run.id,
267
+ status: statusBadge(run.status),
268
+ project: (run.project_name ?? run.project_id),
269
+ duration: run.duration ? `${run.duration}ms` : null,
270
+ credits: run.actual_credits_consumed,
271
+ pr_url: run.pr_url,
272
+ error: run.error,
273
+ created_at: run.created_at,
274
+ completed_at: run.completed_at,
275
+ }, 'Run Status');
276
+ // Languages section
277
+ const targetLocales = run.target_languages;
278
+ if (targetLocales?.length) {
279
+ section('Languages Processed');
280
+ for (const loc of targetLocales) {
281
+ console.log(` ${successColor('✓')} ${loc}`);
282
+ }
283
+ }
284
+ // Stats section
285
+ const stats = run.stats;
286
+ if (stats) {
287
+ section('Translation Stats');
288
+ keyValue({
289
+ files_scanned: stats.files_scanned,
290
+ files_with_strings: stats.files_with_strings,
291
+ strings_extracted: stats.strings_extracted,
292
+ keys_generated: stats.keys_generated,
293
+ files_modified: stats.files_modified,
294
+ locale_files_created: stats.locale_files_created,
295
+ reused_from_lockfile: stats.translations_from_lockfile,
296
+ processing_time: stats.processing_time_ms ? `${stats.processing_time_ms}ms` : null,
297
+ }, 'Stats');
298
+ }
299
+ // Local artifacts
300
+ const projectId = run.project_id;
301
+ if (projectId) {
302
+ section('Local Artifacts');
303
+ dim(`Staging: .babelize/${projectId}/staging/`);
304
+ }
305
+ // Warnings (capped)
306
+ const logs = run.logs;
307
+ if (logs?.length) {
308
+ section('Pipeline Log');
309
+ table(logs, [
310
+ { key: 'step', header: 'Phase', width: 20 },
311
+ { key: 'status', header: 'Status', width: 12, transform: statusBadge },
312
+ { key: 'message', header: 'Message', width: 60 },
313
+ ]);
314
+ }
315
+ // Warnings from activity payload
316
+ const warnings = data.warnings;
317
+ if (warnings?.length) {
318
+ const DUPE_CAP = 10;
319
+ const dupeWarnings = warnings.filter(w => w.type === 'duplicate-key');
320
+ const otherWarnings = warnings.filter(w => w.type !== 'duplicate-key');
321
+ const shown = [...otherWarnings, ...dupeWarnings.slice(0, DUPE_CAP)];
322
+ const remaining = dupeWarnings.length - DUPE_CAP;
323
+ if (shown.length > 0) {
324
+ section('Warnings');
325
+ for (const w of shown) {
326
+ console.log(` ${warning('⚠')} ${w.message ?? ''}`);
327
+ }
328
+ if (remaining > 0) {
329
+ dim(` … and ${remaining} more duplicate-key warnings. Use --json for full list.`);
330
+ }
331
+ }
332
+ }
333
+ // PR hint
334
+ if (run.status === 'completed' && !run.pr_url && projectId) {
335
+ dim('Run `babelize pr raise ' + projectId + '` to open a GitHub PR with the translations.');
336
+ }
337
+ }
338
+ /**
339
+ * Get project_id from a run response if available
340
+ */
341
+ function extractProjectId(data) {
342
+ const run = (data.run ?? data);
343
+ return run.project_id;
344
+ }
345
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerStatusCommands(program: Command): void;
3
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8I7D"}
@@ -0,0 +1,126 @@
1
+ import * as clack from '@clack/prompts';
2
+ import chalk from 'chalk';
3
+ import { muted, sym, success as successColor, error as errorColor, statusBadge } from '../tui/theme.js';
4
+ import { table } from '../tui/table.js';
5
+ import { section } from '../tui/display.js';
6
+ import { renderSimpleHelp } from '../tui/help.js';
7
+ import { ExitCode } from '../exit-codes.js';
8
+ import { getClient, handleApiError } from '../client.js';
9
+ import { isJsonMode, printJson } from '../formatters.js';
10
+ export function registerStatusCommands(program) {
11
+ const status = program
12
+ .command('status')
13
+ .description('Check Babelize API server health')
14
+ .option('--deep', 'Run deep health check (verifies all dependencies)');
15
+ status.helpInformation = () => renderSimpleHelp('status', 'Check Babelize API server health', [
16
+ { name: '--deep', desc: 'Run deep health check (verifies all dependencies)' },
17
+ { name: '--json', desc: 'Output raw JSON (machine-readable)' },
18
+ ]);
19
+ status.action(async (opts) => {
20
+ const endpoint = opts.deep ? '/health/deep' : '/health';
21
+ const spinner = clack.spinner();
22
+ spinner.start('Checking status…');
23
+ let user = null;
24
+ let plan = null;
25
+ let projects = [];
26
+ let usage = null;
27
+ try {
28
+ const client = getClient();
29
+ // Parallel requests: API health + User data (if logged in)
30
+ const { config } = await import('../config.js');
31
+ const creds = config.getCredentials();
32
+ const requests = [client.get(endpoint)];
33
+ if (creds) {
34
+ requests.push(client.get('/auth/me').catch(() => ({ data: null })), client.get('/plan').catch(() => ({ data: null })), client.get('/projects').catch(() => ({ data: [] })), client.get('/billing/usage/summary').catch(() => ({ data: null })));
35
+ }
36
+ const [healthRes, meRes, planRes, projectsRes, usageRes] = await Promise.all(requests);
37
+ const apiData = healthRes?.data;
38
+ if (meRes?.data) {
39
+ const meData = meRes;
40
+ user = meData.data?.user ?? meData.data;
41
+ }
42
+ if (planRes?.data) {
43
+ const planData = planRes;
44
+ plan = planData.data?.plan ?? planData.data;
45
+ }
46
+ if (projectsRes?.data) {
47
+ const projectsData = projectsRes;
48
+ projects = projectsData.data?.projects ?? projectsData.data ?? [];
49
+ }
50
+ if (usageRes?.data) {
51
+ const usageData = usageRes;
52
+ usage = usageData.data?.summary ?? usageData.data;
53
+ }
54
+ spinner.stop('Done.');
55
+ if (isJsonMode()) {
56
+ printJson({ status: apiData, user, plan, usage, projectsCount: projects.length });
57
+ return;
58
+ }
59
+ if (user) {
60
+ section('Current User');
61
+ const userMeta = user.user_metadata;
62
+ const name = (userMeta?.display_name ?? userMeta?.name ?? user.display_name) ?? '—';
63
+ console.log(` ${muted('Name'.padEnd(16))} ${chalk.bold(name)}`);
64
+ console.log(` ${muted('Email'.padEnd(16))} ${user.email}`);
65
+ if (plan) {
66
+ console.log(` ${muted('Plan'.padEnd(16))} ${plan.name} (${plan.billingCycle})`);
67
+ }
68
+ }
69
+ if (plan) {
70
+ section('Usage & Limits');
71
+ const pUsed = projects.length;
72
+ const pLimit = plan.projectsLimit ?? '∞';
73
+ const aiUsed = plan.aiCreditsUsed ?? 0;
74
+ const aiLimit = plan.aiCreditsLimit ?? '∞';
75
+ const bUsed = usage?.monthly ?? 0;
76
+ const bLimit = plan.babelsLimit ?? '∞';
77
+ console.log(` ${muted('Projects'.padEnd(16))} ${pUsed} / ${pLimit}`);
78
+ console.log(` ${muted('Babels'.padEnd(16))} ${bUsed} / ${bLimit} (monthly)`);
79
+ console.log(` ${muted('AI Credits'.padEnd(16))} ${aiUsed} / ${aiLimit}`);
80
+ }
81
+ section('Service Status');
82
+ const s = apiData?.status ?? 'unknown';
83
+ console.log(` ${muted('Status'.padEnd(18))} ${statusBadge(s)}`);
84
+ if (apiData?.services) {
85
+ const services = apiData.services;
86
+ table(Object.entries(services).map(([name, info]) => {
87
+ const infoObj = info;
88
+ return {
89
+ name,
90
+ status: (infoObj?.status ?? info),
91
+ latency: infoObj?.latency ? `${infoObj.latency}ms` : sym.emDash,
92
+ };
93
+ }), [
94
+ { key: 'name', header: 'Service', width: 20 },
95
+ { key: 'status', header: 'Status', width: 14, transform: statusBadge },
96
+ { key: 'latency', header: 'Latency', width: 14 },
97
+ ]);
98
+ }
99
+ if (apiData?.timestamp) {
100
+ console.log(muted(`\n Checked at ${apiData.timestamp}`));
101
+ }
102
+ }
103
+ catch (err) {
104
+ spinner.stop('Failed.');
105
+ console.error(errorColor(`${sym.cross} API unreachable.`));
106
+ handleApiError(err);
107
+ }
108
+ });
109
+ // Individual probe subcommands
110
+ const ping = program
111
+ .command('ping')
112
+ .description('Quick liveness probe');
113
+ ping.helpInformation = () => renderSimpleHelp('ping', 'Quick liveness probe');
114
+ ping.action(async () => {
115
+ try {
116
+ const client = getClient();
117
+ await client.get('/health/live');
118
+ console.log(successColor(`${sym.check} API is live.`));
119
+ }
120
+ catch {
121
+ console.error(errorColor(`${sym.cross} API is not reachable.`));
122
+ process.exit(ExitCode.NETWORK);
123
+ }
124
+ });
125
+ }
126
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,IAAI,YAAY,EAAE,KAAK,IAAI,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,QAAQ,EAAE,mDAAmD,CAAC,CAAC;IAEzE,MAAM,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,kCAAkC,EAAE;QAC5F,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,mDAAmD,EAAE;QAC7E,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,oCAAoC,EAAE;KAC/D,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC;QACxD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAElC,IAAI,IAAI,GAAmC,IAAI,CAAC;QAChD,IAAI,IAAI,GAAmC,IAAI,CAAC;QAChD,IAAI,QAAQ,GAA8B,EAAE,CAAC;QAC7C,IAAI,KAAK,GAAmC,IAAI,CAAC;QAEjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAE3B,2DAA2D;YAC3D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;YAEtC,MAAM,QAAQ,GAAuB,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE5D,IAAI,KAAK,EAAE,CAAC;gBACV,QAAQ,CAAC,IAAI,CACX,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EACpD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EACjD,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EACnD,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CACnE,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvF,MAAM,OAAO,GAAI,SAAiD,EAAE,IAA2C,CAAC;YAEhH,IAAK,KAA6C,EAAE,IAAI,EAAE,CAAC;gBACzD,MAAM,MAAM,GAAG,KAAgC,CAAC;gBAChD,IAAI,GAAI,MAAM,CAAC,IAA4C,EAAE,IAA+B,IAAI,MAAM,CAAC,IAA+B,CAAC;YACzI,CAAC;YACD,IAAK,OAA+C,EAAE,IAAI,EAAE,CAAC;gBAC3D,MAAM,QAAQ,GAAG,OAAkC,CAAC;gBACpD,IAAI,GAAI,QAAQ,CAAC,IAA4C,EAAE,IAA+B,IAAI,QAAQ,CAAC,IAA+B,CAAC;YAC7I,CAAC;YACD,IAAK,WAAmD,EAAE,IAAI,EAAE,CAAC;gBAC/D,MAAM,YAAY,GAAG,WAAsC,CAAC;gBAC5D,QAAQ,GAAI,YAAY,CAAC,IAA4C,EAAE,QAAqC,IAAI,YAAY,CAAC,IAAiC,IAAI,EAAE,CAAC;YACvK,CAAC;YACD,IAAK,QAAgD,EAAE,IAAI,EAAE,CAAC;gBAC5D,MAAM,SAAS,GAAG,QAAmC,CAAC;gBACtD,KAAK,GAAI,SAAS,CAAC,IAA4C,EAAE,OAAkC,IAAI,SAAS,CAAC,IAA+B,CAAC;YACnJ,CAAC;YAED,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAEtB,IAAI,UAAU,EAAE,EAAE,CAAC;gBACjB,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBAClF,OAAO;YACT,CAAC;YAED,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,CAAC,cAAc,CAAC,CAAC;gBACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAoD,CAAC;gBAC3E,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,YAAY,IAAI,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAC,YAAY,CAAW,IAAI,GAAG,CAAC;gBAC9F,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,KAAe,EAAE,CAAC,CAAC;gBACtE,IAAI,IAAI,EAAE,CAAC;oBACT,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,IAAc,KAAK,IAAI,CAAC,YAAsB,GAAG,CAAC,CAAC;gBACvG,CAAC;YACH,CAAC;YAED,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAC9B,MAAM,MAAM,GAAI,IAAI,CAAC,aAAwB,IAAI,GAAG,CAAC;gBAErD,MAAM,MAAM,GAAI,IAAI,CAAC,aAAwB,IAAI,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAI,IAAI,CAAC,cAAyB,IAAI,GAAG,CAAC;gBAEvD,MAAM,KAAK,GAAI,KAAK,EAAE,OAAkB,IAAI,CAAC,CAAC;gBAC9C,MAAM,MAAM,GAAI,IAAI,CAAC,WAAsB,IAAI,GAAG,CAAC;gBAEnD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,MAAM,EAAE,CAAC,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,MAAM,YAAY,CAAC,CAAC;gBAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,MAAM,OAAO,EAAE,CAAC,CAAC;YAC5E,CAAC;YAED,OAAO,CAAC,gBAAgB,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAI,OAAO,EAAE,MAAiB,IAAI,SAAS,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAEjE,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;gBACtB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAmC,CAAC;gBAC7D,KAAK,CACH,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBAC5C,MAAM,OAAO,GAAG,IAA+B,CAAC;oBAChD,OAAO;wBACL,IAAI;wBACJ,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,IAAI,IAAI,CAAW;wBAC3C,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAiB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM;qBAC1E,CAAC;gBACJ,CAAC,CAAC,EACF;oBACE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;oBAC7C,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE;oBACtE,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;iBACjD,CACF,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,EAAE,SAAS,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,kBAAkB,OAAO,CAAC,SAAmB,EAAE,CAAC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,KAAK,mBAAmB,CAAC,CAAC,CAAC;YAC3D,cAAc,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,+BAA+B;IAC/B,MAAM,IAAI,GAAG,OAAO;SACjB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAEvC,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAE9E,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,MAAM,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,KAAK,wBAAwB,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerSubscriptionCommands(program: Command): void;
3
+ //# sourceMappingURL=subscriptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscriptions.d.ts","sourceRoot":"","sources":["../../src/commands/subscriptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2GnE"}
@@ -0,0 +1,141 @@
1
+ import * as clack from '@clack/prompts';
2
+ import { getClient, handleApiError } from '../client.js';
3
+ import { isJsonMode, printJson } from '../formatters.js';
4
+ import { statusBadge } from '../tui/theme.js';
5
+ import { table, keyValue } from '../tui/table.js';
6
+ import { section } from '../tui/display.js';
7
+ import { renderCommandHelp } from '../tui/help.js';
8
+ export function registerSubscriptionCommands(program) {
9
+ const subs = program
10
+ .command('subscriptions')
11
+ .alias('sub')
12
+ .description('Subscription plan management');
13
+ subs
14
+ .command('list')
15
+ .description('List all available subscription plans')
16
+ .action(async () => {
17
+ const s = clack.spinner();
18
+ s.start('Fetching subscriptions…');
19
+ try {
20
+ const client = getClient();
21
+ const res = await client.get('/subscriptions');
22
+ s.stop();
23
+ const items = res.data?.subscriptions ?? res.data ?? [];
24
+ if (isJsonMode()) {
25
+ printJson(items);
26
+ return;
27
+ }
28
+ section('Subscription Plans');
29
+ table(items, [
30
+ { key: 'id', format: 'id', header: 'ID', width: 38 },
31
+ { key: 'name', header: 'Name', width: 18 },
32
+ { key: 'price_monthly', format: 'number', header: '$/mo', width: 10 },
33
+ { key: 'project_limit', format: 'number', header: 'Projects', width: 12 },
34
+ { key: 'babel_limit', format: 'number', header: 'Babels/mo', width: 14 },
35
+ { key: 'is_deprecated', header: 'Deprecated', width: 12 },
36
+ ]);
37
+ }
38
+ catch (err) {
39
+ s.stop();
40
+ handleApiError(err);
41
+ }
42
+ });
43
+ subs
44
+ .command('get <id>')
45
+ .description('Get a subscription plan by ID')
46
+ .action(async (id) => {
47
+ const s = clack.spinner();
48
+ s.start('Fetching subscription…');
49
+ try {
50
+ const client = getClient();
51
+ const res = await client.get(`/subscriptions/${id}`);
52
+ s.stop();
53
+ if (isJsonMode()) {
54
+ printJson(res.data);
55
+ return;
56
+ }
57
+ keyValue(res.data?.subscription ?? res.data ?? {}, 'Subscription');
58
+ }
59
+ catch (err) {
60
+ s.stop();
61
+ handleApiError(err);
62
+ }
63
+ });
64
+ subs
65
+ .command('default')
66
+ .description('Get the default (free) plan')
67
+ .action(async () => {
68
+ const s = clack.spinner();
69
+ s.start('Fetching default plan…');
70
+ try {
71
+ const client = getClient();
72
+ const res = await client.get('/subscriptions/default');
73
+ s.stop();
74
+ if (isJsonMode()) {
75
+ printJson(res.data);
76
+ return;
77
+ }
78
+ keyValue(res.data?.subscription ?? res.data ?? {}, 'Default Plan');
79
+ }
80
+ catch (err) {
81
+ s.stop();
82
+ handleApiError(err);
83
+ }
84
+ });
85
+ subs
86
+ .command('plan')
87
+ .description('Show your current active subscription plan')
88
+ .action(async () => {
89
+ const s = clack.spinner();
90
+ s.start('Fetching your plan…');
91
+ try {
92
+ const client = getClient();
93
+ const res = await client.get('/plan');
94
+ s.stop();
95
+ if (isJsonMode()) {
96
+ printJson(res.data);
97
+ return;
98
+ }
99
+ keyValue(res.data ?? {}, 'Your Plan');
100
+ }
101
+ catch (err) {
102
+ s.stop();
103
+ handleApiError(err);
104
+ }
105
+ });
106
+ subs
107
+ .command('user <userId>')
108
+ .description('Get subscriptions for a specific user')
109
+ .action(async (userId) => {
110
+ const s = clack.spinner();
111
+ s.start('Fetching user subscriptions…');
112
+ try {
113
+ const client = getClient();
114
+ const res = await client.get(`/users/${userId}/subscriptions`);
115
+ s.stop();
116
+ const items = res.data?.subscriptions ?? res.data ?? [];
117
+ if (isJsonMode()) {
118
+ printJson(items);
119
+ return;
120
+ }
121
+ table(items, [
122
+ { key: 'plan_name', header: 'Plan', width: 18 },
123
+ { key: 'status', header: 'Status', width: 14, transform: statusBadge },
124
+ { key: 'started_at', format: 'date', header: 'Started', width: 24 },
125
+ { key: 'expires_at', format: 'date', header: 'Expires', width: 24 },
126
+ ]);
127
+ }
128
+ catch (err) {
129
+ s.stop();
130
+ handleApiError(err);
131
+ }
132
+ });
133
+ subs.helpInformation = () => renderCommandHelp('subscriptions', 'Subscription plan management', [
134
+ { name: 'list', desc: 'List all available subscription plans' },
135
+ { name: 'get <id>', desc: 'Get a subscription plan by ID' },
136
+ { name: 'default', desc: 'Get the default (free) plan' },
137
+ { name: 'plan', desc: 'Show your current active subscription plan' },
138
+ { name: 'user <userId>', desc: 'Get subscriptions for a specific user' },
139
+ ]);
140
+ }
141
+ //# sourceMappingURL=subscriptions.js.map