vibecodingmachine-cli 2026.3.14-1537 → 2026.6.17-1956

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 (162) hide show
  1. package/bin/auth/auth-compliance.js +7 -7
  2. package/bin/commands/agent-commands.js +15 -15
  3. package/bin/commands/auto-commands.js +3 -3
  4. package/bin/commands/command-aliases.js +13 -4
  5. package/bin/config/cli-config.js +15 -5
  6. package/bin/update/update-checker.js +5 -5
  7. package/bin/vibecodingmachine.js +2 -2
  8. package/package.json +2 -2
  9. package/src/commands/agents/add.js +5 -5
  10. package/src/commands/agents/check.js +19 -19
  11. package/src/commands/agents/list.js +24 -24
  12. package/src/commands/agents/remove.js +4 -4
  13. package/src/commands/agents-check.js +1 -1
  14. package/src/commands/analyze-file-sizes.js +43 -43
  15. package/src/commands/auto-direct/auto-provider-manager.js +19 -19
  16. package/src/commands/auto-direct/auto-start-phases.js +493 -0
  17. package/src/commands/auto-direct/auto-status-display.js +35 -35
  18. package/src/commands/auto-direct/auto-utils.js +50 -50
  19. package/src/commands/auto-direct/cline-installer.js +56 -0
  20. package/src/commands/auto-direct/code-processor.js +27 -27
  21. package/src/commands/auto-direct/file-scanner.js +19 -19
  22. package/src/commands/auto-direct/ide-completion-waiter.js +485 -0
  23. package/src/commands/auto-direct/ide-fallback-runner.js +226 -0
  24. package/src/commands/auto-direct/ide-provider-runner.js +103 -0
  25. package/src/commands/auto-direct/iteration-handlers.js +189 -0
  26. package/src/commands/auto-direct/iteration-runner.js +485 -0
  27. package/src/commands/auto-direct/provider-config.js +38 -7
  28. package/src/commands/auto-direct/provider-manager.js +132 -6
  29. package/src/commands/auto-direct/requirement-manager.js +169 -104
  30. package/src/commands/auto-direct/requirement-mover.js +350 -0
  31. package/src/commands/auto-direct/spec-handlers.js +155 -0
  32. package/src/commands/auto-direct/spec-ide-runner.js +318 -0
  33. package/src/commands/auto-direct/spec-processing.js +203 -0
  34. package/src/commands/auto-direct/status-display.js +9 -9
  35. package/src/commands/auto-direct/utils.js +83 -1
  36. package/src/commands/auto-direct-refactored.js +1 -413
  37. package/src/commands/auto-direct.js +127 -4119
  38. package/src/commands/auto-execution.js +21 -21
  39. package/src/commands/auto-status-helpers.js +0 -2
  40. package/src/commands/auto.js +22 -22
  41. package/src/commands/check-compliance.js +65 -65
  42. package/src/commands/computers.js +39 -39
  43. package/src/commands/continuous-scan.js +19 -19
  44. package/src/commands/ide.js +4 -4
  45. package/src/commands/locale.js +7 -7
  46. package/src/commands/refactor-file.js +59 -59
  47. package/src/commands/requirements/commands.js +17 -17
  48. package/src/commands/requirements/default-handlers.js +30 -30
  49. package/src/commands/requirements/disable.js +3 -3
  50. package/src/commands/requirements/enable.js +3 -3
  51. package/src/commands/requirements/utils.js +6 -6
  52. package/src/commands/requirements-refactored.js +3 -3
  53. package/src/commands/requirements-remote.js +38 -38
  54. package/src/commands/requirements.js +3 -3
  55. package/src/commands/settings.js +111 -0
  56. package/src/commands/specs/count.js +60 -0
  57. package/src/commands/specs/disable.js +3 -3
  58. package/src/commands/specs/enable.js +3 -3
  59. package/src/commands/status.js +10 -10
  60. package/src/commands/sync.js +25 -25
  61. package/src/commands/timeout.js +35 -35
  62. package/src/trui/TruiInterface.js +2 -2
  63. package/src/trui/agents/AgentInterface.js +4 -4
  64. package/src/trui/agents/handlers/CommandHandler.js +4 -4
  65. package/src/trui/agents/handlers/ContextManager.js +1 -1
  66. package/src/trui/agents/handlers/DisplayHandler.js +11 -11
  67. package/src/trui/agents/handlers/HelpHandler.js +1 -1
  68. package/src/utils/agent-selector.js +6 -6
  69. package/src/utils/antigravity-installer.js +4 -4
  70. package/src/utils/asset-cleanup.js +1 -1
  71. package/src/utils/auth.js +9 -12
  72. package/src/utils/clarification-actions.js +4 -4
  73. package/src/utils/cline-js-handler.js +5 -5
  74. package/src/utils/compliance-check.js +6 -6
  75. package/src/utils/config.js +12 -12
  76. package/src/utils/display-formatters-complete.js +2 -2
  77. package/src/utils/display-formatters-extracted.js +2 -2
  78. package/src/utils/display-formatters.js +2 -2
  79. package/src/utils/feedback-handler.js +2 -2
  80. package/src/utils/first-run.js +7 -7
  81. package/src/utils/ide-detection.js +1 -1
  82. package/src/utils/ide-handlers.js +6 -6
  83. package/src/utils/interactive/clarification-actions.js +3 -3
  84. package/src/utils/interactive/core-ui.js +7 -7
  85. package/src/utils/interactive/file-backup.js +6 -6
  86. package/src/utils/interactive/file-import-export.js +49 -49
  87. package/src/utils/interactive/file-operations.js +3 -3
  88. package/src/utils/interactive/file-validation.js +41 -41
  89. package/src/utils/interactive/interactive-prompts.js +41 -41
  90. package/src/utils/interactive/requirement-actions.js +5 -5
  91. package/src/utils/interactive/requirement-crud.js +4 -4
  92. package/src/utils/interactive/requirements-navigation.js +10 -10
  93. package/src/utils/interactive-broken.js +6 -6
  94. package/src/utils/interactive.js +37 -37
  95. package/src/utils/keyboard-handler.js +4 -4
  96. package/src/utils/prompt-helper.js +6 -6
  97. package/src/utils/provider-checker/agent-checker.js +1 -1
  98. package/src/utils/provider-checker/agent-runner.js +203 -314
  99. package/src/utils/provider-checker/agents-file-lock.js +134 -0
  100. package/src/utils/provider-checker/agents-manager.js +224 -36
  101. package/src/utils/provider-checker/cli-installer.js +28 -28
  102. package/src/utils/provider-checker/cli-utils.js +2 -2
  103. package/src/utils/provider-checker/cursor-approval-clicker.js +108 -0
  104. package/src/utils/provider-checker/format-utils.js +4 -4
  105. package/src/utils/provider-checker/ide-installer-helper.js +96 -0
  106. package/src/utils/provider-checker/ide-manager.js +19 -8
  107. package/src/utils/provider-checker/ide-quota-checker.js +120 -0
  108. package/src/utils/provider-checker/ide-utils.js +2 -2
  109. package/src/utils/provider-checker/node-detector.js +4 -4
  110. package/src/utils/provider-checker/node-utils.js +5 -5
  111. package/src/utils/provider-checker/opencode-checker.js +107 -73
  112. package/src/utils/provider-checker/process-utils.js +1 -1
  113. package/src/utils/provider-checker/provider-validator.js +11 -11
  114. package/src/utils/provider-checker/quota-checker.js +5 -5
  115. package/src/utils/provider-checker/quota-detector.js +5 -5
  116. package/src/utils/provider-checker/requirements-manager.js +6 -6
  117. package/src/utils/provider-checker/test-requirements.js +1 -1
  118. package/src/utils/provider-checker/vscode-approval-clicker.js +328 -0
  119. package/src/utils/provider-checker-new.js +6 -6
  120. package/src/utils/provider-checker.js +6 -6
  121. package/src/utils/provider-checkers/ide-manager.js +13 -13
  122. package/src/utils/provider-checkers/node-executable-finder.js +4 -4
  123. package/src/utils/provider-checkers/provider-checker-core.js +5 -5
  124. package/src/utils/provider-checkers/provider-checker-main.js +17 -17
  125. package/src/utils/provider-registry.js +5 -6
  126. package/src/utils/provider-utils.js +12 -12
  127. package/src/utils/quota-detectors.js +32 -32
  128. package/src/utils/requirement-action-handlers.js +12 -12
  129. package/src/utils/requirement-actions/requirement-operations.js +3 -3
  130. package/src/utils/requirement-actions.js +1 -1
  131. package/src/utils/requirement-file-operations.js +5 -5
  132. package/src/utils/requirement-helpers.js +1 -1
  133. package/src/utils/requirement-management.js +5 -5
  134. package/src/utils/requirement-navigation.js +2 -2
  135. package/src/utils/requirement-organization.js +3 -3
  136. package/src/utils/rui-trui-adapter.js +14 -14
  137. package/src/utils/simple-trui.js +3 -3
  138. package/src/utils/status-helpers-extracted.js +3 -3
  139. package/src/utils/trui-clarifications.js +11 -11
  140. package/src/utils/trui-debug.js +3 -2
  141. package/src/utils/trui-devin.js +217 -0
  142. package/src/utils/trui-feedback.js +7 -7
  143. package/src/utils/trui-kiro-integration.js +34 -34
  144. package/src/utils/trui-main-handlers.js +20 -21
  145. package/src/utils/trui-main-menu.js +19 -19
  146. package/src/utils/trui-nav-agents.js +59 -8
  147. package/src/utils/trui-nav-requirements.js +3 -3
  148. package/src/utils/trui-nav-settings.js +10 -10
  149. package/src/utils/trui-nav-specifications.js +1 -1
  150. package/src/utils/trui-navigation-backup.js +11 -11
  151. package/src/utils/trui-navigation.js +9 -9
  152. package/src/utils/trui-provider-health.js +25 -25
  153. package/src/utils/trui-provider-manager.js +28 -28
  154. package/src/utils/trui-quick-menu.js +2 -2
  155. package/src/utils/trui-req-actions-backup.js +21 -21
  156. package/src/utils/trui-req-actions.js +20 -20
  157. package/src/utils/trui-req-editor.js +10 -10
  158. package/src/utils/trui-req-file-ops.js +3 -3
  159. package/src/utils/trui-req-tree.js +7 -7
  160. package/src/utils/trui-windsurf.js +103 -103
  161. package/src/utils/user-tracking.js +15 -15
  162. package/src/utils/trui-req-tree-old.js +0 -719
