diff --git a/README.md b/README.md index f936ac6bc8..864a5de8cc 100644 --- a/README.md +++ b/README.md @@ -138,22 +138,54 @@ pnpm install 3. **Run the extension**: -Press `F5` (or **Run** → **Start Debugging**) in VSCode to open a new window with Roo Code running. +There are several ways to run the Roo Code extension: -Changes to the webview will appear immediately. Changes to the core extension will require a restart of the extension host. +### Development Mode (F5) -Alternatively you can build a .vsix and install it directly in VSCode: +For active development, use VSCode's built-in debugging: -```sh -pnpm vsix -``` +Press `F5` (or go to **Run** → **Start Debugging**) in VSCode. This will open a new VSCode window with the Roo Code extension running. + +- Changes to the webview will appear immediately. +- Changes to the core extension will also hot reload automatically. + +### Automated VSIX Installation -A `.vsix` file will appear in the `bin/` directory which can be installed with: +To build and install the extension as a VSIX package directly into VSCode: ```sh -code --install-extension bin/roo-cline-.vsix +pnpm install:vsix [-y] [--editor=] ``` +This command will: + +- Ask which editor command to use (code/cursor/code-insiders) - defaults to 'code' +- Uninstall any existing version of the extension. +- Build the latest VSIX package. +- Install the newly built VSIX. +- Prompt you to restart VS Code for changes to take effect. + +Options: + +- `-y`: Skip all confirmation prompts and use defaults +- `--editor=`: Specify the editor command (e.g., `--editor=cursor` or `--editor=code-insiders`) + +### Manual VSIX Installation + +If you prefer to install the VSIX package manually: + +1. First, build the VSIX package: + ```sh + pnpm vsix + ``` +2. A `.vsix` file will be generated in the `bin/` directory (e.g., `bin/roo-cline-.vsix`). +3. Install it manually using the VSCode CLI: + ```sh + code --install-extension bin/roo-cline-.vsix + ``` + +--- + We use [changesets](https://github.com/changesets/changesets) for versioning and publishing. Check our `CHANGELOG.md` for release notes. --- diff --git a/package.json b/package.json index 0741895029..61f1f6cdaf 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "vsix": "turbo vsix --log-order grouped --output-logs new-only", "vsix:nightly": "turbo vsix:nightly --log-order grouped --output-logs new-only", "clean": "turbo clean --log-order grouped --output-logs new-only && rimraf dist out bin .vite-port .turbo", + "install:vsix": "pnpm install --frozen-lockfile && pnpm clean && pnpm vsix && node scripts/install-vsix.js", "changeset:version": "cp CHANGELOG.md src/CHANGELOG.md && changeset version && cp -vf src/CHANGELOG.md .", "knip": "knip --include files", "update-contributors": "node scripts/update-contributors.js", diff --git a/scripts/install-vsix.js b/scripts/install-vsix.js new file mode 100644 index 0000000000..0ed9b6d376 --- /dev/null +++ b/scripts/install-vsix.js @@ -0,0 +1,91 @@ +const { execSync } = require("child_process") +const fs = require("fs") +const readline = require("readline") + +// detect "yes" flags +const autoYes = process.argv.includes("-y") + +// detect editor command from args or default to "code" +const editorArg = process.argv.find((arg) => arg.startsWith("--editor=")) +const defaultEditor = editorArg ? editorArg.split("=")[1] : "code" + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}) + +const askQuestion = (question) => { + return new Promise((resolve) => { + rl.question(question, (answer) => { + resolve(answer) + }) + }) +} + +async function main() { + try { + const packageJson = JSON.parse(fs.readFileSync("./src/package.json", "utf-8")) + const name = packageJson.name + const version = packageJson.version + const vsixFileName = `./bin/${name}-${version}.vsix` + const publisher = packageJson.publisher + const extensionId = `${publisher}.${name}` + + console.log("\nšŸš€ Roo Code VSIX Installer") + console.log("========================") + console.log("\nThis script will:") + console.log("1. Uninstall any existing version of the Roo Code extension") + console.log("2. Install the newly built VSIX package") + console.log(`\nExtension: ${extensionId}`) + console.log(`VSIX file: ${vsixFileName}`) + + // Ask for editor command if not provided + let editorCommand = defaultEditor + if (!editorArg && !autoYes) { + const editorAnswer = await askQuestion( + "\nWhich editor command to use? (code/cursor/code-insiders) [default: code]: ", + ) + if (editorAnswer.trim()) { + editorCommand = editorAnswer.trim() + } + } + + // skip prompt if auto-yes + const answer = autoYes ? "y" : await askQuestion("\nDo you wish to continue? (y/n): ") + + if (answer.toLowerCase() !== "y") { + console.log("Installation cancelled.") + rl.close() + process.exit(0) + } + + console.log(`\nProceeding with installation using '${editorCommand}' command...`) + + try { + execSync(`${editorCommand} --uninstall-extension ${extensionId}`, { stdio: "inherit" }) + } catch (e) { + console.log("Extension not installed, skipping uninstall step") + } + + if (!fs.existsSync(vsixFileName)) { + console.error(`\nāŒ VSIX file not found: ${vsixFileName}`) + console.error("Make sure the build completed successfully") + rl.close() + process.exit(1) + } + + execSync(`${editorCommand} --install-extension ${vsixFileName}`, { stdio: "inherit" }) + + console.log(`\nāœ… Successfully installed extension from ${vsixFileName}`) + console.log("\nāš ļø IMPORTANT: You need to restart VS Code for the changes to take effect.") + console.log(" Please close and reopen VS Code to use the updated extension.\n") + + rl.close() + } catch (error) { + console.error("\nāŒ Failed to install extension:", error.message) + rl.close() + process.exit(1) + } +} + +main()