vibecodingmachine-cli 2026.3.9-907 → 2026.3.10-1548

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 (39) hide show
  1. package/README.md +85 -85
  2. package/bin/commands/agent-commands.js +295 -28
  3. package/bin/vibecodingmachine.js +0 -0
  4. package/package.json +2 -2
  5. package/scripts/postinstall.js +161 -161
  6. package/src/commands/auth.js +100 -100
  7. package/src/commands/auto-execution.js +120 -32
  8. package/src/commands/auto-requirement-management.js +9 -9
  9. package/src/commands/auto-status-helpers.js +6 -12
  10. package/src/commands/computers.js +318 -318
  11. package/src/commands/feature.js +123 -123
  12. package/src/commands/locale.js +72 -72
  13. package/src/commands/repo.js +163 -163
  14. package/src/commands/setup.js +93 -93
  15. package/src/commands/sync.js +287 -287
  16. package/src/index.js +5 -5
  17. package/src/utils/agent-selector.js +50 -50
  18. package/src/utils/asset-cleanup.js +60 -60
  19. package/src/utils/auth.js +6 -0
  20. package/src/utils/auto-mode-ansi-ui.js +237 -237
  21. package/src/utils/auto-mode-simple-ui.js +141 -141
  22. package/src/utils/copy-with-progress.js +167 -167
  23. package/src/utils/download-with-progress.js +84 -84
  24. package/src/utils/keyboard-handler.js +153 -153
  25. package/src/utils/kiro-installer.js +178 -178
  26. package/src/utils/logger.js +4 -4
  27. package/src/utils/persistent-header.js +114 -114
  28. package/src/utils/prompt-helper.js +63 -63
  29. package/src/utils/provider-checker/agent-runner.js +110 -31
  30. package/src/utils/provider-checker/ide-manager.js +37 -8
  31. package/src/utils/provider-checker/provider-validator.js +50 -0
  32. package/src/utils/provider-checker/requirements-manager.js +21 -6
  33. package/src/utils/status-card.js +121 -121
  34. package/src/utils/stdout-interceptor.js +127 -127
  35. package/src/utils/trui-main-handlers.js +41 -8
  36. package/src/utils/trui-main-menu.js +10 -3
  37. package/src/utils/trui-nav-agents.js +23 -33
  38. package/src/utils/trui-navigation.js +2 -2
  39. package/src/utils/user-tracking.js +299 -299