@@ -6,14 +6,15 @@
6
6
 
7
7
  const inquirer = require('inquirer');
8
8
  const chalk = require('chalk');
9
+ const { IDEHealthTracker } = require('vibecodingmachine-core');
9
10
 
10
11
  // Track expanded agent indices
11
12
  const expandedAgents = new Set();
12
13
 
13
14
  /**
14
- * Load agents data via the RUI command resolver + provider preferences
15
+ * Load agents data via the RUI command resolver + provider preferences + health metrics
15
16
  * @param {Object} navigation - TRUINavigation instance
16
- * @returns {Promise<{agents: Array, enabledMap: Object, prefs: Object}|null>}
17
+ * @returns {Promise<{agents: Array, enabledMap: Object, prefs: Object, healthMetrics: Object}|null>}
17
18
  */
18
19
  async function loadAgentsData(navigation) {
19
20
  try {
@@ -24,6 +25,15 @@ async function loadAgentsData(navigation) {
24
25
  const definitions = getProviderDefinitions();
25
26
  const prefs = await getProviderPreferences();
26
27
 
28
+ // Load health metrics
29
+ let healthMetrics = {};
30
+ try {
31
+ const healthTracker = new IDEHealthTracker();
32
+ healthMetrics = await healthTracker.getAllHealthMetrics();
33
+ } catch (error) {
34
+ console.warn('[loadAgentsData] Health tracking not available:', error.message);
35
+ }
36
+
27
37
  // Build agents array matching the format from list agents command
28
38
  const agents = definitions.map(def => ({
29
39
  id: def.id,
@@ -31,7 +41,8 @@ async function loadAgentsData(navigation) {
31
41
  description: def.description || '',
32
42
  type: def.type || 'unknown',
33
43
  enabled: prefs.enabled?.[def.id] !== false,
34
- category: def.category || 'unknown'
44
+ category: def.category || 'unknown',
45
+ healthMetrics: healthMetrics.get(def.id) || null
35
46
  }));
36
47
 
37
48
  const enabledMap = { ...(prefs.enabled || {}) };
@@ -44,6 +55,7 @@ async function loadAgentsData(navigation) {
44
55
  agents,
45
56
  enabledMap,
46
57
  prefs,
58
+ healthMetrics
47
59
  };
48
60
  } catch (err) {
49
61
  console.error('[loadAgentsData] Error:', err.message);
@@ -52,8 +64,8 @@ async function loadAgentsData(navigation) {
52
64
  }
53
65
 
54
66
  /**
55
- * Build inline accordion choice objects for the agents section
56
- * @param {{agents: Array, enabledMap: Object}} data
67
+ * Build inline accordion choice objects for the agents section with health metrics
68
+ * @param {{agents: Array, enabledMap: Object, healthMetrics: Object}} data
57
69
  * @returns {Array} inquirer choice objects
58
70
  */
59
71
  function buildAgentChoices(data) {
@@ -67,12 +79,51 @@ function buildAgentChoices(data) {
67
79
 
68
80
  data.agents.forEach((agent, index) => {
69
81
  const isEnabled = data.enabledMap[agent.id] !== false;
70
- const icon = isEnabled ? '🟢' : '🔴';
82
+ const health = agent.healthMetrics;
83
+
84
+ // Determine status icon and color based on health metrics
85
+ let statusIcon = '🔴';
86
+ let statusColor = chalk.red;
87
+
88
+ if (isEnabled) {
89
+ if (health && health.consecutiveFailures === 0) {
90
+ statusIcon = '🟢';
91
+ statusColor = chalk.green;
92
+ } else if (health && health.consecutiveFailures > 0 && health.consecutiveFailures < 5) {
93
+ statusIcon = '�';
94
+ statusColor = chalk.yellow;
95
+ }
96
+ }
97
+
98
+ // Build the display name with health metrics
71
99
  const label = agent.name || agent.type || agent.id || 'Unknown';
100
+ let displayName = ` ${statusIcon} ${statusColor(label)}`;
101
+
102
+ // Add health metrics if available
103
+ if (health) {
104
+ const successCount = health.successCount || 0;
105
+ const failureCount = health.failureCount || 0;
106
+ const successIndicator = successCount > 0 ? chalk.green(`+${successCount}`) : '';
107
+ const failureIndicator = failureCount > 0 ? chalk.red(`-${failureCount}`) : '';
108
+
109
+ if (successIndicator || failureIndicator) {
110
+ displayName += ` ${successIndicator} ${failureIndicator}`;
111
+ }
112
+
113
+ // Add quota reset time if available
114
+ if (health.quotaResetAt) {
115
+ const resetTime = new Date(health.quotaResetAt).toLocaleTimeString('en-US', {
116
+ hour: 'numeric',
117
+ minute: '2-digit',
118
+ hour12: true
119
+ });
120
+ const timeZone = new Date().toLocaleTimeString('en-US', { timeZoneName: 'short' }).split(' ').pop().toUpperCase();
121
+ displayName += ` ${chalk.gray(`[Quota reset at ${resetTime} ${timeZone}]`)}`;
122
+ }
123
+ }
72
124
 
73
- // Simple list view without individual expand/collapse
74
125
  choices.push({
75
- name: ` ${icon} ${chalk.white(label)}`,
126
+ name: displayName,
76
127
  value: `agent:${index}`,
77
128
  });
78
129
  });
@@ -328,15 +328,15 @@ async function handleRequirementAction(index, data, navigation) {
328
328
  await promoteToVerified(reqPath, req.title);
329
329
  } else if (reqAction === 'enable' || reqAction === 'disable') {
330
330
  // Use the new enable/disable utility functions
331
- const { enableRequirement, disableRequirement } = require('@vibecodingmachine/core/src/utils/requirement-enable-disable');
332
-
331
+ const { enableRequirement, disableRequirement } = require('vibecodingmachine-core/src/utils/requirement-enable-disable');
332
+
333
333
  let result;
334
334
  if (reqAction === 'enable') {
335
335
  result = await enableRequirement(cleanTitle);
336
336
  } else {
337
337
  result = await disableRequirement(cleanTitle);
338
338
  }
339
-
339
+
340
340
  if (result.success) {
341
341
  console.log(chalk.green(`\n✓ ${result.message}`));
342
342
  console.log(chalk.gray(` Equivalent: app ${reqAction} requirement "${cleanTitle}"`));
@@ -93,7 +93,7 @@ async function showSettings() {
93
93
  const stages = await getStages();
94
94
  // Find first enabled provider in order for display
95
95
  let activeIde = autoConfig.ide || autoConfig.agent || 'cline';
96
-
96
+
97
97
  // Get hostname info
98
98
  const currentHostname = getHostname();
99
99
  const hostnameEnabled = isComputerNameEnabled();
@@ -154,7 +154,7 @@ async function showSettings() {
154
154
  } else if (value === 'setting:hostname') {
155
155
  const hostnameEnabled = isComputerNameEnabled();
156
156
  const currentHostname = getHostname();
157
-
157
+
158
158
  const { action } = await inquirer.prompt([{
159
159
  type: 'list',
160
160
  name: 'action',
@@ -165,7 +165,7 @@ async function showSettings() {
165
165
  { name: 'Back', value: 'back' }
166
166
  ]
167
167
  }]);
168
-
168
+
169
169
  if (action === 'change') {
170
170
  const { newHostname } = await inquirer.prompt([{
171
171
  type: 'input',
@@ -180,7 +180,7 @@ async function showSettings() {
180
180
  return true;
181
181
  }
182
182
  }]);
183
-
183
+
184
184
  try {
185
185
  await setHostname(newHostname.trim());
186
186
  console.log(chalk.green(`✅ Hostname changed to: ${newHostname}`));
@@ -204,7 +204,7 @@ async function showSettings() {
204
204
  }
205
205
  } else if (value === 'setting:stages') {
206
206
  const stages = await getStages();
207
-
207
+
208
208
  const { action } = await inquirer.prompt([{
209
209
  type: 'list',
210
210
  name: 'action',
@@ -215,7 +215,7 @@ async function showSettings() {
215
215
  { name: 'Back', value: 'back' }
216
216
  ]
217
217
  }]);
218
-
218
+
219
219
  if (action === 'edit') {
220
220
  const { newStages } = await inquirer.prompt([{
221
221
  type: 'input',
@@ -225,19 +225,19 @@ async function showSettings() {
225
225
  validate: input => {
226
226
  const stageList = input.split(',').map(s => s.trim()).filter(s => s);
227
227
  if (stageList.length === 0) return 'At least one stage is required';
228
-
228
+
229
229
  // Check for duplicate stages
230
230
  const duplicates = stageList.filter((stage, index) => stageList.indexOf(stage) !== index);
231
231
  if (duplicates.length > 0) return `Duplicate stages: ${duplicates.join(', ')}`;
232
-
232
+
233
233
  // Check for valid stage names (alphanumeric with hyphens/underscores)
234
234
  const invalidStages = stageList.filter(stage => !/^[a-zA-Z0-9_-]+$/.test(stage));
235
235
  if (invalidStages.length > 0) return `Invalid stage names: ${invalidStages.join(', ')}`;
236
-
236
+
237
237
  return true;
238
238
  }
239
239
  }]);
240
-
240
+
241
241
  try {
242
242
  const stageList = newStages.split(',').map(s => s.trim()).filter(s => s);
243
243
  await setStages(stageList);
@@ -57,7 +57,7 @@ async function handleSpecificationSelection(directory, specs, navigation) {
57
57
  return;
58
58
  }
59
59
 
60
- const { enableSpec, disableSpec, isSpecDisabled } = require('@vibecodingmachine/core/src/utils/specification-enable-disable');
60
+ const { enableSpec, disableSpec, isSpecDisabled } = require('vibecodingmachine-core/src/utils/specification-enable-disable');
61
61
  const isDisabled = await isSpecDisabled(directory);
62
62
 
63
63
  console.log(chalk.bold.cyan(`\n📐 ${spec.title || spec.directory}\n`));
@@ -89,7 +89,7 @@ async function buildMainMenuItems(expandedSections = {}, navigation = null) {
89
89
  const prefs = await getProviderPreferences();
90
90
  const { getProviderCache } = require('./config');
91
91
  const cache = await getProviderCache();
92
-
92
+
93
93
  // Find first enabled provider
94
94
  let currentAgent = null;
95
95
  let rateLimitWarning = '';
@@ -107,7 +107,7 @@ async function buildMainMenuItems(expandedSections = {}, navigation = null) {
107
107
  break;
108
108
  }
109
109
  }
110
-
110
+
111
111
  if (currentAgent) {
112
112
  const { getProviderDisplayName } = require('./provider-registry');
113
113
  const displayName = getProviderDisplayName(currentAgent);
@@ -172,7 +172,7 @@ async function buildMainMenuItems(expandedSections = {}, navigation = null) {
172
172
  items.push({ type: 'blank', name: '', value: 'blank' });
173
173
  items.push({ type: 'action', name: '[+ Add Requirement]', value: 'add-req' });
174
174
  items.push({ type: 'action', name: '[+ Add Specification]', value: 'add-spec' });
175
- items.push({ type: 'action', name: '💬 Send Continue to Windsurf', value: 'continue-windsurf' });
175
+ items.push({ type: 'action', name: '💬 Send Continue to Devin', value: 'continue-devin' });
176
176
  items.push({ type: 'action', name: '🔄 Sync Now', value: 'sync' });
177
177
  items.push({ type: 'action', name: 'Exit', value: 'exit' });
178
178
 
@@ -198,21 +198,21 @@ class TRUINavigation {
198
198
  async start() {
199
199
  perfMonitor.start('TRUINavigation.start');
200
200
  stateTracker.push({ type: 'navigation', phase: 'start' });
201
-
201
+
202
202
  const { showWelcomeScreen } = require('./welcome-screen-extracted');
203
203
 
204
204
  console.clear();
205
205
  try { await showWelcomeScreen(); } catch (_) {}
206
206
 
207
- // Initialize Windsurf integration with error handling
207
+ // Initialize Devin integration with error handling
208
208
  try {
209
209
  initializeWindsurfIntegration();
210
210
  } catch (error) {
211
- console.log(chalk.yellow('⚠ Windsurf integration disabled: ' + error.message));
211
+ console.log(chalk.yellow('⚠ Devin integration disabled: ' + error.message));
212
212
  }
213
213
 
214
214
  await this._loop();
215
-
215
+
216
216
  perfMonitor.end('TRUINavigation.start');
217
217
  stateTracker.pop();
218
218
  }
@@ -220,7 +220,7 @@ class TRUINavigation {
220
220
  async _loop() {
221
221
  perfMonitor.start('TRUINavigation.loop');
222
222
  stateTracker.push({ type: 'navigation', phase: 'loop' });
223
-
223
+
224
224
  const { sendContinueToWindsurf } = require('./trui-windsurf');
225
225
 
226
226
  // Track expanded sections state
@@ -485,10 +485,10 @@ class TRUINavigation {
485
485
  continue;
486
486
  }
487
487
 
488
- if (action === 'continue-windsurf') {
488
+ if (action === 'continue-devin') {
489
489
  try {
490
490
  await sendContinueToWindsurf();
491
- console.log(chalk.green('\n✓ Continue message sent to Windsurf Cascade\n'));
491
+ console.log(chalk.green('\n✓ Continue message sent to Devin\n'));
492
492
  } catch (err) { console.log(chalk.red('Error: ' + err.message)); }
493
493
  await this._pause();
494
494
  console.clear();
@@ -530,7 +530,7 @@ class TRUINavigation {
530
530
  continue;
531
531
  }
532
532
  }
533
-
533
+
534
534
  perfMonitor.end('TRUINavigation.loop');
535
535
  stateTracker.pop();
536
536
  }
@@ -14,11 +14,11 @@ const { debugLogger, perfMonitor, stateTracker } = require('./trui-debug');
14
14
  const RUITRUIAdapter = require('./rui-trui-adapter');
15
15
 
16
16
  // Import extracted modules
17
- const {
18
- buildMainMenuItems
17
+ const {
18
+ buildMainMenuItems
19
19
  } = require('./trui-main-menu');
20
20
 
21
- const {
21
+ const {
22
22
  handleMainMenuSelection,
23
23
  setupMainMenuExtraKeys
24
24
  } = require('./trui-main-handlers');
@@ -39,9 +39,9 @@ class TRUINavigation {
39
39
  async start() {
40
40
  perfMonitor.start('TRUINavigation.start');
41
41
  stateTracker.push('TRUINavigation.start');
42
-
42
+
43
43
  debugLogger.info('Starting TRUI navigation');
44
-
44
+
45
45
  try {
46
46
  await this._showMainMenu();
47
47
  } catch (error) {
@@ -71,11 +71,11 @@ class TRUINavigation {
71
71
 
72
72
  // Show menu
73
73
  const result = await showQuickMenu(items, 0, { extraKeys });
74
-
74
+
75
75
  // Handle selection
76
76
  const handlerResult = await handleMainMenuSelection(
77
- result,
78
- this.expandedSections,
77
+ result,
78
+ this.expandedSections,
79
79
  this
80
80
  );
81
81
 
@@ -95,7 +95,7 @@ class TRUINavigation {
95
95
  continue;
96
96
  }
97
97
  }
98
-
98
+
99
99
  perfMonitor.end('TRUINavigation.loop');
100
100
  stateTracker.pop();
101
101
  }
@@ -43,9 +43,9 @@ async function getProviderHealth(provider) {
43
43
  // Check IDE integration
44
44
  health.ideDetection = await checkIDEIntegration(provider);
45
45
 
46
- debugLogger.info('Provider health retrieved', {
47
- provider: health.provider,
48
- status: health.status
46
+ debugLogger.info('Provider health retrieved', {
47
+ provider: health.provider,
48
+ status: health.status
49
49
  });
50
50
 
51
51
  return health;
@@ -99,7 +99,7 @@ async function checkIDEIntegration(provider) {
99
99
  const detections = {
100
100
  'vscode': await checkVSCodeExtension(provider),
101
101
  'cursor': await checkCursorIntegration(provider),
102
- 'windsurf': await checkWindsurfIntegration(provider)
102
+ 'devin': await checkDevinIntegration(provider)
103
103
  };
104
104
 
105
105
  return detections;
@@ -113,7 +113,7 @@ async function checkVSCodeExtension(provider) {
113
113
  const fs = require('fs');
114
114
  const path = require('path');
115
115
  const os = require('os');
116
-
116
+
117
117
  const vscodeDir = path.join(os.homedir(), '.vscode', 'extensions');
118
118
  if (!fs.existsSync(vscodeDir)) {
119
119
  return { installed: false, reason: 'VS Code not found' };
@@ -126,7 +126,7 @@ async function checkVSCodeExtension(provider) {
126
126
  'cline': ['saoudrizwan.claude-dev']
127
127
  };
128
128
 
129
- const relevantExtensions = extensions.filter(ext =>
129
+ const relevantExtensions = extensions.filter(ext =>
130
130
  (providerExtensions[provider.id] || []).some(prefix => ext.startsWith(prefix))
131
131
  );
132
132
 
@@ -148,10 +148,10 @@ async function checkCursorIntegration(provider) {
148
148
  const fs = require('fs');
149
149
  const path = require('path');
150
150
  const os = require('os');
151
-
151
+
152
152
  const cursorDir = path.join(os.homedir(), '.cursor');
153
153
  const hasCursor = fs.existsSync(cursorDir);
154
-
154
+
155
155
  return {
156
156
  installed: hasCursor,
157
157
  path: hasCursor ? cursorDir : null
@@ -162,20 +162,20 @@ async function checkCursorIntegration(provider) {
162
162
  }
163
163
 
164
164
  /**
165
- * Check Windsurf integration for provider
165
+ * Check Devin integration for provider
166
166
  */
167
- async function checkWindsurfIntegration(provider) {
167
+ async function checkDevinIntegration(provider) {
168
168
  try {
169
169
  const fs = require('fs');
170
170
  const path = require('path');
171
171
  const os = require('os');
172
-
173
- const windsurfDir = path.join(os.homedir(), '.windsurf');
174
- const hasWindsurf = fs.existsSync(windsurfDir);
175
-
172
+
173
+ const devinDir = path.join(os.homedir(), '.devin');
174
+ const hasDevin = fs.existsSync(devinDir);
175
+
176
176
  return {
177
- installed: hasWindsurf,
178
- path: hasWindsurf ? windsurfDir : null
177
+ installed: hasDevin,
178
+ path: hasDevin ? devinDir : null
179
179
  };
180
180
  } catch (error) {
181
181
  return { installed: false, reason: error.message };
@@ -218,36 +218,36 @@ function getQuotaColor(percentage) {
218
218
  */
219
219
  function formatHealthDisplay(health) {
220
220
  const lines = [];
221
-
221
+
222
222
  // Status
223
223
  lines.push(`${getHealthIcon(health.status)} ${health.provider} - ${health.status}`);
224
-
224
+
225
225
  // Response time
226
226
  if (health.responseTime !== null) {
227
- const timeColor = health.responseTime < 1000 ? chalk.green :
227
+ const timeColor = health.responseTime < 1000 ? chalk.green :
228
228
  health.responseTime < 3000 ? chalk.yellow : chalk.red;
229
229
  lines.push(` Response Time: ${timeColor(health.responseTime + 'ms')}`);
230
230
  }
231
-
231
+
232
232
  // Quota information
233
233
  if (health.quota && health.quota.limit > 0) {
234
234
  const percentage = getQuotaPercentage(health.quota);
235
235
  const color = getQuotaColor(percentage);
236
236
  lines.push(` Quota: ${color(health.quota.used + '/' + health.quota.limit + ' (' + percentage + '%)')}`);
237
237
  }
238
-
238
+
239
239
  // IDE detection
240
240
  if (health.ideDetection) {
241
241
  const ideCount = Object.values(health.ideDetection).filter(ide => ide.installed).length;
242
242
  lines.push(` IDE Integration: ${ideCount} IDE(s) detected`);
243
-
243
+
244
244
  Object.entries(health.ideDetection).forEach(([ide, detection]) => {
245
245
  if (detection.installed) {
246
246
  lines.push(` ${ide}: ✅`);
247
247
  }
248
248
  });
249
249
  }
250
-
250
+
251
251
  // Errors
252
252
  if (health.errors && health.errors.length > 0) {
253
253
  lines.push(` Errors: ${chalk.red(health.errors.length)} error(s)`);
@@ -255,7 +255,7 @@ function formatHealthDisplay(health) {
255
255
  lines.push(` ${chalk.red('•')} ${error}`);
256
256
  });
257
257
  }
258
-
258
+
259
259
  return lines;
260
260
  }
261
261
 
@@ -266,7 +266,7 @@ module.exports = {
266
266
  checkIDEIntegration,
267
267
  checkVSCodeExtension,
268
268
  checkCursorIntegration,
269
- checkWindsurfIntegration,
269
+ checkDevinIntegration,
270
270
  getHealthIcon,
271
271
  getQuotaPercentage,
272
272
  getQuotaColor,