Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 40 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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-<version>.vsix
pnpm install:vsix [-y] [--editor=<command>]
```

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=<command>`: 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-<version>.vsix`).
3. Install it manually using the VSCode CLI:
```sh
code --install-extension bin/roo-cline-<version>.vsix
```

---

We use [changesets](https://github.com/changesets/changesets) for versioning and publishing. Check our `CHANGELOG.md` for release notes.

---
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
91 changes: 91 additions & 0 deletions scripts/install-vsix.js
Original file line number Diff line number Diff line change
@@ -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()
Loading