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.
- package/bin/auth/auth-compliance.js +7 -7
- package/bin/commands/agent-commands.js +15 -15
- package/bin/commands/auto-commands.js +3 -3
- package/bin/commands/command-aliases.js +13 -4
- package/bin/config/cli-config.js +15 -5
- package/bin/update/update-checker.js +5 -5
- package/bin/vibecodingmachine.js +2 -2
- package/package.json +2 -2
- package/src/commands/agents/add.js +5 -5
- package/src/commands/agents/check.js +19 -19
- package/src/commands/agents/list.js +24 -24
- package/src/commands/agents/remove.js +4 -4
- package/src/commands/agents-check.js +1 -1
- package/src/commands/analyze-file-sizes.js +43 -43
- package/src/commands/auto-direct/auto-provider-manager.js +19 -19
- package/src/commands/auto-direct/auto-start-phases.js +493 -0
- package/src/commands/auto-direct/auto-status-display.js +35 -35
- package/src/commands/auto-direct/auto-utils.js +50 -50
- package/src/commands/auto-direct/cline-installer.js +56 -0
- package/src/commands/auto-direct/code-processor.js +27 -27
- package/src/commands/auto-direct/file-scanner.js +19 -19
- package/src/commands/auto-direct/ide-completion-waiter.js +485 -0
- package/src/commands/auto-direct/ide-fallback-runner.js +226 -0
- package/src/commands/auto-direct/ide-provider-runner.js +103 -0
- package/src/commands/auto-direct/iteration-handlers.js +189 -0
- package/src/commands/auto-direct/iteration-runner.js +485 -0
- package/src/commands/auto-direct/provider-config.js +38 -7
- package/src/commands/auto-direct/provider-manager.js +132 -6
- package/src/commands/auto-direct/requirement-manager.js +169 -104
- package/src/commands/auto-direct/requirement-mover.js +350 -0
- package/src/commands/auto-direct/spec-handlers.js +155 -0
- package/src/commands/auto-direct/spec-ide-runner.js +318 -0
- package/src/commands/auto-direct/spec-processing.js +203 -0
- package/src/commands/auto-direct/status-display.js +9 -9
- package/src/commands/auto-direct/utils.js +83 -1
- package/src/commands/auto-direct-refactored.js +1 -413
- package/src/commands/auto-direct.js +127 -4119
- package/src/commands/auto-execution.js +21 -21
- package/src/commands/auto-status-helpers.js +0 -2
- package/src/commands/auto.js +22 -22
- package/src/commands/check-compliance.js +65 -65
- package/src/commands/computers.js +39 -39
- package/src/commands/continuous-scan.js +19 -19
- package/src/commands/ide.js +4 -4
- package/src/commands/locale.js +7 -7
- package/src/commands/refactor-file.js +59 -59
- package/src/commands/requirements/commands.js +17 -17
- package/src/commands/requirements/default-handlers.js +30 -30
- package/src/commands/requirements/disable.js +3 -3
- package/src/commands/requirements/enable.js +3 -3
- package/src/commands/requirements/utils.js +6 -6
- package/src/commands/requirements-refactored.js +3 -3
- package/src/commands/requirements-remote.js +38 -38
- package/src/commands/requirements.js +3 -3
- package/src/commands/settings.js +111 -0
- package/src/commands/specs/count.js +60 -0
- package/src/commands/specs/disable.js +3 -3
- package/src/commands/specs/enable.js +3 -3
- package/src/commands/status.js +10 -10
- package/src/commands/sync.js +25 -25
- package/src/commands/timeout.js +35 -35
- package/src/trui/TruiInterface.js +2 -2
- package/src/trui/agents/AgentInterface.js +4 -4
- package/src/trui/agents/handlers/CommandHandler.js +4 -4
- package/src/trui/agents/handlers/ContextManager.js +1 -1
- package/src/trui/agents/handlers/DisplayHandler.js +11 -11
- package/src/trui/agents/handlers/HelpHandler.js +1 -1
- package/src/utils/agent-selector.js +6 -6
- package/src/utils/antigravity-installer.js +4 -4
- package/src/utils/asset-cleanup.js +1 -1
- package/src/utils/auth.js +9 -12
- package/src/utils/clarification-actions.js +4 -4
- package/src/utils/cline-js-handler.js +5 -5
- package/src/utils/compliance-check.js +6 -6
- package/src/utils/config.js +12 -12
- package/src/utils/display-formatters-complete.js +2 -2
- package/src/utils/display-formatters-extracted.js +2 -2
- package/src/utils/display-formatters.js +2 -2
- package/src/utils/feedback-handler.js +2 -2
- package/src/utils/first-run.js +7 -7
- package/src/utils/ide-detection.js +1 -1
- package/src/utils/ide-handlers.js +6 -6
- package/src/utils/interactive/clarification-actions.js +3 -3
- package/src/utils/interactive/core-ui.js +7 -7
- package/src/utils/interactive/file-backup.js +6 -6
- package/src/utils/interactive/file-import-export.js +49 -49
- package/src/utils/interactive/file-operations.js +3 -3
- package/src/utils/interactive/file-validation.js +41 -41
- package/src/utils/interactive/interactive-prompts.js +41 -41
- package/src/utils/interactive/requirement-actions.js +5 -5
- package/src/utils/interactive/requirement-crud.js +4 -4
- package/src/utils/interactive/requirements-navigation.js +10 -10
- package/src/utils/interactive-broken.js +6 -6
- package/src/utils/interactive.js +37 -37
- package/src/utils/keyboard-handler.js +4 -4
- package/src/utils/prompt-helper.js +6 -6
- package/src/utils/provider-checker/agent-checker.js +1 -1
- package/src/utils/provider-checker/agent-runner.js +203 -314
- package/src/utils/provider-checker/agents-file-lock.js +134 -0
- package/src/utils/provider-checker/agents-manager.js +224 -36
- package/src/utils/provider-checker/cli-installer.js +28 -28
- package/src/utils/provider-checker/cli-utils.js +2 -2
- package/src/utils/provider-checker/cursor-approval-clicker.js +108 -0
- package/src/utils/provider-checker/format-utils.js +4 -4
- package/src/utils/provider-checker/ide-installer-helper.js +96 -0
- package/src/utils/provider-checker/ide-manager.js +19 -8
- package/src/utils/provider-checker/ide-quota-checker.js +120 -0
- package/src/utils/provider-checker/ide-utils.js +2 -2
- package/src/utils/provider-checker/node-detector.js +4 -4
- package/src/utils/provider-checker/node-utils.js +5 -5
- package/src/utils/provider-checker/opencode-checker.js +107 -73
- package/src/utils/provider-checker/process-utils.js +1 -1
- package/src/utils/provider-checker/provider-validator.js +11 -11
- package/src/utils/provider-checker/quota-checker.js +5 -5
- package/src/utils/provider-checker/quota-detector.js +5 -5
- package/src/utils/provider-checker/requirements-manager.js +6 -6
- package/src/utils/provider-checker/test-requirements.js +1 -1
- package/src/utils/provider-checker/vscode-approval-clicker.js +328 -0
- package/src/utils/provider-checker-new.js +6 -6
- package/src/utils/provider-checker.js +6 -6
- package/src/utils/provider-checkers/ide-manager.js +13 -13
- package/src/utils/provider-checkers/node-executable-finder.js +4 -4
- package/src/utils/provider-checkers/provider-checker-core.js +5 -5
- package/src/utils/provider-checkers/provider-checker-main.js +17 -17
- package/src/utils/provider-registry.js +5 -6
- package/src/utils/provider-utils.js +12 -12
- package/src/utils/quota-detectors.js +32 -32
- package/src/utils/requirement-action-handlers.js +12 -12
- package/src/utils/requirement-actions/requirement-operations.js +3 -3
- package/src/utils/requirement-actions.js +1 -1
- package/src/utils/requirement-file-operations.js +5 -5
- package/src/utils/requirement-helpers.js +1 -1
- package/src/utils/requirement-management.js +5 -5
- package/src/utils/requirement-navigation.js +2 -2
- package/src/utils/requirement-organization.js +3 -3
- package/src/utils/rui-trui-adapter.js +14 -14
- package/src/utils/simple-trui.js +3 -3
- package/src/utils/status-helpers-extracted.js +3 -3
- package/src/utils/trui-clarifications.js +11 -11
- package/src/utils/trui-debug.js +3 -2
- package/src/utils/trui-devin.js +217 -0
- package/src/utils/trui-feedback.js +7 -7
- package/src/utils/trui-kiro-integration.js +34 -34
- package/src/utils/trui-main-handlers.js +20 -21
- package/src/utils/trui-main-menu.js +19 -19
- package/src/utils/trui-nav-agents.js +59 -8
- package/src/utils/trui-nav-requirements.js +3 -3
- package/src/utils/trui-nav-settings.js +10 -10
- package/src/utils/trui-nav-specifications.js +1 -1
- package/src/utils/trui-navigation-backup.js +11 -11
- package/src/utils/trui-navigation.js +9 -9
- package/src/utils/trui-provider-health.js +25 -25
- package/src/utils/trui-provider-manager.js +28 -28
- package/src/utils/trui-quick-menu.js +2 -2
- package/src/utils/trui-req-actions-backup.js +21 -21
- package/src/utils/trui-req-actions.js +20 -20
- package/src/utils/trui-req-editor.js +10 -10
- package/src/utils/trui-req-file-ops.js +3 -3
- package/src/utils/trui-req-tree.js +7 -7
- package/src/utils/trui-windsurf.js +103 -103
- package/src/utils/user-tracking.js +15 -15
- 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
|
|
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:
|
|
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('
|
|
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('
|
|
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
|
|
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
|
|
207
|
+
// Initialize Devin integration with error handling
|
|
208
208
|
try {
|
|
209
209
|
initializeWindsurfIntegration();
|
|
210
210
|
} catch (error) {
|
|
211
|
-
console.log(chalk.yellow('⚠
|
|
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-
|
|
488
|
+
if (action === 'continue-devin') {
|
|
489
489
|
try {
|
|
490
490
|
await sendContinueToWindsurf();
|
|
491
|
-
console.log(chalk.green('\n✓ Continue message sent to
|
|
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
|
-
'
|
|
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
|
|
165
|
+
* Check Devin integration for provider
|
|
166
166
|
*/
|
|
167
|
-
async function
|
|
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
|
|
174
|
-
const
|
|
175
|
-
|
|
172
|
+
|
|
173
|
+
const devinDir = path.join(os.homedir(), '.devin');
|
|
174
|
+
const hasDevin = fs.existsSync(devinDir);
|
|
175
|
+
|
|
176
176
|
return {
|
|
177
|
-
installed:
|
|
178
|
-
path:
|
|
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
|
-
|
|
269
|
+
checkDevinIntegration,
|
|
270
270
|
getHealthIcon,
|
|
271
271
|
getQuotaPercentage,
|
|
272
272
|
getQuotaColor,
|