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.
@@ -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('Vibe Coding Machine CLI - Autonomous development')
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('Manage repository settings')
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('Set the active repository path')
84
+ .description(t('cli.repo.set'))
78
85
  .action(repoCommands.setRepo);
79
86
 
80
87
  program
81
88
  .command('repo:get')
82
- .description('Get the current repository path')
89
+ .description(t('cli.repo.get'))
83
90
  .action(repoCommands.getRepo);
84
91
 
85
92
  program
86
93
  .command('repo:init')
87
- .description('Initialize Vibe Coding Machine in current directory')
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('Start autonomous development mode')
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('Start autonomous mode with direct LLM API calls (recommended)')
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('Stop autonomous development mode')
117
+ .description(t('cli.auto.stop'))
111
118
  .action(autoCommands.stop);
112
119
 
113
120
  program
114
121
  .command('auto:status')
115
- .description('Check autonomous mode status')
122
+ .description(t('cli.auto.status'))
116
123
  .action(autoCommands.status);
117
124
 
118
125
  program
119
126
  .command('auto:config')
120
- .description('Configure auto mode settings')
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('List available agents and their quota status')
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('List all requirements')
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('Add a new requirement')
147
+ .description(t('cli.req.add'))
141
148
  .action(reqCommands.add);
142
149
 
143
150
  program
144
151
  .command('req:current')
145
- .description('Show current requirement being worked on')
152
+ .description(t('cli.req.current'))
146
153
  .action(reqCommands.current);
147
154
 
148
155
  program
149
156
  .command('req:next')
150
- .description('Move to next requirement')
157
+ .description(t('cli.req.next'))
151
158
  .action(reqCommands.next);
152
159
 
153
160
  program
154
161
  .command('req:edit')
155
- .description('Open requirements file in editor')
162
+ .description(t('cli.req.edit'))
156
163
  .action(reqCommands.edit);
157
164
 
158
165
  program
159
166
  .command('req:watch')
160
- .description('Watch requirements file for changes')
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('Rename requirement and optionally update 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('List available IDEs')
178
+ .description(t('cli.ide.list'))
172
179
  .action(ideCommands.list);
173
180
 
174
181
  program
175
182
  .command('ide:open <ide>')
176
- .description('Open IDE with current repository')
183
+ .description(t('cli.ide.open'))
177
184
  .action(ideCommands.open);
178
185
 
179
186
  program
180
187
  .command('ide:send <message>')
181
- .description('Send message to IDE AI chat')
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('Show Vibe Coding Machine status and progress')
195
+ .description(t('cli.status'))
189
196
  .action(statusCommands.show);
190
197
 
191
198
  program
192
199
  .command('progress')
193
- .description('Show development progress')
200
+ .description(t('cli.progress'))
194
201
  .action(statusCommands.progress);
195
202
 
196
203
  program
197
204
  .command('logs')
198
- .description('Show recent activity logs')
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('Setup "vcm" alias for shell')
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('Login with Google')
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('Logout')
228
+ .description(t('cli.auth.logout'))
222
229
  .action(authCommands.logout);
223
230
 
224
231
  program
225
232
  .command('auth:status')
226
- .description('Check authentication status')
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('List all registered computers')
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('Show detailed status of a specific computer')
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('Register current computer with focus area')
253
+ .description(t('cli.computer.register'))
247
254
  .action(computerCommands.registerComputer);
248
255
 
249
256
  program
250
257
  .command('computer:focus [newFocusArea]')
251
- .description('View or update focus area for current computer')
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('View requirements for another computer')
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('Add requirement to another computer')
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('Trigger immediate sync')
282
+ .description(t('cli.sync.trigger'))
276
283
  .action(syncCommands.syncNow);
277
284
 
278
285
  program
279
286
  .command('sync:status')
280
- .description('Show sync status and statistics')
287
+ .description(t('cli.sync.status.show'))
281
288
  .action(syncCommands.syncStatus);
282
289
 
283
290
  program
284
291
  .command('sync:queue')
285
- .description('View pending changes in offline queue')
292
+ .description(t('cli.sync.queue.view'))
286
293
  .action(syncCommands.viewQueue);
287
294
 
288
295
  program
289
296
  .command('sync:force')
290
- .description('Force sync even if offline')
297
+ .description(t('cli.sync.force.sync'))
291
298
  .action(syncCommands.forceSync);
292
299
 
293
300
  program
294
301
  .command('sync:history')
295
- .description('View sync history')
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('Start interactive mode')
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('Error:'), error.message);
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('Error:'), error.message);
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('\nπŸ” Opening browser for authentication...\n'));
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('\nβœ“ Authentication successful!\n'));
535
+ console.log(chalk.green(`\nβœ“ ${t('cli.auth.success')}\n`));
529
536
  } catch (error) {
530
- console.log(chalk.red('\nβœ— Authentication failed:'), error.message);
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('\nβœ— Compliance check failed. Exiting.\n'));
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('\nπŸ” Opening browser for authentication...\n'));
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('\nβœ“ Authentication successful!\n'));
576
+ console.log(chalk.green(`\nβœ“ ${t('cli.auth.success')}\n`));
570
577
  } catch (error) {
571
- console.log(chalk.red('\nβœ— Authentication failed:'), error.message);
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('\nβœ— Compliance check failed. Exiting.\n'));
590
+ console.log(chalk.red(`\nβœ— ${t('cli.compliance.failed')}\n`));
584
591
  process.exit(1);
