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
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Devin Detection and Integration
|
|
3
|
+
*
|
|
4
|
+
* Detects when Devin (Cognition AI) is active and integrates with VCM workflow.
|
|
5
|
+
* Devin is primarily web-based; detection looks for browser processes or local app.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const { execSync } = require('child_process');
|
|
11
|
+
const { debugLogger } = require('./trui-debug');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Devin process/session detector
|
|
15
|
+
*/
|
|
16
|
+
class DevinDetector {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.isDevinActive = false;
|
|
19
|
+
this.lastActivity = null;
|
|
20
|
+
this.pollInterval = null;
|
|
21
|
+
this.continueThreshold = 30000;
|
|
22
|
+
this.projectRoot = this.findProjectRoot();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
findProjectRoot() {
|
|
26
|
+
let currentDir = process.cwd();
|
|
27
|
+
while (currentDir !== path.dirname(currentDir)) {
|
|
28
|
+
if (fs.existsSync(path.join(currentDir, '.git')) ||
|
|
29
|
+
fs.existsSync(path.join(currentDir, 'package.json'))) {
|
|
30
|
+
return currentDir;
|
|
31
|
+
}
|
|
32
|
+
currentDir = path.dirname(currentDir);
|
|
33
|
+
}
|
|
34
|
+
return process.cwd();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
isDevinRunning() {
|
|
38
|
+
try {
|
|
39
|
+
const isWindows = process.platform === 'win32';
|
|
40
|
+
let result;
|
|
41
|
+
|
|
42
|
+
if (isWindows) {
|
|
43
|
+
result = execSync('tasklist /FI "IMAGENAME eq Devin.exe" /NH', {
|
|
44
|
+
encoding: 'utf8',
|
|
45
|
+
timeout: 5000
|
|
46
|
+
});
|
|
47
|
+
return result.toLowerCase().includes('devin.exe');
|
|
48
|
+
} else {
|
|
49
|
+
result = execSync('ps aux | grep -i devin | grep -v grep', {
|
|
50
|
+
encoding: 'utf8',
|
|
51
|
+
timeout: 5000
|
|
52
|
+
});
|
|
53
|
+
return result.trim().length > 0;
|
|
54
|
+
}
|
|
55
|
+
} catch (error) {
|
|
56
|
+
debugLogger.warn('Devin process check failed', { error: error.message });
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
checkDevinActivity() {
|
|
62
|
+
try {
|
|
63
|
+
const checkDirs = ['src', 'components', 'pages', 'lib', 'app'];
|
|
64
|
+
let recentActivity = false;
|
|
65
|
+
|
|
66
|
+
for (const dir of checkDirs) {
|
|
67
|
+
const fullPath = path.join(this.projectRoot, dir);
|
|
68
|
+
if (fs.existsSync(fullPath)) {
|
|
69
|
+
const stats = fs.statSync(fullPath);
|
|
70
|
+
if (Date.now() - stats.mtime.getTime() < 30000) {
|
|
71
|
+
recentActivity = true;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return recentActivity;
|
|
78
|
+
} catch (error) {
|
|
79
|
+
debugLogger.warn('Devin activity check failed', { error: error.message });
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
detectWorkCompletion() {
|
|
85
|
+
const wasActive = this.isDevinActive;
|
|
86
|
+
const isActive = this.checkDevinActivity();
|
|
87
|
+
|
|
88
|
+
if (wasActive && !isActive) {
|
|
89
|
+
this.lastActivity = Date.now();
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
this.isDevinActive = isActive;
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async sendContinueMessage() {
|
|
98
|
+
try {
|
|
99
|
+
const { AppleScriptManager } = require('vibecodingmachine-core');
|
|
100
|
+
const applescriptManager = new AppleScriptManager();
|
|
101
|
+
const result = await applescriptManager.sendText('continue with your best approach', 'devin');
|
|
102
|
+
return result.success;
|
|
103
|
+
} catch (error) {
|
|
104
|
+
debugLogger.error('Failed to send continue message to Devin', { error: error.message });
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
startMonitoring() {
|
|
110
|
+
if (this.pollInterval) {
|
|
111
|
+
this.stopMonitoring();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
this.isDevinActive = this.checkDevinActivity();
|
|
115
|
+
this.pollInterval = setInterval(() => {
|
|
116
|
+
if (this.detectWorkCompletion()) {
|
|
117
|
+
this.sendContinueMessage();
|
|
118
|
+
}
|
|
119
|
+
}, 5000);
|
|
120
|
+
|
|
121
|
+
process.on('SIGINT', () => this.stopMonitoring());
|
|
122
|
+
process.on('SIGTERM', () => this.stopMonitoring());
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
stopMonitoring() {
|
|
126
|
+
if (this.pollInterval) {
|
|
127
|
+
clearInterval(this.pollInterval);
|
|
128
|
+
this.pollInterval = null;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
getStatus() {
|
|
133
|
+
return {
|
|
134
|
+
isRunning: this.isDevinRunning(),
|
|
135
|
+
isActive: this.isDevinActive,
|
|
136
|
+
lastActivity: this.lastActivity,
|
|
137
|
+
isMonitoring: this.pollInterval !== null
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Integration manager for VCM + Devin workflow
|
|
144
|
+
*/
|
|
145
|
+
class VCMDevinIntegration {
|
|
146
|
+
constructor() {
|
|
147
|
+
this.detector = new DevinDetector();
|
|
148
|
+
this.autoContinueEnabled = true;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async initialize() {
|
|
152
|
+
debugLogger.info('Initializing VCM-Devin integration');
|
|
153
|
+
|
|
154
|
+
if (!this.detector.isDevinRunning()) {
|
|
155
|
+
debugLogger.info('Devin not detected, integration disabled');
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
this.detector.startMonitoring();
|
|
160
|
+
debugLogger.info('VCM-Devin integration initialized');
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
getStatus() {
|
|
165
|
+
return this.detector.getStatus();
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
async manualContinue() {
|
|
169
|
+
return await this.detector.sendContinueMessage();
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
async forceCompletionDetection() {
|
|
173
|
+
try {
|
|
174
|
+
const result = await this.detector.sendContinueMessage();
|
|
175
|
+
return { success: result };
|
|
176
|
+
} catch (error) {
|
|
177
|
+
return { success: false, error: error.message };
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
let devinIntegration = null;
|
|
183
|
+
|
|
184
|
+
function initializeDevinIntegration() {
|
|
185
|
+
if (!devinIntegration) {
|
|
186
|
+
devinIntegration = new VCMDevinIntegration();
|
|
187
|
+
return devinIntegration.initialize();
|
|
188
|
+
}
|
|
189
|
+
return true;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function getDevinStatus() {
|
|
193
|
+
return devinIntegration ? devinIntegration.getStatus() : null;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
async function sendContinueToDevin() {
|
|
197
|
+
if (devinIntegration) {
|
|
198
|
+
return await devinIntegration.manualContinue();
|
|
199
|
+
}
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async function forceDevinCompletionDetection() {
|
|
204
|
+
if (devinIntegration) {
|
|
205
|
+
return await devinIntegration.forceCompletionDetection();
|
|
206
|
+
}
|
|
207
|
+
return { success: false, error: 'Devin integration not initialized' };
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
module.exports = {
|
|
211
|
+
DevinDetector,
|
|
212
|
+
VCMDevinIntegration,
|
|
213
|
+
initializeDevinIntegration,
|
|
214
|
+
getDevinStatus,
|
|
215
|
+
sendContinueToDevin,
|
|
216
|
+
forceDevinCompletionDetection
|
|
217
|
+
};
|
|
@@ -86,17 +86,17 @@ async function showFeedbackSubmission() {
|
|
|
86
86
|
if (!input) return 'Screenshot path is required when including screenshot';
|
|
87
87
|
const fs = require('fs');
|
|
88
88
|
const path = require('path');
|
|
89
|
-
|
|
89
|
+
|
|
90
90
|
if (!fs.existsSync(input.trim())) {
|
|
91
91
|
return `File not found: ${input}`;
|
|
92
92
|
}
|
|
93
|
-
|
|
93
|
+
|
|
94
94
|
const ext = path.extname(input.trim()).toLowerCase();
|
|
95
95
|
const validExts = ['.png', '.jpg', '.jpeg', '.gif', '.bmp', '.webp'];
|
|
96
96
|
if (!validExts.includes(ext)) {
|
|
97
97
|
return `Invalid image format. Supported: ${validExts.join(', ')}`;
|
|
98
98
|
}
|
|
99
|
-
|
|
99
|
+
|
|
100
100
|
return true;
|
|
101
101
|
}
|
|
102
102
|
}
|
|
@@ -157,13 +157,13 @@ async function submitFeedback(feedbackData) {
|
|
|
157
157
|
if (feedbackData.screenshotPath) {
|
|
158
158
|
const screenshotFileName = `screenshot-${Date.now()}${path.extname(feedbackData.screenshotPath)}`;
|
|
159
159
|
const screenshotDestPath = path.join(feedbackDir, screenshotFileName);
|
|
160
|
-
|
|
160
|
+
|
|
161
161
|
// Copy screenshot to feedback directory
|
|
162
162
|
fs.copyFileSync(feedbackData.screenshotPath, screenshotDestPath);
|
|
163
163
|
feedbackWithMeta.screenshotFile = screenshotFileName;
|
|
164
|
-
debugLogger.info('Screenshot attached', {
|
|
165
|
-
source: feedbackData.screenshotPath,
|
|
166
|
-
dest: screenshotDestPath
|
|
164
|
+
debugLogger.info('Screenshot attached', {
|
|
165
|
+
source: feedbackData.screenshotPath,
|
|
166
|
+
dest: screenshotDestPath
|
|
167
167
|
});
|
|
168
168
|
}
|
|
169
169
|
|
|
@@ -69,19 +69,19 @@ async function getKiroConfig() {
|
|
|
69
69
|
*/
|
|
70
70
|
async function installKiro() {
|
|
71
71
|
console.log(chalk.bold.cyan('\n🚀 Installing Kiro...\n'));
|
|
72
|
-
|
|
72
|
+
|
|
73
73
|
try {
|
|
74
74
|
// Check if npm is available
|
|
75
75
|
execSync('npm --version', { stdio: 'ignore' });
|
|
76
|
-
|
|
76
|
+
|
|
77
77
|
console.log(chalk.gray('Installing Kiro via npm...'));
|
|
78
78
|
execSync('npm install -g kiro', { stdio: 'inherit' });
|
|
79
|
-
|
|
79
|
+
|
|
80
80
|
console.log(chalk.green('\n✅ Kiro installed successfully!'));
|
|
81
81
|
return true;
|
|
82
82
|
} catch (error) {
|
|
83
83
|
console.log(chalk.red('\n❌ Failed to install Kiro: ' + error.message));
|
|
84
|
-
|
|
84
|
+
|
|
85
85
|
// Try alternative installation methods
|
|
86
86
|
const { tryAlternative } = await inquirer.prompt([
|
|
87
87
|
{
|
|
@@ -91,11 +91,11 @@ async function installKiro() {
|
|
|
91
91
|
default: true
|
|
92
92
|
}
|
|
93
93
|
]);
|
|
94
|
-
|
|
94
|
+
|
|
95
95
|
if (tryAlternative) {
|
|
96
96
|
return await tryAlternativeInstallation();
|
|
97
97
|
}
|
|
98
|
-
|
|
98
|
+
|
|
99
99
|
return false;
|
|
100
100
|
}
|
|
101
101
|
}
|
|
@@ -105,7 +105,7 @@ async function installKiro() {
|
|
|
105
105
|
*/
|
|
106
106
|
async function tryAlternativeInstallation() {
|
|
107
107
|
console.log(chalk.yellow('\n📦 Alternative installation options:\n'));
|
|
108
|
-
|
|
108
|
+
|
|
109
109
|
const { method } = await inquirer.prompt([
|
|
110
110
|
{
|
|
111
111
|
type: 'list',
|
|
@@ -119,7 +119,7 @@ async function tryAlternativeInstallation() {
|
|
|
119
119
|
]
|
|
120
120
|
}
|
|
121
121
|
]);
|
|
122
|
-
|
|
122
|
+
|
|
123
123
|
switch (method) {
|
|
124
124
|
case 'github':
|
|
125
125
|
return await installFromGitHub();
|
|
@@ -141,7 +141,7 @@ async function installFromGitHub() {
|
|
|
141
141
|
console.log(chalk.gray('\nOpening GitHub releases page...'));
|
|
142
142
|
console.log(chalk.white('Please download the appropriate binary for your system.'));
|
|
143
143
|
console.log(chalk.cyan('https://github.com/kiro-dev/kiro/releases\n'));
|
|
144
|
-
|
|
144
|
+
|
|
145
145
|
const { downloaded } = await inquirer.prompt([
|
|
146
146
|
{
|
|
147
147
|
type: 'confirm',
|
|
@@ -150,12 +150,12 @@ async function installFromGitHub() {
|
|
|
150
150
|
default: false
|
|
151
151
|
}
|
|
152
152
|
]);
|
|
153
|
-
|
|
153
|
+
|
|
154
154
|
if (downloaded) {
|
|
155
155
|
const verified = await verifyKiroInstallation();
|
|
156
156
|
return verified;
|
|
157
157
|
}
|
|
158
|
-
|
|
158
|
+
|
|
159
159
|
return false;
|
|
160
160
|
}
|
|
161
161
|
|
|
@@ -164,14 +164,14 @@ async function installFromGitHub() {
|
|
|
164
164
|
*/
|
|
165
165
|
async function installFromSource() {
|
|
166
166
|
console.log(chalk.gray('\nCloning and building from source...'));
|
|
167
|
-
|
|
167
|
+
|
|
168
168
|
try {
|
|
169
169
|
execSync('git clone https://github.com/kiro-dev/kiro.git /tmp/kiro-build', { stdio: 'inherit' });
|
|
170
170
|
process.chdir('/tmp/kiro-build');
|
|
171
171
|
execSync('npm install', { stdio: 'inherit' });
|
|
172
172
|
execSync('npm run build', { stdio: 'inherit' });
|
|
173
173
|
execSync('npm install -g .', { stdio: 'inherit' });
|
|
174
|
-
|
|
174
|
+
|
|
175
175
|
console.log(chalk.green('\n✅ Kiro built and installed successfully!'));
|
|
176
176
|
return true;
|
|
177
177
|
} catch (error) {
|
|
@@ -196,9 +196,9 @@ async function installWithPackageManager() {
|
|
|
196
196
|
]
|
|
197
197
|
}
|
|
198
198
|
]);
|
|
199
|
-
|
|
199
|
+
|
|
200
200
|
if (packageManager === 'cancel') return false;
|
|
201
|
-
|
|
201
|
+
|
|
202
202
|
try {
|
|
203
203
|
console.log(chalk.gray(`Installing Kiro with ${packageManager}...`));
|
|
204
204
|
execSync(`${packageManager} global add kiro`, { stdio: 'inherit' });
|
|
@@ -230,7 +230,7 @@ async function verifyKiroInstallation() {
|
|
|
230
230
|
*/
|
|
231
231
|
async function configureKiro() {
|
|
232
232
|
console.log(chalk.bold.cyan('\n⚙️ Configuring Kiro...\n'));
|
|
233
|
-
|
|
233
|
+
|
|
234
234
|
const { projectName } = await inquirer.prompt([
|
|
235
235
|
{
|
|
236
236
|
type: 'input',
|
|
@@ -239,7 +239,7 @@ async function configureKiro() {
|
|
|
239
239
|
default: path.basename(process.cwd())
|
|
240
240
|
}
|
|
241
241
|
]);
|
|
242
|
-
|
|
242
|
+
|
|
243
243
|
const { provider } = await inquirer.prompt([
|
|
244
244
|
{
|
|
245
245
|
type: 'list',
|
|
@@ -252,7 +252,7 @@ async function configureKiro() {
|
|
|
252
252
|
]
|
|
253
253
|
}
|
|
254
254
|
]);
|
|
255
|
-
|
|
255
|
+
|
|
256
256
|
const { autoMode } = await inquirer.prompt([
|
|
257
257
|
{
|
|
258
258
|
type: 'confirm',
|
|
@@ -261,13 +261,13 @@ async function configureKiro() {
|
|
|
261
261
|
default: true
|
|
262
262
|
}
|
|
263
263
|
]);
|
|
264
|
-
|
|
264
|
+
|
|
265
265
|
// Create .kiro directory and config
|
|
266
266
|
const kiroDir = path.join(process.cwd(), '.kiro');
|
|
267
267
|
if (!fs.existsSync(kiroDir)) {
|
|
268
268
|
fs.mkdirSync(kiroDir, { recursive: true });
|
|
269
269
|
}
|
|
270
|
-
|
|
270
|
+
|
|
271
271
|
const config = {
|
|
272
272
|
project: projectName,
|
|
273
273
|
provider,
|
|
@@ -275,12 +275,12 @@ async function configureKiro() {
|
|
|
275
275
|
version: '1.0.0',
|
|
276
276
|
createdAt: new Date().toISOString()
|
|
277
277
|
};
|
|
278
|
-
|
|
278
|
+
|
|
279
279
|
fs.writeFileSync(
|
|
280
280
|
path.join(kiroDir, 'config.json'),
|
|
281
281
|
JSON.stringify(config, null, 2)
|
|
282
282
|
);
|
|
283
|
-
|
|
283
|
+
|
|
284
284
|
console.log(chalk.green('\n✅ Kiro configured successfully!'));
|
|
285
285
|
return true;
|
|
286
286
|
}
|
|
@@ -293,21 +293,21 @@ async function showKiroStatus() {
|
|
|
293
293
|
const version = await getKiroVersion();
|
|
294
294
|
const isConfigured = await isKiroConfigured();
|
|
295
295
|
const config = await getKiroConfig();
|
|
296
|
-
|
|
296
|
+
|
|
297
297
|
console.log(chalk.bold.cyan('\n🔍 Kiro Status\n'));
|
|
298
|
-
|
|
298
|
+
|
|
299
299
|
console.log(`Status: ${isInstalled ? chalk.green('Installed') : chalk.red('Not Installed')}`);
|
|
300
300
|
if (version) {
|
|
301
301
|
console.log(`Version: ${chalk.white(version)}`);
|
|
302
302
|
}
|
|
303
303
|
console.log(`Configured: ${isConfigured ? chalk.green('Yes') : chalk.yellow('No')}`);
|
|
304
|
-
|
|
304
|
+
|
|
305
305
|
if (config) {
|
|
306
306
|
console.log(`Project: ${chalk.white(config.project)}`);
|
|
307
307
|
console.log(`Provider: ${chalk.white(config.provider)}`);
|
|
308
308
|
console.log(`Auto-mode: ${config.autoMode ? chalk.green('Enabled') : chalk.red('Disabled')}`);
|
|
309
309
|
}
|
|
310
|
-
|
|
310
|
+
|
|
311
311
|
console.log();
|
|
312
312
|
}
|
|
313
313
|
|
|
@@ -316,7 +316,7 @@ async function showKiroStatus() {
|
|
|
316
316
|
*/
|
|
317
317
|
async function promptKiroInstallation() {
|
|
318
318
|
const isInstalled = await isKiroInstalled();
|
|
319
|
-
|
|
319
|
+
|
|
320
320
|
if (isInstalled) {
|
|
321
321
|
console.log(chalk.green('✅ Kiro is already installed.'));
|
|
322
322
|
const isConfigured = await isKiroConfigured();
|
|
@@ -329,16 +329,16 @@ async function promptKiroInstallation() {
|
|
|
329
329
|
default: true
|
|
330
330
|
}
|
|
331
331
|
]);
|
|
332
|
-
|
|
332
|
+
|
|
333
333
|
if (shouldConfigure) {
|
|
334
334
|
return await configureKiro();
|
|
335
335
|
}
|
|
336
336
|
}
|
|
337
337
|
return true;
|
|
338
338
|
}
|
|
339
|
-
|
|
339
|
+
|
|
340
340
|
console.log(chalk.yellow('⚠️ Kiro is not installed.'));
|
|
341
|
-
|
|
341
|
+
|
|
342
342
|
const { shouldInstall } = await inquirer.prompt([
|
|
343
343
|
{
|
|
344
344
|
type: 'confirm',
|
|
@@ -347,7 +347,7 @@ async function promptKiroInstallation() {
|
|
|
347
347
|
default: true
|
|
348
348
|
}
|
|
349
349
|
]);
|
|
350
|
-
|
|
350
|
+
|
|
351
351
|
if (shouldInstall) {
|
|
352
352
|
const installed = await installKiro();
|
|
353
353
|
if (installed) {
|
|
@@ -359,13 +359,13 @@ async function promptKiroInstallation() {
|
|
|
359
359
|
default: true
|
|
360
360
|
}
|
|
361
361
|
]);
|
|
362
|
-
|
|
362
|
+
|
|
363
363
|
if (shouldConfigure) {
|
|
364
364
|
return await configureKiro();
|
|
365
365
|
}
|
|
366
366
|
}
|
|
367
367
|
}
|
|
368
|
-
|
|
368
|
+
|
|
369
369
|
return false;
|
|
370
370
|
}
|
|
371
371
|
|
|
@@ -375,7 +375,7 @@ async function promptKiroInstallation() {
|
|
|
375
375
|
async function getKiroIntegrationStatus() {
|
|
376
376
|
const isInstalled = await isKiroInstalled();
|
|
377
377
|
const isConfigured = await isKiroConfigured();
|
|
378
|
-
|
|
378
|
+
|
|
379
379
|
return {
|
|
380
380
|
installed: isInstalled,
|
|
381
381
|
configured: isConfigured,
|
|
@@ -8,7 +8,7 @@ const chalk = require('chalk');
|
|
|
8
8
|
const inquirer = require('inquirer');
|
|
9
9
|
const { showQuickMenu } = require('./trui-quick-menu');
|
|
10
10
|
const { showProviderManagerMenu } = require('./provider-manager');
|
|
11
|
-
const {
|
|
11
|
+
const { initializeDevinIntegration, getDevinStatus } = require('./trui-devin');
|
|
12
12
|
const { debugLogger, perfMonitor, stateTracker } = require('./trui-debug');
|
|
13
13
|
|
|
14
14
|
// Import section modules
|
|
@@ -82,8 +82,8 @@ async function handleMainMenuSelection(result, expandedSections, navigation) {
|
|
|
82
82
|
return { shouldContinue: true };
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
if (value === '
|
|
86
|
-
await
|
|
85
|
+
if (value === 'devin') {
|
|
86
|
+
await handleDevinSelection();
|
|
87
87
|
return { shouldContinue: true };
|
|
88
88
|
}
|
|
89
89
|
|
|
@@ -101,24 +101,23 @@ async function handleMainMenuSelection(result, expandedSections, navigation) {
|
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
/**
|
|
104
|
-
* Handle
|
|
104
|
+
* Handle Devin selection
|
|
105
105
|
*/
|
|
106
|
-
async function
|
|
106
|
+
async function handleDevinSelection() {
|
|
107
107
|
console.clear();
|
|
108
|
-
console.log(chalk.bold.cyan('
|
|
109
|
-
|
|
108
|
+
console.log(chalk.bold.cyan('🤖 Devin Integration\n'));
|
|
109
|
+
|
|
110
110
|
try {
|
|
111
|
-
await
|
|
112
|
-
const status = await
|
|
113
|
-
|
|
114
|
-
console.log(`Status: ${status.
|
|
115
|
-
console.log(`
|
|
116
|
-
|
|
117
|
-
|
|
111
|
+
await initializeDevinIntegration();
|
|
112
|
+
const status = await getDevinStatus();
|
|
113
|
+
|
|
114
|
+
console.log(`Status: ${status && status.isRunning ? chalk.green('Running') : chalk.red('Not detected')}`);
|
|
115
|
+
console.log(`Active: ${status && status.isActive ? chalk.green('Yes') : chalk.yellow('No')}`);
|
|
116
|
+
|
|
118
117
|
} catch (error) {
|
|
119
118
|
console.log(chalk.red('Error: ' + error.message));
|
|
120
119
|
}
|
|
121
|
-
|
|
120
|
+
|
|
122
121
|
console.log(chalk.gray('\nPress Enter to continue...'));
|
|
123
122
|
await inquirer.prompt([{ type: 'input', name: 'c', message: '' }]);
|
|
124
123
|
}
|
|
@@ -145,7 +144,7 @@ async function handleCheckAgents(navigation) {
|
|
|
145
144
|
async function showDebugInfo() {
|
|
146
145
|
console.clear();
|
|
147
146
|
console.log(chalk.bold.cyan('📊 Debug Information\n'));
|
|
148
|
-
|
|
147
|
+
|
|
149
148
|
try {
|
|
150
149
|
// Show performance stats
|
|
151
150
|
const perfStats = perfMonitor.getStats();
|
|
@@ -153,23 +152,23 @@ async function showDebugInfo() {
|
|
|
153
152
|
console.log(` Menu renders: ${perfStats.menuRenders}`);
|
|
154
153
|
console.log(` Avg render time: ${perfStats.avgRenderTime.toFixed(2)}ms`);
|
|
155
154
|
console.log(` Total render time: ${perfStats.totalRenderTime.toFixed(2)}ms`);
|
|
156
|
-
|
|
155
|
+
|
|
157
156
|
// Show state tracking
|
|
158
157
|
const stateHistory = stateTracker.getHistory();
|
|
159
158
|
console.log(chalk.yellow('\nState History:'));
|
|
160
159
|
stateHistory.slice(-5).forEach(entry => {
|
|
161
160
|
console.log(` ${entry.timestamp}: ${entry.action} - ${entry.details}`);
|
|
162
161
|
});
|
|
163
|
-
|
|
162
|
+
|
|
164
163
|
// Show debug log status
|
|
165
164
|
console.log(chalk.yellow('\nDebug Logging:'));
|
|
166
165
|
console.log(` Enabled: ${debugLogger.enabled ? 'Yes' : 'No'}`);
|
|
167
166
|
console.log(` Log file: ${debugLogger.logFile}`);
|
|
168
|
-
|
|
167
|
+
|
|
169
168
|
} catch (error) {
|
|
170
169
|
console.log(chalk.red('Error getting debug info: ' + error.message));
|
|
171
170
|
}
|
|
172
|
-
|
|
171
|
+
|
|
173
172
|
console.log(chalk.gray('\nPress Enter to continue...'));
|
|
174
173
|
await inquirer.prompt([{ type: 'input', name: 'c', message: '' }]);
|
|
175
174
|
}
|
|
@@ -221,7 +220,7 @@ function setupMainMenuExtraKeys(items) {
|
|
|
221
220
|
|
|
222
221
|
module.exports = {
|
|
223
222
|
handleMainMenuSelection,
|
|
224
|
-
|
|
223
|
+
handleDevinSelection,
|
|
225
224
|
showDebugInfo,
|
|
226
225
|
setupMainMenuExtraKeys
|
|
227
226
|
};
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
const chalk = require('chalk');
|
|
8
8
|
const { showProviderManagerMenu } = require('./provider-manager');
|
|
9
|
-
const {
|
|
9
|
+
const { getDevinStatus } = require('./trui-devin');
|
|
10
10
|
|
|
11
11
|
// Import section modules
|
|
12
12
|
const {
|
|
@@ -72,7 +72,7 @@ async function buildMainMenuItems(expandedSections, navigation) {
|
|
|
72
72
|
// Additional sections
|
|
73
73
|
items.push({ type: 'separator', name: chalk.gray(' ── Tools ──'), value: 'separator-tools' });
|
|
74
74
|
items.push({ type: 'action', name: '[🔧 Provider Manager]', value: 'provider-manager' });
|
|
75
|
-
items.push({ type: 'action', name: '[
|
|
75
|
+
items.push({ type: 'action', name: '[🤖 Devin]', value: 'devin' });
|
|
76
76
|
items.push({ type: 'action', name: '[📊 Debug Info]', value: 'debug-info' });
|
|
77
77
|
items.push({ type: 'action', name: '[❌ Exit]', value: 'exit' });
|
|
78
78
|
|
|
@@ -84,13 +84,13 @@ async function buildMainMenuItems(expandedSections, navigation) {
|
|
|
84
84
|
*/
|
|
85
85
|
async function buildStatusSection() {
|
|
86
86
|
const items = [];
|
|
87
|
-
|
|
87
|
+
|
|
88
88
|
// Auto mode status
|
|
89
89
|
const autoModeStatus = await getAutoModeStatus();
|
|
90
|
-
items.push({
|
|
91
|
-
type: 'status',
|
|
92
|
-
name: chalk.gray(`Auto-mode: ${autoModeStatus}`),
|
|
93
|
-
value: 'status:auto-mode'
|
|
90
|
+
items.push({
|
|
91
|
+
type: 'status',
|
|
92
|
+
name: chalk.gray(`Auto-mode: ${autoModeStatus}`),
|
|
93
|
+
value: 'status:auto-mode'
|
|
94
94
|
});
|
|
95
95
|
|
|
96
96
|
// Requirements counts
|
|
@@ -99,21 +99,21 @@ async function buildStatusSection() {
|
|
|
99
99
|
const { todo = 0, verify = 0, verified = 0 } = requirementsData.sections || {};
|
|
100
100
|
const total = todo + verify + verified;
|
|
101
101
|
const progress = total > 0 ? Math.round((verified / total) * 100) : 0;
|
|
102
|
-
|
|
103
|
-
items.push({
|
|
104
|
-
type: 'status',
|
|
105
|
-
name: chalk.gray(`Requirements: ${verified}✓ ${verify}⏳ ${todo}📋 (${progress}%)`),
|
|
106
|
-
value: 'status:requirements'
|
|
102
|
+
|
|
103
|
+
items.push({
|
|
104
|
+
type: 'status',
|
|
105
|
+
name: chalk.gray(`Requirements: ${verified}✓ ${verify}⏳ ${todo}📋 (${progress}%)`),
|
|
106
|
+
value: 'status:requirements'
|
|
107
107
|
});
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
// Current agent/provider
|
|
111
111
|
const agentStatus = await getCurrentAgentStatus();
|
|
112
112
|
if (agentStatus) {
|
|
113
|
-
items.push({
|
|
114
|
-
type: 'status',
|
|
115
|
-
name: chalk.gray(`Agent: ${agentStatus}`),
|
|
116
|
-
value: 'status:agent'
|
|
113
|
+
items.push({
|
|
114
|
+
type: 'status',
|
|
115
|
+
name: chalk.gray(`Agent: ${agentStatus}`),
|
|
116
|
+
value: 'status:agent'
|
|
117
117
|
});
|
|
118
118
|
}
|
|
119
119
|
|
|
@@ -127,7 +127,7 @@ async function buildRequirementsSection(requirementsData, expandedSections) {
|
|
|
127
127
|
const items = [];
|
|
128
128
|
const isExpanded = expandedSections.requirements || false;
|
|
129
129
|
const icon = isExpanded ? '▼' : '▶';
|
|
130
|
-
|
|
130
|
+
|
|
131
131
|
items.push({
|
|
132
132
|
type: 'section',
|
|
133
133
|
name: `${icon} 📋 Requirements`,
|
|
@@ -147,7 +147,7 @@ async function buildRequirementsSection(requirementsData, expandedSections) {
|
|
|
147
147
|
*/
|
|
148
148
|
function buildSettingsSection(settingsData) {
|
|
149
149
|
const items = [];
|
|
150
|
-
|
|
150
|
+
|
|
151
151
|
items.push({
|
|
152
152
|
type: 'section',
|
|
153
153
|
name: '⚙️ Settings',
|
|
@@ -167,7 +167,7 @@ function buildSpecificationsSection(specificationsData, expandedSections) {
|
|
|
167
167
|
const items = [];
|
|
168
168
|
const isExpanded = expandedSections.specifications || false;
|
|
169
169
|
const icon = isExpanded ? '▼' : '▶';
|
|
170
|
-
|
|
170
|
+
|
|
171
171
|
items.push({
|
|
172
172
|
type: 'section',
|
|
173
173
|
name: `${icon} 📄 Specifications`,
|