diff --git a/vscode-extension/openclaude-vscode/package.json b/vscode-extension/openclaude-vscode/package.json index 9b32b0ed..441e28de 100644 --- a/vscode-extension/openclaude-vscode/package.json +++ b/vscode-extension/openclaude-vscode/package.json @@ -70,8 +70,8 @@ }, "openclaude.useOpenAIShim": { "type": "boolean", - "default": true, - "description": "Set CLAUDE_CODE_USE_OPENAI=1 in launched OpenClaude terminals." + "default": false, + "description": "Optionally set CLAUDE_CODE_USE_OPENAI=1 in launched OpenClaude terminals." } } }, @@ -96,7 +96,7 @@ ], "repository": { "type": "git", - "url": "https://github.com/devNull-bootloader/openclaude" + "url": "https://github.com/Gitlawb/openclaude" }, "license": "MIT" } diff --git a/vscode-extension/openclaude-vscode/src/extension.js b/vscode-extension/openclaude-vscode/src/extension.js index 6a6bd443..d04fd662 100644 --- a/vscode-extension/openclaude-vscode/src/extension.js +++ b/vscode-extension/openclaude-vscode/src/extension.js @@ -1,16 +1,62 @@ const vscode = require('vscode'); const crypto = require('crypto'); +const { exec } = require('child_process'); +const { promisify } = require('util'); -function launchOpenClaude() { +const execAsync = promisify(exec); +const OPENCLAUDE_REPO_URL = 'https://github.com/Gitlawb/openclaude'; + +async function isCommandAvailable(command) { + try { + if (!command) { + return false; + } + + if (process.platform === 'win32') { + await execAsync(`where ${command}`); + } else { + await execAsync(`command -v ${command}`); + } + + return true; + } catch { + return false; + } +} + +function getExecutableFromCommand(command) { + return command.trim().split(/\s+/)[0]; +} + +async function launchOpenClaude() { const configured = vscode.workspace.getConfiguration('openclaude'); const launchCommand = configured.get('launchCommand', 'openclaude'); const terminalName = configured.get('terminalName', 'OpenClaude'); + const shimEnabled = configured.get('useOpenAIShim', false); + const executable = getExecutableFromCommand(launchCommand); + const installed = await isCommandAvailable(executable); + + if (!installed) { + const action = await vscode.window.showErrorMessage( + `OpenClaude command not found: ${executable}. Install it with: npm install -g @gitlawb/openclaude`, + 'Open Repository' + ); + + if (action === 'Open Repository') { + await vscode.env.openExternal(vscode.Uri.parse(OPENCLAUDE_REPO_URL)); + } + + return; + } + + const env = {}; + if (shimEnabled) { + env.CLAUDE_CODE_USE_OPENAI = '1'; + } const terminal = vscode.window.createTerminal({ name: terminalName, - env: { - CLAUDE_CODE_USE_OPENAI: configured.get('useOpenAIShim', true) ? '1' : undefined, - }, + env, }); terminal.show(true); @@ -18,18 +64,30 @@ function launchOpenClaude() { } class OpenClaudeControlCenterProvider { - resolveWebviewView(webviewView) { + async resolveWebviewView(webviewView) { webviewView.webview.options = { enableScripts: true }; - webviewView.webview.html = this.getHtml(webviewView.webview); + const configured = vscode.workspace.getConfiguration('openclaude'); + const launchCommand = configured.get('launchCommand', 'openclaude'); + const executable = getExecutableFromCommand(launchCommand); + const installed = await isCommandAvailable(executable); + const shimEnabled = configured.get('useOpenAIShim', false); + const shortcut = process.platform === 'darwin' ? 'Cmd+Shift+P' : 'Ctrl+Shift+P'; + + webviewView.webview.html = this.getHtml(webviewView.webview, { + installed, + shimEnabled, + shortcut, + executable, + }); webviewView.webview.onDidReceiveMessage(async (message) => { if (message?.type === 'launch') { - launchOpenClaude(); + await launchOpenClaude(); return; } if (message?.type === 'docs') { - await vscode.env.openExternal(vscode.Uri.parse('https://github.com/devNull-bootloader/openclaude')); + await vscode.env.openExternal(vscode.Uri.parse(OPENCLAUDE_REPO_URL)); return; } @@ -39,8 +97,10 @@ class OpenClaudeControlCenterProvider { }); } - getHtml(webview) { + getHtml(webview, status) { const nonce = crypto.randomBytes(16).toString('base64'); + const runtimeLabel = status.installed ? 'available' : 'missing'; + const shimLabel = status.shimEnabled ? 'enabled (CLAUDE_CODE_USE_OPENAI=1)' : 'disabled'; return `
@@ -216,8 +276,9 @@ class OpenClaudeControlCenterProvider {Ctrl+Shift+P and run OpenClaude commands from anywhere.
+ Quick trigger: use ${status.shortcut} and run OpenClaude commands from anywhere.