585
592
  }
586
593
 
@@ -0,0 +1,2 @@
1
+ {"timestamp":"2025-12-25T00:38:27.990Z","type":"auto-mode-stop","reason":"startup","message":"Auto Mode stopped (startup)"}
2
+ {"timestamp":"2025-12-25T00:39:00.886Z","type":"auto-mode-stop","reason":"startup","message":"Auto Mode stopped (startup)"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibecodingmachine-cli",
3
- "version": "2025.12.22-2230",
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.22-2230",
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",
@@ -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βœ“ Already authenticated as ${chalk.bold(profile.email)}`));
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('\nπŸš€ Starting interactive mode...\n'));
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('\nβœ— Login failed:'), error.message);
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('\nβœ“ Logged out successfully'));
41
+ console.log(chalk.green(`\nβœ“ ${t('auth.logout.success')}`));
41
42
  } catch (error) {
42
- console.error(chalk.red('\nβœ— Logout failed:'), error.message);
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('\nNot authenticated'));
56
- console.log(`Run ${chalk.cyan('vcm auth:login')} to sign in`);
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('\nπŸ‘€ User Profile:'));
66
- console.log(` Name: ${profile.name}`);
67
- console.log(` Email: ${profile.email}`);
68
- console.log(` Tier: ${profile.tier === 'premium' ? chalk.green('Premium 🌟') : 'Free'}`);
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('\nπŸ“Š Usage:'));
71
+ console.log(chalk.bold(`\nπŸ“Š ${t('profile.usage')}:`));
71
72
  if (canRun.features && canRun.features.unlimitedIterations) {
72
- console.log(` Daily Usage: ${canRun.todayUsage} iterations`);
73
- console.log(` Limit: ${chalk.green('Unlimited')} πŸš€`);
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(` Daily Usage: ${limitColor(`${canRun.todayUsage}/${canRun.maxIterations}`)} iterations`);
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('Upgrade to Premium for unlimited usage.'));
83
+ console.log(chalk.gray(t('profile.upgrade.suggestion')));
83
84
  }
84
85
  }
85
86
 
86
87
  } catch (error) {
87
- console.error(chalk.red('\nβœ— Failed to check status:'), error.message);
88
+ console.error(chalk.red(`\nβœ— ${t('status.check.failed')}:`), error.message);
88
89
  }
89
90
  }
90
91