vibecodingmachine-cli 2025.12.22-2230 β 2025.12.24-2348
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.
- package/bin/vibecodingmachine.js +57 -50
- package/logs/audit/2025-12-24.jsonl +2 -0
- package/package.json +2 -2
- package/src/commands/auth.js +19 -18
- package/src/commands/auto-direct.js +81 -56
- package/src/commands/auto.js +13 -12
- package/src/commands/computers.js +58 -55
- package/src/commands/locale.js +73 -0
- package/src/commands/requirements-remote.js +4 -3
- package/src/commands/setup.js +14 -13
- package/src/commands/status.js +17 -17
- package/src/commands/sync.js +68 -67
- package/src/utils/first-run.js +4 -3
- package/src/utils/interactive.js +178 -117
- package/src/utils/provider-registry.js +38 -1
package/bin/vibecodingmachine.js
CHANGED
|
@@ -45,6 +45,13 @@ const streamPipeline = promisify(pipeline);
|
|
|
45
45
|
// const path = require('path'); // Moved to top for .env.auth loading
|
|
46
46
|
const packageJson = require('../package.json');
|
|
47
47
|
|
|
48
|
+
// Import localization
|
|
49
|
+
const { t, detectLocale, setLocale } = require('vibecodingmachine-core');
|
|
50
|
+
|
|
51
|
+
// Initialize locale detection
|
|
52
|
+
const detectedLocale = detectLocale();
|
|
53
|
+
setLocale(detectedLocale);
|
|
54
|
+
|
|
48
55
|
// Import command modules
|
|
49
56
|
const repoCommands = require('../src/commands/repo');
|
|
50
57
|
const autoCommands = require('../src/commands/auto');
|
|
@@ -60,37 +67,37 @@ const altCommandName = commandName === 'vcm' ? 'vibecodingmachine' : 'vcm';
|
|
|
60
67
|
program
|
|
61
68
|
.name(commandName)
|
|
62
69
|
.usage(`[options] [command]\n\n You can use '${commandName}' or '${altCommandName}'`)
|
|
63
|
-
.description('
|
|
70
|
+
.description(t('app.name') + ' CLI - Autonomous development')
|
|
64
71
|
.version(packageJson.version, '-v, --version', 'output the current version')
|
|
65
72
|
.helpOption('-h, --help', 'display help for command');
|
|
66
73
|
|
|
67
74
|
// Repository management commands
|
|
68
75
|
program
|
|
69
76
|
.command('repo')
|
|
70
|
-
.description('
|
|
77
|
+
.description(t('cli.repo.manage'))
|
|
71
78
|
.action(() => {
|
|
72
79
|
program.outputHelp();
|
|
73
80
|
});
|
|
74
81
|
|
|
75
82
|
program
|
|
76
83
|
.command('repo:set <path>')
|
|
77
|
-
.description('
|
|
84
|
+
.description(t('cli.repo.set'))
|
|
78
85
|
.action(repoCommands.setRepo);
|
|
79
86
|
|
|
80
87
|
program
|
|
81
88
|
.command('repo:get')
|
|
82
|
-
.description('
|
|
89
|
+
.description(t('cli.repo.get'))
|
|
83
90
|
.action(repoCommands.getRepo);
|
|
84
91
|
|
|
85
92
|
program
|
|
86
93
|
.command('repo:init')
|
|
87
|
-
.description('
|
|
94
|
+
.description(t('cli.repo.init'))
|
|
88
95
|
.action(repoCommands.initRepo);
|
|
89
96
|
|
|
90
97
|
// Auto mode commands
|
|
91
98
|
program
|
|
92
99
|
.command('auto:start')
|
|
93
|
-
.description('
|
|
100
|
+
.description(t('cli.auto.start'))
|
|
94
101
|
.option('-i, --ide <ide>', 'IDE to use (claude-code, aider, cursor, vscode, windsurf, cline)')
|
|
95
102
|
.option('-m, --max-chats <number>', 'Maximum number of chat iterations', parseInt)
|
|
96
103
|
.option('-n, --never-stop', 'Run indefinitely without stopping')
|
|
@@ -101,23 +108,23 @@ program
|
|
|
101
108
|
const { handleAutoStart: handleDirectAutoStart } = require('../src/commands/auto-direct');
|
|
102
109
|
program
|
|
103
110
|
.command('auto:direct')
|
|
104
|
-
.description('
|
|
111
|
+
.description(t('cli.auto.direct'))
|
|
105
112
|
.option('-m, --max-chats <number>', 'Maximum number of iterations', parseInt)
|
|
106
113
|
.action(handleDirectAutoStart);
|
|
107
114
|
|
|
108
115
|
program
|
|
109
116
|
.command('auto:stop')
|
|
110
|
-
.description('
|
|
117
|
+
.description(t('cli.auto.stop'))
|
|
111
118
|
.action(autoCommands.stop);
|
|
112
119
|
|
|
113
120
|
program
|
|
114
121
|
.command('auto:status')
|
|
115
|
-
.description('
|
|
122
|
+
.description(t('cli.auto.status'))
|
|
116
123
|
.action(autoCommands.status);
|
|
117
124
|
|
|
118
125
|
program
|
|
119
126
|
.command('auto:config')
|
|
120
|
-
.description('
|
|
127
|
+
.description(t('cli.auto.config'))
|
|
121
128
|
.option('--max-chats <number>', 'Set maximum chat iterations', parseInt)
|
|
122
129
|
.option('--never-stop', 'Enable never stop mode')
|
|
123
130
|
.option('--no-never-stop', 'Disable never stop mode')
|
|
@@ -125,84 +132,84 @@ program
|
|
|
125
132
|
|
|
126
133
|
program
|
|
127
134
|
.command('auto:agents')
|
|
128
|
-
.description('
|
|
135
|
+
.description(t('cli.auto.agents'))
|
|
129
136
|
.action(autoCommands.listAgents);
|
|
130
137
|
|
|
131
138
|
// Requirements management commands
|
|
132
139
|
program
|
|
133
140
|
.command('req:list')
|
|
134
|
-
.description('
|
|
141
|
+
.description(t('cli.req.list'))
|
|
135
142
|
.option('-s, --status <status>', 'Filter by status (pending, in-progress, completed)')
|
|
136
143
|
.action(reqCommands.list);
|
|
137
144
|
|
|
138
145
|
program
|
|
139
146
|
.command('req:add <requirement>')
|
|
140
|
-
.description('
|
|
147
|
+
.description(t('cli.req.add'))
|
|
141
148
|
.action(reqCommands.add);
|
|
142
149
|
|
|
143
150
|
program
|
|
144
151
|
.command('req:current')
|
|
145
|
-
.description('
|
|
152
|
+
.description(t('cli.req.current'))
|
|
146
153
|
.action(reqCommands.current);
|
|
147
154
|
|
|
148
155
|
program
|
|
149
156
|
.command('req:next')
|
|
150
|
-
.description('
|
|
157
|
+
.description(t('cli.req.next'))
|
|
151
158
|
.action(reqCommands.next);
|
|
152
159
|
|
|
153
160
|
program
|
|
154
161
|
.command('req:edit')
|
|
155
|
-
.description('
|
|
162
|
+
.description(t('cli.req.edit'))
|
|
156
163
|
.action(reqCommands.edit);
|
|
157
164
|
|
|
158
165
|
program
|
|
159
166
|
.command('req:watch')
|
|
160
|
-
.description('
|
|
167
|
+
.description(t('cli.req.watch'))
|
|
161
168
|
.action(reqCommands.watch);
|
|
162
169
|
|
|
163
170
|
program
|
|
164
171
|
.command('req:rename <old-title> <new-title> [description...]')
|
|
165
|
-
.description('
|
|
172
|
+
.description(t('cli.req.rename'))
|
|
166
173
|
.action((oldTitle, newTitle, description) => reqCommands.rename(oldTitle, newTitle, description));
|
|
167
174
|
|
|
168
175
|
// IDE integration commands
|
|
169
176
|
program
|
|
170
177
|
.command('ide:list')
|
|
171
|
-
.description('
|
|
178
|
+
.description(t('cli.ide.list'))
|
|
172
179
|
.action(ideCommands.list);
|
|
173
180
|
|
|
174
181
|
program
|
|
175
182
|
.command('ide:open <ide>')
|
|
176
|
-
.description('
|
|
183
|
+
.description(t('cli.ide.open'))
|
|
177
184
|
.action(ideCommands.open);
|
|
178
185
|
|
|
179
186
|
program
|
|
180
187
|
.command('ide:send <message>')
|
|
181
|
-
.description('
|
|
188
|
+
.description(t('cli.ide.send'))
|
|
182
189
|
.option('-i, --ide <ide>', 'IDE to use (cursor, vscode, windsurf)', 'cursor')
|
|
183
190
|
.action(ideCommands.send);
|
|
184
191
|
|
|
185
192
|
// Status and monitoring commands
|
|
186
193
|
program
|
|
187
194
|
.command('status')
|
|
188
|
-
.description('
|
|
195
|
+
.description(t('cli.status'))
|
|
189
196
|
.action(statusCommands.show);
|
|
190
197
|
|
|
191
198
|
program
|
|
192
199
|
.command('progress')
|
|
193
|
-
.description('
|
|
200
|
+
.description(t('cli.progress'))
|
|
194
201
|
.action(statusCommands.progress);
|
|
195
202
|
|
|
196
203
|
program
|
|
197
204
|
.command('logs')
|
|
198
|
-
.description('
|
|
205
|
+
.description(t('cli.logs'))
|
|
199
206
|
.option('-n, --lines <number>', 'Number of log lines to show', '50')
|
|
200
207
|
.action(statusCommands.logs);
|
|
201
208
|
|
|
202
209
|
// Setup command
|
|
203
210
|
program
|
|
204
211
|
.command('setup')
|
|
205
|
-
.description('
|
|
212
|
+
.description(t('cli.setup'))
|
|
206
213
|
.action(async () => {
|
|
207
214
|
const { setupAlias } = require('../src/commands/setup');
|
|
208
215
|
await setupAlias();
|
|
@@ -212,18 +219,18 @@ program
|
|
|
212
219
|
const authCommands = require('../src/commands/auth');
|
|
213
220
|
program
|
|
214
221
|
.command('auth:login')
|
|
215
|
-
.description('
|
|
222
|
+
.description(t('cli.auth.login'))
|
|
216
223
|
.option('--headless', 'Use headless mode (manual URL paste) for SSH/no-GUI environments')
|
|
217
224
|
.action((options) => authCommands.login(options));
|
|
218
225
|
|
|
219
226
|
program
|
|
220
227
|
.command('auth:logout')
|
|
221
|
-
.description('
|
|
228
|
+
.description(t('cli.auth.logout'))
|
|
222
229
|
.action(authCommands.logout);
|
|
223
230
|
|
|
224
231
|
program
|
|
225
232
|
.command('auth:status')
|
|
226
|
-
.description('
|
|
233
|
+
.description(t('cli.auth.status'))
|
|
227
234
|
.action(authCommands.status);
|
|
228
235
|
|
|
229
236
|
// Multi-computer management commands
|
|
@@ -231,24 +238,24 @@ const computerCommands = require('../src/commands/computers');
|
|
|
231
238
|
const remoteReqCommands = require('../src/commands/requirements-remote');
|
|
232
239
|
program
|
|
233
240
|
.command('computers')
|
|
234
|
-
.description('
|
|
241
|
+
.description(t('cli.computers.list'))
|
|
235
242
|
.option('-f, --focus <area>', 'Filter by focus area')
|
|
236
243
|
.option('-s, --status <status>', 'Filter by status (active, idle, error)')
|
|
237
244
|
.action(computerCommands.listComputers);
|
|
238
245
|
|
|
239
246
|
program
|
|
240
247
|
.command('computer:status <computerId>')
|
|
241
|
-
.description('
|
|
248
|
+
.description(t('cli.computer.status.show'))
|
|
242
249
|
.action(computerCommands.showComputerStatus);
|
|
243
250
|
|
|
244
251
|
program
|
|
245
252
|
.command('computer:register <focusArea>')
|
|
246
|
-
.description('
|
|
253
|
+
.description(t('cli.computer.register'))
|
|
247
254
|
.action(computerCommands.registerComputer);
|
|
248
255
|
|
|
249
256
|
program
|
|
250
257
|
.command('computer:focus [newFocusArea]')
|
|
251
|
-
.description('
|
|
258
|
+
.description(t('cli.computer.focus.view'))
|
|
252
259
|
.action((newFocusArea) => {
|
|
253
260
|
if (newFocusArea) {
|
|
254
261
|
computerCommands.updateFocus(newFocusArea);
|
|
@@ -260,39 +267,39 @@ program
|
|
|
260
267
|
|
|
261
268
|
program
|
|
262
269
|
.command('computer:requirements <computerId>')
|
|
263
|
-
.description('
|
|
270
|
+
.description(t('cli.computer.requirements.view'))
|
|
264
271
|
.action(remoteReqCommands.listRemoteRequirements);
|
|
265
272
|
|
|
266
273
|
program
|
|
267
274
|
.command('computer:add-requirement <computerId> <requirement>')
|
|
268
|
-
.description('
|
|
275
|
+
.description(t('cli.computer.requirement.add'))
|
|
269
276
|
.action(remoteReqCommands.addRemoteRequirement);
|
|
270
277
|
|
|
271
278
|
// Sync management commands
|
|
272
279
|
const syncCommands = require('../src/commands/sync');
|
|
273
280
|
program
|
|
274
281
|
.command('sync:now')
|
|
275
|
-
.description('
|
|
282
|
+
.description(t('cli.sync.trigger'))
|
|
276
283
|
.action(syncCommands.syncNow);
|
|
277
284
|
|
|
278
285
|
program
|
|
279
286
|
.command('sync:status')
|
|
280
|
-
.description('
|
|
287
|
+
.description(t('cli.sync.status.show'))
|
|
281
288
|
.action(syncCommands.syncStatus);
|
|
282
289
|
|
|
283
290
|
program
|
|
284
291
|
.command('sync:queue')
|
|
285
|
-
.description('
|
|
292
|
+
.description(t('cli.sync.queue.view'))
|
|
286
293
|
.action(syncCommands.viewQueue);
|
|
287
294
|
|
|
288
295
|
program
|
|
289
296
|
.command('sync:force')
|
|
290
|
-
.description('
|
|
297
|
+
.description(t('cli.sync.force.sync'))
|
|
291
298
|
.action(syncCommands.forceSync);
|
|
292
299
|
|
|
293
300
|
program
|
|
294
301
|
.command('sync:history')
|
|
295
|
-
.description('
|
|
302
|
+
.description(t('cli.sync.history.view'))
|
|
296
303
|
.option('-n, --limit <number>', 'Number of history entries to show', '50')
|
|
297
304
|
.action(syncCommands.viewHistory);
|
|
298
305
|
|
|
@@ -300,7 +307,7 @@ program
|
|
|
300
307
|
program
|
|
301
308
|
.command('interactive')
|
|
302
309
|
.alias('i')
|
|
303
|
-
.description('
|
|
310
|
+
.description(t('cli.interactive'))
|
|
304
311
|
.action(async () => {
|
|
305
312
|
const { startInteractive } = require('../src/utils/interactive');
|
|
306
313
|
await startInteractive();
|
|
@@ -308,7 +315,7 @@ program
|
|
|
308
315
|
|
|
309
316
|
// Error handling
|
|
310
317
|
process.on('uncaughtException', (error) => {
|
|
311
|
-
console.error(chalk.red('
|
|
318
|
+
console.error(chalk.red(`${t('cli.error')}:`), error.message);
|
|
312
319
|
if (process.env.DEBUG) {
|
|
313
320
|
console.error(chalk.gray('Stack:'), error.stack);
|
|
314
321
|
}
|
|
@@ -316,7 +323,7 @@ process.on('uncaughtException', (error) => {
|
|
|
316
323
|
});
|
|
317
324
|
|
|
318
325
|
process.on('unhandledRejection', (error) => {
|
|
319
|
-
console.error(chalk.red('
|
|
326
|
+
console.error(chalk.red(`${t('cli.error')}:`), error.message);
|
|
320
327
|
if (process.env.DEBUG) {
|
|
321
328
|
console.error(chalk.gray('Stack:'), error.stack);
|
|
322
329
|
}
|
|
@@ -522,12 +529,12 @@ if (!process.argv.slice(2).length) {
|
|
|
522
529
|
const isAuth = await auth.isAuthenticated();
|
|
523
530
|
|
|
524
531
|
if (!isAuth) {
|
|
525
|
-
console.log(chalk.cyan(
|
|
532
|
+
console.log(chalk.cyan(`\nπ ${t('cli.auth.opening.browser')}\n`));
|
|
526
533
|
try {
|
|
527
534
|
await auth.login();
|
|
528
|
-
console.log(chalk.green(
|
|
535
|
+
console.log(chalk.green(`\nβ ${t('cli.auth.success')}\n`));
|
|
529
536
|
} catch (error) {
|
|
530
|
-
console.log(chalk.red(
|
|
537
|
+
console.log(chalk.red(`\nβ ${t('cli.auth.failed')}:`), error.message);
|
|
531
538
|
process.exit(1);
|
|
532
539
|
}
|
|
533
540
|
}
|
|
@@ -537,7 +544,7 @@ if (!process.argv.slice(2).length) {
|
|
|
537
544
|
const isCompliant = await checkCompliance();
|
|
538
545
|
|
|
539
546
|
if (!isCompliant) {
|
|
540
|
-
console.log(chalk.red(
|
|
547
|
+
console.log(chalk.red(`\nβ ${t('cli.compliance.failed')}\n`));
|
|
541
548
|
process.exit(1);
|
|
542
549
|
}
|
|
543
550
|
|
|
@@ -563,12 +570,12 @@ if (!process.argv.slice(2).length) {
|
|
|
563
570
|
const isAuth = await auth.isAuthenticated();
|
|
564
571
|
|
|
565
572
|
if (!isAuth) {
|
|
566
|
-
console.log(chalk.cyan(
|
|
573
|
+
console.log(chalk.cyan(`\nπ ${t('cli.auth.opening.browser')}\n`));
|
|
567
574
|
try {
|
|
568
575
|
await auth.login();
|
|
569
|
-
console.log(chalk.green(
|
|
576
|
+
console.log(chalk.green(`\nβ ${t('cli.auth.success')}\n`));
|
|
570
577
|
} catch (error) {
|
|
571
|
-
console.log(chalk.red(
|
|
578
|
+
console.log(chalk.red(`\nβ ${t('cli.auth.failed')}:`), error.message);
|
|
572
579
|
process.exit(1);
|
|
573
580
|
}
|
|
574
581
|
}
|
|
@@ -580,7 +587,7 @@ if (!process.argv.slice(2).length) {
|
|
|
580
587
|
const isCompliant = await checkCompliance();
|
|
581
588
|
|
|
582
589
|
if (!isCompliant) {
|
|
583
|
-
console.log(chalk.red(
|
|
590
|
+
console.log(chalk.red(`\nβ ${t('cli.compliance.failed')}\n`));
|
|
584
591
|
process.exit(1);
|
|
585
592
|
}
|
|
586
593
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vibecodingmachine-cli",
|
|
3
|
-
"version": "2025.12.
|
|
3
|
+
"version": "2025.12.24-2348",
|
|
4
4
|
"description": "Command-line interface for Vibe Coding Machine - Autonomous development",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"author": "Vibe Coding Machine Team",
|
|
26
26
|
"license": "MIT",
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"vibecodingmachine-core": "^2025.12.
|
|
28
|
+
"vibecodingmachine-core": "^2025.12.24-2348",
|
|
29
29
|
"@aws-sdk/client-dynamodb": "^3.600.0",
|
|
30
30
|
"@aws-sdk/lib-dynamodb": "^3.600.0",
|
|
31
31
|
"boxen": "^5.1.2",
|
package/src/commands/auth.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
const chalk = require('chalk');
|
|
2
2
|
const auth = require('../utils/auth');
|
|
3
|
+
const { t } = require('vibecodingmachine-core');
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* Login command
|
|
@@ -12,7 +13,7 @@ async function login(options = {}) {
|
|
|
12
13
|
const isAuth = await auth.isAuthenticated();
|
|
13
14
|
if (isAuth) {
|
|
14
15
|
const profile = await auth.getUserProfile();
|
|
15
|
-
console.log(chalk.green(`\nβ
|
|
16
|
+
console.log(chalk.green(`\nβ ${t('auth.login.already', { email: chalk.bold(profile.email) })}`));
|
|
16
17
|
return;
|
|
17
18
|
}
|
|
18
19
|
|
|
@@ -21,12 +22,12 @@ async function login(options = {}) {
|
|
|
21
22
|
|
|
22
23
|
// After successful authentication, start interactive mode
|
|
23
24
|
if (result) {
|
|
24
|
-
console.log(chalk.cyan(
|
|
25
|
+
console.log(chalk.cyan(`\nπ ${t('auth.starting.interactive')}\n`));
|
|
25
26
|
const { startInteractive } = require('../utils/interactive');
|
|
26
27
|
await startInteractive();
|
|
27
28
|
}
|
|
28
29
|
} catch (error) {
|
|
29
|
-
console.error(chalk.red(
|
|
30
|
+
console.error(chalk.red(`\nβ ${t('auth.login.failed')}:`), error.message);
|
|
30
31
|
process.exit(1);
|
|
31
32
|
}
|
|
32
33
|
}
|
|
@@ -37,9 +38,9 @@ async function login(options = {}) {
|
|
|
37
38
|
async function logout() {
|
|
38
39
|
try {
|
|
39
40
|
await auth.logout();
|
|
40
|
-
console.log(chalk.green(
|
|
41
|
+
console.log(chalk.green(`\nβ ${t('auth.logout.success')}`));
|
|
41
42
|
} catch (error) {
|
|
42
|
-
console.error(chalk.red(
|
|
43
|
+
console.error(chalk.red(`\nβ ${t('auth.logout.failed')}:`), error.message);
|
|
43
44
|
process.exit(1);
|
|
44
45
|
}
|
|
45
46
|
}
|
|
@@ -52,8 +53,8 @@ async function status() {
|
|
|
52
53
|
const isAuth = await auth.isAuthenticated();
|
|
53
54
|
|
|
54
55
|
if (!isAuth) {
|
|
55
|
-
console.log(chalk.yellow('
|
|
56
|
-
console.log(
|
|
56
|
+
console.log(chalk.yellow(`\n${t('auth.not.authenticated')}`));
|
|
57
|
+
console.log(t('auth.run.login', { command: chalk.cyan('vcm auth:login') }));
|
|
57
58
|
return;
|
|
58
59
|
}
|
|
59
60
|
|
|
@@ -62,29 +63,29 @@ async function status() {
|
|
|
62
63
|
// Get usage stats
|
|
63
64
|
const canRun = await auth.canRunAutoMode();
|
|
64
65
|
|
|
65
|
-
console.log(chalk.bold(
|
|
66
|
-
console.log(`
|
|
67
|
-
console.log(`
|
|
68
|
-
console.log(`
|
|
66
|
+
console.log(chalk.bold(`\nπ€ ${t('profile.name')}:`));
|
|
67
|
+
console.log(` ${t('profile.name')}: ${profile.name}`);
|
|
68
|
+
console.log(` ${t('profile.email')}: ${profile.email}`);
|
|
69
|
+
console.log(` ${t('profile.tier')}: ${profile.tier === 'premium' ? chalk.green(t('profile.tier.premium')) : t('profile.tier.free')}`);
|
|
69
70
|
|
|
70
|
-
console.log(chalk.bold(
|
|
71
|
+
console.log(chalk.bold(`\nπ ${t('profile.usage')}:`));
|
|
71
72
|
if (canRun.features && canRun.features.unlimitedIterations) {
|
|
72
|
-
console.log(`
|
|
73
|
-
console.log(`
|
|
73
|
+
console.log(` ${t('profile.daily.usage')}: ${canRun.todayUsage} ${t('profile.iterations')}`);
|
|
74
|
+
console.log(` ${t('profile.limit')}: ${chalk.green(t('profile.unlimited'))}`);
|
|
74
75
|
} else {
|
|
75
76
|
const limitColor = canRun.todayUsage >= canRun.maxIterations ? chalk.red : chalk.green;
|
|
76
|
-
console.log(`
|
|
77
|
+
console.log(` ${t('profile.daily.usage')}: ${limitColor(`${canRun.todayUsage}/${canRun.maxIterations}`)} ${t('profile.iterations')}`);
|
|
77
78
|
}
|
|
78
79
|
|
|
79
80
|
if (!canRun.canRun) {
|
|
80
|
-
console.log(chalk.red(`\nβ οΈ ${canRun.reason}`));
|
|
81
|
+
console.log(chalk.red(`\nβ οΈ ${t('quota.exceeded.warning', { reason: canRun.reason })}`));
|
|
81
82
|
if (profile.tier !== 'premium') {
|
|
82
|
-
console.log(chalk.gray('
|
|
83
|
+
console.log(chalk.gray(t('profile.upgrade.suggestion')));
|
|
83
84
|
}
|
|
84
85
|
}
|
|
85
86
|
|
|
86
87
|
} catch (error) {
|
|
87
|
-
console.error(chalk.red(
|
|
88
|
+
console.error(chalk.red(`\nβ ${t('status.check.failed')}:`), error.message);
|
|
88
89
|
}
|
|
89
90
|
}
|
|
90
91
|
|