---
title: Chrome Extension Dev (Autopilot)
---

# Chrome Extension Dev (Autopilot)

> Status: **in development** — hidden by default. Reveal via **Settings → Lab → Chrome extension dev (Autopilot)** or launch Omniscio with `AMC_SHOW_CHROME_EXTENSION_DEV=1`.

## What it is

When your project is a Chrome extension, this feature lets the agent **build and test the extension itself** by driving a real Chrome browser — no manual clicking. It does this with **`agent-browser`**, a CLI that connects to a headed Chrome over the Chrome DevTools Protocol.

The agent gets a built-in **extension-dev workflow** that teaches it to:

- Load the unpacked extension from the project folder into a managed Chrome instance.
- Click the popup, interact with content scripts, and take screenshots.
- Read the browser console for JavaScript errors.
- **Reload after code edits** (Chrome does not hot-reload extensions — a step that trips up most generic agents).
- Iterate until the extension behaves as expected, then report back with screenshot evidence.

The result: the agent owns the build-and-verify loop for Chrome extension work, the same way Obscura lets it own the verify loop for web apps — but on **real, pixel-rendering Chrome** (Obscura has no rendering engine and cannot load extensions).

Inspired by the `jlstradingco/chrome-ext-autopilot` workflow.

### What it is NOT

- **Not Chrome Web Store publishing** — this feature covers building and testing only. Distribution to the store is out of scope.
- **Chrome only** — Firefox and Safari extension formats are not supported. The underlying `agent-browser` CLI connects to Chrome (or Chrome-for-Testing); other browsers are not wired.
- **Not a general-purpose browser-automation feature** — the feature is scoped to the Chrome-extension development loop. General browser automation is a possible later generalization.

## Where to find it

The feature is hidden until you reveal it, in **Settings → Lab → Chrome extension dev (Autopilot)**. With it on, an **Extensions** tool appears in the sidebar; clicking that opens the Chrome Extensions Hub, one panel listing every Chrome-extension project Omniscio knows about. The guided "Build a Chrome Extension" mission is reachable from a project's empty state and from the mission picker, and the two tools it needs are installed by a one-click "Set it up for me" flow rather than by hand.

## How it behaves

### Setup

Two prerequisites must be in place before the feature activates:

1. **Enable the feature** in Settings → Lab → "Chrome extension dev (Autopilot)" (or run Omniscio with `AMC_SHOW_CHROME_EXTENSION_DEV=1`).
2. **Install `agent-browser` and Chrome-for-Testing** — use the Toolchain "Set it up for me" flow. Omniscio downloads both the `agent-browser` CLI and the matching Chrome-for-Testing binary in one click. You do not need a separately installed Chrome.

**Proactive nudge:** the first time you open a Chrome-extension project with the feature enabled but `agent-browser` not yet installed, Omniscio drops a single dismissible Inbox card offering one-click setup (once per install, never nags).

### Auto-equip (how it activates per-session)

Omniscio detects that a project is a Chrome extension when its root contains a `manifest.json` with `"manifest_version": 2` or `"manifest_version": 3`. When all three conditions hold — the project is a Chrome extension, the feature is enabled, and `agent-browser` is installed — the session is automatically equipped with:

