{"slug":"browser-automation-3","title":"browser-automation","summary":"Imported from alexei-led/cc-thingz/dist/pi/skills/browser-automation.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-10-01T19:35:08.152543Z","repo":{"url":"https://github.com/alexei-led/cc-thingz","stars":36,"forks":5,"license":"MIT","updatedAt":"2026-09-30T10:11:40Z"},"bodyHtml":"<hr>\n<h2>{\"description\":\"Browser automation for rendered UI exploration, validation, screenshots, recordings, and end-to-end flows. Use when a task needs an actual browser or rendered DOM: inspect UI state, click/fill forms, debug frontend behavior, capture evidence, verify a feature, or run/generate browser tests. NOT for API checks or pure logic tests where curl, unit tests, or JSDOM is cheaper.\",\"name\":\"browser-automation\"}</h2>\n\n\n\n<h1>Browser Automation</h1>\n<p>Prove rendered behavior in a real browser and report pass, fail, or blocked with\nevidence. Keep automation temporary unless the user asks for permanent tests.</p>\n<h2>Runtime</h2>\n<p>Use the cheapest runtime that proves the claim:</p>\n<ol>\n<li>Browser tools exposed in the current session. See\n<a href=\"references/platform-browser-tools.md\"><code>references/platform-browser-tools.md</code></a>.</li>\n<li>The project's configured browser runner. Infer the package manager from the\nlockfile; do not invent a runner.</li>\n<li>The bundled Playwright scripts in this skill's <code>scripts/</code> directory. Read\n<a href=\"references/playwright.md\"><code>references/playwright.md</code></a> for setup, the script\nskeleton, helpers, and custom headers.</li>\n<li>None available: report blocked and name the missing tool or package.</li>\n</ol>\n<h2>Rules</h2>\n<ul>\n<li>Target: reuse a reachable dev server; start one only when its command is\nknown. Ask when no server or several servers are found.</li>\n<li>Data: use seeded users, fixed dates, reset state, and mocked external\nservices. Credentials, production data, and destructive actions need explicit\nuser approval.</li>\n<li>Locators: role, label, text, or test id first; CSS last.</li>\n<li>Waiting: wait on observable state such as a selector, URL, network response,\nor accessibility snapshot. Never add fixed sleeps. For SPA or HTMX pages,\nassert the DOM after swaps and client-side route changes.</li>\n<li>Headless: when the platform exposes no visible browser (Pi, CI, most CLIs),\nuse headless screenshots plus a manifest as visual evidence. Use headed mode\nonly when the user can see the browser.</li>\n<li>Files: write generated scripts and artifacts to <code>/tmp/playwright-*</code>. Write to\nthe project only when the user asked for permanent tests, and never write into\nthe skill directory.</li>\n<li>Failures: fix the app or tests only when that is in scope. After two failed\nscoped attempts, save evidence, quote the failing line or UI state, and stop.</li>\n<li>Permanent tests: done when the relevant build/test/lint checks pass on what\nyou changed, or you name each check that did not run and why.</li>\n</ul>\n<h2>Bundled Playwright scripts</h2>\n<p>Run them by absolute path from the caller's working directory, where\n<code>&lt;skill-dir&gt;</code> is the directory that contains this <code>SKILL.md</code>. Prefer the\nscreenshot scripts over custom batch scripts:</p>\n<pre><code>node &lt;skill-dir&gt;/scripts/screenshot-url.js --url &lt;url&gt; --selector &lt;ready-selector&gt; \\\n  --out /tmp/playwright-page.png --json\nnode &lt;skill-dir&gt;/scripts/screenshot-sequence.js --url-template '&lt;url/{n}&gt;' --from 1 --to 10 \\\n  --selector &lt;ready-selector&gt; --out-dir /tmp/playwright-shots --json\nnode &lt;skill-dir&gt;/scripts/run.js --json /tmp/playwright-check.js\n</code></pre>\n<ul>\n<li>Manifests record URL, title, screenshot path, viewport, console errors,\nnetwork failures, and HTTP responses with status &gt;=400.</li>\n<li><code>run.js</code> keeps the caller's working directory and writes its status logs to\nstderr. Pass <code>--json</code> or <code>--quiet</code> whenever stdout must carry only the\nscript's JSON: without them, a first-run Playwright install also writes to\nstdout. Playwright globals such as <code>chromium</code> and <code>helpers</code> stay available when the script also\nuses <code>require(\"fs\")</code> or <code>require(\"path\")</code>.</li>\n</ul>\n<h2>Platform additions</h2>\n<p>No target-specific additions.</p>\n<h2>Output</h2>\n<pre><code>## Browser Automation Result\n\nTarget: &lt;page, feature, or flow&gt;\nRuntime: &lt;built-in browser | project runner | bundled Playwright | blocked&gt;\nActions: &lt;commands or browser actions&gt;\nResult: &lt;pass | fail | blocked&gt;\nEvidence: &lt;screenshot, manifest, or trace paths, or the key observation&gt;\nNext fix: &lt;only when failing or blocked&gt;\n</code></pre>\n<p>Report blocked, not pass, when the check did not run.</p>\n","files":[{"path":"references/platform-browser-tools.md","sizeBytes":907,"isText":true},{"path":"references/playwright.md","sizeBytes":4738,"isText":true},{"path":"scripts/.gitignore","sizeBytes":14,"isText":false},{"path":"scripts/lib/helpers.js","sizeBytes":18633,"isText":true},{"path":"scripts/lib/runtime.js","sizeBytes":2896,"isText":true},{"path":"scripts/lib/screenshot.js","sizeBytes":9128,"isText":true},{"path":"scripts/package.json","sizeBytes":792,"isText":true},{"path":"scripts/run.js","sizeBytes":5617,"isText":true},{"path":"scripts/screenshot-sequence.js","sizeBytes":3619,"isText":true},{"path":"scripts/screenshot-url.js","sizeBytes":3138,"isText":true},{"path":"scripts/setup-runtime.js","sizeBytes":588,"isText":true},{"path":"SKILL.md","sizeBytes":4352,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-10-01T19:36:29.862074Z","sha256":"B59D3DD51ED6B6FC1AADE9E1CECE8A0C558BDACEFF806CBF28D91770049A21BF","sizeBytes":21347},"review":null,"source":{"repositoryUrl":"https://github.com/alexei-led/cc-thingz","path":"dist/pi/skills/browser-automation","license":"MIT","commit":"ce56bb43c7f803a192be038135c5e2bb4cd2249f","subtreeSha":"508AA4949B3D28B5AFD4BC5095284FBF33C8ED6DBE8A899F3C8606E93901BFE8","lastSyncedAt":"2026-10-01T19:34:58.8618Z"},"reviewedAt":"2026-10-01T19:38:38.095328Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/alexei-led/cc-thingz/tree/master/dist/pi/skills/browser-automation"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install alexei-led-cc-thingz@llmmart"},{"target":"git","command":"git clone https://github.com/alexei-led/cc-thingz.git"}]}