Skip to content

Commit 8a58190

Browse files
committed
Yolo mode
1 parent 2feaed6 commit 8a58190

3 files changed

Lines changed: 160 additions & 3 deletions

File tree

src/extension.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,9 @@ class ClaudeChatProvider {
305305
case 'deleteCustomSnippet':
306306
this._deleteCustomSnippet(message.snippetId);
307307
return;
308+
case 'enableYoloMode':
309+
this._enableYoloMode();
310+
return;
308311
}
309312
}
310313

@@ -2038,15 +2041,39 @@ class ClaudeChatProvider {
20382041
});
20392042
}
20402043

2044+
private async _enableYoloMode(): Promise<void> {
2045+
try {
2046+
// Update VS Code configuration to enable YOLO mode
2047+
const config = vscode.workspace.getConfiguration('claudeCodeChat');
2048+
2049+
// Clear any global setting and set workspace setting
2050+
await config.update('permissions.yoloMode', true, vscode.ConfigurationTarget.Workspace);
2051+
2052+
console.log('YOLO Mode enabled - all future permissions will be skipped');
2053+
2054+
// Send updated settings to UI
2055+
this._sendCurrentSettings();
2056+
2057+
} catch (error) {
2058+
console.error('Error enabling YOLO mode:', error);
2059+
}
2060+
}
2061+
20412062
private async _updateSettings(settings: { [key: string]: any }): Promise<void> {
20422063
const config = vscode.workspace.getConfiguration('claudeCodeChat');
20432064

20442065
try {
20452066
for (const [key, value] of Object.entries(settings)) {
2046-
await config.update(key, value, vscode.ConfigurationTarget.Global);
2067+
if (key === 'permissions.yoloMode') {
2068+
// YOLO mode is workspace-specific
2069+
await config.update(key, value, vscode.ConfigurationTarget.Workspace);
2070+
} else {
2071+
// Other settings are global (user-wide)
2072+
await config.update(key, value, vscode.ConfigurationTarget.Global);
2073+
}
20472074
}
20482075

2049-
vscode.window.showInformationMessage('Settings updated successfully');
2076+
console.log('Settings updated:', settings);
20502077
} catch (error) {
20512078
console.error('Failed to update settings:', error);
20522079
vscode.window.showErrorMessage('Failed to update settings');

src/ui-styles.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,86 @@ const styles = `
107107
font-size: 16px;
108108
}
109109
110+
.permission-menu {
111+
position: relative;
112+
margin-left: auto;
113+
}
114+
115+
.permission-menu-btn {
116+
background: none;
117+
border: none;
118+
color: var(--vscode-descriptionForeground);
119+
cursor: pointer;
120+
padding: 4px 8px;
121+
border-radius: 4px;
122+
font-size: 16px;
123+
font-weight: bold;
124+
transition: all 0.2s ease;
125+
line-height: 1;
126+
}
127+
128+
.permission-menu-btn:hover {
129+
background-color: var(--vscode-list-hoverBackground);
130+
color: var(--vscode-foreground);
131+
}
132+
133+
.permission-menu-dropdown {
134+
position: absolute;
135+
top: 100%;
136+
right: 0;
137+
background-color: var(--vscode-menu-background);
138+
border: 1px solid var(--vscode-menu-border);
139+
border-radius: 6px;
140+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
141+
z-index: 1000;
142+
min-width: 220px;
143+
padding: 4px 0;
144+
margin-top: 4px;
145+
}
146+
147+
.permission-menu-item {
148+
display: flex;
149+
align-items: flex-start;
150+
gap: 10px;
151+
padding: 12px 16px;
152+
background: none;
153+
border: none;
154+
width: 100%;
155+
text-align: left;
156+
cursor: pointer;
157+
color: var(--vscode-foreground);
158+
transition: background-color 0.2s ease;
159+
}
160+
161+
.permission-menu-item:hover {
162+
background-color: var(--vscode-list-hoverBackground);
163+
}
164+
165+
.permission-menu-item .menu-icon {
166+
font-size: 16px;
167+
margin-top: 1px;
168+
flex-shrink: 0;
169+
}
170+
171+
.permission-menu-item .menu-content {
172+
display: flex;
173+
flex-direction: column;
174+
gap: 2px;
175+
}
176+
177+
.permission-menu-item .menu-title {
178+
font-weight: 500;
179+
font-size: 13px;
180+
line-height: 1.2;
181+
}
182+
183+
.permission-menu-item .menu-subtitle {
184+
font-size: 11px;
185+
color: var(--vscode-descriptionForeground);
186+
opacity: 0.8;
187+
line-height: 1.2;
188+
}
189+
110190
.permission-content {
111191
font-size: 13px;
112192
line-height: 1.4;

src/ui.ts

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ const html = `<!DOCTYPE html>
339339
</button>
340340
<div class="yolo-mode-section">
341341
<input type="checkbox" id="yolo-mode" onchange="updateSettings(); updateYoloWarning();">
342-
<label for="yolo-mode">Enable Yolo Mode (Skip All Permissions)</label>
342+
<label for="yolo-mode">Enable Yolo Mode (Auto-allow all permissions)</label>
343343
</div>
344344
</div>
345345
</div>
@@ -2786,6 +2786,18 @@ const html = `<!DOCTYPE html>
27862786
<div class="permission-header">
27872787
<span class="icon">🔐</span>
27882788
<span>Permission Required</span>
2789+
<div class="permission-menu">
2790+
<button class="permission-menu-btn" onclick="togglePermissionMenu('\${data.id}')" title="More options">⋮</button>
2791+
<div class="permission-menu-dropdown" id="permissionMenu-\${data.id}" style="display: none;">
2792+
<button class="permission-menu-item" onclick="enableYoloMode('\${data.id}')">
2793+
<span class="menu-icon">⚡</span>
2794+
<div class="menu-content">
2795+
<span class="menu-title">Enable YOLO Mode</span>
2796+
<span class="menu-subtitle">Auto-allow all permissions</span>
2797+
</div>
2798+
</button>
2799+
</div>
2800+
</div>
27892801
</div>
27902802
<div class="permission-content">
27912803
<p>Allow <strong>\${toolName}</strong> to execute the tool call above?</p>
@@ -2837,6 +2849,44 @@ const html = `<!DOCTYPE html>
28372849
}
28382850
}
28392851
2852+
function togglePermissionMenu(permissionId) {
2853+
const menu = document.getElementById(\`permissionMenu-\${permissionId}\`);
2854+
const isVisible = menu.style.display !== 'none';
2855+
2856+
// Close all other permission menus
2857+
document.querySelectorAll('.permission-menu-dropdown').forEach(dropdown => {
2858+
dropdown.style.display = 'none';
2859+
});
2860+
2861+
// Toggle this menu
2862+
menu.style.display = isVisible ? 'none' : 'block';
2863+
}
2864+
2865+
function enableYoloMode(permissionId) {
2866+
// Hide the menu
2867+
document.getElementById(\`permissionMenu-\${permissionId}\`).style.display = 'none';
2868+
2869+
// Send message to enable YOLO mode
2870+
vscode.postMessage({
2871+
type: 'enableYoloMode'
2872+
});
2873+
2874+
// Auto-approve this permission
2875+
respondToPermission(permissionId, true);
2876+
2877+
// Show notification
2878+
addMessage('⚡ YOLO Mode enabled! All future permissions will be automatically allowed.', 'system');
2879+
}
2880+
2881+
// Close permission menus when clicking outside
2882+
document.addEventListener('click', function(event) {
2883+
if (!event.target.closest('.permission-menu')) {
2884+
document.querySelectorAll('.permission-menu-dropdown').forEach(dropdown => {
2885+
dropdown.style.display = 'none';
2886+
});
2887+
}
2888+
});
2889+
28402890
// Session management functions
28412891
function newSession() {
28422892
vscode.postMessage({

0 commit comments

Comments
 (0)