vibecodingmachine-cli 2026.1.3-2209 → 2026.1.23-1010

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 (40) hide show
  1. package/__tests__/antigravity-js-handler.test.js +23 -0
  2. package/__tests__/provider-manager.test.js +84 -0
  3. package/__tests__/provider-rate-cache.test.js +27 -0
  4. package/bin/vibecodingmachine.js +8 -0
  5. package/package.json +2 -2
  6. package/reset_provider_order.js +21 -0
  7. package/scripts/convert-requirements.js +35 -0
  8. package/scripts/debug-parse.js +24 -0
  9. package/src/commands/auto-direct.js +679 -120
  10. package/src/commands/auto.js +200 -45
  11. package/src/commands/ide.js +108 -3
  12. package/src/commands/requirements-remote.js +10 -1
  13. package/src/commands/status.js +39 -1
  14. package/src/utils/antigravity-js-handler.js +13 -4
  15. package/src/utils/auth.js +37 -13
  16. package/src/utils/compliance-check.js +10 -0
  17. package/src/utils/config.js +29 -1
  18. package/src/utils/date-formatter.js +44 -0
  19. package/src/utils/interactive.js +1006 -537
  20. package/src/utils/kiro-js-handler.js +188 -0
  21. package/src/utils/provider-rate-cache.js +31 -0
  22. package/src/utils/provider-registry.js +42 -1
  23. package/src/utils/requirements-converter.js +107 -0
  24. package/src/utils/requirements-parser.js +144 -0
  25. package/tests/antigravity-js-handler.test.js +23 -0
  26. package/tests/integration/health-tracking.integration.test.js +284 -0
  27. package/tests/provider-manager.test.js +92 -0
  28. package/tests/rate-limit-display.test.js +44 -0
  29. package/tests/requirements-bullet-parsing.test.js +15 -0
  30. package/tests/requirements-converter.test.js +42 -0
  31. package/tests/requirements-heading-count.test.js +27 -0
  32. package/tests/requirements-legacy-parsing.test.js +15 -0
  33. package/tests/requirements-parse-integration.test.js +44 -0
  34. package/tests/wait-for-ide-completion.test.js +56 -0
  35. package/tests/wait-for-ide-quota-detection-cursor-screenshot.test.js +61 -0
  36. package/tests/wait-for-ide-quota-detection-cursor.test.js +60 -0
  37. package/tests/wait-for-ide-quota-detection-negative.test.js +45 -0
  38. package/tests/wait-for-ide-quota-detection.test.js +59 -0
  39. package/verify_fix.js +36 -0
  40. package/verify_ui.js +38 -0
