autobrowse
browserbase/skills
Permet d'acquérir des compétences solides en automatisation des navigateurs grâce à une expérimentation itérative, en exécutant un agent interne pour parcourir des sites et en affinant les instructions de navigation jusqu'à ce que les tâches soient exécutées de manière cohérente.
...Développer toutAutoBrowse — Compétences en automatisation de navigateur par auto-amélioration
Développez des compétences fiables en automatisation de navigateur grâce à une expérimentation itérative. Un agent interne navigue sur le site (evaluate.ts). Vous — l’agent externe — lisez ce qui s’est passé et améliorez les instructions (strategy.md). Répétez l’opération jusqu’à ce que le test soit réussi de manière constante.
Points d’entrée
L’invocation est flexible : les indicateurs explicites et le langage naturel libre fonctionnent tous les deux :
/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
# Également valable — analyse libre :
/autobrowse https://flights.google.com/
/autobrowse réserver un vol sur delta.com
/autobrowse corriger la compétence google-flights existante
--browser-trace (désactivé par défaut, à distance uniquement) : associe chaque itération à la compétence sœur browser-trace — encapsule l’agent interne dans une capture CDP pour obtenir des preuves par page concernant le réseau, la console et le cycle de vie de la page. Implique --env remote; génère une erreur si combiné avec --env local. Nécessite la présence de la compétence « browser-trace » jumelle dans ${CLAUDE_SKILL_DIR}/../browser-trace/, ainsi que la variable d’environnement BROWSERBASE_API_KEY.
Lorsque l’utilisateur saisit une URL ou une instruction libre au lieu de l’ :
- Si une tâche existante dans
${WORKSPACE}/tasks/correspond clairement au site/à l’intention, utilisez-la. - Sinon, choisissez un nom court en « kebab case », créez le fichier
${WORKSPACE}/tasks/à partir de/task.md ${CLAUDE_SKILL_DIR}/references/example-task.md, complétez l’URL et l’objectif en fonction de ce que l’utilisateur a dit, puis poursuivez. Indiquez à l’utilisateur le nom choisi en une seule ligne.
Comment procéder
Étape 1 — Analyser les arguments et s’orienter
Vérifiez ce qui a été transmis :
--task→ mode tâche unique--tasks a,b,cou--all→ mode multitâche (lance des sous-agents)--iterations N→ nombre de cycles d'évaluation → amélioration (par défaut : 5)--env local|remote→ environnement du navigateur (par défaut : local ; utiliser « remote » pour les sites protégés par des bots)--browser-trace→ active l'intégration de la trace du navigateur (désactivée par défaut). Implique--env remote. Si--env local et --browser-tracesont tous deux passés explicitement, une erreur s'affiche : «browser-trace nécessite Browserbase » ; supprimez --env local ou --browser-trace.
Si l’utilisateur a fourni un texte libre à la place, mappez-le à l’une des options ci-dessus avant de continuer.
Étape 2 — Configurer l’espace de travail
Tous les artefacts d’entraînement (définitions de tâches, itérations de stratégie, traces, rapports) se trouvent dans un répertoire « workspace » situé dans le répertoire de travail actuel — et NON dans ~/.claude/skills/. Cela permet d’éviter que les écritures de fichiers de l’agent interne n’affectent le répertoire personnel de Claude et d’éviter tout conflit d’autorisations.
Espace de travail par défaut : ${CWD}/autobrowse/
mkdir -p ./autobrowse/tasks ./autobrowse/traces ./autobrowse/reports
Si le répertoire de tâches (./autobrowse/tasks/) n'existe pas encore, créez-le :
mkdir -p ./autobrowse/tasks/
cp ${CLAUDE_SKILL_DIR}/references/example-task.md ./autobrowse/tasks//task.md
# Modifiez ensuite le fichier task.md pour décrire l’URL, les entrées, les étapes et la sortie JSON attendue
La source de la compétence située dans ${CLAUDE_SKILL_DIR} reste en lecture seule — seul le ré pertoire ./autobrowse/ dans le répertoire de travail (CWD) est modifié pendant l’entraînement. La « graduation » (étape finale) écrit un seul fichier dans ~/.claude/skills/.
Liste des tâches disponibles :
ls ./autobrowse/tasks/
Étape 3 — Multitâche : lancer des sous-agents en parallèle
Si vous exécutez plusieurs tâches, utilisez l’outil Agent pour lancer simultanément un sous-agent par tâche. Chaque sous-agent reçoit une invite autonome lui permettant d’exécuter la boucle complète autobrowse pour sa tâche :
« Vous exécutez la compétence autobrowse pour la tâche
. Espace de travail :(par ex./chemin/vers/projet/autobrowse). Effectuezles itérations suivantes : evaluate → read trace → improve strategy.md → repeat. Utilisez--env. Passez--workspaceà chaque invocation de evaluate.mjs. Si l'invocation parente a utilisé--browser-trace, vous DEVEZ utiliser le bloc traced-path de la boucle SKILL.md pour chaque itération (pré-créer une session, attacher bb-capture, passer--connect-urlà evaluate.mjs, arrêt + bisection, publication) — ne revenez pas au chemin par défaut à commande unique. Suivez à la lettre les instructions de la boucle autobrowse.À la fin du projet, installez la compétence dans
~/.claude/skills/avec une section d’en-tête agentskills correcte (nom + description). Ne vous contentez pas de copier strategy.md — rédigez une compétence autonome./SKILL.md À la fin, générez un résumé structuré comprenant : le nom de la tâche, la réussite ou l’échec de l’exécution finale, le coût cumulé total, le nombre d’itérations effectuées, un tableau par itération (numéro d’itération, tours, coût, statut, hypothèse testée) et 2 à 3 points clés sous forme de puces. »
Lancez tous les sous-agents en parallèle, attendez qu’ils aient tous terminé, puis collectez leurs résumés et rédigez le rapport de session.
Pour une tâche unique, ignorez cette étape et exécutez la boucle ci-dessous.
La boucle (à exécuter pour chaque tâche)
Début de l’itération
Vérifiez que le fichier ./autobrowse/tasks/ (créez-le à partir du modèle s’il n’existe pas — voir l’étape 2). Le fichier strategy.md est créé automatiquement et vide par le harnais lors de la première exécution.
Prérequis
ANTHROPIC_API_KEYdoit être présent dans l’environnement (ou dans un fichier.envdu répertoire de travail —evaluate.mjsle charge automatiquement). S’il manque, le harnais affiche une erreur claire et se termine ; ne cherchez pas de clés dans d’autres chemins.
Exécuter l’agent interne
Chemin par défaut (sans --browser-trace) — commande unique, sans orchestration :
node ${CLAUDE_SKILL_DIR}/scripts/evaluate.mjs --task --workspace ./autobrowse
# ou pour les sites protégés par un bot :
node ${CLAUDE_SKILL_DIR}/scripts/evaluate.mjs --task --workspace ./autobrowse --env remote
Cela lance la session de navigateur et enregistre une trace complète dans ./autobrowse/traces/
Chemin de trace (--browser-trace, à distance uniquement) — le harnais externe pré-crée une session Browserbase, associe bb-capture en tant qu’observateur passif et transmet l’URL de connexion de la session ( connectUrl) à evaluate.mjs afin que chaque appel de navigation interne utilise --cdp $connectUrl --session autobrowse-main (le modèle canonique de browser-trace qui fournit aux observateurs l’intégralité des événements Network/Console). Exécutez ce bloc une fois par itération en définissant $N sur le numéro d’itération indexé à partir de 1 :
# Vérification préalable — échouer rapidement si browser-trace n’est pas installé aux côtés de autobrowse.
BT_DIR="${CLAUDE_SKILL_DIR}/../browser-trace"
if [ ! -f "$BT_DIR/scripts/bb-capture.mjs" ]; then
echo "ERREUR : --browser-trace nécessite la compétence browser-trace à l'emplacement $BT_DIR." >&2
echo "Installez-la en clonant github.com/browserbase/skills et en copiant le répertoire skills/browser-trace/" >&2
echo "dans le même répertoire parent que autobrowse (par exemple ~/.claude/skills/browser-trace/)." >&2
exit 1
fi
# a. CONFIGURATION DE LA SESSION — pré-créer la session keep-alive et en dériver l’URL de connexion
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" # stocke la sortie de browser-trace dans le répertoire d'exécution de autobrowse export O11Y_RUN_ID="$RUN_ID" # indique à l'interface CLI de browse dans quel répertoire d'exécution écrire le fichier descriptors.ndjson
# b. LANCER BROWSER-TRACE — observateur passif ; s'exécute en arrière-plan
node ${CLAUDE_SKILL_DIR}/../browser-trace/scripts/bb-capture.mjs "$sid" "$RUN_ID" &
sleep 2
# c. EXÉCUTION d’ AUTOBROWSE — le drapeau connectUrl indique à evaluate.mjs d’injecter --cdp/--session
# dans chaque appel interne à browse. L’agent interne ne voit jamais --remote.
node ${CLAUDE_SKILL_DIR}/scripts/evaluate.mjs \
--task --workspace ./autobrowse --env remote \
--connect-url "$connect_url" --run-number "$N"
# d. STOP + BISECT + UNIFY — l’ordre est important ; bisect nécessite que la session
# existe encore, et unify-trace fusionne la sortie de bisect avec le fichier trace.json de autobrowse# en un seul NDJSON classé par ordre chronologique que l’agent externe lit en premier à chaque itération.
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
Cela écrit la trace interne à l’agent dans ./autobrowse/traces/ et la bisection CDP dans ./autobrowse/traces/ L’interface CLI de navigation tracée génère également, pour chaque commande, des descripteurs de nœuds riches vers .o11y/ (un objet JSON par appel générateur de page : balise cible/id/rôle/nom accessible/attributs/xpath/rectangle de délimitation). Le fichier de descripteurs alimente le générateur de code en aval ; il n’ est pas indispensable à la formulation d’hypothèses — ignorez-le lors de la lecture de la trace.
Lire la trace
cat ./autobrowse/traces//latest/summary.md
Le résumé contient la durée, le coût, les tours, le journal des décisions et la sortie JSON finale.
Si l’agent a échoué ou s’est bloqué, examinez la trace plus en détail :
- Lisez le fichier
./autobrowse/traces/— recherchez le tour où l'échec s'est produit/latest/trace.json - Consultez les captures d’écran autour du point d’échec à l’aide de l’outil Read
Lorsque l'option --browser-trace a été utilisée — commencez par unified-events.jsonl. Le harnais fusionne le journal des tours de l'agent et le flux CDP du navigateur en un seul flux NDJSON ordonné chronologiquement à la racine de l'exécution. Un seul fichier, balisé parsource (source : « agent » | « navigateur »), entrecoupé d’horodatages en temps réel. Parcourez-le de haut en bas ; la cause de l’échec se trouve généralement sur une ou deux lignes adjacentes (l’agent a émis la commande X, le navigateur a répondu par Y).
cat ./autobrowse/traces//latest/unified-events.jsonl
Les fichiers structurés (trace.json, .o11y/) peuvent également être exploités par l'agent sous forme d'analyses approfondies lorsque le flux unifié met en évidence un élément sur lequel vous souhaitez obtenir davantage d'informations :
| Besoin | Fichier ou commande d’exploration |
|---|---|
| Totaux par page + chronométrage (événements, nombre de connexions réseau, erreurs par page) | .o11y/ |
| Toutes les requêtes réseau ayant échoué regroupées en un seul endroit | .o11y/ |
| Données complètes des exceptions de la console (traces de pile, etc.) | .o11y/ |
| Extrait par page (uniquement les événements de la page N) | .o11y/ |
| Texte complet du raisonnement / sorties d’outils non tronquées pour un tour spécifique | trace.json (filtrer par tour === N) |
| Requête groupée ad hoc (par ex. principaux hôtes, erreurs par page) | O11Y_ROOT=./autobrowse/traces/ |
Le flux unifié est le paramètre par défaut ; n'explorez les fichiers structurés que lorsque vous avez besoin d'une requête groupée, d'une charge utile en texte intégral ou d'un filtrage que le flux ne peut pas vous fournir.
Formulez une hypothèse
Identifiez le moment précis où les choses ont mal tourné. Quelle heuristique unique aurait pu l’empêcher ?
Avec l'option --browser-trace, l'hypothèse doit citer un événement spécifique issu du fichier unified-events.jsonl (numéro de ligne ou horodatage) — ou indiquer le nom du fichier d'analyse détaillée si vous avez dû y accéder. Cela permet de s'appuyer sur des preuves concrètes plutôt que sur des impressions subjectives lors des mises à jour. Une hypothèse fondée uniquement sur les commandes de l’agent pourrait indiquer « le clic n’a pas fonctionné » ; s’appuyant sur le flux unifié, elle peut indiquer : « ligne 47 de unified-events.jsonl : la commande browse open a été suivie d’ un Network.responseReceived statut 403 sur /api/checkout — basculer vers --verified --proxies. »
Exemples :
- « Après avoir cliqué sur le menu déroulant, attendre 1 s — les options s’affichent en animation avant de devenir cliquables »
- « Accédez directement à
/pay-invoice/— ignorez complètement la page d’accueil » - « Utilisez
la valeur de remplissage #field_3 de la navigationet nonle type de navigation— ce champ s’efface lorsqu’on le met en surbrillance » - « La page affiche un indicateur de chargement au tour 8 — ajoutez
un délai d’attente de navigation de 2000avant la capture d’écran » - (avec
--browser-trace) « À la ligne 47 du fichier unified-events.jsonl, 3 événementsNetwork.responseReceivedconsécutifs sur/api/availabilityont renvoyé un code 403 juste aprèsl’ouverture du navigateur— le site effectue une identification par empreinte digitale ; l’itération suivante nécessiteles options --verified et --proxies. »
Mettez à jour strategy.md
Modifiez ./autobrowse/tasks/. Conservez tout ce qui fonctionnait. Corrigez l’échec spécifique. Ajoutez une heuristique concrète.
Les bonnes stratégies comportent :
- Un chemin rapide: URL directe ou raccourcis pour éviter l’exploration
- Un workflow étape par étape: séquence exacte avec indications de timing
- Connaissances spécifiques au site: identifiants des sélecteurs, noms des champs de formulaire, indicateurs de réussite
- Récupération en cas d’échec: que faire lorsque X ne fonctionne pas
Évaluez le résultat
Lisez le nouveau résumé. A-t-il été validé ? Des progrès significatifs ont-ils été réalisés ?
- Réussite ou progrès → conserver,passer à l’itération suivante
- Pas de progrès ou régression → revenir à la version précédente de strategy.md et tester une autre hypothèse
Générer un script exécutable (facultatif)
Une fois que la tâche a convergé, vous pouvez produire un script déterministe et exécutable
dans un ou plusieurs frameworks via scripts/codegen.mjs. Il s’agit d’un appel unique au
LLM par framework, mis en cache par hachage de contenu, avec en option une vérification par rapport à une
nouvelle session et une réécriture en cas d’échec.
node ${CLAUDE_SKILL_DIR}/scripts/codegen.mjs \
--task \
--workspace ./autobrowse \
--frameworks playwright,stagehand \
--verify
Chaque framework dispose de son propre sous-répertoire sous tasks/
contenant le script généré et une structure de base autonome (package.json,
tsconfig.json). Le répertoire est exécutable de manière autonome avec
cd tasks/ — la seule
condition d’exécution requise est BROWSERBASE_API_KEY (ainsi que ANTHROPIC_API_KEY pour
la cible Stagehand).
Frameworks intégrés : playwright, stagehand. Ajoutez un framework personnalisé avec
--prompt-template (et fournissez votre propre runner
ou passez --no-verify).
Options courantes :
| Option | Objectif |
|---|---|
--frameworks a,b,... |
Séparés par des virgules ; par défaut : playwright |
--verify / --no-verify |
Exécute le script généré dans une nouvelle session BB ; par défaut : --verify |
--max-retentes N |
Limite du nombre de réécritures en cas d'échec de la vérification ; valeur par défaut : 2 |
--cache-only |
Génère une erreur en cas d'échec de la mise en cache (adapté à l'environnement CI) |
--force |
Vider le cache |
--dry-run |
Estimer la taille et le coût de l'invite ; ne pas appeler le LLM |
--run |
Forcer un nombre spécifique d'itérations (NNN) (par défaut : dernier passage réussi) |
La sortie est constituée d’une ligne JSON par framework sur stdout. Code de sortie non nul si l’
état final d’un framework sélectionné est false.
Voir references/playwright-cdp-bridge.md pour les modèles canoniques
connectOverCDP suivis par les scripts générés.
Après toutes les itérations — publier si prêt
Si la tâche a réussi au moins 2 des 3 dernières itérations ou a atteint la limite maximale d’itérations, installez-la en tant que compétence Claude Code. Ne vous contentez pas de copier strategy.md — la compétence doit être autonome et utile à quelqu’un qui n’a jamais vu cette base de code. Si la tâche atteint la limite d’itérations sans avoir réussi une fois, notez le point d’échec connu mais documentez tout ce que vous avez appris.
Installez-la en créant le fichier ~/.claude/skills/:
mkdir -p ~/.claude/skills/
Utilisez cette structure pour le fichier SKILL.md :
---
name:
description: <1-2 sentences describing what this skill does and when to use it. Include trigger keywords.>
---
# — Compétence de navigation
## Objectif
<1-2 sentences: what this automates and why it exists.>
## Quand l’utiliser
## Consultation de la référence CLI
L’agent interne utilise la CLI `browse`. Commandes clés pour cette tâche :
- `browse stop` — met fin à la session en cours (à toujours exécuter avant de basculer en mode distant)
- `browse open --remote` — lance une nouvelle session Browserbase dans le cloud et permet de naviguer
- `browse open --local` — lance un navigateur local vierge et permet de naviguer
- `browse tab new ` — ouvre l’URL dans un nouvel onglet
- `browse wait load` — attend que le chargement de la page soit terminé
- `browse wait timeout ` — attend un délai défini pour les indicateurs de chargement ou les animations
- `browse wait selector ""` — attendre qu’un élément devienne visible
- `browse get title` — vérifier que vous êtes sur la bonne page
- `browse get text body` — extraire tout le texte visible (méthode privilégiée pour l’extraction de contenu)
- `browse snapshot` — récupère l’arborescence d’accessibilité ; chaque nœud possède une référence au format `[X-Y]` (par ex. `[0-5]`, `[2-147]`)
- `browse click [X-Y]` — clique sur un élément par sa référence à partir du dernier instantané (inclure les crochets)
**N’utilisez jamais les indicateurs `--session ` dans SKILL.md.** Les sessions nommées constituent une solution de contournement permettant l’exécution en parallèle — elles contaminent les compétences avec des problèmes d’infrastructure. Les compétences doivent fonctionner de manière isolée avec la session par défaut.
## Déroulement
### Étape 1 — Démarrer la session
### Étape 2 — Navigation
### Étape 3 — Extraction
### Étape 4 — Sortie
## Pièges spécifiques au site
## Récupération après échec
## Sortie attendue
```json
Après avoir rédigé le fichier SKILL.md, vérifiez qu’il est bien installé :
```bash
ls ~/.claude/skills//SKILL.md
La compétence est désormais disponible sous la forme / dans Claude Code.
Rapport final (mode multitâche)
Une fois que tous les sous-agents ont terminé, affichez un tableau au format Markdown :
| Tâche | Itérations | Statut final | Terminé | Coût |
|---|---|---|---|---|
| google-flights | 5 | ✅ réussi | oui | 0,42 $ |
| amazon-ajouter-au-panier | 5 | ❌ échec | non | 1,20 $ |
Ensuite, enregistrez un rapport de session persistant dans ./autobrowse/reports/ afin de conserver une trace durable de l'exécution au sein de l'espace de travail :
mkdir -p ./autobrowse/reports
Créez le fichier ./autobrowse/reports/AAAA-MM-JJ-HH-MM- avec le contenu suivant :
# Rapport de session d’ AutoBrowse **Date :**
**Tâches :**
**Environnement :** distant|local
**Coût total :** $X.XX
## Résultats
| Tâche | Itérations | Taux de réussite | Statut final | Réussite | Coût |
|------|-----------|-----------|--------------|-----------|------|
| ... | ... | X/5 | ✅/❌ | oui/non | $X,XX |
## Enseignements par tâche
###
- **Enseignement clé n° 1 :**
- **Enseignement clé n° 2 :**
- **Mode de défaillance corrigé :**
## Journal des itérations
###
| Itér | Tours | Coût | Statut | Hypothèse testée |
|------|-------|------|--------|-------------------|
| 1 | 79 | 18,75 $ | ❌ échec | référence |
| 2 | 9 | 0,26 $ | ✅ réussite | correction de la contamination de session |
| ... | ... | ... | ... | ... |
Règles
- Modifiez uniquement
le fichier strategy.md— ne touchez jamaisau fichier task.md(sauf si vous le créez à partir du modèle) niau fichier evaluate.mjs - Restez dans l’espace de travail — toutes les écritures liées à l’entraînement vont dans
./autobrowse/, jamais dans~/.claude/skills/autobrowse/.Le code source de la compétence est en lecture seule. - Une hypothèse par itération — testez une modification à la fois
- S’appuyer sur les réussites — conserver ce qui a fonctionné et y ajouter des éléments
- Faites confiance à la trace — l’agent interne montre exactement ce qu’il a vu et fait
- Passez à
~/.claude/skills/— le seul fichier que vous y enregistrez est le fichierSKILL.mdfinal validé - Ne publiez pas avant la bisection — avec l’option
--browser-trace, l’ordre à la fin de chaque itération est impératif :stop-capture→bisect-cdp→parcourir les sessions cloud → mettre à jour REQUEST_RELEASE. La bisection nécessite que la session existe encore lorsque la trace s’arrête.
---
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.
Tous les fichiers
21 fichiersInstaller autobrowse
Téléchargez et décompressez les fichiers de compétences dans votre répertoire .claude/skills/.
Télécharger le ZIPClonez le dépôt et copiez les fichiers de compétence dans votre projet.
git clone https://github.com/browserbase/skills/tree/main/skills/autobrowse # Copy SKILL.md to your .claude/skills/ directory
Copier





Maison
