vibecodingmachine-cli 2026.3.14-1537 → 2026.6.17-1956
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/auth/auth-compliance.js +7 -7
- package/bin/commands/agent-commands.js +15 -15
- package/bin/commands/auto-commands.js +3 -3
- package/bin/commands/command-aliases.js +13 -4
- package/bin/config/cli-config.js +15 -5
- package/bin/update/update-checker.js +5 -5
- package/bin/vibecodingmachine.js +2 -2
- package/package.json +2 -2
- package/src/commands/agents/add.js +5 -5
- package/src/commands/agents/check.js +19 -19
- package/src/commands/agents/list.js +24 -24
- package/src/commands/agents/remove.js +4 -4
- package/src/commands/agents-check.js +1 -1
- package/src/commands/analyze-file-sizes.js +43 -43
- package/src/commands/auto-direct/auto-provider-manager.js +19 -19
- package/src/commands/auto-direct/auto-start-phases.js +493 -0
- package/src/commands/auto-direct/auto-status-display.js +35 -35
- package/src/commands/auto-direct/auto-utils.js +50 -50
- package/src/commands/auto-direct/cline-installer.js +56 -0
- package/src/commands/auto-direct/code-processor.js +27 -27
- package/src/commands/auto-direct/file-scanner.js +19 -19
- package/src/commands/auto-direct/ide-completion-waiter.js +485 -0
- package/src/commands/auto-direct/ide-fallback-runner.js +226 -0
- package/src/commands/auto-direct/ide-provider-runner.js +103 -0
- package/src/commands/auto-direct/iteration-handlers.js +189 -0
- package/src/commands/auto-direct/iteration-runner.js +485 -0
- package/src/commands/auto-direct/provider-config.js +38 -7
- package/src/commands/auto-direct/provider-manager.js +132 -6
- package/src/commands/auto-direct/requirement-manager.js +169 -104
- package/src/commands/auto-direct/requirement-mover.js +350 -0
- package/src/commands/auto-direct/spec-handlers.js +155 -0
- package/src/commands/auto-direct/spec-ide-runner.js +318 -0
- package/src/commands/auto-direct/spec-processing.js +203 -0
- package/src/commands/auto-direct/status-display.js +9 -9
- package/src/commands/auto-direct/utils.js +83 -1
- package/src/commands/auto-direct-refactored.js +1 -413
- package/src/commands/auto-direct.js +127 -4119
- package/src/commands/auto-execution.js +21 -21
- package/src/commands/auto-status-helpers.js +0 -2
- package/src/commands/auto.js +22 -22
- package/src/commands/check-compliance.js +65 -65
- package/src/commands/computers.js +39 -39
- package/src/commands/continuous-scan.js +19 -19
- package/src/commands/ide.js +4 -4
- package/src/commands/locale.js +7 -7
- package/src/commands/refactor-file.js +59 -59
- package/src/commands/requirements/commands.js +17 -17
- package/src/commands/requirements/default-handlers.js +30 -30
- package/src/commands/requirements/disable.js +3 -3
- package/src/commands/requirements/enable.js +3 -3
- package/src/commands/requirements/utils.js +6 -6
- package/src/commands/requirements-refactored.js +3 -3
- package/src/commands/requirements-remote.js +38 -38
- package/src/commands/requirements.js +3 -3
- package/src/commands/settings.js +111 -0
- package/src/commands/specs/count.js +60 -0
- package/src/commands/specs/disable.js +3 -3
- package/src/commands/specs/enable.js +3 -3
- package/src/commands/status.js +10 -10
- package/src/commands/sync.js +25 -25
- package/src/commands/timeout.js +35 -35
- package/src/trui/TruiInterface.js +2 -2
- package/src/trui/agents/AgentInterface.js +4 -4
- package/src/trui/agents/handlers/CommandHandler.js +4 -4
- package/src/trui/agents/handlers/ContextManager.js +1 -1
- package/src/trui/agents/handlers/DisplayHandler.js +11 -11
- package/src/trui/agents/handlers/HelpHandler.js +1 -1
- package/src/utils/agent-selector.js +6 -6
- package/src/utils/antigravity-installer.js +4 -4
- package/src/utils/asset-cleanup.js +1 -1
- package/src/utils/auth.js +9 -12
- package/src/utils/clarification-actions.js +4 -4
- package/src/utils/cline-js-handler.js +5 -5
- package/src/utils/compliance-check.js +6 -6
- package/src/utils/config.js +12 -12
- package/src/utils/display-formatters-complete.js +2 -2
- package/src/utils/display-formatters-extracted.js +2 -2
- package/src/utils/display-formatters.js +2 -2
- package/src/utils/feedback-handler.js +2 -2
- package/src/utils/first-run.js +7 -7
- package/src/utils/ide-detection.js +1 -1
- package/src/utils/ide-handlers.js +6 -6
- package/src/utils/interactive/clarification-actions.js +3 -3
- package/src/utils/interactive/core-ui.js +7 -7
- package/src/utils/interactive/file-backup.js +6 -6
- package/src/utils/interactive/file-import-export.js +49 -49
- package/src/utils/interactive/file-operations.js +3 -3
- package/src/utils/interactive/file-validation.js +41 -41
- package/src/utils/interactive/interactive-prompts.js +41 -41
- package/src/utils/interactive/requirement-actions.js +5 -5
- package/src/utils/interactive/requirement-crud.js +4 -4
- package/src/utils/interactive/requirements-navigation.js +10 -10
- package/src/utils/interactive-broken.js +6 -6
- package/src/utils/interactive.js +37 -37
- package/src/utils/keyboard-handler.js +4 -4
- package/src/utils/prompt-helper.js +6 -6
- package/src/utils/provider-checker/agent-checker.js +1 -1
- package/src/utils/provider-checker/agent-runner.js +203 -314
- package/src/utils/provider-checker/agents-file-lock.js +134 -0
- package/src/utils/provider-checker/agents-manager.js +224 -36
- package/src/utils/provider-checker/cli-installer.js +28 -28
- package/src/utils/provider-checker/cli-utils.js +2 -2
- package/src/utils/provider-checker/cursor-approval-clicker.js +108 -0
- package/src/utils/provider-checker/format-utils.js +4 -4
- package/src/utils/provider-checker/ide-installer-helper.js +96 -0
- package/src/utils/provider-checker/ide-manager.js +19 -8
- package/src/utils/provider-checker/ide-quota-checker.js +120 -0
- package/src/utils/provider-checker/ide-utils.js +2 -2
- package/src/utils/provider-checker/node-detector.js +4 -4
- package/src/utils/provider-checker/node-utils.js +5 -5
- package/src/utils/provider-checker/opencode-checker.js +107 -73
- package/src/utils/provider-checker/process-utils.js +1 -1
- package/src/utils/provider-checker/provider-validator.js +11 -11
- package/src/utils/provider-checker/quota-checker.js +5 -5
- package/src/utils/provider-checker/quota-detector.js +5 -5
- package/src/utils/provider-checker/requirements-manager.js +6 -6
- package/src/utils/provider-checker/test-requirements.js +1 -1
- package/src/utils/provider-checker/vscode-approval-clicker.js +328 -0
- package/src/utils/provider-checker-new.js +6 -6
- package/src/utils/provider-checker.js +6 -6
- package/src/utils/provider-checkers/ide-manager.js +13 -13
- package/src/utils/provider-checkers/node-executable-finder.js +4 -4
- package/src/utils/provider-checkers/provider-checker-core.js +5 -5
- package/src/utils/provider-checkers/provider-checker-main.js +17 -17
- package/src/utils/provider-registry.js +5 -6
- package/src/utils/provider-utils.js +12 -12
- package/src/utils/quota-detectors.js +32 -32
- package/src/utils/requirement-action-handlers.js +12 -12
- package/src/utils/requirement-actions/requirement-operations.js +3 -3
- package/src/utils/requirement-actions.js +1 -1
- package/src/utils/requirement-file-operations.js +5 -5
- package/src/utils/requirement-helpers.js +1 -1
- package/src/utils/requirement-management.js +5 -5
- package/src/utils/requirement-navigation.js +2 -2
- package/src/utils/requirement-organization.js +3 -3
- package/src/utils/rui-trui-adapter.js +14 -14
- package/src/utils/simple-trui.js +3 -3
- package/src/utils/status-helpers-extracted.js +3 -3
- package/src/utils/trui-clarifications.js +11 -11
- package/src/utils/trui-debug.js +3 -2
- package/src/utils/trui-devin.js +217 -0
- package/src/utils/trui-feedback.js +7 -7
- package/src/utils/trui-kiro-integration.js +34 -34
- package/src/utils/trui-main-handlers.js +20 -21
- package/src/utils/trui-main-menu.js +19 -19
- package/src/utils/trui-nav-agents.js +59 -8
- package/src/utils/trui-nav-requirements.js +3 -3
- package/src/utils/trui-nav-settings.js +10 -10
- package/src/utils/trui-nav-specifications.js +1 -1
- package/src/utils/trui-navigation-backup.js +11 -11
- package/src/utils/trui-navigation.js +9 -9
- package/src/utils/trui-provider-health.js +25 -25
- package/src/utils/trui-provider-manager.js +28 -28
- package/src/utils/trui-quick-menu.js +2 -2
- package/src/utils/trui-req-actions-backup.js +21 -21
- package/src/utils/trui-req-actions.js +20 -20
- package/src/utils/trui-req-editor.js +10 -10
- package/src/utils/trui-req-file-ops.js +3 -3
- package/src/utils/trui-req-tree.js +7 -7
- package/src/utils/trui-windsurf.js +103 -103
- package/src/utils/user-tracking.js +15 -15
- package/src/utils/trui-req-tree-old.js +0 -719
|
@@ -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
|
* 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
|
}
|
|
@@ -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 -
|
|
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 -
|
|
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
|
|
package/src/utils/config.js
CHANGED
|
@@ -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
|
-
'
|
|
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
|
-
'
|
|
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 === '
|
|
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
|
-
'
|
|
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 === '
|
|
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
|
-
'
|
|
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 === '
|
|
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'));
|
package/src/utils/first-run.js
CHANGED
|
@@ -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 === '
|
|
183
|
-
//
|
|
184
|
-
installed = await checkAppOrBinary(['
|
|
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 === '
|
|
242
|
-
alreadyInstalled = await checkAppOrBinary(['
|
|
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 === '
|
|
319
|
-
installedNow = await checkAppOrBinary(['
|
|
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')];
|