@@ -0,0 +1,23 @@
1
+ const { handleAntigravityRateLimit } = require('../src/utils/antigravity-js-handler');
2
+ const providerRegistry = require('../src/utils/provider-registry');
3
+
4
+ jest.mock('../src/utils/provider-registry');
5
+
6
+ describe('handleAntigravityRateLimit', () => {
7
+ beforeEach(() => {
8
+ jest.resetAllMocks();
9
+ });
10
+
11
+ test('suggests next provider and does not persistently disable antigravity', async () => {
12
+ providerRegistry.getProviderPreferences.mockResolvedValue({
13
+ order: ['antigravity', 'vscode'],
14
+ enabled: { antigravity: true, vscode: true }
15
+ });
16
+
17
+ const result = await handleAntigravityRateLimit();
18
+
19
+ expect(result.success).toBe(true);
20
+ expect(result.nextProvider).toBe('vscode');
21
+ expect(providerRegistry.saveProviderPreferences).not.toHaveBeenCalled();
22
+ });
23
+ });
@@ -0,0 +1,84 @@
1
+ const providerRegistry = require('../src/utils/provider-registry');
2
+ const interactive = require('../src/utils/interactive');
3
+
4
+ jest.mock('../src/utils/provider-registry');
5
+
6
+ describe('showProviderManagerMenu', () => {
7
+ const origIsTTY = process.stdin.isTTY;
8
+ const origSetRawMode = process.stdin.setRawMode;
9
+
10
+ beforeAll(() => {
11
+ // Ensure stdin behaves like a TTY for the menu
12
+ process.stdin.isTTY = true;
13
+ process.stdin.setRawMode = () => {};
14
+ });
15
+
16
+ afterAll(() => {
17
+ process.stdin.isTTY = origIsTTY;
18
+ process.stdin.setRawMode = origSetRawMode;
19
+ });
20
+
21
+ beforeEach(() => {
22
+ jest.resetAllMocks();
23
+ });
24
+
25
+ test('pressing left after reordering calls saveProviderPreferences', async () => {
26
+ providerRegistry.getProviderDefinitions.mockReturnValue([
27
+ { id: 'groq', name: 'Groq' },
28
+ { id: 'antigravity', name: 'Antigravity' }
29
+ ]);
30
+
31
+ providerRegistry.getProviderPreferences.mockResolvedValue({
32
+ order: ['groq', 'antigravity'],
33
+ enabled: { groq: true, antigravity: true }
34
+ });
35
+
36
+ providerRegistry.saveProviderPreferences.mockResolvedValue();
37
+
38
+ // Start the menu
39
+ const menuPromise = interactive.showProviderManagerMenu();
40
+
41
+ // Allow the menu to initialize
42
+ await new Promise(resolve => setImmediate(resolve));
43
+
44
+ // Simulate 'j' (reorder downward)
45
+ process.stdin.emit('keypress', 'j', { name: 'j' });
46
+ await new Promise(resolve => setImmediate(resolve));
47
+
48
+ // Simulate left arrow to save and exit
49
+ process.stdin.emit('keypress', undefined, { name: 'left' });
50
+
51
+ await menuPromise; // wait for menu to finish
52
+
53
+ expect(providerRegistry.saveProviderPreferences).toHaveBeenCalledTimes(1);
54
+ expect(providerRegistry.saveProviderPreferences).toHaveBeenCalledWith(['antigravity', 'groq'], { groq: true, antigravity: true });
55
+ });
56
+
57
+ test('pressing escape after reordering does NOT call saveProviderPreferences', async () => {
58
+ providerRegistry.getProviderDefinitions.mockReturnValue([
59
+ { id: 'groq', name: 'Groq' },
60
+ { id: 'antigravity', name: 'Antigravity' }
61
+ ]);
62
+
63
+ providerRegistry.getProviderPreferences.mockResolvedValue({
64
+ order: ['groq', 'antigravity'],
65
+ enabled: { groq: true, antigravity: true }
66
+ });
67
+
68
+ providerRegistry.saveProviderPreferences.mockResolvedValue();
69
+
70
+ const menuPromise = interactive.showProviderManagerMenu();
71
+ await new Promise(resolve => setImmediate(resolve));
72
+
73
+ // Make a change
74
+ process.stdin.emit('keypress', 'j', { name: 'j' });
75
+ await new Promise(resolve => setImmediate(resolve));
76
+
77
+ // Press escape to cancel (should not persist)
78
+ process.stdin.emit('keypress', undefined, { name: 'escape' });
79
+
80
+ await menuPromise;
81
+
82
+ expect(providerRegistry.saveProviderPreferences).not.toHaveBeenCalled();
83
+ });
84
+ });
@@ -0,0 +1,27 @@
1
+ const { getProviderRateLimitedQuotas } = require('../src/utils/provider-rate-cache');
2
+ const ProviderManager = require('vibecodingmachine-core/src/ide-integration/provider-manager.cjs');
3
+
4
+ describe('getProviderRateLimitedQuotas', () => {
5
+ let pm;
6
+
7
+ beforeEach(() => {
8
+ pm = new ProviderManager();
9
+ pm.clearAllRateLimits();
10
+ });
11
+
12
+ afterEach(() => {
13
+ pm.clearAllRateLimits();
14
+ });
15
+
16
+ test('returns rate-limited entry when ProviderManager has a limit', () => {
17
+ pm.markRateLimited('antigravity', undefined, 'Quota limit reached');
18
+
19
+ const defs = [{ id: 'antigravity' }, { id: 'vscode' }];
20
+ const map = getProviderRateLimitedQuotas(defs);
21
+
22
+ expect(map.has('antigravity')).toBe(true);
23
+ const q = map.get('antigravity');
24
+ expect(q).toHaveProperty('type', 'rate-limit');
25
+ expect(q).toHaveProperty('resetsAt');
26
+ });
27
+ });
@@ -103,6 +103,8 @@ program
103
103
  .command('auto:start')
104
104
  .description(t('cli.auto.start'))
105
105
  .option('-i, --ide <ide>', 'IDE to use (claude-code, aider, cursor, vscode, windsurf, cline)')
106
+ .option('--ide-model <model>', 'IDE agent/model to use (for IDE sub-agents like Windsurf/Antigravity)')
107
+ .option('--extension <extension>', 'VS Code extension to use (amazon-q, github-copilot, windsurf)')
106
108
  .option('-m, --max-chats <number>', 'Maximum number of chat iterations', parseInt)
107
109
  .option('-n, --never-stop', 'Run indefinitely without stopping')
