vibecodingmachine-cli 2026.3.14-1528 → 2026.6.17-1835

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
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Windsurf/Cascade Detection and Integration
2
+ * Devin Detection and Integration
3
3
  *
4
- * Detects when Windsurf (Cascade) is done typing and automatically
4
+ * Detects when Devin is done working and automatically
5
5
  * sends "continue with your best approach" messages to keep work flowing.
6
6
  */
7
7
 
@@ -11,7 +11,7 @@ const { execSync } = require('child_process');
11
11
  const { debugLogger, perfMonitor } = require('./trui-debug');
12
12
 
13
13
  /**
14
- * Windsurf/Cascade state detector
14
+ * Devin state detector
15
15
  */
16
16
  class WindsurfDetector {
17
17
  constructor() {
@@ -28,7 +28,7 @@ class WindsurfDetector {
28
28
  findProjectRoot() {
29
29
  let currentDir = process.cwd();
30
30
  while (currentDir !== path.dirname(currentDir)) {
31
- const markerFile = path.join(currentDir, '.windsurf-workspace');
31
+ const markerFile = path.join(currentDir, '.devin-workspace');
32
32
  if (fs.existsSync(markerFile) ||
33
33
  fs.existsSync(path.join(currentDir, '.git')) ||
34
34
  fs.existsSync(path.join(currentDir, 'package.json'))) {
@@ -40,7 +40,7 @@ class WindsurfDetector {
40
40
  }
41
41
 
42
42
  /**
43
- * Check if Windsurf/Cascade is running
43
+ * Check if Devin is running
44
44
  */
45
45
  isWindsurfRunning() {
46
46
  try {
@@ -50,28 +50,28 @@ class WindsurfDetector {
50
50
 
51
51
  if (isWindows) {
52
52
  // Windows: use tasklist
53
- result = execSync('tasklist /FI "IMAGENAME eq Windsurf.exe" /NH', {
53
+ result = execSync('tasklist /FI "IMAGENAME eq Devin.exe" /NH', {
54
54
  encoding: 'utf8',
55
55
  timeout: 5000
56
56
  });
57
- // Check if Windsurf.exe is in the output
58
- return result.toLowerCase().includes('windsurf.exe');
57
+ // Check if Devin.exe is in the output
58
+ return result.toLowerCase().includes('devin.exe');
59
59
  } else {
60
60
  // Unix/macOS: use ps and grep
61
- result = execSync('ps aux | grep -i windsurf | grep -v grep', {
61
+ result = execSync('ps aux | grep -i devin | grep -v grep', {
62
62
  encoding: 'utf8',
63
63
  timeout: 5000
64
64
  });
65
65
  return result.trim().length > 0;
66
66
  }
67
67
  } catch (error) {
68
- debugLogger.warn('Windsurf process check failed', { error: error.message });
68
+ debugLogger.warn('Devin process check failed', { error: error.message });
69
69
  return false;
70
70
  }
71
71
  }
72
72
 
73
73
  /**
74
- * Check if Cascade/Windsurf is actively typing/working
74
+ * Check if Devin is actively typing/working
75
75
  */
76
76
  checkWindsurfActivity() {
77
77
  try {
@@ -94,8 +94,8 @@ class WindsurfDetector {
94
94
  }
95
95
  }
96
96
 
97
- // Also check for specific Windsurf activity files
98
- const activityFile = path.join(this.projectRoot, '.windsurf-activity');
97
+ // Also check for specific Devin activity files
98
+ const activityFile = path.join(this.projectRoot, '.devin-activity');
99
99
  if (fs.existsSync(activityFile)) {
100
100
  const activityTime = fs.statSync(activityFile).mtime.getTime();
101
101
  if (Date.now() - activityTime < 30000) {
@@ -105,24 +105,24 @@ class WindsurfDetector {
105
105
 
106
106
  return recentActivity;
107
107
  } catch (error) {
108
- debugLogger.warn('Windsurf activity check failed', { error: error.message });
108
+ debugLogger.warn('Devin activity check failed', { error: error.message });
109
109
  return false;
110
110
  }
111
111
  }
112
112
 
113
113
  /**
114
- * Detect when Windsurf completes work (stops typing)
114
+ * Detect when Devin completes work (stops typing)
115
115
  */
116
116
  detectWorkCompletion() {
117
117
  const wasActive = this.isWindsurfActive;
118
118
  const isActive = this.checkWindsurfActivity();
119
119
 
120
- debugLogger.info('Windsurf activity check', { wasActive, isActive });
120
+ debugLogger.info('Devin activity check', { wasActive, isActive });
121
121
 
122
122
  // Transition from active to inactive = work completed
123
123
  if (wasActive && !isActive) {
124
124
  this.lastActivity = Date.now();
125
- debugLogger.info('Windsurf work completed detected');
125
+ debugLogger.info('Devin work completed detected');
126
126
  return true;
127
127
  }
128
128
 
@@ -135,43 +135,43 @@ class WindsurfDetector {
135
135
  */
136
136
  async sendContinueMessage() {
137
137
  try {
138
- debugLogger.info('Sending continue message to Windsurf');
139
-
140
- // Use AppleScript manager to actually send text to Windsurf
138
+ debugLogger.info('Sending continue message to Devin');
139
+
140
+ // Use AppleScript manager to actually send text to Devin
141
141
  const { AppleScriptManager } = require('vibecodingmachine-core');
142
142
  const applescriptManager = new AppleScriptManager();
143
-
144
- debugLogger.info('Using AppleScript manager to send to Windsurf');
145
- const result = await applescriptManager.sendText('continue with your best approach', 'windsurf');
146
-
143
+
144
+ debugLogger.info('Using AppleScript manager to send to Devin');
145
+ const result = await applescriptManager.sendText('continue with your best approach', 'devin');
146
+
147
147
  debugLogger.info('AppleScript result', { success: result.success, error: result.error, method: result.method });
148
-
148
+
149
149
  if (result.success) {
150
- debugLogger.info('Continue message sent successfully to Windsurf');
151
-
150
+ debugLogger.info('Continue message sent successfully to Devin');
151
+
152
152
  // Set up timeout to prevent indefinite waiting
153
153
  const maxWaitTime = 10 * 60 * 1000; // 10 minutes maximum wait
154
154
  const checkInterval = 5000; // Check every 5 seconds
155
155
  let totalWaited = 0;
156
-
156
+
157
157
  const checkForCompletion = async () => {
158
158
  try {
159
159
  const completed = await this.checkForDoneStatusAndRespond();
160
160
  if (completed) {
161
- debugLogger.info('✅ Windsurf task completion confirmed');
161
+ debugLogger.info('✅ Devin task completion confirmed');
162
162
  return true;
163
163
  }
164
-
164
+
165
165
  totalWaited += checkInterval;
166
166
  if (totalWaited >= maxWaitTime) {
167
167
  debugLogger.warn(`⚠️ Maximum wait time (${maxWaitTime/1000/60} minutes) reached, assuming completion`);
168
-
168
+
169
169
  // Force completion after timeout
170
- const timeoutMessage = `⚠️ VCM timeout after ${maxWaitTime/1000/60} minutes. Assuming Windsurf task completed. STATUS:DONE`;
171
- await applescriptManager.sendText(timeoutMessage, 'windsurf');
170
+ const timeoutMessage = `⚠️ VCM timeout after ${maxWaitTime/1000/60} minutes. Assuming Devin task completed. STATUS:DONE`;
171
+ await applescriptManager.sendText(timeoutMessage, 'devin');
172
172
  return true;
173
173
  }
174
-
174
+
175
175
  // Continue checking
176
176
  setTimeout(checkForCompletion, checkInterval);
177
177
  return false;
@@ -180,7 +180,7 @@ class WindsurfDetector {
180
180
  return false;
181
181
  }
182
182
  };
183
-
183
+
184
184
  // Start checking after initial delay
185
185
  setTimeout(async () => {
186
186
  try {
@@ -189,14 +189,14 @@ class WindsurfDetector {
189
189
  debugLogger.error('Failed to start completion checking', { error: error.message });
190
190
  }
191
191
  }, 5000); // Wait 5 seconds before first check
192
-
192
+
193
193
  return true;
194
194
  } else {
195
- debugLogger.error('Failed to send continue message to Windsurf', { error: result.error, details: result });
195
+ debugLogger.error('Failed to send continue message to Devin', { error: result.error, details: result });
196
196
 
197
197
  // Fallback: create file and notification for manual intervention
198
198
  try {
199
- const continueFile = path.join(this.projectRoot, '.windsurf-continue');
199
+ const continueFile = path.join(this.projectRoot, '.devin-continue');
200
200
  const message = {
201
201
  type: 'continue',
202
202
  message: 'continue with your best approach',
@@ -221,14 +221,14 @@ class WindsurfDetector {
221
221
  }
222
222
 
223
223
  /**
224
- * Start monitoring Windsurf activity
224
+ * Start monitoring Devin activity
225
225
  */
226
226
  startMonitoring() {
227
227
  if (this.pollInterval) {
228
228
  this.stopMonitoring();
229
229
  }
230
230
 
231
- debugLogger.info('Starting Windsurf activity monitoring');
231
+ debugLogger.info('Starting Devin activity monitoring');
232
232
  this.isWindsurfActive = this.checkWindsurfActivity();
233
233
 
234
234
  this.pollInterval = setInterval(() => {
@@ -243,13 +243,13 @@ class WindsurfDetector {
243
243
  }
244
244
 
245
245
  /**
246
- * Stop monitoring Windsurf activity
246
+ * Stop monitoring Devin activity
247
247
  */
248
248
  stopMonitoring() {
249
249
  if (this.pollInterval) {
250
250
  clearInterval(this.pollInterval);
251
251
  this.pollInterval = null;
252
- debugLogger.info('Windsurf monitoring stopped');
252
+ debugLogger.info('Devin monitoring stopped');
253
253
  }
254
254
  }
255
255
 
@@ -267,7 +267,7 @@ class WindsurfDetector {
267
267
  }
268
268
 
269
269
  /**
270
- * Integration manager for VCM + Windsurf workflow
270
+ * Integration manager for VCM + Devin workflow
271
271
  */
272
272
  class VCMWindsurfIntegration {
273
273
  constructor() {
@@ -280,11 +280,11 @@ class VCMWindsurfIntegration {
280
280
  * Initialize the integration
281
281
  */
282
282
  async initialize() {
283
- debugLogger.info('Initializing VCM-Windsurf integration');
283
+ debugLogger.info('Initializing VCM-Devin integration');
284
284
 
285
- // Check if Windsurf is running
285
+ // Check if Devin is running
286
286
  if (!this.detector.isWindsurfRunning()) {
287
- debugLogger.info('Windsurf not detected, integration disabled');
287
+ debugLogger.info('Devin not detected, integration disabled');
288
288
  return false;
289
289
  }
290
290
 
@@ -296,7 +296,7 @@ class VCMWindsurfIntegration {
296
296
  this.setupAutoContinue();
297
297
  }
298
298
 
299
- debugLogger.info('VCM-Windsurf integration initialized');
299
+ debugLogger.info('VCM-Devin integration initialized');
300
300
  return true;
301
301
  }
302
302
 
@@ -337,21 +337,21 @@ class VCMWindsurfIntegration {
337
337
  */
338
338
  async forceCompletionDetection() {
339
339
  try {
340
- debugLogger.info('🔧 Manually forcing completion detection for stalled VCM-Windsurf communication');
341
-
340
+ debugLogger.info('🔧 Manually forcing completion detection for stalled VCM-Devin communication');
341
+
342
342
  const { AppleScriptManager } = require('vibecodingmachine-core');
343
343
  const applescriptManager = new AppleScriptManager();
344
-
345
- // Try to read current Windsurf chat state
344
+
345
+ // Try to read current Devin chat state
346
346
  let chatResponse = '';
347
347
  try {
348
- chatResponse = await applescriptManager.readChatResponse('windsurf');
349
- debugLogger.info('Current Windsurf chat state:', chatResponse ? chatResponse.substring(0, 300) + '...' : 'No response readable');
348
+ chatResponse = await applescriptManager.readChatResponse('devin');
349
+ debugLogger.info('Current Devin chat state:', chatResponse ? chatResponse.substring(0, 300) + '...' : 'No response readable');
350
350
  } catch (error) {
351
- debugLogger.warn('Could not read Windsurf chat response:', error.message);
351
+ debugLogger.warn('Could not read Devin chat response:', error.message);
352
352
  }
353
-
354
- // Check if Windsurf shows completion indicators
353
+
354
+ // Check if Devin shows completion indicators
355
355
  const hasCompletionIndicators = chatResponse && (
356
356
  chatResponse.includes('STATUS:WAITING') ||
357
357
  chatResponse.includes('PLEASE RESPOND') ||
@@ -361,39 +361,39 @@ class VCMWindsurfIntegration {
361
361
  chatResponse.includes('complete') ||
362
362
  chatResponse.includes('finished')
363
363
  );
364
-
364
+
365
365
  if (hasCompletionIndicators) {
366
- debugLogger.info('✅ Completion indicators detected in Windsurf chat');
367
-
368
- const confirmMessage = `✅ VCM-to-Windsurf communication test PASSED! Message successfully sent to Windsurf chat panel. Completion detected via manual recovery. Cascade panel remained open and functional. STATUS:DONE`;
369
-
370
- const result = await applescriptManager.sendText(confirmMessage, 'windsurf');
371
-
366
+ debugLogger.info('✅ Completion indicators detected in Devin chat');
367
+
368
+ const confirmMessage = `✅ VCM-to-Devin communication test PASSED! Message successfully sent to Devin chat panel. Completion detected via manual recovery. STATUS:DONE`;
369
+
370
+ const result = await applescriptManager.sendText(confirmMessage, 'devin');
371
+
372
372
  if (result.success) {
373
373
  debugLogger.info('✅ Manual recovery confirmation sent successfully');
374
-
374
+
375
375
  // Update requirements file
376
376
  const fs = require('fs');
377
377
  const path = require('path');
378
378
  const requirementsPath = path.join(this.projectRoot, 'REQUIREMENTS.md');
379
-
379
+
380
380
  if (fs.existsSync(requirementsPath)) {
381
381
  let content = fs.readFileSync(requirementsPath, 'utf8');
382
382
  content = content.replace(
383
- /\[ \] \*\*VCM-to-Windsurf Communication Test\*\*:.*?When Windsurf agent detects this status change, it should send a confirmation message back and then the requirement should be automatically removed via normal completion process\./g,
384
- `[x] **VCM-to-Windsurf Communication Test**: Add test requirement that updates to "DONE" status when VCM successfully sends text to Windsurf chat panel. When Windsurf agent detects this status change, it should send a confirmation message back and then the requirement should be automatically removed via normal completion process.`
383
+ /\[ \] \*\*VCM-to-Devin Communication Test\*\*:.*?When Devin agent detects this status change, it should send a confirmation message back and then the requirement should be automatically removed via normal completion process\./g,
384
+ `[x] **VCM-to-Devin Communication Test**: Add test requirement that updates to "DONE" status when VCM successfully sends text to Devin chat panel. When Devin agent detects this status change, it should send a confirmation message back and then the requirement should be automatically removed via normal completion process.`
385
385
  );
386
386
  fs.writeFileSync(requirementsPath, content, 'utf8');
387
387
  debugLogger.info('✅ Updated REQUIREMENTS.md to mark test as DONE');
388
388
  }
389
-
389
+
390
390
  return { success: true, message: 'Manual recovery completed successfully' };
391
391
  } else {
392
392
  debugLogger.error('❌ Failed to send manual recovery confirmation');
393
393
  return { success: false, error: result.error };
394
394
  }
395
395
  } else {
396
- debugLogger.info('No completion indicators detected, Windsurf may still be working');
396
+ debugLogger.info('No completion indicators detected, Devin may still be working');
397
397
  return { success: false, message: 'No completion indicators detected' };
398
398
  }
399
399
  } catch (error) {
@@ -403,7 +403,7 @@ class VCMWindsurfIntegration {
403
403
  }
404
404
 
405
405
  /**
406
- * Get current Windsurf integration status
406
+ * Get current Devin integration status
407
407
  */
408
408
  getStatus() {
409
409
  return {
@@ -414,81 +414,81 @@ class VCMWindsurfIntegration {
414
414
  }
415
415
 
416
416
  /**
417
- * Check for DONE status in REQUIREMENTS.md and respond to Windsurf
417
+ * Check for DONE status in REQUIREMENTS.md and respond to Devin
418
418
  */
419
419
  async checkForDoneStatusAndRespond() {
420
420
  try {
421
421
  const fs = require('fs');
422
422
  const path = require('path');
423
423
  const requirementsPath = path.join(this.projectRoot, 'REQUIREMENTS.md');
424
-
425
- // Check both requirements file AND try to read Windsurf's last response
424
+
425
+ // Check both requirements file AND try to read Devin's last response
426
426
  let doneDetected = false;
427
427
  let detectionSource = '';
428
-
428
+
429
429
  // Method 1: Check requirements file for DONE status
430
430
  if (fs.existsSync(requirementsPath)) {
431
431
  const content = fs.readFileSync(requirementsPath, 'utf8');
432
- const donePattern = /\[x\].*VCM-to-Windsurf Communication Test/;
432
+ const donePattern = /\[x\].*VCM-to-Devin Communication Test/;
433
433
  const doneMatch = content.match(donePattern);
434
-
434
+
435
435
  if (doneMatch) {
436
436
  doneDetected = true;
437
437
  detectionSource = 'requirements file';
438
- debugLogger.info('✅ Detected DONE status for VCM-to-Windsurf Communication Test in requirements file');
438
+ debugLogger.info('✅ Detected DONE status for VCM-to-Devin Communication Test in requirements file');
439
439
  }
440
440
  }
441
-
442
- // Method 2: Try to read Windsurf's chat response for STATUS:WAITING
441
+
442
+ // Method 2: Try to read Devin's chat response for STATUS:WAITING
443
443
  if (!doneDetected) {
444
444
  try {
445
445
  const { AppleScriptManager } = require('vibecodingmachine-core');
446
446
  const applescriptManager = new AppleScriptManager();
447
-
448
- // Try to read the last chat response from Windsurf
449
- const chatResponse = await applescriptManager.readChatResponse('windsurf');
450
-
451
- if (chatResponse &&
447
+
448
+ // Try to read the last chat response from Devin
449
+ const chatResponse = await applescriptManager.readChatResponse('devin');
450
+
451
+ if (chatResponse &&
452
452
  (chatResponse.includes('STATUS:WAITING') || chatResponse.includes('PLEASE RESPOND')) &&
453
453
  (chatResponse.includes('done') || chatResponse.includes('complete') || chatResponse.includes('finished'))) {
454
454
  doneDetected = true;
455
455
  detectionSource = 'chat response';
456
- debugLogger.info('✅ Detected completion status in Windsurf chat response');
456
+ debugLogger.info('✅ Detected completion status in Devin chat response');
457
457
  debugLogger.info('Chat response sample:', chatResponse.substring(0, 200) + '...');
458
458
  }
459
459
  } catch (error) {
460
- debugLogger.info('Could not read Windsurf chat response:', error.message);
460
+ debugLogger.info('Could not read Devin chat response:', error.message);
461
461
  }
462
462
  }
463
-
463
+
464
464
  // Method 3: Check for activity completion (no recent activity + time elapsed)
465
465
  if (!doneDetected && this.detector.lastActivity) {
466
466
  const timeSinceActivity = Date.now() - this.detector.lastActivity;
467
467
  const fiveMinutes = 5 * 60 * 1000;
468
-
468
+
469
469
  if (timeSinceActivity > fiveMinutes) {
470
470
  doneDetected = true;
471
471
  detectionSource = 'activity timeout';
472
472
  debugLogger.info('✅ Detected completion via activity timeout (5 minutes since last activity)');
473
473
  }
474
474
  }
475
-
475
+
476
476
  if (doneDetected) {
477
477
  debugLogger.info(`✅ Completion detected via ${detectionSource}`);
478
-
479
- // Send confirmation message back to Windsurf
478
+
479
+ // Send confirmation message back to Devin
480
480
  const { AppleScriptManager } = require('vibecodingmachine-core');
481
481
  const applescriptManager = new AppleScriptManager();
482
-
483
- const confirmMessage = `✅ VCM-to-Windsurf communication test PASSED! Message successfully sent to Windsurf chat panel. Completion detected via ${detectionSource}. Cascade panel remained open and functional. STATUS:DONE`;
484
-
485
- debugLogger.info('Sending confirmation message to Windsurf', { message: confirmMessage });
486
-
487
- const result = await applescriptManager.sendText(confirmMessage, 'windsurf');
488
-
482
+
483
+ const confirmMessage = `✅ VCM-to-Devin communication test PASSED! Message successfully sent to Devin chat panel. Completion detected via ${detectionSource}. STATUS:DONE`;
484
+
485
+ debugLogger.info('Sending confirmation message to Devin', { message: confirmMessage });
486
+
487
+ const result = await applescriptManager.sendText(confirmMessage, 'devin');
488
+
489
489
  if (result.success) {
490
- debugLogger.info('✅ Confirmation message sent successfully to Windsurf');
491
-
490
+ debugLogger.info('✅ Confirmation message sent successfully to Devin');
491
+
492
492
  // Update the requirements file to mark the test as DONE
493
493
  try {
494
494
  if (fs.existsSync(requirementsPath)) {
@@ -503,10 +503,10 @@ class VCMWindsurfIntegration {
503
503
  } catch (updateError) {
504
504
  debugLogger.warn('Could not update requirements file:', updateError.message);
505
505
  }
506
-
506
+
507
507
  return true;
508
508
  } else {
509
- debugLogger.error('❌ Failed to send confirmation message to Windsurf', { error: result.error });
509
+ debugLogger.error('❌ Failed to send confirmation message to Devin', { error: result.error });
510
510
  return false;
511
511
  }
512
512
  } else {
@@ -558,7 +558,7 @@ async function forceWindsurfCompletionDetection() {
558
558
  if (windsurfIntegration) {
559
559
  return await windsurfIntegration.forceCompletionDetection();
560
560
  }
561
- return { success: false, error: 'Windsurf integration not initialized' };
561
+ return { success: false, error: 'Devin integration not initialized' };
562
562
  }
563
563
 
564
564
  module.exports = {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * User Tracking Integration for CLI
3
- *
3
+ *
4
4
  * This module integrates the CLI with the enhanced user tracking system,
5
5
  * automatically logging user activities and updating usage statistics.
6
6
  */
@@ -12,7 +12,7 @@ class CLIUserTracking {
12
12
  this.sessionStartTime = Date.now()
13
13
  this.activityBuffer = []
14
14
  this.flushInterval = null
15
-
15
+
16
16
  // Start periodic flush of activity data
17
17
  this.startActivityFlush()
18
18
  }
@@ -142,7 +142,7 @@ class CLIUserTracking {
142
142
  async endSession() {
143
143
  try {
144
144
  const sessionDuration = Date.now() - this.sessionStartTime
145
-
145
+
146
146
  await auth.trackCLIActivity('session_ended', {
147
147
  duration: Math.round(sessionDuration / 1000), // Convert to seconds
148
148
  metadata: {
@@ -184,7 +184,7 @@ class CLIUserTracking {
184
184
  if (token && token.id_token) {
185
185
  await auth._updateUserActivity()
186
186
  }
187
-
187
+
188
188
  // Clear buffer after successful flush
189
189
  this.activityBuffer = []
190
190
  } catch (error) {
@@ -201,12 +201,12 @@ class CLIUserTracking {
201
201
  if (!token || !token.id_token) return null
202
202
 
203
203
  const payload = JSON.parse(Buffer.from(token.id_token.split('.')[1], 'base64').toString())
204
-
204
+
205
205
  const UserDatabase = require('vibecodingmachine-core/src/database/user-schema')
206
206
  const userDb = new UserDatabase()
207
-
207
+
208
208
  const userId = userDb.generateUserId(payload.email)
209
-
209
+
210
210
  const project = await userDb.registerProject(userId, {
211
211
  name: projectInfo.name || 'Unnamed Project',
212
212
  description: projectInfo.description || '',
@@ -241,16 +241,16 @@ class CLIUserTracking {
241
241
  if (!token || !token.id_token) return { compliant: false }
242
242
 
243
243
  const payload = JSON.parse(Buffer.from(token.id_token.split('.')[1], 'base64').toString())
244
-
244
+
245
245
  const ComplianceManager = require('vibecodingmachine-core/src/compliance/compliance-manager')
246
246
  const compliance = new ComplianceManager()
247
-
247
+
248
248
  const UserDatabase = require('vibecodingmachine-core/src/database/user-schema')
249
249
  const userDb = new UserDatabase()
250
250
  const userId = userDb.generateUserId(payload.email)
251
-
251
+
252
252
  const status = await compliance.checkComplianceStatus(userId)
253
-
253
+
254
254
  return {
255
255
  compliant: !status.needsAcknowledgment,
256
256
  termsAccepted: status.termsAccepted,
@@ -272,16 +272,16 @@ class CLIUserTracking {
272
272
  if (!token || !token.id_token) return false
273
273
 
274
274
  const payload = JSON.parse(Buffer.from(token.id_token.split('.')[1], 'base64').toString())
275
-
275
+
276
276
  const ComplianceManager = require('vibecodingmachine-core/src/compliance/compliance-manager')
277
277
  const compliance = new ComplianceManager()
278
-
278
+
279
279
  const UserDatabase = require('vibecodingmachine-core/src/database/user-schema')
280
280
  const userDb = new UserDatabase()
281
281
  const userId = userDb.generateUserId(payload.email)
282
-
282
+
283
283
  await compliance.recordAcknowledgment(userId, acknowledgments)
284
-
284
+
285
285
  // Track compliance activity
286
286
  await this.trackCommand('compliance_acknowledged', [], {
287
287
  termsAccepted: acknowledgments.terms,