1. **The extension-dev workflow** (a built-in skill injected into the session's context), which teaches the agent the load → exercise → screenshot → reload → iterate loop.
2. **A git-excluded `agent-browser.json`** written to the project root: `{ "headed": true, "extensions": ["<absolute project path>"] }`. This tells `agent-browser` to launch in headed mode and load the project directory as an unpacked extension. The extension path is **absolute** on purpose — Chrome resolves a relative `"."` against its own install directory (not the project) and fails with "manifest missing", so Omniscio writes the absolute project path. Omniscio writes this file on first equip (only when absent — it never clobbers a config you authored) and adds it to the project's `.gitignore`; it is never committed.

### Coaching mission — "Build a Chrome Extension"

A guided "Build a Chrome Extension" coaching mission takes a non-programmer from **idea → working, tested extension** in one session. It scaffolds the extension folder structure and manifest, then hands off to a session that has the Autopilot workflow already active — so the agent builds the popup, background logic, and any content scripts, then verifies each piece by driving Chrome. The mission is reachable from the project empty-state and the mission picker.

### Privacy

`agent-browser` launches a **clean managed Chrome-for-Testing instance** — not your real Chrome profile. Omniscio passes no cookies, saved passwords, bookmarks, or sign-in state to the test browser. There is no way for the agent to accidentally browse as you or access your real Chrome history. The managed instance only exists while the session is running.

### Extensions hub

When the `chrome-extension-dev` feature is visible, an **"Extensions" tool** appears in the sidebar. Clicking it opens the **Chrome Extensions Hub** — a dedicated panel that lists every Chrome-extension project Omniscio knows about, all in one place.

#### What the hub shows

Each project row displays:

- A **status pill** — **Tested** (the project has screenshots under `tests/screenshots/`, indicating at least one Autopilot run has passed) or **Draft** (no screenshots yet).
- Three quick-action icon buttons: **Open** (switches Omniscio to that project), **Test it** (shows a confirmation dialog then launches a new Autopilot session for that extension), and **Install in Chrome** (opens an `InstallDialog` that reveals the project folder via the OS file manager and walks through Chrome's Load-unpacked flow — this button is disabled until the project has been tested at least once).
- A **right-click menu** with **Rename** (edits the project name via `PROJECT_UPDATE`) and **Remove** (soft-deletes the project via `PROJECT_DELETE` with an undo toast — the project record is marked deleted, not physically removed).

A **"+ New Extension"** button at the top launches the guided "Build a Chrome Extension" coaching mission, taking you from idea to a working, tested extension in one session.

#### What Install in Chrome does (and doesn't do)

"Install in Chrome" **never** auto-installs the extension or opens a `chrome://` URL. It reveals the built extension folder in your OS file manager and gives you step-by-step instructions for Chrome's built-in **Load unpacked** flow (chrome://extensions → Developer mode → Load unpacked → select folder). This is intentional: Chrome requires a deliberate user gesture to load an unpacked extension — there is no API Omniscio can call to do it silently.

#### How project discovery works

The hub calls `CHROME_EXTENSIONS_LIST` (a read-only IPC channel) which invokes `listExtensionProjects()` on the backend. That function filters the full project list through `isChromeExtensionProject` (the same detection used for Autopilot workflow injection) and attaches a `tested` flag based on whether `tests/screenshots/` exists in the project folder.

#### Gating

The sidebar "Extensions" tool and the hub panel are both gated by the `chrome-extension-dev` unreleased feature, via the same `sidebarLaunch` check used throughout — when the feature is hidden, the tool does not appear at all.

#### Key code — extensions hub

- `src/renderer/src/features/chrome-extensions/` — all hub UI components (`ChromeExtensionsHubView`, `InstallDialog`, icon actions).
- `src/main/services/chrome-extension/chrome-extensions-service.ts` — `listExtensionProjects()` backend implementation.
- `src/main/ipc/chrome-extensions-handlers.ts` — `CHROME_EXTENSIONS_LIST` IPC handler.

## For agents

### Key code

- `src/main/services/chrome-extension/` — feature services:
  - `is-chrome-extension-project.ts` — detects `manifest.json` with `manifest_version` 2 or 3.
  - `session-context-provider.ts` — content-matched provider that injects the workflow when all gates pass.
  - `extension-dev-workflow.ts` — the workflow text injected into the session context.
  - `ensure-agent-browser-config.ts` — writes/validates `agent-browser.json` and updates `.gitignore`.
  - `agent-browser-installed.ts` — checks whether the `agent-browser` binary is available.
  - `extension-dev-nudge.ts` — the once-per-install Inbox nudge when `agent-browser` is missing.
- `src/shared/unreleased-features.ts` — the `chrome-extension-dev` entry in `UNRELEASED_FEATURES` (setting key `chromeExtensionDevEnabled`, env var `AMC_SHOW_CHROME_EXTENSION_DEV`).
- `src/main/services/session-context/` — the session-context provider seam that content-matched providers (like this one) plug into.

Design spec: `docs/superpowers/specs/2026-06-19-chrome-extension-dev-autopilot-design.md`.

## Related

Verifying a web app by driving a real browser is the sibling capability described on the [Web app verification](web-app-verification.md) page, and the browser surface itself is covered by [AI browser](ai-browser.md). The guided "Build a Chrome Extension" mission belongs to the wider mission system on the [Missions hub](missions-hub.md) page.
