vibecodingmachine-cli 2026.2.20-423 → 2026.2.20-426

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.
@@ -206,9 +206,12 @@ async function showProviderManagerMenu() {
206
206
  console.log(chalk.cyan(`\nConfiguring ${getAgentDisplayName(selectedId)}...\n`));
207
207
  // Here you would implement configuration logic
208
208
  console.log(chalk.gray('Configuration not yet implemented in CLI'));
209
- await new Promise(resolve => {
210
- process.stdin.once('keypress', () => resolve());
211
- });
209
+ const inquirer = require('inquirer');
210
+ await inquirer.prompt([{
211
+ type: 'input',
212
+ name: 'continue',
213
+ message: 'Press Enter to continue...'
214
+ }]);
212
215
  }
213
216
  break;
214
217
 
@@ -327,10 +327,12 @@ async function showRequirementsTree() {
327
327
  // Safety check: ensure tree.selected is within bounds
328
328
  if (tree.items.length === 0) {
329
329
  console.log(chalk.yellow('No items to display.'));
330
- console.log(chalk.gray(`\n${t('interactive.press.any.key.return')}`));
331
- await new Promise((resolve) => {
332
- process.stdin.once('keypress', () => resolve());
333
- });
330
+ const inquirer = require('inquirer');
331
+ await inquirer.prompt([{
332
+ type: 'input',
333
+ name: 'continue',
334
+ message: `${t('interactive.press.any.key.return')}`
335
+ }]);
334
336
  inTree = false;
335
337
  continue;
336
338
  }
@@ -57,6 +57,7 @@ async function buildMainMenuItems() {
57
57
  items.push({ type: 'action', name: '[+ Add Specification]', value: 'add-spec' });
58
58
  items.push({ type: 'action', name: '💬 Send Continue to Windsurf', value: 'continue-windsurf' });
59
59
  items.push({ type: 'action', name: '🔄 Sync Now', value: 'sync' });
60
+ items.push({ type: 'action', name: 'Exit', value: 'exit' });
60
61
 
61
62
  return items;
62
63
  }
@@ -72,6 +73,7 @@ class TRUINavigation {
72
73
 
73
74
  async start() {
74
75
  const { showWelcomeScreen } = require('./welcome-screen-extracted');
76
+
75
77
  console.clear();
76
78
  try { await showWelcomeScreen(); } catch (_) {}
77
79
 
@@ -211,6 +211,8 @@ function showQuickMenu(items, initialSelectedIndex = 0, options = {}) {
211
211
  perfMonitor.end('showQuickMenu');
212
212
  stateTracker.pop();
213
213
  debugLogger.info('Menu cleanup completed', perfMonitor.getMetrics());
214
+ // Reset debounce timer when cleaning up
215
+ menuSuppressUntil = 0;
214
216
  };
215
217
 
216
218
  const selectOption = index => {
@@ -299,6 +301,8 @@ function showQuickMenu(items, initialSelectedIndex = 0, options = {}) {
299
301
  count++;
300
302
  }
301
303
  }
304
+ // Invalid letter - don't do anything, just return
305
+ return;
302
306
  }
303
307
 
304
308
  // Arrow up
@@ -310,7 +314,7 @@ function showQuickMenu(items, initialSelectedIndex = 0, options = {}) {
310
314
  next = items.length - 1;
311
315
  while (next >= 0 && !isSelectable(items[next])) next--;
312
316
  }
313
- if (next >= 0) {
317
+ if (next >= 0 && next < items.length && isSelectable(items[next])) {
314
318
  selectedIndex = next;
315
319
  stateTracker.update({ selectedIndex });
316
320
  display();
@@ -327,7 +331,7 @@ function showQuickMenu(items, initialSelectedIndex = 0, options = {}) {
327
331
  next = 0;
328
332
  while (next < items.length && !isSelectable(items[next])) next++;
329
333
  }
330
- if (next < items.length) {
334
+ if (next >= 0 && next < items.length && isSelectable(items[next])) {
331
335
  selectedIndex = next;
332
336
  stateTracker.update({ selectedIndex });
333
337
  display();
@@ -352,7 +356,8 @@ function showQuickMenu(items, initialSelectedIndex = 0, options = {}) {
352
356
  if (process.stdin.isTTY && process.stdin.setRawMode) {
353
357
  process.stdin.setRawMode(true);
354
358
  }
355
- menuSuppressUntil = Date.now() + 300;
359
+ // Shorter debounce (50ms) to prevent accidental double-presses while still being responsive
360
+ menuSuppressUntil = Date.now() + 50;
356
361
  process.stdin.on('keypress', onKeypress);
357
362
  process.stdin.resume();
358
363
  });
@@ -217,7 +217,7 @@ async function showRequirementsTree() {
217
217
 
218
218
  while (true) {
219
219
  const items = await buildTreeItems(sections, expanded, expandedSpecs, specPhases);
220
- const hintText = '[→ expand ← collapse/back < move item down > move item up - delete + add Space toggle, NO SHIFT needed]';
220
+ const hintText = '[→ expand ← collapse/back < move item down > move item up - delete + add Space toggle]';
221
221
 
222
222
  const extraKeys = (str, key, selectedIndex, { resolveWith }) => {
223
223
  const keyName = key && key.name;
@@ -44,12 +44,26 @@ class WindsurfDetector {
44
44
  */
45
45
  isWindsurfRunning() {
46
46
  try {
47
- // Check for Windsurf processes
48
- const result = execSync('ps aux | grep -i windsurf | grep -v grep', {
49
- encoding: 'utf8',
50
- timeout: 5000
51
- });
52
- return result.trim().length > 0;
47
+ // Cross-platform process check
48
+ const isWindows = process.platform === 'win32';
49
+ let result;
50
+
51
+ if (isWindows) {
52
+ // Windows: use tasklist
53
+ result = execSync('tasklist /FI "IMAGENAME eq Windsurf.exe" /NH', {
54
+ encoding: 'utf8',
55
+ timeout: 5000
56
+ });
57
+ // Check if Windsurf.exe is in the output
58
+ return result.toLowerCase().includes('windsurf.exe');
59
+ } else {
60
+ // Unix/macOS: use ps and grep
61
+ result = execSync('ps aux | grep -i windsurf | grep -v grep', {
62
+ encoding: 'utf8',
63
+ timeout: 5000
64
+ });
65
+ return result.trim().length > 0;
66
+ }
53
67
  } catch (error) {
54
68
  debugLogger.warn('Windsurf process check failed', { error: error.message });
55
69
  return false;