package/README.md CHANGED
@@ -1,85 +1,85 @@
1
- # Vibe Coding Machine CLI
2
-
3
- Vibe Coding Machine command-line interface for managing repositories, auto mode, requirements, IDE actions, and status.
4
-
5
- ## Install
6
-
7
- From the monorepo root:
8
-
9
- ```bash
10
- npm install
11
- # optional: link locally for global access
12
- npm run --workspaces --if-present build
13
- npm link ./packages/cli
14
- ```
15
-
16
- Then run `vibecodingmachine` or `vcm` (short version).
17
-
18
- **Note**: The `vcm` shortcut will only be installed if you don't already have another `vcm` command on your system. If a conflict is detected, you can still use the full `vibecodingmachine` command.
19
-
20
- ## Usage
21
-
22
- ```bash
23
- vibecodingmachine --help # or: vcm --help (if installed)
24
- vibecodingmachine -v # or: vcm -v (if installed)
25
- ```
26
-
27
- **Note**: You can use either `vibecodingmachine` or `vcm` - they're the same command!
28
-
29
- ### Repository
30
- ```bash
31
- vcm repo:init # initialize .vibecodingmachine in CWD and set repo
32
- vcm repo:set /path/to/repo # set active repository
33
- vcm repo:get # print current repo path
34
- ```
35
-
36
- ### Auto Mode
37
- ```bash
38
- vcm auto:start --ide cursor --max-chats 10
39
- vcm auto:status
40
- vcm auto:config --max-chats 25 --never-stop
41
- vcm auto:stop
42
- ```
43
-
44
- ### Requirements
45
- ```bash
46
- vcm req:list
47
- vcm req:add "Build initial CLI MVP"
48
- vcm req:current
49
- vcm req:next
50
- vcm req:edit
51
- vcm req:watch
52
- ```
53
-
54
- ### IDE
55
- ```bash
56
- vcm ide:list
57
- vcm ide:open cursor # or vscode, windsurf
58
- vcm ide:send "Summarize failures" -i cursor
59
- ```
60
-
61
- ### Status
62
- ```bash
63
- vcm status
64
- vcm progress
65
- vcm logs -n 100
66
- ```
67
-
68
- ### Interactive
69
- ```bash
70
- vcm interactive
71
- ```
72
-
73
- ## Configuration
74
- - Stored at `~/.config/vibecodingmachine/config.json` by default
75
- - Override for testing with env var `VIBECODINGMACHINE_CONFIG_PATH=/tmp/your-test-config.json`
76
-
77
- ## Development
78
- ```bash
79
- # format and lint
80
- npm run -w @vibecodingmachine/cli format
81
- npm run -w @vibecodingmachine/cli lint
82
-
83
- # tests
84
- npm run -w @vibecodingmachine/cli test
85
- ```
1
+ # Vibe Coding Machine CLI
2
+
3
+ Vibe Coding Machine command-line interface for managing repositories, auto mode, requirements, IDE actions, and status.
4
+
5
+ ## Install
6
+
7
+ From the monorepo root:
8
+
9
+ ```bash
10
+ npm install
11
+ # optional: link locally for global access
12
+ npm run --workspaces --if-present build
13
+ npm link ./packages/cli
14
+ ```
15
+
16
+ Then run `vibecodingmachine` or `vcm` (short version).
17
+
18
+ **Note**: The `vcm` shortcut will only be installed if you don't already have another `vcm` command on your system. If a conflict is detected, you can still use the full `vibecodingmachine` command.
19
+
20
+ ## Usage
21
+
22
+ ```bash
23
+ vibecodingmachine --help # or: vcm --help (if installed)
24
+ vibecodingmachine -v # or: vcm -v (if installed)
25
+ ```
26
+
27
+ **Note**: You can use either `vibecodingmachine` or `vcm` - they're the same command!
28
+
29
+ ### Repository
30
+ ```bash
31
+ vcm repo:init # initialize .vibecodingmachine in CWD and set repo
32
+ vcm repo:set /path/to/repo # set active repository
33
+ vcm repo:get # print current repo path
34
+ ```
35
+
36
+ ### Auto Mode
37
+ ```bash
38
+ vcm auto:start --ide cursor --max-chats 10
39
+ vcm auto:status
40
+ vcm auto:config --max-chats 25 --never-stop
41
+ vcm auto:stop
42
+ ```
43
+
44
+ ### Requirements
45
+ ```bash
46
+ vcm req:list
47
+ vcm req:add "Build initial CLI MVP"
48
+ vcm req:current
49
+ vcm req:next
50
+ vcm req:edit
51
+ vcm req:watch
52
+ ```
53
+
54
+ ### IDE
55
+ ```bash
56
+ vcm ide:list
57
+ vcm ide:open cursor # or vscode, windsurf
58
+ vcm ide:send "Summarize failures" -i cursor
59
+ ```
60
+
61
+ ### Status
62
+ ```bash
63
+ vcm status
64
+ vcm progress
65
+ vcm logs -n 100
66
+ ```
67
+
68
+ ### Interactive
69
+ ```bash
70
+ vcm interactive
71
+ ```
72
+
73
+ ## Configuration
74
+ - Stored at `~/.config/vibecodingmachine/config.json` by default
75
+ - Override for testing with env var `VIBECODINGMACHINE_CONFIG_PATH=/tmp/your-test-config.json`
76
+
77
+ ## Development
78
+ ```bash
79
+ # format and lint
80
+ npm run -w @vibecodingmachine/cli format
81
+ npm run -w @vibecodingmachine/cli lint
82
+
83
+ # tests
84
+ npm run -w @vibecodingmachine/cli test
85
+ ```
@@ -177,56 +177,323 @@ function setupAgentCommands() {
177
177
  }