108
110
  .option('-f, --force-provider-setup', 'Force provider selection even if already configured')
@@ -223,6 +225,12 @@ program
223
225
  .option('-i, --ide <ide>', 'IDE to use (cursor, vscode, windsurf)', 'cursor')
224
226
  .action(ideCommands.send);
225
227
 
228
+ program
229
+ .command('ide:health')
230
+ .description('Test health and connectivity of all configured IDEs')
231
+ .option('-v, --verbose', 'Show detailed health metrics', false)
232
+ .action(ideCommands.health);
233
+
226
234
  // Status and monitoring commands
227
235
  program
228
236
  .command('status')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vibecodingmachine-cli",
3
- "version": "2026.01.03-2209",
3
+ "version": "2026.01.23-1010",
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": "^2026.01.03-2209",
28
+ "vibecodingmachine-core": "^2026.01.23-1010",
29
29
  "@aws-sdk/client-dynamodb": "^3.600.0",
30
30
  "@aws-sdk/lib-dynamodb": "^3.600.0",
31
31
  "boxen": "^5.1.2",
@@ -0,0 +1,21 @@
1
+ const { getDefaultProviderOrder, saveProviderPreferences, getProviderPreferences } = require('./src/utils/provider-registry');
2
+ const chalk = require('chalk');
3
+
4
+ async function resetOrder() {
5
+ try {
6
+ const defaultOrder = getDefaultProviderOrder();
7
+ console.log('New Default Order:', defaultOrder);
8
+
9
+ const currentPrefs = await getProviderPreferences();
10
+ console.log('Current User Order:', currentPrefs.order);
11
+
12
+ // Force update the order to match default
13
+ await saveProviderPreferences(defaultOrder, currentPrefs.enabled);
14
+ console.log(chalk.green('Successfully reset provider order to default (Cloud -> IDE -> Local).'));
15
+ } catch (error) {
16
+ console.error('Failed to reset order:', error);
17
+ process.exit(1);
18
+ }
19
+ }
20
+
21
+ resetOrder();
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ const fs = require('fs-extra');
3
+ const path = require('path');
4
+ const os = require('os');
5
+ const { getRequirementsPath } = require('vibecodingmachine-core/src/utils/repo-helpers.cjs');
6
+ const { convertPackageBlocksToHeadings } = require('../src/utils/requirements-converter');
7
+
8
+ async function main() {
9
+ try {
10
+ const repoRoot = path.resolve(__dirname, '..', '..', '..');
11
+ const reqPath = await getRequirementsPath(repoRoot, os.hostname());
12
+ if (!reqPath || !await fs.pathExists(reqPath)) {
13
+ console.error('Requirements file not found for this host:', reqPath);
14
+ process.exit(1);
15
+ }
16
+
17
+ const content = await fs.readFile(reqPath, 'utf8');
18
+ const converted = convertPackageBlocksToHeadings(content, 'todo', '⏳ Requirements not yet completed');
19
+
20
+ // Backup
21
+ const backupPath = `${reqPath}.bak.${Date.now()}`;
22
+ await fs.copy(reqPath, backupPath);
23
+ console.log('Backup created at', backupPath);
24
+
25
+ await fs.writeFile(reqPath, converted, 'utf8');
26
+ console.log('Converted requirements written to', reqPath);
27
+ } catch (e) {
28
+ console.error('Error converting requirements:', e);
29
+ process.exit(1);
30
+ }
31
+ }
32
+
33
+ if (require.main === module) {
34
+ main();
35
+ }
@@ -0,0 +1,24 @@
1
+ const { parseRequirementsFromContent } = require('../src/utils/requirements-parser');
2
+ const content = `# REQUIREMENTS
3
+
4
+ ## ⏳ Requirements not yet completed
5
+
6
+ PACKAGE: cli
7
+ Add filter options to ` + "`vcm req:list`" + `: --computer <hostname>
8
+
9
+ - Add
10
+ - bullet one
11
+ - bullet two
12
+
13
+ ### Modify "Add Requirement" dialog to include computer selection dropdown. Show computer focus areas as hints. Allow selecting a computer.
14
+
15
+ PACKAGE: electron-app
16
+ Create modal dialog for resolving sync conflicts. Show side-by-side diff of local vs remote changes.
17
+
18
+ - Create network status indicator
19
+
20
+ `;
21
+
22
+ const reqs = parseRequirementsFromContent(content, 'todo', '⏳ Requirements not yet completed');
23
+ console.log('Parsed titles:', reqs.map(r => r.title));
24
+ console.log('Full:', JSON.stringify(reqs, null, 2));