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.
- package/__tests__/antigravity-js-handler.test.js +23 -0
- package/__tests__/provider-manager.test.js +84 -0
- package/__tests__/provider-rate-cache.test.js +27 -0
- package/bin/vibecodingmachine.js +8 -0
- package/package.json +2 -2
- package/reset_provider_order.js +21 -0
- package/scripts/convert-requirements.js +35 -0
- package/scripts/debug-parse.js +24 -0
- package/src/commands/auto-direct.js +679 -120
- package/src/commands/auto.js +200 -45
- package/src/commands/ide.js +108 -3
- package/src/commands/requirements-remote.js +10 -1
- package/src/commands/status.js +39 -1
- package/src/utils/antigravity-js-handler.js +13 -4
- package/src/utils/auth.js +37 -13
- package/src/utils/compliance-check.js +10 -0
- package/src/utils/config.js +29 -1
- package/src/utils/date-formatter.js +44 -0
- package/src/utils/interactive.js +1006 -537
- package/src/utils/kiro-js-handler.js +188 -0
- package/src/utils/provider-rate-cache.js +31 -0
- package/src/utils/provider-registry.js +42 -1
- package/src/utils/requirements-converter.js +107 -0
- package/src/utils/requirements-parser.js +144 -0
- package/tests/antigravity-js-handler.test.js +23 -0
- package/tests/integration/health-tracking.integration.test.js +284 -0
- package/tests/provider-manager.test.js +92 -0
- package/tests/rate-limit-display.test.js +44 -0
- package/tests/requirements-bullet-parsing.test.js +15 -0
- package/tests/requirements-converter.test.js +42 -0
- package/tests/requirements-heading-count.test.js +27 -0
- package/tests/requirements-legacy-parsing.test.js +15 -0
- package/tests/requirements-parse-integration.test.js +44 -0
- package/tests/wait-for-ide-completion.test.js +56 -0
- package/tests/wait-for-ide-quota-detection-cursor-screenshot.test.js +61 -0
- package/tests/wait-for-ide-quota-detection-cursor.test.js +60 -0
- package/tests/wait-for-ide-quota-detection-negative.test.js +45 -0
- package/tests/wait-for-ide-quota-detection.test.js +59 -0
- package/verify_fix.js +36 -0
- 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
|
+
});
|
package/bin/vibecodingmachine.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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));
|