178
178
  });
179
179
 
180
- // Add agents subcommand structure
180
+ // Add agents list command (specific commands must come before general pattern)
181
181
  program
182
- .command('agents <agent-id> <action>')
183
- .description('Manage agent (enable/disable)')
184
- .action(async (agentId, action) => {
182
+ .command('agents-list')
183
+ .description('List all agents')
184
+ .action(async () => {
185
185
  try {
186
- let result;
187
- if (action === 'enable') {
188
- result = await agentCommands.executeCommand('ENABLE', agentId);
189
- } else if (action === 'disable') {
190
- result = await agentCommands.executeCommand('DISABLE', agentId);
186
+ const result = await agentCommands.executeCommand('LIST', 'agents');
187
+ if (result.success && result.agents) {
188
+ console.log(chalk.blue('=== AGENTS ==='));
189
+ result.agents.forEach(agent => {
190
+ const status = agent.enabled ? '' : '✗';
191
+ console.log(`${status} ${agent.id.padEnd(12)} ${agent.name}`);
192
+ });
191
193
  } else {
192
- console.error(chalk.red(`Unknown action: ${action}. Use 'enable' or 'disable'`));
194
+ console.error(chalk.red('Failed to list agents'));
193
195
  process.exit(1);
194
196
  }
195
-
196
- if (result.success) {
197
- console.log(chalk.green(result.message));
197
+ } catch (error) {
198
+ console.error('Error listing agents:', error.message);
199
+ process.exit(1);
200
+ }
201
+ });
202
+
203
+
204
+ // Add agents check command (specific commands must come before general pattern)
205
+ program
206
+ .command('agents-check [agent-id]')
207
+ .description('Check agent(s) status and run validation tests')
208
+ .option('--all', 'Check all enabled agents')
209
+ .action(async (agentId, options) => {
210
+ try {
211
+ const { checkAllProviders } = require('../../src/utils/provider-checker');
212
+ const { getEffectiveRepoPath, getAutoConfig } = require('../../src/utils/config');
213
+
214
+ const repoPath = await getEffectiveRepoPath();
215
+ const autoConfig = await getAutoConfig();
216
+
217
+ console.log(chalk.blue('🔍 Running agent checks...\n'));
218
+
219
+ // Determine which agents to check
220
+ let agentsToCheck = [];
221
+ if (options.all || !agentId) {
222
+ // Check all enabled agents
223
+ const definitions = getProviderDefinitions();
224
+ const prefs = await getProviderPreferences();
225
+ agentsToCheck = definitions
226
+ .filter(def => prefs.enabled[def.id] !== false)
227
+ .map(def => def.id);
228
+
229
+ if (agentsToCheck.length === 0) {
230
+ console.log(chalk.yellow('No enabled agents found. Enable agents first with: vcm enable agents <agent-id>'));
231
+ return;
232
+ }
233
+
234
+ console.log(chalk.gray(`Checking ${agentsToCheck.length} enabled agent(s): ${agentsToCheck.join(', ')}\n`));
198
235
  } else {
199
- console.error(chalk.red(result.error));
236
+ // Check specific agent
237
+ agentsToCheck = [agentId];
238
+ console.log(chalk.gray(`Checking agent: ${agentId}\n`));
239
+ }
240
+
241
+ // Run the checks
242
+ const results = await checkAllProviders(agentsToCheck, autoConfig, repoPath, (providerId, phase, result, message) => {
243
+ // Progress callback
244
+ const phaseEmoji = {
245
+ 'loading': '⏳',
246
+ 'installing': '📥',
247
+ 'checking': '🔍',
248
+ 'awaiting': '⏱️',
249
+ 'done': '✅',
250
+ 'error': '❌',
251
+ 'rate-limited': '⏸️'
252
+ };
253
+
254
+ const emoji = phaseEmoji[phase] || '•';
255
+ const msg = message || phase;
256
+ console.log(`${emoji} ${providerId}: ${msg}`);
257
+ });
258
+
259
+ // Display summary
260
+ console.log(chalk.blue('\n=== CHECK SUMMARY ===\n'));
261
+
262
+ let passCount = 0;
263
+ let failCount = 0;
264
+ let rateLimitedCount = 0;
265
+
266
+ for (const [providerId, result] of Object.entries(results)) {
267
+ if (result.status === 'success') {
268
+ console.log(chalk.green(`✅ ${providerId}: ${result.message}`));
269
+ passCount++;
270
+ } else if (result.rateLimited) {
271
+ console.log(chalk.yellow(`⏸️ ${providerId}: Rate limited (resets ${result.rateLimitMessage || 'unknown'})`));
272
+ rateLimitedCount++;
273
+ } else {
274
+ console.log(chalk.red(`❌ ${providerId}: ${result.message || 'Failed'}`));
275
+ failCount++;
276
+ }
277
+ }
278
+
279
+ console.log(chalk.blue('\n=== RESULTS ==='));
280
+ console.log(chalk.green(`✅ Passed: ${passCount}`));
281
+ if (rateLimitedCount > 0) {
282
+ console.log(chalk.yellow(`⏸️ Rate Limited: ${rateLimitedCount}`));
283
+ }
284
+ if (failCount > 0) {
285
+ console.log(chalk.red(`❌ Failed: ${failCount}`));
286
+ }
287
+
288
+ // Exit with error code if any failed
289
+ if (failCount > 0) {
200
290
  process.exit(1);
201
291
  }
292
+
202
293
  } catch (error) {
203
- console.error(`Error ${action}ing agent ${agentId}:`, error.message);
294
+ console.error(chalk.red('Error checking agents:'), error.message);
295
+ console.error(error.stack);
204
296
  process.exit(1);
205
297
  }
206
298
  });
207
299
 
208
- // Add agents list command
300
+ // Add "check agents" alias command
209
301
  program
210
- .command('agents list')
211
- .description('List all agents')
212
- .action(async () => {
302
+ .command('check-agents [agent-id]')
303
+ .description('Check agent(s) status and run validation tests (alias)')
304
+ .option('--all', 'Check all enabled agents')
305
+ .action(async (agentId, options) => {
306
+ // Delegate to the agents check command logic
213
307
  try {
214
- const result = await agentCommands.executeCommand('LIST', 'agents');
215
- if (result.success && result.agents) {
216
- console.log(chalk.blue('=== AGENTS ==='));
217
- result.agents.forEach(agent => {
218
- const status = agent.enabled ? '✓' : '✗';
219
- console.log(`${status} ${agent.id.padEnd(12)} ${agent.name}`);
220
- });
308
+ const { checkAllProviders } = require('../../src/utils/provider-checker');
309
+ const { getEffectiveRepoPath, getAutoConfig } = require('../../src/utils/config');
310
+
311
+ const repoPath = await getEffectiveRepoPath();
312
+ const autoConfig = await getAutoConfig();
313
+
314
+ console.log(chalk.blue('🔍 Running agent checks...\n'));
315
+
316
+ // Determine which agents to check
317
+ let agentsToCheck = [];
318
+ if (options.all || !agentId) {
319
+ // Check all enabled agents
320
+ const definitions = getProviderDefinitions();
321
+ const prefs = await getProviderPreferences();
322
+ agentsToCheck = definitions
323
+ .filter(def => prefs.enabled[def.id] !== false)
324
+ .map(def => def.id);
325
+
326
+ if (agentsToCheck.length === 0) {
327
+ console.log(chalk.yellow('No enabled agents found. Enable agents first with: vcm enable agents <agent-id>'));
328
+ return;
329
+ }
330
+
331
+ console.log(chalk.gray(`Checking ${agentsToCheck.length} enabled agent(s): ${agentsToCheck.join(', ')}\n`));
221
332
  } else {
222
- console.error(chalk.red('Failed to list agents'));
333
+ // Check specific agent
334
+ agentsToCheck = [agentId];
335
+ console.log(chalk.gray(`Checking agent: ${agentId}\n`));
336
+ }
337
+
338
+ // Run the checks
339
+ const results = await checkAllProviders(agentsToCheck, autoConfig, repoPath, (providerId, phase, result, message) => {
340
+ // Progress callback
341
+ const phaseEmoji = {
342
+ 'loading': '⏳',
343
+ 'installing': '📥',
344
+ 'checking': '🔍',
345
+ 'awaiting': '⏱️',
346
+ 'done': '✅',
347
+ 'error': '❌',
348
+ 'rate-limited': '⏸️'
349
+ };
350
+
351
+ const emoji = phaseEmoji[phase] || '•';
352
+ const msg = message || phase;
353
+ console.log(`${emoji} ${providerId}: ${msg}`);
354
+ });
355
+
356
+ // Display summary
357
+ console.log(chalk.blue('\n=== CHECK SUMMARY ===\n'));
358
+
359
+ let passCount = 0;
360
+ let failCount = 0;
361
+ let rateLimitedCount = 0;
362
+
363
+ for (const [providerId, result] of Object.entries(results)) {
364
+ if (result.status === 'success') {
365
+ console.log(chalk.green(`✅ ${providerId}: ${result.message}`));
366
+ passCount++;
367
+ } else if (result.rateLimited) {
368
+ console.log(chalk.yellow(`⏸️ ${providerId}: Rate limited (resets ${result.rateLimitMessage || 'unknown'})`));
369
+ rateLimitedCount++;
370
+ } else {
371
+ console.log(chalk.red(`❌ ${providerId}: ${result.message || 'Failed'}`));
372
+ failCount++;
373
+ }
374
+ }
375
+
376
+ console.log(chalk.blue('\n=== RESULTS ==='));
377
+ console.log(chalk.green(`✅ Passed: ${passCount}`));
378
+ if (rateLimitedCount > 0) {
379
+ console.log(chalk.yellow(`⏸️ Rate Limited: ${rateLimitedCount}`));
380
+ }
381
+ if (failCount > 0) {
382
+ console.log(chalk.red(`❌ Failed: ${failCount}`));
383
+ }
384
+
385
+ // Exit with error code if any failed
386
+ if (failCount > 0) {
223
387
  process.exit(1);
224
388
  }
389
+
225
390
  } catch (error) {
226
- console.error('Error listing agents:', error.message);
391
+ console.error(chalk.red('Error checking agents:'), error.message);
392
+ console.error(error.stack);
227
393
  process.exit(1);
228
394
  }
229
395
  });
396
+
397
+ // Alias: check agents
398
+ program
399
+ .command('check agents [agent-id]')
400
+ .description('Check agent(s) status and run validation tests (alias)')
401
+ .option('--all', 'Check all enabled agents')
402
+ .action(async (agentId, options) => {
403
+ // Delegate to the agents-check command logic
404
+ try {
405
+ const { checkAllProviders } = require('../../src/utils/provider-checker');
406
+ const { getEffectiveRepoPath, getAutoConfig } = require('../../src/utils/config');
407
+
408
+ const repoPath = await getEffectiveRepoPath();
409
+ const autoConfig = await getAutoConfig();
410
+
411
+ console.log(chalk.blue('🔍 Running agent checks...\n'));
412
+
413
+ // Determine which agents to check
414
+ let agentsToCheck = [];
415
+ if (options.all || !agentId) {
416
+ // Check all enabled agents
417
+ const definitions = getProviderDefinitions();
418
+ const prefs = await getProviderPreferences();
419
+ agentsToCheck = definitions
420
+ .filter(def => prefs.enabled[def.id] !== false)
421
+ .map(def => def.id);
422
+
423
+ if (agentsToCheck.length === 0) {
424
+ console.log(chalk.yellow('No enabled agents found. Enable agents first with: vcm enable agents <agent-id>'));
425
+ return;
426
+ }
427
+
428
+ console.log(chalk.gray(`Checking ${agentsToCheck.length} enabled agent(s): ${agentsToCheck.join(', ')}\n`));
429
+ } else {
430
+ // Check specific agent
431
+ agentsToCheck = [agentId];
432
+ console.log(chalk.gray(`Checking agent: ${agentId}\n`));
433
+ }
434
+
435
+ // Run the checks
436
+ const results = await checkAllProviders(agentsToCheck, autoConfig, repoPath, (providerId, phase, result, message) => {
437
+ // Progress callback
438
+ const phaseEmoji = {
439
+ 'loading': '⏳',
440
+ 'installing': '📥',
441
+ 'checking': '🔍',
442
+ 'awaiting': '⏱️',
443
+ 'done': '✅',
444
+ 'error': '❌',
445
+ 'rate-limited': '⏸️'
446
+ };
447
+
448
+ const emoji = phaseEmoji[phase] || '•';
449
+ const msg = message || phase;
450
+ console.log(`${emoji} ${providerId}: ${msg}`);
451
+ });
452
+
453
+ // Display summary
454
+ console.log(chalk.blue('\n=== CHECK SUMMARY ===\n'));
455
+
456
+ let passCount = 0;
457
+ let failCount = 0;
458
+ let rateLimitedCount = 0;
459
+
460
+ for (const [providerId, result] of Object.entries(results)) {
461
+ if (result.status === 'success') {
462
+ console.log(chalk.green(`✅ ${providerId}: ${result.message}`));
463
+ passCount++;
464
+ } else if (result.rateLimited) {
465
+ console.log(chalk.yellow(`⏸️ ${providerId}: Rate limited (resets ${result.rateLimitMessage || 'unknown'})`));
466
+ rateLimitedCount++;
467
+ } else {
468
+ console.log(chalk.red(`❌ ${providerId}: ${result.message || 'Failed'}`));
469
+ failCount++;
470
+ }
471
+ }
472
+
473
+ console.log(chalk.blue('\n=== RESULTS ==='));
474
+ console.log(chalk.green(`✅ Passed: ${passCount}`));
475
+ if (rateLimitedCount > 0) {
476
+ console.log(chalk.yellow(`⏸️ Rate Limited: ${rateLimitedCount}`));
477
+ }
478
+ if (failCount > 0) {
479
+ console.log(chalk.red(`❌ Failed: ${failCount}`));
480
+ }
481
+
482
+ // Exit with error code if any failed
483
+ if (failCount > 0) {
484
+ process.exit(1);
485
+ }
486
+
487
+ } catch (error) {
488
+ console.error(chalk.red('Error checking agents:'), error.message);
489
+ console.error(error.stack);
490
+ process.exit(1);
491
+ }
492
+ });
493
+
494
+ // Note: Removed general agents <agent-id> <action> command
495
+ // It was conflicting with "agents check <agent-id>"
496
+ // Use explicit commands instead: "vcm agents <id> enable" or "vcm agents <id> disable"
230
497
  }
231
498
 
232
499
  module.exports = { setupAgentCommands, createAgentCommands };
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibecodingmachine-cli",
3
- "version": "2026.03.09-0907",
3
+ "version": "2026.03.10-1548",
4
4
  "description": "Command-line interface for Vibe Coding Machine - Autonomous development",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -59,7 +59,7 @@
59
59
  "react": "^19.2.0",
60
60
  "screenshot-desktop": "^1.15.3",
61
61
  "table": "^6.8.1",
62
- "vibecodingmachine-core": "^2026.03.09-0907"
62
+ "vibecodingmachine-core": "^2026.03.10-1548"
63
63
  },
64
64
  "devDependencies": {
65
65
  "eslint": "^8.57.0",