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
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * TRUI Agents Interface
3
- *
3
+ *
4
4
  * Text-based REST UI interface for agent management.
5
5
  * Follows constitutional requirements: <555 lines, test-first approach.
6
6
  */
@@ -30,7 +30,7 @@ class AgentInterface {
30
30
  fileManager: new FileManager()
31
31
  });
32
32
  this.fileManager = options.fileManager || new FileManager();
33
-
33
+
34
34
  // Initialize RUI components
35
35
  this.agentCommands = new AgentCommands({
36
36
  configManager: this.configManager,
@@ -70,7 +70,7 @@ class AgentInterface {
70
70
  async start() {
71
71
  try {
72
72
  await this.configManager.load();
73
-
73
+
74
74
  console.log('=== Vibe Coding Machine - Agent Management ===');
75
75
  console.log('Type "help" for available commands or "exit" to quit');
76
76
  console.log('');
@@ -122,7 +122,7 @@ class AgentInterface {
122
122
  */
123
123
  async handleInput(input) {
124
124
  const trimmedInput = input.trim();
125
-
125
+
126
126
  if (!trimmedInput) {
127
127
  this.rl.prompt();
128
128
  return;
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Command Handler for TRUI Agent Interface
3
- *
3
+ *
4
4
  * Handles command parsing and execution.
5
5
  * Follows constitutional requirements: <555 lines, test-first approach.
6
6
  */
@@ -26,7 +26,7 @@ class CommandHandler {
26
26
  async executeCommand(commandString) {
27
27
  // Parse command
28
28
  const parsed = this.parseCommand(commandString);
29
-
29
+
30
30
  if (!parsed.success) {
31
31
  throw new Error(parsed.error);
32
32
  }
@@ -53,7 +53,7 @@ class CommandHandler {
53
53
  */
54
54
  parseCommand(commandString) {
55
55
  const tokens = commandString.trim().split(/\s+/);
56
-
56
+
57
57
  if (tokens.length === 0) {
58
58
  return { success: false, error: 'Empty command' };
59
59
  }
@@ -66,7 +66,7 @@ class CommandHandler {
66
66
  // Parse parameters
67
67
  for (let i = 2; i < tokens.length; i++) {
68
68
  const token = tokens[i];
69
-
69
+
70
70
  if (token.startsWith('--')) {
71
71
  const param = token.substring(2);
72
72
  if (param.includes('=')) {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Context Manager for TRUI Agent Interface
3
- *
3
+ *
4
4
  * Manages interface context and navigation state.
5
5
  * Follows constitutional requirements: <555 lines, test-first approach.
6
6
  */
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Display Handler for TRUI Agent Interface
3
- *
3
+ *
4
4
  * Handles all display operations for agent data, results, and summaries.
5
5
  * Follows constitutional requirements: <555 lines, test-first approach.
6
6
  */
@@ -67,7 +67,7 @@ class DisplayHandler {
67
67
  */
68
68
  async displayErrorResult(response, parsedCommand) {
69
69
  console.error(`Error: ${response.error}`);
70
-
70
+
71
71
  if (response.navigation && response.navigation.suggestions) {
72
72
  console.log('\nSuggestions:');
73
73
  response.navigation.suggestions.forEach(suggestion => {
@@ -83,7 +83,7 @@ class DisplayHandler {
83
83
  */
84
84
  async displayAgentList(data) {
85
85
  console.log('\n=== AGENTS ===');
86
-
86
+
87
87
  if (!data.agents || data.agents.length === 0) {
88
88
  console.log('No agents found.');
89
89
  return;
@@ -94,9 +94,9 @@ class DisplayHandler {
94
94
  const status = agent.status || 'UNKNOWN';
95
95
  const statusIcon = this.getStatusIcon(status);
96
96
  const displayIndex = (agentIndex + 1).toString().padStart(2);
97
-
97
+
98
98
  console.log(`${displayIndex}. ${statusIcon} ${agent.id.padEnd(15)} - ${agent.name}`);
99
-
99
+
100
100
  if (agent.statusDescription) {
101
101
  console.log(` Status: ${agent.statusDescription}`);
102
102
  }
@@ -117,15 +117,15 @@ class DisplayHandler {
117
117
  console.log(`Description: ${data.description || 'No description'}`);
118
118
  console.log(`Enabled: ${data.enabled ? 'Yes' : 'No'}`);
119
119
  console.log(`Status: ${data.status || 'UNKNOWN'}`);
120
-
120
+
121
121
  if (data.statusDescription) {
122
122
  console.log(`Status Description: ${data.statusDescription}`);
123
123
  }
124
-
124
+
125
125
  if (data.lastChecked) {
126
126
  console.log(`Last Checked: ${new Date(data.lastChecked).toLocaleString()}`);
127
127
  }
128
-
128
+
129
129
  if (data.lastVerified) {
130
130
  console.log(`Last Verified: ${new Date(data.lastVerified).toLocaleString()}`);
131
131
  }
@@ -158,7 +158,7 @@ class DisplayHandler {
158
158
  console.log(`Successful: ${data.successful || 0}`);
159
159
  console.log(`Failed: ${data.failed || 0}`);
160
160
  console.log(`Skipped: ${data.skipped || 0}`);
161
-
161
+
162
162
  if (data.duration) {
163
163
  console.log(`Duration: ${(data.duration / 1000).toFixed(2)}s`);
164
164
  }
@@ -209,11 +209,11 @@ class DisplayHandler {
209
209
  if (navigation.context) {
210
210
  console.log(`\nContext: ${navigation.context}`);
211
211
  }
212
-
212
+
213
213
  if (navigation.availableActions && navigation.availableActions.length > 0) {
214
214
  console.log('Available commands:', navigation.availableActions.join(', '));
215
215
  }
216
-
216
+
217
217
  if (navigation.shortcuts && navigation.shortcuts.length > 0) {
218
218
  console.log('Shortcuts:', navigation.shortcuts.join(', '));
219
219
  }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Help Handler for TRUI Agent Interface
3
- *
3
+ *
4
4
  * Handles help display and command information.
5
5
  * Follows constitutional requirements: <555 lines, test-first approach.
6
6
  */
@@ -14,7 +14,7 @@ const { getProviderPreferences } = require('./provider-registry');
14
14
  */
15
15
  async function getEffectiveAgent(options = {}, providerDefinitions, providerDefinitionMap) {
16
16
  const prefs = await getProviderPreferences();
17
-
17
+
18
18
  // Get all available providers in the order specified in preferences
19
19
  const availableProviders = [];
20
20
  for (const id of prefs.order) {
@@ -22,22 +22,22 @@ async function getEffectiveAgent(options = {}, providerDefinitions, providerDefi
22
22
  availableProviders.push(id);
23
23
  }
24
24
  }
25
-
25
+
26
26
  // If no providers are available, use the first one from definitions as fallback
27
27
  if (availableProviders.length === 0) {
28
28
  availableProviders.push(providerDefinitions[0]?.id || 'claude-code');
29
29
  }
30
-
30
+
31
31
  // Use the first available provider by default, unless overridden by options
32
32
  let effectiveAgent = options.ide || availableProviders[0];
33
-
33
+
34
34
  // If the requested agent isn't available, use the first available one
35
35
  if (!availableProviders.includes(effectiveAgent)) {
36
36
  effectiveAgent = availableProviders[0];
37
37
  }
38
-
38
+
39
39
  const providerDef = providerDefinitionMap.get(effectiveAgent);
40
-
40
+
41
41
  return {
42
42
  effectiveAgent,
43
43
  providerDef,
@@ -18,11 +18,11 @@ async function installAntigravity() {
18
18
  // Handle Windows platform
19
19
  if (platform === 'win32') {
20
20
  spinner.succeed(`System OK (${arch === 'x64' ? 'x64' : 'ARM64'})`);
21
-
21
+
22
22
  try {
23
23
  const cacheDir = path.join(os.homedir(), '.vibecodingmachine', 'cache');
24
24
  await fs.ensureDir(cacheDir);
25
-
25
+
26
26
  // Try to find Antigravity installation on Windows
27
27
  const possiblePaths = [
28
28
  'C:\\Program Files\\Google\\Antigravity\\Antigravity.exe',
@@ -53,7 +53,7 @@ async function installAntigravity() {
53
53
  console.log(chalk.cyan('1. Download from: https://antigravity.dev'));
54
54
  console.log(chalk.cyan('2. Run the installer'));
55
55
  console.log(chalk.cyan('3. Antigravity should be automatically detected'));
56
-
56
+
57
57
  return false;
58
58
  } catch (error) {
59
59
  spinner.fail('Windows installation check failed');
@@ -101,7 +101,7 @@ async function installAntigravity() {
101
101
  if (total && stat.size === total) {
102
102
  await fs.copy(cachedPath, dmgPath);
103
103
  usedCache = true;
104
- console.log(chalk.gray('Using cached Antigravity DMG'));
104
+ console.log(chalk.gray('Using cached Antigravity DMG'));
105
105
  }
106
106
  } catch (e) {
107
107
  // If HEAD fails, still allow reuse of cache to avoid re-download
@@ -16,7 +16,7 @@ async function cleanupBrokenAssets() {
16
16
  // But for the user's workspace context, iterating 'assets/' in CWD (repo root) is correct for their dev environment.
17
17
  // Let's try to be smart about finding specific 'assets' dir if we can, but CWD is a safe start for the CLI tool which is often run from root.
18
18
 
19
- // Actually, looking at previous grep, `assets/` was checked specifically.
19
+ // Actually, looking at previous grep, `assets/` was checked specifically.
20
20
  // Let's just check `assets` in process.cwd() as a primary target.
21
21
 
22
22
  const assetsDir = path.join(process.cwd(), 'assets');
package/src/utils/auth.js CHANGED
@@ -25,7 +25,7 @@ class CLIAuth {
25
25
  console.log('🔓 Authentication bypassed for IDE checking');
26
26
  return true;
27
27
  }
28
-
28
+
29
29
  const isValid = await sharedAuth.isAuthenticated();
30
30
  if (isValid) {
31
31
  await this._updateUserActivity();
@@ -40,7 +40,7 @@ class CLIAuth {
40
40
  await this._updateUserActivity();
41
41
  return true;
42
42
  }
43
- } catch (error) {}
43
+ } catch (error) { }
44
44
  return false;
45
45
  }
46
46
 
@@ -305,7 +305,7 @@ class CLIAuth {
305
305
  const codeVerifier = generateCodeVerifier();
306
306
  const codeChallenge = generateCodeChallenge(codeVerifier);
307
307
 
308
- // Build Cognito OAuth URL with PKCE - force Google account picker every time
308
+ // Build Cognito OAuth URL with PKCE - enable persistent sessions
309
309
  const authUrl = `https://${COGNITO_DOMAIN}/oauth2/authorize?` +
310
310
  `client_id=${CLIENT_ID}&` +
311
311
  `response_type=code&` +
@@ -313,8 +313,7 @@ class CLIAuth {
313
313
  `redirect_uri=http://localhost:${PORT}/callback&` +
314
314
  `code_challenge=${codeChallenge}&` +
315
315
  `code_challenge_method=S256&` +
316
- `identity_provider=Google&` +
317
- `prompt=select_account`;
316
+ `identity_provider=Google`;
318
317
 
319
318
  // Create local server to receive callback
320
319
  const server = http.createServer(async (req, res) => {
@@ -482,7 +481,7 @@ class CLIAuth {
482
481
  });
483
482
 
484
483
  server.listen(PORT, async () => {
485
- // Build Cognito OAuth URL with PKCE - force Google account picker every time
484
+ // Build Cognito OAuth URL with PKCE - enable persistent sessions
486
485
  const authUrl = `https://${COGNITO_DOMAIN}/oauth2/authorize?` +
487
486
  `client_id=${CLIENT_ID}&` +
488
487
  `response_type=code&` +
@@ -490,8 +489,7 @@ class CLIAuth {
490
489
  `redirect_uri=http://localhost:${PORT}/callback&` +
491
490
  `code_challenge=${codeChallenge}&` +
492
491
  `code_challenge_method=S256&` +
493
- `identity_provider=Google&` +
494
- `prompt=select_account`;
492
+ `identity_provider=Google`;
495
493
 
496
494
  // Open browser - VS Code Remote SSH users should click the URL
497
495
  if (this._isVSCodeRemoteSSH()) {
@@ -538,7 +536,7 @@ class CLIAuth {
538
536
  const codeVerifier = generateCodeVerifier();
539
537
  const codeChallenge = generateCodeChallenge(codeVerifier);
540
538
 
541
- // Build Cognito OAuth URL with PKCE
539
+ // Build Cognito OAuth URL with PKCE - enable persistent sessions
542
540
  const authUrl = `https://${COGNITO_DOMAIN}/oauth2/authorize?` +
543
541
  `client_id=${CLIENT_ID}&` +
544
542
  `response_type=code&` +
@@ -546,8 +544,7 @@ class CLIAuth {
546
544
  `redirect_uri=http://localhost:${PREFERRED_PORT}/callback&` +
547
545
  `code_challenge=${codeChallenge}&` +
548
546
  `code_challenge_method=S256&` +
549
- `identity_provider=Google&` +
550
- `prompt=select_account`;
547
+ `identity_provider=Google`;
551
548
 
552
549
  console.log(chalk.cyan('\n🔐 Headless Authentication Mode\n'));
553
550
  console.log(chalk.gray('You are in a headless/SSH environment.\n'));
@@ -748,7 +745,7 @@ class CLIAuth {
748
745
  // Get user from API to get the correct userId format
749
746
  const userDbClient = userDb.apiClient;
750
747
  userDbClient.setAuthToken(idToken);
751
-
748
+
752
749
  try {
753
750
  const apiUser = await userDbClient.getUser();
754
751
  if (apiUser && apiUser.userId) {
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Clarification Actions Module
3
- *
3
+ *
4
4
  * Handles clarification-related requirement actions.
5
5
  */
6
6
 
@@ -42,7 +42,7 @@ async function editClarificationResponses(req, tree) {
42
42
  for (const qIdx of questions) {
43
43
  const question = req.questions[qIdx];
44
44
  console.log(chalk.bold(`\nQuestion ${qIdx + 1}: ${question.question.replace(/^\d+\.\s*/, '')}`));
45
-
45
+
46
46
  if (question.response) {
47
47
  console.log(chalk.gray(`Current response: ${question.response}`));
48
48
  }
@@ -153,7 +153,7 @@ async function moveClarificationToTodo(req, tree) {
153
153
  if (startIdx !== -1) {
154
154
  // Extract the requirement content
155
155
  const reqContent = lines.slice(startIdx, endIdx);
156
-
156
+
157
157
  // Remove from clarification section
158
158
  lines.splice(startIdx, endIdx - startIdx);
159
159
 
@@ -169,7 +169,7 @@ async function moveClarificationToTodo(req, tree) {
169
169
  if (insertIdx !== -1) {
170
170
  lines.splice(insertIdx, 0, ...reqContent);
171
171
  }
172
-
172
+
173
173
  await fs.writeFile(reqPath, lines.join('\n'));
174
174
  console.log(chalk.green('\n✓ Moved to TODO!'));
175
175
  }
@@ -188,19 +188,19 @@ async function handleClineRateLimit() {
188
188
  */
189
189
  async function setupClineExtension() {
190
190
  console.log(chalk.blue('🔍 Checking Cline extension installation...'));
191
-
191
+
192
192
  const checkResult = await checkClineInstallation();
193
-
193
+
194
194
  if (checkResult.installed) {
195
195
  console.log(chalk.green('✅ Cline extension is already installed!'));
196
196
  return { success: true };
197
197
  }
198
-
198
+
199
199
  console.log(chalk.yellow('⚠️ Cline extension not found.'));
200
200
  console.log(chalk.cyan('📦 Installing Cline extension...'));
201
-
201
+
202
202
  const installResult = await installClineExtension();
203
-
203
+
204
204
  if (installResult.success) {
205
205
  console.log(chalk.green('✅ Cline extension installed successfully!'));
206
206
  console.log(chalk.blue('💡 Please restart VS Code to activate the extension.'));
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * CLI Compliance Check Utility
3
- *
3
+ *
4
4
  * Checks and prompts for compliance on CLI startup
5
5
  */
6
6
 
@@ -24,7 +24,7 @@ async function checkCompliance() {
24
24
 
25
25
  // Get current user
26
26
  const user = await auth.getCurrentUser()
27
-
27
+
28
28
  if (!user || !user.userId) {
29
29
  // If we can't get user info but they're authenticated, something is wrong
30
30
  // But don't block them - they can still use the app
@@ -51,7 +51,7 @@ async function checkCompliance() {
51
51
  // Set auth token for compliance manager
52
52
  compliancePrompt.complianceManager.userDb.setAuthToken(token)
53
53
  const status = await compliancePrompt.complianceManager.checkComplianceStatus(user.userId)
54
-
54
+
55
55
  if (!status.needsAcknowledgment) {
56
56
  return true
57
57
  }
@@ -87,7 +87,7 @@ async function promptCLI(userId, status, compliancePrompt) {
87
87
 
88
88
  if (status.requiredActions.includes('terms')) {
89
89
  const terms = await compliancePrompt.complianceManager.getTermsOfService()
90
-
90
+
91
91
  console.log(chalk.yellow('📄 Terms of Service'))
92
92
  console.log(chalk.gray('─'.repeat(70)))
93
93
  console.log(formatForCLI(terms.content))
@@ -104,7 +104,7 @@ async function promptCLI(userId, status, compliancePrompt) {
104
104
 
105
105
  if (status.requiredActions.includes('privacy')) {
106
106
  const privacy = await compliancePrompt.complianceManager.getPrivacyPolicy()
107
-
107
+
108
108
  console.log(chalk.yellow('🔒 Privacy Policy'))
109
109
  console.log(chalk.gray('─'.repeat(70)))
110
110
  console.log(formatForCLI(privacy.content))
@@ -122,7 +122,7 @@ async function promptCLI(userId, status, compliancePrompt) {
122
122
  const answers = await inquirer.prompt(questions)
123
123
 
124
124
  // Check if user accepted all required items
125
- const allAccepted =
125
+ const allAccepted =
126
126
  (!status.requiredActions.includes('terms') || answers.acceptTerms) &&
127
127
  (!status.requiredActions.includes('privacy') || answers.acceptPrivacy)
128
128
 
@@ -16,12 +16,12 @@ async function ensureConfigFile() {
16
16
  const cfgPath = getConfigPath();
17
17
  await fs.ensureDir(path.dirname(cfgPath));
18
18
  if (!await fs.pathExists(cfgPath)) {
19
- const defaultConfig = {
20
- repoPath: null,
19
+ const defaultConfig = {
20
+ repoPath: null,
21
21
  auto: {
22
22
  specProgressTimeoutMinutes: 5, // Default 5 minutes
23
23
  maxIdeAttempts: 3 // Default 3 attempts
24
- }
24
+ }
25
25
  };
26
26
  await fs.writeJson(cfgPath, defaultConfig, { spaces: 2 });
27
27
  }
@@ -90,7 +90,7 @@ const DEFAULT_STAGES = Object.freeze([
90
90
  'ACT',
91
91
  'CLEAN UP',
92
92
  'VERIFY',
93
- 'RUN UNIT TESTS',
93
+ 'TESTS',
94
94
  'DONE'
95
95
  ]);
96
96
 
@@ -170,12 +170,12 @@ async function initializeTimeoutConfigManager() {
170
170
  if (!timeoutConfigManager) {
171
171
  const configPath = getTimeoutConfigPath();
172
172
  await fs.ensureDir(path.dirname(configPath));
173
-
173
+
174
174
  let config = {};
175
175
  if (await fs.pathExists(configPath)) {
176
176
  config = await fs.readJson(configPath);
177
177
  }
178
-
178
+
179
179
  timeoutConfigManager = new TimeoutConfigManager(config);
180
180
  }
181
181
  return timeoutConfigManager;
@@ -185,7 +185,7 @@ async function getTimeoutConfig() {
185
185
  try {
186
186
  const manager = await initializeTimeoutConfigManager();
187
187
  const config = manager.getConfig();
188
-
188
+
189
189
  // Add minSamples for UI compatibility
190
190
  return {
191
191
  ...config,
@@ -200,7 +200,7 @@ async function getTimeoutConfig() {
200
200
  async function setTimeoutConfig(timeoutConfig) {
201
201
  try {
202
202
  const manager = await initializeTimeoutConfigManager();
203
-
203
+
204
204
  // Apply updates to the manager
205
205
  if (timeoutConfig.mode !== undefined) {
206
206
  manager.setMode(timeoutConfig.mode);
@@ -220,13 +220,13 @@ async function setTimeoutConfig(timeoutConfig) {
220
220
  if (timeoutConfig.ewmaAlpha !== undefined) {
221
221
  manager.setEWMAAlpha(timeoutConfig.ewmaAlpha);
222
222
  }
223
-
223
+
224
224
  // Save to storage
225
225
  const newConfig = manager.getConfig();
226
226
  const configPath = getTimeoutConfigPath();
227
227
  await fs.ensureDir(path.dirname(configPath));
228
228
  await fs.writeJson(configPath, newConfig, { spaces: 2 });
229
-
229
+
230
230
  return newConfig;
231
231
  } catch (error) {
232
232
  console.error('Failed to set timeout configuration:', error);
@@ -238,13 +238,13 @@ async function resetTimeoutConfig() {
238
238
  try {
239
239
  const manager = await initializeTimeoutConfigManager();
240
240
  manager.reset();
241
-
241
+
242
242
  // Save defaults to storage
243
243
  const config = manager.getConfig();
244
244
  const configPath = getTimeoutConfigPath();
245
245
  await fs.ensureDir(path.dirname(configPath));
246
246
  await fs.writeJson(configPath, config, { spaces: 2 });
247
-
247
+
248
248
  return config;
249
249
  } catch (error) {
250
250
  console.error('Failed to reset timeout configuration:', error);
@@ -37,7 +37,7 @@ function formatIDEName(ide) {
37
37
  'cline': 'Cline CLI',
38
38
  'cursor': 'Cursor',
39
39
  'vscode': 'VS Code',
40
- 'windsurf': 'Windsurf',
40
+ 'devin': 'Devin',
41
41
  'kiro': 'AWS Kiro'
42
42
  };
43
43
  return ideNames[ide] || ide;
@@ -161,7 +161,7 @@ function getCurrentAIProvider(ide) {
161
161
  function getAgentDisplayName(agentType) {
162
162
  // IDE-based agents
163
163
  if (agentType === 'cursor') return 'Cursor IDE Agent';
164
- if (agentType === 'windsurf') return 'Windsurf IDE Agent';
164
+ if (agentType === 'devin') return 'Devin AI Agent';
165
165
  if (agentType === 'antigravity') return 'Google Antigravity IDE Agent';
166
166
  if (agentType === 'kiro') return 'AWS Kiro AI IDE Agent';
167
167
  if (agentType === 'vscode') return 'VS Code IDE Agent';
@@ -32,7 +32,7 @@ function formatIDEName(ide) {
32
32
  'cline': 'Cline CLI',
33
33
  'cursor': 'Cursor',
34
34
  'vscode': 'VS Code',
35
- 'windsurf': 'Windsurf',
35
+ 'devin': 'Devin',
36
36
  'kiro': 'AWS Kiro'
37
37
  };
38
38
  return ideNames[ide] || ide;
@@ -51,7 +51,7 @@ function formatIDEName(ide) {
51
51
  function getAgentDisplayName(agentType) {
52
52
  // IDE-based agents
53
53
  if (agentType === 'cursor') return 'Cursor IDE Agent';
54
- if (agentType === 'windsurf') return 'Windsurf IDE Agent';
54
+ if (agentType === 'devin') return 'Devin AI Agent';
55
55
  if (agentType === 'antigravity') return 'Google Antigravity IDE Agent';
56
56
  if (agentType === 'kiro') return 'AWS Kiro AI IDE Agent';
57
57
  if (agentType === 'vscode') return 'VS Code IDE Agent';
@@ -37,7 +37,7 @@ function formatIDEName(ide) {
37
37
  'cline': 'Cline CLI',
38
38
  'cursor': 'Cursor',
39
39
  'vscode': 'VS Code',
40
- 'windsurf': 'Windsurf',
40
+ 'devin': 'Devin',
41
41
  'kiro': 'AWS Kiro'
42
42
  };
43
43
  return ideNames[ide] || ide;
@@ -51,7 +51,7 @@ function formatIDEName(ide) {
51
51
  function getAgentDisplayName(agentType) {
52
52
  // IDE-based agents
53
53
  if (agentType === 'cursor') return 'Cursor IDE Agent';
54
- if (agentType === 'windsurf') return 'Windsurf IDE Agent';
54
+ if (agentType === 'devin') return 'Devin AI Agent';
55
55
  if (agentType === 'antigravity') return 'Google Antigravity IDE Agent';
56
56
  if (agentType === 'kiro') return 'AWS Kiro AI IDE Agent';
57
57
  if (agentType === 'vscode') return 'VS Code IDE Agent';
@@ -34,12 +34,12 @@ async function handleFeedbackSubmission() {
34
34
  try {
35
35
  const screenshot = require('screenshot-desktop');
36
36
  const imgBuffer = await screenshot({ format: 'png' });
37
-
37
+
38
38
  // Convert to base64 and check size
39
39
  const base64 = imgBuffer.toString('base64');
40
40
  const dataUrl = `data:image/png;base64,${base64}`;
41
41
  const size = Buffer.byteLength(dataUrl, 'utf8');
42
-
42
+
43
43
  // Much stricter size limit - 100KB max
44
44
  if (size > 100 * 1024) {
45
45
  console.log(chalk.yellow('⚠️ Screenshot is too large, submitting feedback without screenshot'));
@@ -179,9 +179,9 @@ async function checkFirstRun() {
179
179
  } else if (ide.id === 'cursor') {
180
180
  // Cursor: check app bundle and 'cursor' binary
181
181
  installed = await checkAppOrBinary(['Cursor'], ['cursor']);
182
- } else if (ide.id === 'windsurf') {
183
- // Windsurf: check app bundle and common binary
184
- installed = await checkAppOrBinary(['Windsurf'], ['windsurf']);
182
+ } else if (ide.id === 'devin') {
183
+ // Devin: check app bundle
184
+ installed = await checkAppOrBinary(['Devin'], ['devin']);
185
185
  } else if (ide.id === 'vscode') {
186
186
  // VS Code: check app bundle and 'code' CLI
187
187
  installed = await checkAppOrBinary(['Visual Studio Code', 'Visual Studio Code - Insiders'], ['code', 'code-insiders']);
@@ -238,8 +238,8 @@ async function checkFirstRun() {
238
238
  alreadyInstalled = isKiroInstalled() || await checkAppOrBinary(['AWS Kiro', 'Kiro'], ['kiro']);
239
239
  } else if (ideId === 'cursor') {
240
240
  alreadyInstalled = await checkAppOrBinary(['Cursor'], ['cursor']);
241
- } else if (ideId === 'windsurf') {
242
- alreadyInstalled = await checkAppOrBinary(['Windsurf'], ['windsurf']);
241
+ } else if (ideId === 'devin') {
242
+ alreadyInstalled = await checkAppOrBinary(['Devin'], ['devin']);
243
243
  } else if (ideId === 'vscode') {
244
244
  alreadyInstalled = await checkAppOrBinary(['Visual Studio Code', 'Visual Studio Code - Insiders'], ['code', 'code-insiders']);
245
245
  } else if (ideId === 'antigravity') {
@@ -315,8 +315,8 @@ async function checkFirstRun() {
315
315
  installedNow = isKiroInstalled() || await checkAppOrBinary(['AWS Kiro', 'Kiro'], ['kiro']);
316
316
  } else if (ideDef.id === 'cursor') {
317
317
  installedNow = await checkAppOrBinary(['Cursor'], ['cursor']);
318
- } else if (ideDef.id === 'windsurf') {
319
- installedNow = await checkAppOrBinary(['Windsurf'], ['windsurf']);
318
+ } else if (ideDef.id === 'devin') {
319
+ installedNow = await checkAppOrBinary(['Devin'], ['devin']);
320
320
  } else if (ideDef.id === 'vscode') {
321
321
  installedNow = await checkAppOrBinary(['Visual Studio Code', 'Visual Studio Code - Insiders'], ['code', 'code-insiders']);
322
322
  } else if (ideDef.id === 'antigravity') {
@@ -37,7 +37,7 @@ async function checkVSCodeExtension(extensionId) {
37
37
  */
38
38
  async function checkAppOrBinary(names = [], binaries = []) {
39
39
  const platform = os.platform();
40
-
40
+
41
41
  // Check common application directories
42
42
  if (platform === 'darwin') {
43
43
  const appDirs = ['/Applications', path.join(os.homedir(), 'Applications')];