Agent Browser
quran/quran.com-frontend-next
Automates browser interactions for web testing, form filling, screenshots, and data extraction.
Browser automation CLI for building, maintaining, and running browser automation workflows by inspecting live pages and prototyping interactions.
$ npx skills add cashew-labs/libretto --skill libretto -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install cashew-labs/libretto libretto --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/cashew-labs/libretto.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/libretto .claude/skills/libretto && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "libretto" agent skill from https://github.com/cashew-labs/libretto/tree/main/.agents/skills/libretto into .claude/skills/libretto/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "libretto", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/cashew-labs/libretto/tree/main/.agents/skills/librettoType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add cashew-labs/libretto --skill libretto -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install cashew-labs/libretto libretto --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cashew-labs/libretto.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/libretto .agents/skills/libretto && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "libretto" agent skill from https://github.com/cashew-labs/libretto/tree/main/.agents/skills/libretto into .agents/skills/libretto/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "libretto", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add cashew-labs/libretto --skill libretto -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install cashew-labs/libretto libretto --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cashew-labs/libretto.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/libretto .cursor/skills/libretto && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "libretto" agent skill from https://github.com/cashew-labs/libretto/tree/main/.agents/skills/libretto into .cursor/skills/libretto/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "libretto", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/cashew-labs/libretto.git --path .agents/skills/libretto--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add cashew-labs/libretto --skill libretto -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install cashew-labs/libretto libretto --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cashew-labs/libretto.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/libretto .gemini/skills/libretto && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "libretto" agent skill from https://github.com/cashew-labs/libretto/tree/main/.agents/skills/libretto into .gemini/skills/libretto/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "libretto", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install cashew-labs/libretto librettoInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add cashew-labs/libretto --skill libretto -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/cashew-labs/libretto.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/libretto .github/skills/libretto && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "libretto" agent skill from https://github.com/cashew-labs/libretto/tree/main/.agents/skills/libretto into .github/skills/libretto/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "libretto", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add cashew-labs/libretto --skill libretto -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install cashew-labs/libretto libretto --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cashew-labs/libretto.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/libretto .opencode/skills/libretto && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "libretto" agent skill from https://github.com/cashew-labs/libretto/tree/main/.agents/skills/libretto into .opencode/skills/libretto/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "libretto", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
librettoBrowser automation CLI for building, maintaining, and running browser automation workflows by inspecting live pages and prototyping interactions.
Libretto is an agent skill from cashew-labs/libretto. Browser automation CLI for building, maintaining, and running browser automation workflows by inspecting live pages and prototyping interactions.
Its SKILL.md is about 5.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 9 other files, including reference files (for example `references/action-logs.md`, `references/code-generation-rules.md` and `references/configuration-file-reference.md`).
It sits in Productivity & Automation, covering Browser automation and Prototyping. The repository describes itself as: The AI toolkit for building reliable browser automations. The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 41ab782. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npxjqFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
libretto.shFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Libretto loads about 5.4k tokens when it runs, and up to ~15k if it reads all its reference files. Until then it costs about 39 tokens; SKILL.md has 2,202 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from cashew-labs/libretto at commit 41ab782, republished under its MIT licence (© cashew-labs). 2,202 words, ~5,365 tokens.
.claude/skills/libretto/SKILL.md (or your agent's skills folder). This skill also uses 8 other files; get the full folder from GitHub.Read references/shipped-source-and-documentation.md for shipped source details, published documentation links, and implementation context beyond what this skill file covers.
fetch().references/site-security-review.md (assess only once per site) rules fetch() unsafe, passively capture responses with page.on('response', ...)Mix strategies freely across steps on a site.
Prefer to enter sites at a user-facing URL (homepage, login, etc.) on the first navigation — deep URLs on a cold session are commonly blocked by edge bot protection.
Always declare that entry URL as workflow startUrl. Do not open the same URL again with page.goto at the top of the handler when Libretto launches the browser; Libretto loads startUrl before the handler runs (and before CDP attach on Kernel / cloud providers). run --cdp attaches without navigating, so leave the existing page as-is or navigate inside the handler.
references/code-generation-rules.md for the code shape.npx libretto; pnpm, yarn, and bun projects should use their equivalent package-manager execution form.npx libretto setup for first-time workspace onboarding. It installs Chromium and syncs skills.npx libretto status to inspect open sessions without triggering setup.npx libretto update to upgrade the project-local Libretto package. Use npx libretto update --dry-run to preview the package-manager command first.npx libretto experiments to list internal feature flags and npx libretto experiments describe <name> for usage notes when an experiment is enabled.There are three ways to run workflows:
npx libretto run ./workflow.ts runs workflow code and local Chromium on the current machine. This is easy to watch and private, but most likely to hit CAPTCHAs or anti-bot checks.npx libretto run ./workflow.ts --provider libretto-cloud runs workflow code locally while the browser runs on provider infrastructure with stealth mechanisms. Use this for anti-bot/CAPTCHA issues, provider-specific behavior, and pre-deploy validation. If the user has not specified a provider, prefer libretto-cloud because it includes one free allocated browser-hour and does not require a third-party provider API key.When editing a deployed workflow, validate changes with run --provider <deployment-provider> before redeploying; do not debug by repeatedly deploying and running the deployed job.
If the user prefers a provider for all local CLI runs in a workspace or only deploys workflows to that provider, update .libretto/config.json with provider instead of repeating --provider. Read references/configuration-file-reference.md first.
references/code-generation-rules.md before generating or editing production workflow code. Every generated workflow must set startUrl to the first page the automation needs.LIBRETTO_CLOUD_<secret_name>= entries without overwriting populated values. If any required credential is blank, stop and ask the user to fill it; until then, do not inspect logged-in pages, read authenticated network bodies, write workflow code, open validation sessions, or continue discovery.librettoAuthenticate with declared credentials before validation. Use a reusable *_totp_secret credential for authenticator-app MFA when the portal supports it (not a one-time otp_code). For SMS one-time codes, follow references/website-authentication.md.references/website-authentication.md when you need librettoAuthenticate examples, auth-profile details, or SMS OTP (claimSmsOtp).run on a fresh, unauthenticated session with confirmation of the actual returned output, not just process success. Use the same headed or headless mode that the workflow run is already using.--params, --provider, --headed, or --headless flags the workflow needs. Do not add --auth-profile to run; workflow authProfile metadata controls profile use.exec commands at the same time.libretto-readonly skill and use readonly-exec instead of exec.openexec or snapshot.open at the start of script authoring when you need live page state to decide how the workflow should work.--read-only when you want the session locked for inspection from the moment it is created.npx libretto open https://example.com
npx libretto open https://example.com --provider libretto-cloud --session provider-debug
npx libretto open https://example.com --read-only --session readonly-example
npx libretto open https://example.com --session debug-exampleconnectconnect to attach to any existing Chrome DevTools Protocol (CDP) endpoint — a browser started with --remote-debugging-port, an Electron app, or any other CDP-compatible target.exec, snapshot, pages, and the rest of the session commands follow that session's stored mode.close clears the session but does not terminate the remote process.--read-only if the connected session must stay inspection-only from the start.npx libretto connect http://127.0.0.1:9222 --session my-session
npx libretto connect http://127.0.0.1:9222 --read-only --session readonly-session
npx libretto connect http://127.0.0.1:9223 --session another-sessionsession-modesession-mode to inspect whether an existing session is write-access or read-only.open, run, and connect default new sessions to write-access unless the config sets sessionMode to read-only.--read-only or --write-access to override the config default for a single command.npx libretto session-mode --session my-sessionsnapshotsnapshot as the primary page observation tool.snapshot without --objective or --context; the command prints a screenshot path and compact accessibility tree for the current page.snapshot <ref> to inspect a subtree. Each call captures a fresh screenshot and accessibility tree, then scopes output to that ref. Use ref forms printed in the tree, such as l16; numeric-suffix aliases such as e16 also match l16.npx libretto snapshot --session debug-example
npx libretto snapshot <ref> --session debug-example
npx libretto snapshot --session debug-example --page <page-id>execexec for focused inspection and short-lived interaction experiments.exec to validate selectors, inspect data, or prototype a step before you encode it in the workflow file.exec - to run multi-line scripts from stdin, especially when the code is too long or complex for a command line argument.exec REPL is persistent for each browser session. Define helper functions once and reuse them in later exec calls.page, frame, context, browser, fetch, Buffer.exec failures with try/catch or .catch().exec commands in parallel.exec in read-only diagnosis flows. Use readonly-exec from the libretto-readonly skill for those sessions.--diff-snapshot when you mutate the page and do not know what will change (for example clicking an unfamiliar control). Prefer returning a specific value or running snapshot when you already know what to check.--diff-snapshot, exec skips the before/after compact snapshot work.npx libretto exec "await page.url()"
npx libretto exec "await page.locator('button:has-text(\"Continue\")').click()"
npx libretto exec --diff-snapshot "await page.locator('button:has-text(\"Continue\")').click()"
echo "async function textOf(selector) { return await page.locator(selector).textContent(); }" | npx libretto exec - --session debug-example
npx libretto exec --session debug-example "await textOf('h1')"pagespages when a popup, new tab, or second page appears.exec or snapshot complains about multiple pages, list page ids first and then pass --page.npx libretto pages --session debug-example
npx libretto exec --session debug-example --page <page-id> "await page.url()"runrun to verify a workflow file after creating it or editing it. Use the same headed or headless mode for validation that the workflow run is already using. Plain run defaults to headed mode.references/code-generation-rules.md). run validates --params against that schema before calling the handler and prints a clear field-by-field error if the input doesn't match.--stay-open-on-success when you need to inspect the completed state with pages, snapshot, or exec.--provider <name> when validating behavior in that provider's browser runtime.--cdp <url> to run a workflow against an existing CDP endpoint (Electron or Chrome with --remote-debugging-port). Libretto attaches without navigating to workflow startUrl, preserving the page URL and auth state. Do not pass --provider, --headed, --headless, or --viewport with --cdp. Optional --page page-N selects which discovered page becomes ctx.page.connect + exec / snapshot for interactive exploration of an external CDP browser; use run --cdp once the workflow file is ready.--read-only if the preserved session should come back locked for follow-up terminal inspection after the workflow run.snapshot and exec before editing code.await pause(session) statements in the workflow file when you need to stop at specific states for interactive debugging, like breakpoints in the browser flow.npx libretto resume --session <name>.npx libretto run ./integration.ts --params '{"status":"open"}'
npx libretto run ./integration.ts --provider libretto-cloud
npx libretto run ./integration.ts --cdp http://127.0.0.1:9222
npx libretto run ./integration.ts --cdp http://127.0.0.1:9222 --page page-1
npx libretto run ./integration.ts --read-only
npx libretto run ./integration.ts --stay-open-on-successresumeawait pause("session-name") in the workflow file. Import pause from "libretto".pause(session) is a no-op when NODE_ENV === "production".resume when a workflow hit a pause() call.npx libretto resume --session debug-examplesavesave only when the user explicitly asks to save or reuse authenticated browser state.npx libretto save app.example.comcloseclose when the user is done with the session or an exploration session is no longer helping progress (unless the user asked to keep watching that browser).close --all is available for workspace cleanup.npx libretto close --session debug-example
npx libretto close --allSession state is stored in .libretto/sessions/<session>/state.json.
Session logs are JSONL files at .libretto/sessions/<session>/:
.libretto/sessions/<session>/logs.jsonl..libretto/sessions/<session>/actions.jsonl..libretto/sessions/<session>/network.jsonl and their corresponding raw request/response bodies are in .libretto/sessions/<session>/raw-network/.Use jq to query jsonl logs directly — for any filtering, slicing, or inspection task.
# Last 20 action entries
tail -n 20 .libretto/sessions/<session>/actions.jsonl | jq .
# POST requests with captured response previews
jq 'select(.method == "POST" and .responseBodyPreview != null) | {id, resourceType, status, contentType, url, requestBodyPreview, responseBodyPreview, responseBodyPath}' .libretto/sessions/<session>/network.jsonl
# Read a saved response sidecar
gunzip -c .libretto/sessions/<session>/raw-network/000001.response.json.gz | jq .actions.jsonl)Key fields: ts (ISO timestamp), source (user or agent), action (click, fill, goto, etc.), selector (locator used by the agent), bestSemanticSelector (canonical selector for user DOM events), success (boolean), url (navigation target), value (typed or submitted value), error (message on failure).
Read references/action-logs.md for full field descriptions and user-vs-agent entry semantics.
network.jsonl)Libretto logs useful document, xhr, fetch, and non-noisy mutating requests; obvious static/media/tracking noise is skipped.
Key fields: id (incrementing request id), ts (ISO timestamp), pageId (page target id), method (HTTP method, e.g. GET, POST), url (request URL), resourceType (browser resource type, e.g. document, xhr, fetch), status (HTTP status code, or null for failed requests), statusText (HTTP status text), contentType (response content type), requestHeaders (request headers), responseHeaders (response headers), requestBodyPreview (inline request body preview), requestBodyPath (gzipped full request body sidecar path), requestBodyBytes (request body byte size), requestBodyTruncated (true when the request body exceeded the save limit), requestBodyOmittedReason (why the request body was not captured), responseBodyPreview (inline response body preview), responseBodyPath (gzipped full response body sidecar path), responseBodyBytes (response body byte size), responseBodyTruncated (true when the response body exceeded the save limit), responseBodyOmittedReason (why the response body was not captured), and errorText (request failure or body read error).
<example>
[Context: The user wants to build a new browser workflow and does not yet know the page structure]
Assistant: I'll inspect the real site first if needed, but before I finish I'll create `target-workflow.ts` so the task produces reusable automation code.
Assistant: [Runs `npx libretto open https://target.example.com --headed`]
Assistant: [If sign-in is required, follows the authenticated workflow rules before continuing]
Assistant: [Reads `references/site-security-review.md` before choosing between passive network inspection, direct browser fetch calls, and Playwright-first automation]
Assistant: [Runs `npx libretto snapshot --session <session>`]
Assistant: [Uses `snapshot` and `exec` as needed to understand the site and decide the implementation path]
Assistant: [Reads `references/code-generation-rules.md` before writing production workflow code]
Assistant: I found the working path. I'll now create the workflow file and verify it.
Assistant: [Creates or edits `target-workflow.ts` following `references/code-generation-rules.md`]
Assistant: [Runs `npx libretto run ./target-workflow.ts --params '{"status":"open"}'` on a fresh, unauthenticated session to verify both sign-in and workflow behavior]
Assistant: [If sign-in validation passes and a reusable session is useful, adds an auth profile and reruns validation]
Assistant: Validation passed. Here are the results:
[Shows the output/results from the validation run]
To run it again, use: npx libretto run ./target-workflow.ts --params '{"status":"open"}'
</example><example>
[Context: The user has an existing Libretto workflow that is failing]
Assistant: I'll reproduce the failure first so we can inspect the exact browser state it leaves behind.
Assistant: [Runs `npx libretto run ./integration.ts --session debug-flow`]
Assistant: The workflow failed and Libretto kept the browser open. I'll inspect the page state before changing code.
Assistant: [Runs `npx libretto snapshot --session debug-flow`]
Assistant: [Runs `npx libretto exec --session debug-flow "...focused inspection or prototype..."`]
Assistant: [Reads `references/code-generation-rules.md` before patching the workflow file]
Assistant: I found the issue. I'll patch the workflow code and verify.
Assistant: [Edits `integration.ts` following `references/code-generation-rules.md`]
Assistant: [Runs `npx libretto run ./integration.ts` to validate the fix]
Assistant: Fix verified. Here are the results:
[Shows the output/results from the validation run]
To run it again, use: npx libretto run ./integration.ts
</example>references/configuration-file-reference.md when you need to inspect or change .libretto/config.json for viewport or session defaults.references/site-security-review.md before reviewing the site's security posture and deciding whether to lead with network requests, passive interception, or Playwright DOM automation on a new site.references/code-generation-rules.md before writing or editing production workflow files.references/website-authentication.md when website sign-in implementation or auth-profile behavior is relevant.references/pages-and-page-targeting.md when a session has multiple open pages or you need --page.references/action-logs.md for full action log field descriptions and user-vs-agent event semantics.references/sharing-workflows-externally.md.© cashew-labs, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 8 other files (references) in .agents/skills/libretto of cashew-labs/libretto.
Open the folder on GitHubat commit 41ab782
Libretto next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Libretto this skillcashew-labs/libretto | 904 | — | ~5.4k | Automated safety check: Pass | MIT | |
| Agent Browserquran/quran.com-frontend-next | 1.9k | 40 repos | ~3.3k | Automated safety check: Pass | None | |
| Dev-Browser CLI AutomationSawyerHood/dev-browser | 6.7k | 1 repos | ~455 | Automated safety check: Pass | MIT | |
| Browser Automationopenclaw/openclaw | 392k | — | ~2.9k | Automated safety check: Pass | MIT | |
| Camoufox CLIBin-Huang/camoufox-cli | 350 | 1 repos | ~4.5k | Automated safety check: Pass | MIT | |
| BrowserVibiumDev/vibium | 2.9k | — | ~4.8k | Automated safety check: Pass | Apache-2.0 |
quran/quran.com-frontend-next
Automates browser interactions for web testing, form filling, screenshots, and data extraction.
SawyerHood/dev-browser
Browser automation with persistent named pages via the dev-browser CLI. Use when users ask to navigate websites, fill forms, take screenshots, extract web…
openclaw/openclaw
A skill your agent uses when controlling web pages with the OpenClaw browser tool, especially multi-step flows, login checks, tab management, or recovery from stale refs/timeouts.
Bin-Huang/camoufox-cli
Anti-detect browser automation CLI & Skills for AI agents. An agent skill from Bin-Huang/camoufox-cli.
VibiumDev/vibium
Automate browsers with the Vibium CLI. An agent skill from VibiumDev/vibium.
moeru-ai/airi
Test AIRI display-model imports with agent-browser across stage-tamagotchi Electron, stage-web, and stage-pocket mobile web layouts.
cashew-labs/libretto
Lays out a minimal, iteration-first approach to writing system prompts for LLM agents, with model-specific notes for Claude, GPT, Gemini, and Codex.
cashew-labs/libretto
Works through the review comments on a pull request one by one: fetches the threads, makes the fixes, runs type-check, build and lint, pushes, and resolves the threads.
cashew-labs/libretto
Design rules for command-line tools: subcommand-scoped help, actionable success output, debuggable failures, stable output, meaningful exit codes and a --json mode.
cashew-labs/libretto
Drives desktop Electron apps already installed on your machine, such as Slack, Discord or VS Code, by relaunching them with a debugging port and using the Libretto CLI.
cashew-labs/libretto
Resolves Git merge, rebase and cherry-pick conflicts by reading the PRs behind each side, keeping both intents and asking you when they truly clash.
cashew-labs/libretto
Researches the codebase and relevant docs, asks clarifying questions, then writes a spec sheet in specs/ for a significant feature or complex fix.
Categories
Browser automation CLI for building, maintaining, and running browser automation workflows by inspecting live pages and prototyping interactions. Libretto is an agent skill from cashew-labs/libretto. Browser automation CLI for building, maintaining, and running browser automation workflows by inspecting live pages and prototyping interactions.
Libretto fits situations like: tasks that involve Browser automation; tasks that involve Prototyping.
Run `npx skills add cashew-labs/libretto --skill libretto -a claude-code`. Or copy the skill folder (.agents/skills/libretto in cashew-labs/libretto) into .claude/skills/libretto in your project. Claude Code loads it when a task matches its description.
Run `npx skills add cashew-labs/libretto --skill libretto -a codex`. Or copy the skill folder (.agents/skills/libretto in cashew-labs/libretto) into .agents/skills/libretto in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add cashew-labs/libretto --skill libretto -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/libretto, .gemini/skills/libretto, .github/skills/libretto and .opencode/skills/libretto in your project.
Going by SKILL.md and its folder, Libretto needs the command-line tools its instructions call (npx and jq). Our summary lists: Node.js.
SKILL.md names 1 domain. As links in the text: libretto.sh. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Libretto is published under the MIT licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.4k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 9.7k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Libretto: Agent Browser (quran/quran.com-frontend-next, 1.9k stars), Dev-Browser CLI Automation (SawyerHood/dev-browser, 6.7k stars), Browser Automation (openclaw/openclaw, 392k stars) and Camoufox CLI (Bin-Huang/camoufox-cli, 350 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
cashew-labs (a GitHub organization) maintains it in cashew-labs/libretto, which has 904 GitHub stars. The repository holds 21 skills in this directory. The repository was last updated on August 21, 2026.
Source: cashew-labs/libretto on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.