autobrowse
browserbase/skills
Vermittelt zuverlässige Kenntnisse in der Browser-Automatisierung durch iteratives Experimentieren, wobei ein interner Agent zum Durchsuchen von Websites eingesetzt und die Navigationsanweisungen so lange verbessert werden, bis die Aufgaben durchgängig erfolgreich ausgeführt werden.
...Alle erweiternAutoBrowse — Sich selbst verbessernde Browser-Fähigkeiten
Erwerben Sie durch iteratives Experimentieren zuverlässige Fähigkeiten zur Browser-Automatisierung. Ein innerer Agent durchsucht die Website (evaluate.ts). Sie – der äußere Agent – lesen, was passiert ist, und verbessern die Anweisungen (strategy.md). Wiederhole dies, bis der Test durchgängig erfolgreich ist.
Einstiegspunkte
Der Aufruf ist flexibel – sowohl explizite Flags als auch freie Formulierungen in natürlicher Sprache funktionieren:
/autobrowse --task google-flights
/autobrowse --task google-flights --iterations 10 --env remote
/autobrowse --task google-flights --browser-trace
/autobrowse --tasks google-flights,amazon-add-to-cart
/autobrowse --all
# Also fine — parse freely:
/autobrowse https://flights.google.com/
/autobrowse book a flight on delta.com
/autobrowse fix the existing google-flights skill
--browser-trace (standardmäßig deaktiviert, nur remote): Verknüpft jede Iteration mit der gleichrangigen browser-trace – umschließt den inneren Agenten mit einer CDP-Erfassung für seitenbezogene Nachweise zu Netzwerk, Konsole und Seitenlebenszyklus. Führt --env remote; führt zu Fehlern bei Kombination mit --env local. Erfordert, dass der zugehörige browser-trace Skill muss ${CLAUDE_SKILL_DIR}/../browser-trace/vorhanden sein muss sowie die BROWSERBASE_API_KEY Umgebungsvariable.
Wenn der Benutzer eine URL oder eine frei formulierte Anweisung anstelle von --task :
- Wenn eine vorhandene Aufgabe
${WORKSPACE}/tasks/deutlich mit der Website/Absicht übereinstimmt, verwende diese. - Andernfalls wähle einen kurzen Namen in Kebab-Case, erstelle
${WORKSPACE}/tasks/aus/task.md ${CLAUDE_SKILL_DIR}/references/example-task.md, fülle die URL/das Ziel entsprechend den Angaben des Nutzers aus und fahre fort. Teile dem Nutzer den gewählten Namen in einer Zeile mit.
So führen Sie den Vorgang durch
Schritt 1 – Argumente analysieren und orientieren
Prüfen, was übergeben wurde:
--task→ Einzelaufgabenmodus--tasks a,b,coder--all→ Multitasking-Modus (Unteragenten starten)--iterations N→ Anzahl der Auswertungs- → Optimierungszyklen (Standard: 5)--env local|remote→ Browserumgebung (Standard: lokal; „Remote“ für botgeschützte Websites verwenden)--browser-trace→ Aktivierung der Browser-Trace-Integration (Standard: deaktiviert). Dies bedeutet--env remote. Wenn--env local --browser-tracebeide Werte explizit übergeben werden, wird folgende Fehlermeldung ausgegeben:browser-trace requires Browserbase; drop --env local or drop --browser-trace.
Wenn der Benutzer stattdessen Freitext übergeben hat, ordnen Sie diesen einer der oben genannten Optionen zu, bevor Sie fortfahren.
Schritt 2 – Arbeitsbereich einrichten
Alle Trainingsartefakte (Aufgabendefinitionen, Strategieiterationen, Traces, Berichte) befinden sich in einem Arbeitsbereichsverzeichnis im aktuellen Arbeitsverzeichnis – NICHT innerhalb von ~/.claude/skills/. Dadurch werden die Dateischreibvorgänge des inneren Agenten aus dem Home-Verzeichnis von Claude herausgehalten und Berechtigungskonflikte vermieden.
Standard-Arbeitsbereich: ${CWD}/autobrowse/
mkdir -p ./autobrowse/tasks ./autobrowse/traces ./autobrowse/reports
Falls das Aufgabenverzeichnis (./autobrowse/tasks/) noch nicht existiert, erstellen Sie es:
mkdir -p ./autobrowse/tasks/
cp ${CLAUDE_SKILL_DIR}/references/example-task.md ./autobrowse/tasks//task.md
# Then edit task.md to describe the URL, inputs, steps, and expected JSON output
Die Skill-Quelle unter ${CLAUDE_SKILL_DIR} bleibt schreibgeschützt – nur ./autobrowse/ wird während des Trainings in das aktuelle Arbeitsverzeichnis geschrieben. Beim Abschluss (letzter Schritt) wird eine einzelne Datei in ~/.claude/skills/.
Liste der verfügbaren Aufgaben:
ls ./autobrowse/tasks/
Schritt 3 – Multitasking: Parallele Unteragenten starten
Wenn Sie mehrere Aufgaben ausführen, verwenden Sie das Agent-Tool, um gleichzeitig einen Unteragenten pro Aufgabe zu starten. Jeder Unteragent erhält eine eigenständige Eingabeaufforderung, um die vollständige „autobrowse“-Schleife für seine Aufgabe auszuführen:
„Du führst die Skill-Funktion ‚autobrowse‘ für die Aufgabe
aus. Arbeitsbereich:(z. B./path/to/project/autobrowse). FühreIterationen von: evaluate → read trace → improve strategy.md → repeat. Verwende--env. Übergebe--workspacean jeden Aufruf von `evaluate.mjs‘ weiter. Wenn der übergeordnete Aufruf--browser-trace, MUSST du für jede Iteration den „traced-path“-Block der SKILL.md-Schleife verwenden (Sitzung vorab erstellen, bb-capture anhängen,--connect-urlan evaluate.mjs übergeben, „stop+bisect“, freigeben) – greifen Sie nicht auf den standardmäßigen Pfad mit einem einzigen Befehl zurück. Befolgen Sie die Anweisungen für die „autobrowse“-Schleife genau.Installieren Sie den Skill nach Abschluss in
~/.claude/skills/mit korrektem „agentskills“-Frontmatter (Name + Beschreibung). Kopiere nicht einfach „strategy.md“ – schreibe ein eigenständiges Skill./SKILL.md Geben Sie am Ende eine strukturierte Zusammenfassung aus mit: Aufgabenname, „bestanden/nicht bestanden“ beim letzten Durchlauf, kumulierte Gesamtkosten, abgeschlossene Iterationen, Tabelle pro Iteration (Iterationsnummer, Runden, Kosten, Status, getestete Hypothese) sowie 2–3 stichpunktartige wichtige Erkenntnisse.“
Starte alle Unteragenten parallel, warte, bis alle fertig sind, sammle dann ihre Zusammenfassungen und verfasse den Sitzungsbericht.
Bei einer einzelnen Aufgabe überspringe diesen Schritt und führe die direkt darunter stehende Schleife aus.
Die Schleife (für jede Aufgabe ausführen)
Start der Iteration
Prüfen, ob ./autobrowse/tasks/ vorhanden ist (falls nicht, aus der Vorlage erstellen – siehe Schritt 2). strategy.md beim ersten Lauf vom Harness automatisch leer angelegt wird.
Voraussetzungen
ANTHROPIC_API_KEYin der Umgebung (oder in einer.envDatei im aktuellen Arbeitsverzeichnis —evaluate.mjswird automatisch geladen). Falls sie fehlt, gibt der Harness eine eindeutige Fehlermeldung aus und beendet die Ausführung; suche nicht in anderen Pfaden nach Schlüsseln.
Den internen Agenten ausführen
Standardpfad (kein „--browser-trace“) – einzelner Befehl, keine Orchestrierung:
node ${CLAUDE_SKILL_DIR}/scripts/evaluate.mjs --task --workspace ./autobrowse
# or for bot-protected sites:
node ${CLAUDE_SKILL_DIR}/scripts/evaluate.mjs --task --workspace ./autobrowse --env remote
Hiermit wird die Browsersitzung gestartet und ein vollständiger Trace in ./autobrowse/traces/.
Traced-Pfad (--browser-trace, nur remote) – der äußere Harness erstellt vorab eine Browserbase-Sitzung, fügt sich bb-capture als passiver Beobachter an und übergibt die connectUrl an evaluate.mjs , sodass jeder innere browse Aufruf --cdp $connectUrl --session autobrowse-main (das kanonische Browser-Trace-Muster, das Beobachtern alle Netzwerk- und Konsolenereignisse bereitstellt). Führen Sie diesen Block einmal pro Iteration aus, wobei $N auf die 1-indizierte Iterationsnummer gesetzt:
# Preflight — fail fast if browser-trace isn't installed alongside autobrowse.
BT_DIR="${CLAUDE_SKILL_DIR}/../browser-trace"
if [ ! -f "$BT_DIR/scripts/bb-capture.mjs" ]; then
echo "ERROR: --browser-trace requires the browser-trace skill at $BT_DIR." >&2
echo "Install it by cloning github.com/browserbase/skills and copying skills/browser-trace/" >&2
echo "into the same parent directory as autobrowse (e.g. ~/.claude/skills/browser-trace/)." >&2
exit 1
fi
# a. SESSION SETUP — pre-create the keep-alive session and derive its connectUrl
sid=$(browse cloud sessions create --keep-alive --verified --proxies \
| node -e "let s='';process.stdin.on('data',c=>s+=c).on('end',()=>process.stdout.write(JSON.parse(s).id))")
connect_url=$(browse cloud sessions get "$sid" \
| node -e "let s='';process.stdin.on('data',c=>s+=c).on('end',()=>process.stdout.write(JSON.parse(s).connectUrl))")
RUN_ID="run-$(printf '%03d' "$N")"
TRACE_ROOT="./autobrowse/traces//$RUN_ID"
mkdir -p "$TRACE_ROOT"
export O11Y_ROOT="$TRACE_ROOT/.o11y" # park browser-trace output inside the autobrowse run dir
export O11Y_RUN_ID="$RUN_ID" # tells the browse CLI which run dir to write descriptors.ndjson into
# b. ATTACH BROWSER-TRACE — passive observer; runs in background
node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/bb-capture.mjs "$sid" "$RUN_ID" &
sleep 2
# c. RUN AUTOBROWSE — connectUrl flag tells evaluate.mjs to inject --cdp/--session
# into every inner browse call. The inner agent never sees --remote.
node ${CLAUDE_SKILL_DIR}/scripts/evaluate.mjs \
--task --workspace ./autobrowse --env remote \
--connect-url "$connect_url" --run-number "$N"
# d. STOP + BISECT + UNIFY — order matters; bisect needs the session to still
# exist, and unify-trace joins the bisect output with autobrowse's trace.json
# into a single time-ordered NDJSON the outer agent reads first each iter.
node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/stop-capture.mjs "$RUN_ID"
node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/bisect-cdp.mjs "$RUN_ID"
node ${CLAUDE_SKILL_DIR}/scripts/unify-trace.mjs \
--trace-dir "$TRACE_ROOT" \
--o11y-dir "$O11Y_ROOT/$RUN_ID"
# e. RELEASE
browse cloud sessions update "$sid" --status REQUEST_RELEASE
Dadurch wird der Trace des inneren Agenten in ./autobrowse/traces/ und die CDP-Bisektion in ./autobrowse/traces/. Die protokollierte browse CLI gibt zudem pro Befehl umfangreiche Knotendeskryptoren an .o11y/ (ein JSON-Objekt pro seitenauslösendem Aufruf: Ziel-Tag/ID/Rolle/accessibleName/Attribute/XPath/Bounding-Rect). Die Deskriptordatei speist die nachgelagerte Codegenerierung; sie ist für die Hypothesenbildung nicht erforderlich – überspringen Sie sie beim Lesen des Trace.
Lesen Sie den Trace
cat ./autobrowse/traces//latest/summary.md
Die Zusammenfassung enthält Dauer, Kosten, Durchläufe, das Entscheidungsprotokoll und die abschließende JSON-Ausgabe.
Falls der Agent fehlgeschlagen ist oder hängen geblieben ist, schauen Sie genauer hin:
- Lesen
./autobrowse/traces/— Suche nach dem fehlerhaften Durchlauf/latest/trace.json - Lesen Sie mit dem „Read“-Tool die Screenshots rund um die Fehlerstelle
Wenn „--browser-trace“ verwendet wurde – beginnen Sie mit „unified-events.jsonl“. Der Harness führt das Zug-Protokoll des Agenten und den CDP-Firehose des Browsers an der Ausführungswurzel zu einem zeitlich geordneten NDJSON-Stream zusammen. Eine Datei, mit Quellenangaben (source: "agent" | "browser"), durch Zeitstempel (Wall-Clock) verschachtelt. Überfliegen Sie ihn von oben nach unten; die Fehlerursache liegt meist in einer oder zwei benachbarten Zeilen (der Agent gab den Befehl X aus, der Browser antwortete mit Y).
cat ./autobrowse/traces//latest/unified-events.jsonl
Die strukturierten Dateien (trace.json, .o11y/) können vom Agenten auch als Detailansichten genutzt werden, wenn der zusammengeführte Datenstrom auf etwas hinweist, das Sie genauer untersuchen möchten:
| Benötigt | Drilldown-Datei oder Befehl |
|---|---|
| Summen pro Seite + Zeitangaben (Ereignisse, Netzwerkzugriffe, Fehler pro Seite) | .o11y/ |
| Alle fehlgeschlagenen Netzwerkanfragen an einem Ort | .o11y/ |
| Vollständige Ausnahmedaten der Konsole (Stacktraces usw.) | .o11y/ |
| Aufschlüsselung pro Seite (nur Ereignisse auf Seite N) | .o11y/ |
| Vollständiger Begründungstext / ungekürzte Tool-Ausgaben für einen bestimmten Durchlauf | trace.json (Filtern nach turn === N) |
| Ad-hoc-gruppierte Abfrage (z. B. Top-Hosts, Fehler pro Seite) | O11Y_ROOT=./autobrowse/traces/ |
Der einheitliche Stream ist die Standardeinstellung; greifen Sie nur dann auf strukturierte Dateien zurück, wenn Sie eine gruppierte Abfrage, eine Volltext-Nutzlast oder eine Filterung benötigen, die der Stream nicht bieten kann.
Stellen Sie eine Hypothese auf
Finden Sie den genauen Schritt, an dem etwas schiefgelaufen ist. Welche einzelne Heuristik hätte dies verhindern können?
In --browser-tracemuss die Hypothese ein konkretes Ereignis aus „unified-events.jsonl“ (Zeilennummer oder Zeitstempel) anführen – oder die Datei nennen, in die Sie eingetaucht sind, falls dies erforderlich war. So bleiben Aktualisierungen faktenbasiert und werden nicht von Vermutungen geleitet. Eine Hypothese, die sich ausschließlich auf die Befehle des Agenten stützt, könnte lauten: „Der Klick hat nicht funktioniert“; stützt sie sich hingegen auf den Unified-Stream, könnte sie lauten: „Zeile 47 von unified-events.jsonl: browse open wurde gefolgt von Network.responseReceived Status 403 bei /api/checkout — wechseln zu --verified --proxies."
Beispiele:
- „Nach dem Klicken auf das Dropdown-Menü 1 Sekunde warten – die Optionen werden erst nach dem Einblenden anklickbar“
- „Navigiere direkt zu
/pay-invoice/— die Landingpage komplett überspringen“ - „Verwende
browse fill #field_3 valuenichtbrowse type– dieses Feld wird beim Fokus geleert.“ - „Die Seite zeigt bei Schritt 8 einen Ladekreis an – füge
browse wait timeout 2000vor dem Snapshot“ - (mit
--browser-trace) „In Zeile 47 von unified-events.jsonl wurden 3 aufeinanderfolgendeNetwork.responseReceivedEreignisse bei/api/availability403 zurückgegeben, direkt nachdembrowse open— die Website führt Fingerprinting durch; der nächste Durchlauf benötigt--verified --proxies."
Aktualisiere strategy.md
Bearbeiten ./autobrowse/tasks/. Behalte alles bei, was funktioniert hat. Behebe den konkreten Fehler. Füge eine konkrete Heuristik hinzu.
Gute Strategien haben:
- Schnellweg: direkte URL oder Verknüpfungen, um die Erkundung zu überspringen
- Schritt-für-Schritt-Ablauf: genaue Reihenfolge mit Zeitangaben
- Standortspezifisches Wissen: Selektor-IDs, Namen der Formularfelder, Erfolgsindikatoren
- Fehlerbehebung: Was ist zu tun, wenn X schiefgeht?
Beurteilen Sie das Ergebnis
Lesen Sie die neue Zusammenfassung. Hat es bestanden? Wurden deutliche Fortschritte erzielt?
- Bestanden oder Fortschritt → beibehalten, nächste Iteration
- Kein Fortschritt oder Rückschritt → „strategy.md“ auf die vorherige Version zurücksetzen und eine andere Hypothese ausprobieren
Erstellen Sie ein ausführbares Skript (optional)
Sobald die Aufgabe konvergiert ist, können Sie ein deterministisches, ausführbares Skript
in einem oder mehreren Frameworks über scripts/codegen.mjs. Dabei handelt es sich um einen einzelnen
LLM-Aufruf pro Framework, der anhand des Inhalts-Hashes zwischengespeichert wird, mit optionaler Überprüfung anhand einer
neuen Sitzung und Neuschreibung bei Fehlschlag.
node ${CLAUDE_SKILL_DIR}/scripts/codegen.mjs \
--task \
--workspace ./autobrowse \
--frameworks playwright,stagehand \
--verify
Jedes Framework erhält ein eigenes Unterverzeichnis unter tasks/
mit dem generierten Skript und einem in sich geschlossenen Scaffold (package.json,
tsconfig.json). Das Verzeichnis ist eigenständig ausführbar mit
cd tasks/ — die einzige
Laufzeitanforderung ist BROWSERBASE_API_KEY (plus ANTHROPIC_API_KEY für
das Stagehand-Ziel).
Integrierte Frameworks: playwright, stagehand. Fügen Sie ein benutzerdefiniertes Framework mit
--prompt-template (und stellen Sie Ihren eigenen Runner bereit
oder übergeben Sie --no-verify).
Allgemeine Flags:
| Flag | Zweck |
|---|---|
--frameworks a,b,... |
Durch Kommas getrennt; Standard playwright |
--verify / --no-verify |
Das erstellte Skript in einer neuen BB-Sitzung ausführen; Standard --verify |
--max-retries N |
Obergrenze für „Rewrite-on-verify-failure“; Standardwert 2 |
--cache-only |
Fehler bei Cache-Fehler (CI-freundlich) |
--force |
Cache leeren |
--dry-run |
Schätze Promptgröße und Kosten; rufe das LLM nicht auf |
--run |
Eine bestimmte Version erzwingen run-NNN (Standard: neueste erfolgreiche Version) |
Die Ausgabe erfolgt als eine JSON-Zeile pro Framework auf stdout. Beendigungscode ungleich Null, falls der
Endzustand eines ausgewählten Frameworks passed: false.
Siehe references/playwright-cdp-bridge.md die kanonischen
connectOverCDP Muster, denen die ausgegebenen Skripte folgen.
Nach allen Iterationen – veröffentlichen, falls bereit
Wenn die Aufgabe in mindestens 2 der letzten 3 Iterationen erfolgreich war oder die maximale Iterationsgrenze erreicht hat, installiere sie als Claude-Code-Skill. Kopiere nicht einfach „strategy.md“ – der Skill muss in sich geschlossen und auch für jemanden nützlich sein, der diese Codebasis noch nie gesehen hat. Wenn die maximale Anzahl an Iterationen erreicht ist, ohne dass ein fehlerfreier Durchlauf gelungen ist, notiere die bekannte Fehlerquelle, dokumentiere aber dennoch alles, was du gelernt hast.
Installieren Sie den Skill, indem Sie in ~/.claude/skills/:
mkdir -p ~/.claude/skills/
Verwende diese Struktur für die Datei „SKILL.md“:
---
name:
description: <1-2 sentences describing what this skill does and when to use it. Include trigger keywords.>
---
# — Browser Skill
## Purpose
<1-2 sentences: what this automates and why it exists.>
## When to Use
## Browse CLI Reference
The inner agent uses the `browse` CLI. Key commands for this task:
- `browse stop` — kill existing session (always run before switching to remote)
- `browse open --remote` — start a fresh Browserbase cloud session and navigate
- `browse open --local` — start a clean local browser and navigate
- `browse tab new ` — open URL in a new tab
- `browse wait load` — wait for page to finish loading
- `browse wait timeout ` — wait a fixed amount of time for spinners or animations
- `browse wait selector ""` — wait for an element to become visible
- `browse get title` — verify you're on the right page
- `browse get text body` — extract all visible text (preferred for content extraction)
- `browse snapshot` — get accessibility tree; each node has a ref in `[X-Y]` format (e.g. `[0-5]`, `[2-147]`)
- `browse click [X-Y]` — click element by ref from the latest snapshot (include the brackets)
**Never use `--session ` flags in SKILL.md.** Named sessions are a parallel-run workaround — they contaminate skills with infrastructure concerns. Skills must work in isolation with the default session.
## Workflow
### Step 1 — Start session
### Step 2 — Navigate
### Step 3 — Extract
### Step 4 — Output
## Site-Specific Gotchas
## Failure Recovery
## Expected Output
```json
After writing the SKILL.md, confirm it's installed:
```bash
ls ~/.claude/skills//SKILL.md
Der Skill ist nun als / in Claude Code.
Abschlussbericht (Multitasking-Modus)
Nachdem alle Unteragenten ihre Aufgaben abgeschlossen haben, geben Sie eine Markdown-Tabelle aus:
| Aufgabe | Iterationen | Endstatus | Abgeschlossen | Kosten |
|---|---|---|---|---|
| google-flights | 5 | ✅ bestanden | ja | 0,42 $ |
| amazon-in-den-warenkorb-legen | 5 | ❌ fehlgeschlagen | nein | 1,20 $ |
Schreiben Sie anschließend einen dauerhaften Sitzungsbericht in ./autobrowse/reports/ damit im Arbeitsbereich eine dauerhafte Aufzeichnung des Durchlaufs vorliegt:
mkdir -p ./autobrowse/reports
Schreibe die Datei ./autobrowse/reports/YYYY-MM-DD-HH-MM- mit:
# AutoBrowse Session Report
**Date:**
**Tasks:**
**Environment:** remote|local
**Total cost:** $X.XX
## Results
| Task | Iterations | Pass Rate | Final Status | Graduated | Cost |
|------|-----------|-----------|--------------|-----------|------|
| ... | ... | X/5 | ✅/❌ | yes/no | $X.XX |
## Per-Task Learnings
###
- **Key insight 1:**
- **Key insight 2:**
- **Failure mode fixed:**
## Iteration Log
###
| Iter | Turns | Cost | Status | Hypothesis tested |
|------|-------|------|--------|-------------------|
| 1 | 79 | $18.75 | ❌ fail | baseline |
| 2 | 9 | $0.26 | ✅ pass | session contamination fix |
| ... | ... | ... | ... | ... |
Regeln
- Bearbeite nur „
strategy.md“ – rühretask.md(es sei denn, du erstellst sie aus der Vorlage) oderevaluate.mjs - Bleiben Sie im Arbeitsbereich – alle Trainingsdaten werden in
./autobrowse/, niemals an~/.claude/skills/autobrowse/. Die Skill-Quelle ist schreibgeschützt. - Eine Hypothese pro Iteration – teste jeweils nur eine Änderung
- Auf Erfolgen aufbauen – behalte bei, was funktioniert hat, und baue darauf auf
- Vertraue dem Trace – der interne Agent zeigt genau, was er gesehen und getan hat
- Wechseln Sie zu „
~/.claude/skills/“ – die einzige Datei, die Sie dort schreiben, ist die endgültige, freigegebene VersionSKILL.md - Keine Veröffentlichung vor der Bisektionsanalyse – unter
--browser-traceist die Reihenfolge am Ende jeder Iteration nicht verhandelbar:stop-capture→bisect-cdp→browse cloud sessions update REQUEST_RELEASE. „Bisect“ hängt davon ab, dass die Sitzung noch besteht, wenn der Trace beendet wird.
---
name: autobrowse
description: Builds reliable browser automation skills through iterative experimentation, running an inner agent to browse sites and improving navigation instructions until tasks pass consistently.
license: MIT
---
# AutoBrowse — Self-Improving Browser Skill
Build reliable browser automation skills through iterative experimentation. An inner agent browses the site (`evaluate.ts`). You — the outer agent — read what happened and improve the instructions (`strategy.md`). Repeat until it passes consistently.
## Entry Points
Invocation is flexible — both explicit flags and free-form natural language work:
```
/autobrowse --task google-flights
/autobrowse --task google-flights --iterations 10 --env remote
/autobrowse --task google-flights --browser-trace
/autobrowse --tasks google-flights,amazon-add-to-cart
/autobrowse --all
# Also fine — parse freely:
/autobrowse https://flights.google.com/
/autobrowse book a flight on delta.com
/autobrowse fix the existing google-flights skill
```
`--browser-trace` (default off, remote-only): pairs each iteration with the sibling `browser-trace` skill — wraps the inner agent in a CDP capture for per-page network/console/page-lifecycle evidence. Implies `--env remote`; errors if combined with `--env local`. Requires the sibling `browser-trace` skill present at `${CLAUDE_SKILL_DIR}/../browser-trace/`, and the `BROWSERBASE_API_KEY` env var.
When the user drops a URL or free-form instruction instead of `--task <name>`:
- If an existing task in `${WORKSPACE}/tasks/` clearly matches the site/intent, use it.
- Otherwise, pick a short kebab-case name, create `${WORKSPACE}/tasks/<name>/task.md` from `${CLAUDE_SKILL_DIR}/references/example-task.md`, fill in the URL/goal based on what the user said, and proceed. Tell the user the chosen name in one line.
---
## How to run
### Step 1 — Parse arguments and orient
Check what was passed:
- `--task <name>` → single task mode
- `--tasks a,b,c` or `--all` → multi-task mode (spawn sub-agents)
- `--iterations N` → how many evaluate → improve cycles (default: 5)
- `--env local|remote` → browser environment (default: local; use remote for bot-protected sites)
- `--browser-trace` → opt in to the browser-trace integration (default off). Implies `--env remote`. If `--env local --browser-trace` are both passed explicitly, error with: `browser-trace requires Browserbase; drop --env local or drop --browser-trace.`
If the user passed free-form text instead, map it to one of the above before continuing.
### Step 2 — Set up the workspace
All training artifacts (task definitions, strategy iterations, traces, reports) live in a workspace directory in the **current working directory** — NOT inside `~/.claude/skills/`. This keeps the inner agent's file writes out of Claude's home dir and away from permission friction.
Default workspace: `${CWD}/autobrowse/`
```bash
mkdir -p ./autobrowse/tasks ./autobrowse/traces ./autobrowse/reports
```
If the task directory (`./autobrowse/tasks/<task>/task.md`) doesn't exist yet, scaffold it:
```bash
mkdir -p ./autobrowse/tasks/<task>
cp ${CLAUDE_SKILL_DIR}/references/example-task.md ./autobrowse/tasks/<task>/task.md
# Then edit task.md to describe the URL, inputs, steps, and expected JSON output
```
The skill source at `${CLAUDE_SKILL_DIR}` stays read-only — only `./autobrowse/` in CWD gets written to during training. Graduation (final step) writes a single file to `~/.claude/skills/<task>/SKILL.md`.
List available tasks:
```bash
ls ./autobrowse/tasks/
```
### Step 3 — Multi-task: spawn parallel sub-agents
If running multiple tasks, use the Agent tool to spawn one sub-agent per task simultaneously. Each sub-agent receives a self-contained prompt to run the full autobrowse loop for its task:
> "You are running the autobrowse skill for task `<name>`. Workspace: `<absolute-path-to-workspace>` (e.g. `/path/to/project/autobrowse`). Run `<N>` iterations of: evaluate → read trace → improve strategy.md → repeat. Use `--env <env>`. Pass `--workspace <workspace>` to every evaluate.mjs invocation. If the parent invocation used `--browser-trace`, you MUST use the traced-path block of the SKILL.md loop for every iteration (pre-create session, attach bb-capture, pass `--connect-url` to evaluate.mjs, stop+bisect, release) — do not fall back to the default single-command path. Follow the autobrowse loop instructions exactly.
>
> When graduating, install the skill to `~/.claude/skills/<task-name>/SKILL.md` with proper agentskills frontmatter (name + description). Do not just copy strategy.md — write a self-contained skill.
>
> At the end, output a structured summary with: task name, pass/fail on final run, total cumulative cost, iterations completed, per-iteration table (iter number, turns, cost, status, hypothesis tested), and 2-3 bullet key learnings."
Spawn all sub-agents in parallel, wait for all to complete, then collect their summaries and write the session report.
**For single task**, skip this step and run the loop directly below.
---
## The Loop (run this for each task)
### Iteration start
Check that `./autobrowse/tasks/<task>/task.md` exists (scaffold it from the template if not — see Step 2). `strategy.md` is auto-created empty by the harness on first run.
### Requirements
- `ANTHROPIC_API_KEY` must be in the environment (or in a `.env` file in CWD — `evaluate.mjs` auto-loads it). If missing, the harness prints a clear error and exits; don't hunt for keys in other paths.
### Run the inner agent
**Default path (no `--browser-trace`)** — single command, no orchestration:
```bash
node ${CLAUDE_SKILL_DIR}/scripts/evaluate.mjs --task <task-name> --workspace ./autobrowse
# or for bot-protected sites:
node ${CLAUDE_SKILL_DIR}/scripts/evaluate.mjs --task <task-name> --workspace ./autobrowse --env remote
```
This runs the browser session and writes a full trace to `./autobrowse/traces/<task>/latest/`.
**Traced path (`--browser-trace`, remote only)** — the outer harness pre-creates a Browserbase session, attaches `bb-capture` as a passive observer, and passes the session's `connectUrl` to `evaluate.mjs` so every inner `browse` call uses `--cdp $connectUrl --session autobrowse-main` (the canonical browser-trace pattern that gives observers full Network/Console events). Run this block once per iteration with `$N` set to the 1-indexed iteration number:
```bash
# Preflight — fail fast if browser-trace isn't installed alongside autobrowse.
BT_DIR="${CLAUDE_SKILL_DIR}/../browser-trace"
if [ ! -f "$BT_DIR/scripts/bb-capture.mjs" ]; then
echo "ERROR: --browser-trace requires the browser-trace skill at $BT_DIR." >&2
echo "Install it by cloning github.com/browserbase/skills and copying skills/browser-trace/" >&2
echo "into the same parent directory as autobrowse (e.g. ~/.claude/skills/browser-trace/)." >&2
exit 1
fi
# a. SESSION SETUP — pre-create the keep-alive session and derive its connectUrl
sid=$(browse cloud sessions create --keep-alive --verified --proxies \
| node -e "let s='';process.stdin.on('data',c=>s+=c).on('end',()=>process.stdout.write(JSON.parse(s).id))")
connect_url=$(browse cloud sessions get "$sid" \
| node -e "let s='';process.stdin.on('data',c=>s+=c).on('end',()=>process.stdout.write(JSON.parse(s).connectUrl))")
RUN_ID="run-$(printf '%03d' "$N")"
TRACE_ROOT="./autobrowse/traces/<task-name>/$RUN_ID"
mkdir -p "$TRACE_ROOT"
export O11Y_ROOT="$TRACE_ROOT/.o11y" # park browser-trace output inside the autobrowse run dir
export O11Y_RUN_ID="$RUN_ID" # tells the browse CLI which run dir to write descriptors.ndjson into
# b. ATTACH BROWSER-TRACE — passive observer; runs in background
node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/bb-capture.mjs "$sid" "$RUN_ID" &
sleep 2
# c. RUN AUTOBROWSE — connectUrl flag tells evaluate.mjs to inject --cdp/--session
# into every inner browse call. The inner agent never sees --remote.
node ${CLAUDE_SKILL_DIR}/scripts/evaluate.mjs \
--task <task-name> --workspace ./autobrowse --env remote \
--connect-url "$connect_url" --run-number "$N"
# d. STOP + BISECT + UNIFY — order matters; bisect needs the session to still
# exist, and unify-trace joins the bisect output with autobrowse's trace.json
# into a single time-ordered NDJSON the outer agent reads first each iter.
node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/stop-capture.mjs "$RUN_ID"
node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/bisect-cdp.mjs "$RUN_ID"
node ${CLAUDE_SKILL_DIR}/scripts/unify-trace.mjs \
--trace-dir "$TRACE_ROOT" \
--o11y-dir "$O11Y_ROOT/$RUN_ID"
# e. RELEASE
browse cloud sessions update "$sid" --status REQUEST_RELEASE
```
This writes the inner-agent trace to `./autobrowse/traces/<task-name>/latest/` and the CDP bisect to `./autobrowse/traces/<task-name>/latest/.o11y/<run-id>/`. The traced `browse` CLI also emits per-command rich node descriptors to `.o11y/<run-id>/cdp/descriptors.ndjson` (one JSON object per page-driving call: target tag/id/role/accessibleName/attributes/xpath/bounding-rect). The descriptors file feeds downstream codegen; it is **not** required for hypothesis formation — skip it when reading the trace.
### Read the trace
```bash
cat ./autobrowse/traces/<task-name>/latest/summary.md
```
The summary has duration, cost, turns, the decision log, and the final JSON output.
If the agent failed or got stuck, look deeper:
- Read `./autobrowse/traces/<task-name>/latest/trace.json` — search for the failure turn
- Read screenshots around the failure point with the Read tool
**When `--browser-trace` was used — start with `unified-events.jsonl`.** The harness joins the agent's turn log and the browser's CDP firehose into one time-ordered NDJSON stream at the run root. One file, source-tagged (`source: "agent" | "browser"`), interleaved by wall-clock timestamp. Skim it top-to-bottom; the failure cause is usually one or two adjacent lines (the agent issued command X, the browser responded with Y).
```bash
cat ./autobrowse/traces/<task-name>/latest/unified-events.jsonl
```
The structured files (`trace.json`, `.o11y/<run-id>/cdp/*`) are **also agent-consumable as drill-downs** when the unified stream points at something you need more of:
| Need | Drill-down file or command |
|---|---|
| Per-page totals + timing (events, network counts, errors by page) | `.o11y/<run-id>/cdp/summary.json` |
| All failed network requests in one place | `.o11y/<run-id>/cdp/network/failed.jsonl` |
| Full console exception payloads (stacktraces, etc.) | `.o11y/<run-id>/cdp/console/exceptions.jsonl` |
| Per-page slice (only events on page N) | `.o11y/<run-id>/cdp/pages/<pid>/` |
| Full reasoning text / untruncated tool outputs for a specific turn | `trace.json` (filter by `turn === N`) |
| Ad-hoc grouped query (e.g. top hosts, errors-by-page) | `O11Y_ROOT=./autobrowse/traces/<task-name>/latest/.o11y node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/query.mjs <run-id> <cmd>` |
The unified stream is the default; drill into structured files only when you need a grouped query, a full-text payload, or filtering the stream can't give you.
### Form one hypothesis
Find the exact turn where things went wrong. What single heuristic would have prevented it?
Under `--browser-trace`, the hypothesis must cite a **specific event from `unified-events.jsonl`** (line number or timestamp) — or name the drill-down file if you had to descend into one. This keeps updates evidence-grounded rather than vibes-driven. A hypothesis based only on the agent's commands might say "the click didn't work"; grounded in the unified stream, it can say "line 47 of unified-events.jsonl: `browse open` was followed by `Network.responseReceived` status 403 on `/api/checkout` — switch to `--verified --proxies`."
Examples:
- "After clicking the dropdown, wait 1s — options animate in before they're clickable"
- "Navigate directly to `/pay-invoice/` — skip the landing page entirely"
- "Use `browse fill #field_3 value` not `browse type` — this field clears on focus"
- "The page shows a spinner at turn 8 — add `browse wait timeout 2000` before snapshot"
- (with `--browser-trace`) "At line 47 of unified-events.jsonl, 3 consecutive `Network.responseReceived` events on `/api/availability` returned 403 right after `browse open` — the site is fingerprinting; the next iter needs `--verified --proxies`."
### Update strategy.md
Edit `./autobrowse/tasks/<task-name>/strategy.md`. Keep everything that worked. Fix the specific failure. Add a concrete heuristic.
Good strategies have:
- **Fast path**: direct URL or shortcuts to skip exploration
- **Step-by-step workflow**: exact sequence with timing notes
- **Site-specific knowledge**: selector IDs, form field names, success indicators
- **Failure recovery**: what to do when X goes wrong
### Judge the result
Read the new summary. Did it pass? Make clear progress?
- **Pass or progress** → keep, next iteration
- **No progress or regression** → revert strategy.md to the previous version and try a different hypothesis
### Generate a runnable script (optional)
Once the task has converged, you can produce a deterministic, runnable script
in one or more frameworks via `scripts/codegen.mjs`. This is one shot of an
LLM call per framework, cached by content hash, with optional verify-against-
fresh-session and rewrite-on-failure.
```bash
node ${CLAUDE_SKILL_DIR}/scripts/codegen.mjs \
--task <name> \
--workspace ./autobrowse \
--frameworks playwright,stagehand \
--verify
```
Each framework gets its own subdirectory under `tasks/<name>/<framework>/`
with the emitted script and a self-contained scaffold (`package.json`,
`tsconfig.json`). The directory is runnable standalone with
`cd tasks/<name>/playwright && npm install && npx tsx <name>.ts` — the only
runtime requirement is `BROWSERBASE_API_KEY` (plus `ANTHROPIC_API_KEY` for
the Stagehand target).
Builtin frameworks: `playwright`, `stagehand`. Add a custom framework with
`--prompt-template <path> --frameworks custom` (and provide your own runner
or pass `--no-verify`).
Common flags:
| Flag | Purpose |
|---|---|
| `--frameworks a,b,...` | Comma-separated; default `playwright` |
| `--verify` / `--no-verify` | Run the produced script against a fresh BB session; default `--verify` |
| `--max-retries N` | Rewrite-on-verify-failure cap; default 2 |
| `--cache-only` | Error if cache miss (CI-friendly) |
| `--force` | Bust the cache |
| `--dry-run` | Estimate prompt size + cost; don't call the LLM |
| `--run <id>` | Force a specific `run-NNN` (default: latest passing) |
Output is one JSON line per framework on stdout. Non-zero exit if any
selected framework's final state is `passed: false`.
See `references/playwright-cdp-bridge.md` for the canonical
`connectOverCDP` patterns the emitted scripts follow.
### After all iterations — publish if ready
If the task passed on 2+ of the last 3 iterations **or has reached the max iteration limit**, install it as a Claude Code skill. **Do not just copy strategy.md** — the skill must be self-contained and useful to someone who has never seen this codebase. If graduating at max iterations without a clean pass, note the known failure point but still document everything learned.
Install by writing to `~/.claude/skills/<task-name>/SKILL.md`:
```bash
mkdir -p ~/.claude/skills/<task-name>
```
Use this structure for the SKILL.md:
```markdown
---
name: <task-name>
description: <1-2 sentences describing what this skill does and when to use it. Include trigger keywords.>
---
# <Task Title> — Browser Skill
## Purpose
<1-2 sentences: what this automates and why it exists.>
## When to Use
<When should someone reach for this skill.>
## Browse CLI Reference
The inner agent uses the `browse` CLI. Key commands for this task:
- `browse stop` — kill existing session (always run before switching to remote)
- `browse open <url> --remote` — start a fresh Browserbase cloud session and navigate
- `browse open <url> --local` — start a clean local browser and navigate
- `browse tab new <url>` — open URL in a new tab
- `browse wait load` — wait for page to finish loading
- `browse wait timeout <ms>` — wait a fixed amount of time for spinners or animations
- `browse wait selector "<selector>"` — wait for an element to become visible
- `browse get title` — verify you're on the right page
- `browse get text body` — extract all visible text (preferred for content extraction)
- `browse snapshot` — get accessibility tree; each node has a ref in `[X-Y]` format (e.g. `[0-5]`, `[2-147]`)
- `browse click [X-Y]` — click element by ref from the latest snapshot (include the brackets)
**Never use `--session <name>` flags in SKILL.md.** Named sessions are a parallel-run workaround — they contaminate skills with infrastructure concerns. Skills must work in isolation with the default session.
## Workflow
### Step 1 — Start session
<exact browse commands in order>
### Step 2 — Navigate
<exact URL and verification steps>
### Step 3 — Extract
<exact extraction commands>
### Step 4 — Output
<what JSON to emit, referencing the schema below>
## Site-Specific Gotchas
<Bullet list of every hard-won heuristic from the iterations. This is the core value of the skill.>
## Failure Recovery
<What to do when navigation fails, session is contaminated, or extraction returns garbage>
## Expected Output
```json
<paste the exact expected output schema from task.md>
```
```
After writing the SKILL.md, confirm it's installed:
```bash
ls ~/.claude/skills/<task-name>/SKILL.md
```
The skill is now available as `/<task-name>` in Claude Code.
---
## Final report (multi-task mode)
After all sub-agents complete, print a markdown table:
| Task | Iterations | Final Status | Graduated | Cost |
|------|-----------|--------------|-----------|------|
| google-flights | 5 | ✅ pass | yes | $0.42 |
| amazon-add-to-cart | 5 | ❌ fail | no | $1.20 |
Then write a persistent session report to `./autobrowse/reports/` so there's a durable record of the run inside the workspace:
```bash
mkdir -p ./autobrowse/reports
```
Write the file `./autobrowse/reports/YYYY-MM-DD-HH-MM-<tasks>.md` with:
```markdown
# AutoBrowse Session Report
**Date:** <ISO date>
**Tasks:** <comma-separated list>
**Environment:** remote|local
**Total cost:** $X.XX
## Results
| Task | Iterations | Pass Rate | Final Status | Graduated | Cost |
|------|-----------|-----------|--------------|-----------|------|
| ... | ... | X/5 | ✅/❌ | yes/no | $X.XX |
## Per-Task Learnings
### <task-name>
- **Key insight 1:** <what the agent learned>
- **Key insight 2:** <another heuristic>
- **Failure mode fixed:** <what was failing and how it was resolved>
## Iteration Log
### <task-name>
| Iter | Turns | Cost | Status | Hypothesis tested |
|------|-------|------|--------|-------------------|
| 1 | 79 | $18.75 | ❌ fail | baseline |
| 2 | 9 | $0.26 | ✅ pass | session contamination fix |
| ... | ... | ... | ... | ... |
```
---
## Rules
- **Only edit `strategy.md`** — never touch `task.md` (unless creating it from the template) or `evaluate.mjs`
- **Stay in the workspace** — all training writes go to `./autobrowse/`, never to `~/.claude/skills/autobrowse/`. The skill source is read-only.
- **One hypothesis per iteration** — test one change at a time
- **Build on wins** — keep what worked, add to it
- **Trust the trace** — the inner agent shows exactly what it saw and did
- **Graduate to `~/.claude/skills/`** — the only file you write there is the final graduated `SKILL.md`
- **Don't release before bisecting** — under `--browser-trace`, the order at the end of each iteration is non-negotiable: `stop-capture` → `bisect-cdp` → `browse cloud sessions update REQUEST_RELEASE`. Bisect depends on the session still existing when the trace stops.
Alle Dateien
21 Dateienautobrowse installieren
Laden Sie die Skill-Dateien herunter und entpacken Sie sie in Ihr Verzeichnis „.claude/skills/“.
ZIP herunterladenKlonen Sie das Repository und kopieren Sie die Skill-Dateien in Ihr Projekt.
git clone https://github.com/browserbase/skills/tree/main/skills/autobrowse # Copy SKILL.md to your .claude/skills/ directory
Kopieren





Heim
