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
@@ -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 { initializeWindsurfIntegration, getWindsurfStatus } = require('./trui-windsurf');
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 === 'windsurf') {
86
- await handleWindsurfSelection();
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 Windsurf selection
104
+ * Handle Devin selection
105
105
  */
106
- async function handleWindsurfSelection() {
106
+ async function handleDevinSelection() {
107
107
  console.clear();
108
- console.log(chalk.bold.cyan('🌊 Windsurf Integration\n'));
109
-
108
+ console.log(chalk.bold.cyan('🤖 Devin Integration\n'));
109
+
110
110
  try {
111
- await initializeWindsurfIntegration();
112
- const status = await getWindsurfStatus();
113
-
114
- console.log(`Status: ${status.connected ? chalk.green('Connected') : chalk.red('Disconnected')}`);
115
- console.log(`Workspace: ${status.workspace || 'None'}`);
116
- console.log(`Version: ${status.version || 'Unknown'}`);
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
- handleWindsurfSelection,
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 { getWindsurfStatus } = require('./trui-windsurf');
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: '[🌊 Windsurf]', value: 'windsurf' });
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`,