Files
Roo-Code/src/extension.ts

95 lines
4.3 KiB
TypeScript

// The module 'vscode' contains the VS Code extensibility API
// Import the module and reference it with the alias vscode in your code below
import * as vscode from "vscode"
import { ClaudeDevProvider } from "./providers/ClaudeDevProvider"
/*
Built using https://github.com/microsoft/vscode-webview-ui-toolkit
Inspired by
https://github.com/microsoft/vscode-webview-ui-toolkit-samples/tree/main/default/weather-webview
https://github.com/microsoft/vscode-webview-ui-toolkit-samples/tree/main/frameworks/hello-world-react-cra
*/
let outputChannel: vscode.OutputChannel
// This method is called when your extension is activated
// Your extension is activated the very first time the command is executed
export function activate(context: vscode.ExtensionContext) {
// Use the console to output diagnostic information (console.log) and errors (console.error)
// This line of code will only be executed once when your extension is activated
//console.log('Congratulations, your extension "claude-dev" is now active!')
outputChannel = vscode.window.createOutputChannel("Claude Dev")
context.subscriptions.push(outputChannel)
outputChannel.appendLine("Claude Dev extension activated")
// The command has been defined in the package.json file
// Now provide the implementation of the command with registerCommand
// The commandId parameter must match the command field in package.json
// const disposable = vscode.commands.registerCommand("claude-dev.helloWorld", () => {
// // The code you place here will be executed every time your command is executed
// // Display a message box to the user
// vscode.window.showInformationMessage("Hello World from claude-dev!")
// })
// context.subscriptions.push(disposable)
const sidebarProvider = new ClaudeDevProvider(context, outputChannel)
context.subscriptions.push(
vscode.window.registerWebviewViewProvider(ClaudeDevProvider.viewType, sidebarProvider, {
webviewOptions: { retainContextWhenHidden: true },
})
)
context.subscriptions.push(
vscode.commands.registerCommand("claude-dev.plusButtonTapped", async () => {
outputChannel.appendLine("Plus button tapped")
await sidebarProvider.clearTask()
await sidebarProvider.postStateToWebview()
await sidebarProvider.postMessageToWebview({ type: "action", action: "plusButtonTapped" })
})
)
const openClaudeDevInNewTab = () => {
outputChannel.appendLine("Opening Claude Dev in new tab")
// (this example uses webviewProvider activation event which is necessary to deserialize cached webview, but since we use retainContextWhenHidden, we don't need to use that event)
// https://github.com/microsoft/vscode-extension-samples/blob/main/webview-sample/src/extension.ts
const tabProvider = new ClaudeDevProvider(context, outputChannel)
//const column = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.viewColumn : undefined
const lastCol = Math.max(...vscode.window.visibleTextEditors.map((editor) => editor.viewColumn || 0))
const targetCol = Math.max(lastCol + 1, 1)
const panel = vscode.window.createWebviewPanel(ClaudeDevProvider.viewType, "Claude Dev", targetCol, {
enableScripts: true,
retainContextWhenHidden: true,
localResourceRoots: [context.extensionUri],
})
// TODO: use better svg icon with light and dark variants (see https://stackoverflow.com/questions/58365687/vscode-extension-iconpath)
panel.iconPath = vscode.Uri.joinPath(context.extensionUri, "icon.png")
tabProvider.resolveWebviewView(panel)
// Lock the editor group so clicking on files doesn't open them over the panel
new Promise((resolve) => setTimeout(resolve, 100)).then(() => {
vscode.commands.executeCommand("workbench.action.lockEditorGroup")
})
}
context.subscriptions.push(vscode.commands.registerCommand("claude-dev.popoutButtonTapped", openClaudeDevInNewTab))
context.subscriptions.push(vscode.commands.registerCommand("claude-dev.openInNewTab", openClaudeDevInNewTab))
context.subscriptions.push(
vscode.commands.registerCommand("claude-dev.settingsButtonTapped", () => {
//const message = "claude-dev.settingsButtonTapped!"
//vscode.window.showInformationMessage(message)
sidebarProvider.postMessageToWebview({ type: "action", action: "settingsButtonTapped" })
})
)
}
// This method is called when your extension is deactivated
export function deactivate() {
outputChannel.appendLine("Claude Dev extension deactivated")
}