{"_id":"@bwanamaker/brandobot","_rev":"7-ccd158c01d898623e633836c94ce3c11","name":"@bwanamaker/brandobot","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@bwanamaker/brandobot","version":"0.1.0","keywords":["opencode","plugin","playwright","browser-automation"],"license":"Apache-2.0","_id":"@bwanamaker/brandobot@0.1.0","maintainers":[{"name":"bwanamaker","email":"hello@brandonwanamaker.com"}],"homepage":"https://github.com/bwanamaker/brandobot#readme","bugs":{"url":"https://github.com/bwanamaker/brandobot/issues"},"dist":{"shasum":"c42e6f449db6464bb204a6aaf0ab01e02053c3d0","tarball":"https://registry.npmjs.org/@bwanamaker/brandobot/-/brandobot-0.1.0.tgz","fileCount":6,"integrity":"sha512-hrUybSj6d6J3OHxgTaAs/osxdUt2m+YPI1qptF1lM1BssHNgQhVr/2b5nTQE+yXf/DrjZD5jOMKVu+AUlPq/vg==","signatures":[{"sig":"MEUCIH/6Kzq9dSV36sjrtxgwSX6z68KaA8f5YVtpf0ILdM/xAiEAvlnrfTJKaZ2eFX4aWro+CxvzEGEUlF8QSEd19k6UACo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37834},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"faf0020c1bdb694f9ca6c99767eb3af7d3cd52ba","scripts":{"test":"bun test","build":"tsc -p tsconfig.json","prepack":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"bwanamaker","email":"hello@brandonwanamaker.com"},"repository":{"url":"git+https://github.com/bwanamaker/brandobot.git","type":"git"},"_npmVersion":"11.19.0","description":"An OpenCode plugin that controls browsers through Playwright CLI.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@playwright/cli":"^0.1.18","@opencode-ai/plugin":"^1.18.25"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"^1.3.9","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/brandobot_0.1.0_1788736261069_0.43069958830633603","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@bwanamaker/brandobot","version":"0.1.1","keywords":["opencode","plugin","playwright","browser-automation"],"license":"Apache-2.0","_id":"@bwanamaker/brandobot@0.1.1","maintainers":[{"name":"bwanamaker","email":"hello@brandonwanamaker.com"}],"homepage":"https://github.com/bwanamaker/brandobot#readme","bugs":{"url":"https://github.com/bwanamaker/brandobot/issues"},"dist":{"shasum":"38d9a291780a66bc6ac87b603e206334946dd0d8","tarball":"https://registry.npmjs.org/@bwanamaker/brandobot/-/brandobot-0.1.1.tgz","fileCount":6,"integrity":"sha512-ANxtGw3CLD9AnAz2duu6/7V2jvSLLDnA0PW13/tACcbLVJQaOsUKHl3T3Qn0n6FSr5dOeQN0Kj+dQztVsyRQ5g==","signatures":[{"sig":"MEYCIQCXvm+V4Bv0iIEqrW7zYXzsGPdv5cN4wZEwCK5hTZvxWwIhAN8hvGWTUyzx3RJZQt0hfyvbFjzABJDKABHdRrc2UkF2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37772},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"81f620b6bd79c357151ba71015bcfff41321652e","scripts":{"test":"bun test","build":"tsc -p tsconfig.json","prepack":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"bwanamaker","email":"hello@brandonwanamaker.com"},"repository":{"url":"git+https://github.com/bwanamaker/brandobot.git","type":"git"},"_npmVersion":"11.19.0","description":"An OpenCode plugin that controls browsers through Playwright CLI.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"@playwright/cli":"^0.1.18","@opencode-ai/plugin":"^1.18.25"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"bun-types":"^1.3.9","typescript":"^5.9.3"},"_npmOperationalInternal":{"tmp":"tmp/brandobot_0.1.1_1789093257502_0.12678548225990482","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bwanamaker/brandobot","version":"0.2.0","keywords":["opencode","plugin","playwright","browser-automation"],"license":"Apache-2.0","_id":"@bwanamaker/brandobot@0.2.0","maintainers":[{"name":"bwanamaker","email":"hello@brandonwanamaker.com"}],"homepage":"https://github.com/bwanamaker/brandobot#readme","bugs":{"url":"https://github.com/bwanamaker/brandobot/issues"},"dist":{"shasum":"68e8595e13afe49d0888f85813851ffc2f6199c8","tarball":"https://registry.npmjs.org/@bwanamaker/brandobot/-/brandobot-0.2.0.tgz","fileCount":6,"integrity":"sha512-IyHYALU2G0WQQryNBou8EQV62pvpq8gcNZuneGfY2htCRr8d6JjGUepNIocIjt5NoTzGlsNXCrIk5mydBWd+kg==","signatures":[{"sig":"MEUCIQCS2wKa/lkuqs5qtB72iEjmP2mtVHrlxTn2y2+C+YIlSgIgF5jdYSFac4J9t3D3WcUsDmvLvICACba7bk03lOHR6Sk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bwanamaker%2fbrandobot@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":37942},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":"^22.22.2 || ^24.15.0 || >=26.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"10ca76c6d90b83901301ddd088829a9c6ec8237c","scripts":{"lint":"eslint .","test":"bun test","build":"tsc -p tsconfig.json","prepack":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"bwanamaker","email":"hello@brandonwanamaker.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:597ad9ef-92ec-4750-8cb2-cc8668946b7e"}},"repository":{"url":"git+https://github.com/bwanamaker/brandobot.git","type":"git"},"_npmVersion":"11.15.0","description":"An OpenCode plugin that controls browsers through Playwright CLI.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@playwright/cli":"^0.1.18","@opencode-ai/plugin":"^1.18.25"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.10.0","globals":"^17.12.0","bun-types":"^1.3.9","@eslint/js":"^10.0.1","typescript":"^5.9.3","typescript-eslint":"^8.70.0"},"_npmOperationalInternal":{"tmp":"tmp/brandobot_0.2.0_1789324239914_0.16634427121029982","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@bwanamaker/brandobot","version":"0.2.1","keywords":["opencode","plugin","playwright","browser-automation"],"license":"Apache-2.0","_id":"@bwanamaker/brandobot@0.2.1","maintainers":[{"name":"bwanamaker","email":"hello@brandonwanamaker.com"}],"homepage":"https://github.com/bwanamaker/brandobot#readme","bugs":{"url":"https://github.com/bwanamaker/brandobot/issues"},"dist":{"shasum":"309e673421b9036c8e99e0af8287578fdb43332a","tarball":"https://registry.npmjs.org/@bwanamaker/brandobot/-/brandobot-0.2.1.tgz","fileCount":6,"integrity":"sha512-hewj6wPN3hCC10RaJhbnz0qDTs3LR6R3sz20mhbfQ5CiloDgZ9WE9kdHPH+PDEmeZhmK1Bo+Lg23IgXJUhiJWA==","signatures":[{"sig":"MEYCIQD+G11n6GKSNexp+FrQX16x+O8BMZlkHbxR+WDfQ5Wz1wIhAMFYzUEpd3AYUUrhJ7Wnt+w4KkoHUwFRBSk0g9BCPxCr","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bwanamaker%2fbrandobot@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":37953},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":"^22.22.2 || ^24.15.0 || >=26.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"952fe79b99325a8929b2d21bf282179e7a4b29f6","scripts":{"lint":"eslint .","test":"bun test","build":"tsc -p tsconfig.json","prepack":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"bwanamaker","email":"hello@brandonwanamaker.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:597ad9ef-92ec-4750-8cb2-cc8668946b7e"}},"repository":{"url":"git+https://github.com/bwanamaker/brandobot.git","type":"git"},"_npmVersion":"11.15.0","description":"An OpenCode plugin that controls browsers through Playwright CLI.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@playwright/cli":"^0.1.18","@opencode-ai/plugin":"^1.18.25"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.10.0","globals":"^17.12.0","bun-types":"^1.3.9","@eslint/js":"^10.0.1","typescript":"^5.9.3","typescript-eslint":"^8.70.0"},"_npmOperationalInternal":{"tmp":"tmp/brandobot_0.2.1_1789335524181_0.8922845295902762","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@bwanamaker/brandobot","version":"0.3.0","keywords":["opencode","plugin","playwright","browser-automation"],"license":"Apache-2.0","_id":"@bwanamaker/brandobot@0.3.0","maintainers":[{"name":"bwanamaker","email":"hello@brandonwanamaker.com"}],"homepage":"https://github.com/bwanamaker/brandobot#readme","bugs":{"url":"https://github.com/bwanamaker/brandobot/issues"},"dist":{"shasum":"1f56b98c8f1c752ad3ebfd2ca23dfb6958786e55","tarball":"https://registry.npmjs.org/@bwanamaker/brandobot/-/brandobot-0.3.0.tgz","fileCount":6,"integrity":"sha512-CCIYLes08HkkSUV41tllttcxmcP34dObRWsuVhazsczZ3zeRKN4yo+qT29OGQ6QOKoCnUBJA4y9jASVXqfnFeA==","signatures":[{"sig":"MEUCIHKvPHDsisbAr2RjgGi2KW+3T3UbBIJ+AHf9nhm2dDPNAiEA5y2oRuV2KMENGcHoacVAZjWDr+XarORr4f4mWeiXqN4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bwanamaker%2fbrandobot@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":91967},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":"^22.22.2 || ^24.15.0 || >=26.0.0","opencode":">=1.18.25"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"02cfcf5cfaf43ca2decc52361fd63105171c44c9","scripts":{"lint":"eslint .","test":"bun test","build":"tsc -p tsconfig.json","prepack":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"bwanamaker","email":"hello@brandonwanamaker.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:597ad9ef-92ec-4750-8cb2-cc8668946b7e"}},"repository":{"url":"git+https://github.com/bwanamaker/brandobot.git","type":"git"},"_npmVersion":"11.15.0","description":"An OpenCode plugin that controls browsers through Playwright CLI.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@playwright/cli":"0.1.18","@playwright/test":"1.63.0-alpha-2026-08-05","@opencode-ai/plugin":"^1.18.25"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.10.0","globals":"^17.12.0","bun-types":"^1.3.9","@eslint/js":"^10.0.1","typescript":"^5.9.3","typescript-eslint":"^8.70.0"},"_npmOperationalInternal":{"tmp":"tmp/brandobot_0.3.0_1789862101023_0.8572406996837008","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@bwanamaker/brandobot","version":"0.3.1","keywords":["opencode","plugin","playwright","browser-automation"],"license":"Apache-2.0","_id":"@bwanamaker/brandobot@0.3.1","maintainers":[{"name":"bwanamaker","email":"hello@brandonwanamaker.com"}],"homepage":"https://github.com/bwanamaker/brandobot#readme","bugs":{"url":"https://github.com/bwanamaker/brandobot/issues"},"dist":{"shasum":"68e507a23b4bd78e1cc20c5b9d1dbf2eff11d898","tarball":"https://registry.npmjs.org/@bwanamaker/brandobot/-/brandobot-0.3.1.tgz","fileCount":6,"integrity":"sha512-AtwVRUA2JRGv4VvNo7e1CRNl4rFZJC/VjUIfUVSrYgCu+ixMh96B+IOuOlkpkZRBpLX0SaSxr8q6yZ0sK4t2KQ==","signatures":[{"sig":"MEUCIFJgGcENUJksbTcYNP6sSyIrwsFHHOZ/VQxmlZgxuUS9AiEA/AGoC515mSPyFMyn6r+NA4+BZPDG2Q2VpN0nqUXfZCM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bwanamaker%2fbrandobot@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":91967},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":"^22.22.2 || ^24.15.0 || >=26.0.0","opencode":">=1.18.25"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"gitHead":"22fb1917f3ba7431c1f7974c06a947c5fe57d068","scripts":{"lint":"eslint .","test":"bun test","build":"tsc -p tsconfig.json","prepack":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"bwanamaker","email":"hello@brandonwanamaker.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:597ad9ef-92ec-4750-8cb2-cc8668946b7e"}},"repository":{"url":"git+https://github.com/bwanamaker/brandobot.git","type":"git"},"_npmVersion":"11.15.0","description":"An OpenCode plugin that controls browsers through Playwright CLI.","directories":{},"_nodeVersion":"24.15.0","dependencies":{"@playwright/cli":"0.1.18","@playwright/test":"1.63.0-alpha-2026-08-05","@opencode-ai/plugin":"^1.18.25"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.10.0","globals":"^17.12.0","bun-types":"^1.3.9","@eslint/js":"^10.0.1","typescript":"^5.9.3","typescript-eslint":"^8.70.0"},"_npmOperationalInternal":{"tmp":"tmp/brandobot_0.3.1_1790553275335_0.2998631700965382","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"pi":{"extensions":["./dist/pi.js"]},"_id":"@bwanamaker/brandobot@0.4.0","bugs":{"url":"https://github.com/bwanamaker/brandobot/issues"},"dist":{"shasum":"aecfb861ea8f849b7106fa2e1532bc3309004ff1","tarball":"https://registry.npmjs.org/@bwanamaker/brandobot/-/brandobot-0.4.0.tgz","integrity":"sha512-IHYyfSrpNI0fg+L0o5G2kAJbkJlMLV7yPyAbgPM4ilELVKSyZx5cZSbdthpL4Lx/gBz5yKFIVv2u9wNJOvNDjg==","fileCount":15,"unpackedSize":102121,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bwanamaker%2fbrandobot@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCtH/RjlVxI/dhfRkQsvfEAALfd+PxArHqOVa542pSSPgIhAL5rhTYRVxvEW3SDTmreCGpgEolDsJAnaFHGrpvnLKjw"}]},"main":"./dist/index.js","name":"@bwanamaker/brandobot","type":"module","types":"./dist/index.d.ts","engines":{"node":"^22.22.2 || ^24.15.0 || >=26.0.0","opencode":">=1.18.25"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./pi":{"types":"./dist/pi.d.ts","default":"./dist/pi.js"}},"gitHead":"d52f6a5ecd58f0c73722959afec1e4480be784e9","license":"Apache-2.0","scripts":{"lint":"eslint .","test":"bun test && npm run test:pi","build":"tsc -p tsconfig.json","prepack":"npm run build","test:pi":"npm run build && node --test test/pi-node.mjs","typecheck":"tsc -p tsconfig.json --noEmit"},"version":"0.4.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"597ad9ef-92ec-4750-8cb2-cc8668946b7e"},"approver":{"name":"bwanamaker","email":"hello@brandonwanamaker.com"}},"homepage":"https://github.com/bwanamaker/brandobot#readme","keywords":["opencode","pi-package","plugin","playwright","browser-automation"],"repository":{"url":"git+https://github.com/bwanamaker/brandobot.git","type":"git"},"_npmVersion":"11.15.0","description":"Browser automation for OpenCode and Pi through Playwright CLI.","directories":{},"maintainers":[{"name":"bwanamaker","email":"hello@brandonwanamaker.com"}],"_nodeVersion":"24.15.0","dependencies":{"@playwright/cli":"0.1.18","@playwright/test":"1.63.0-alpha-2026-08-05","@opencode-ai/plugin":"^1.18.25"},"publishConfig":{"access":"public"},"devDependencies":{"eslint":"^10.10.0","globals":"^17.12.0","typebox":"^1.3.27","bun-types":"^1.3.9","@eslint/js":"^10.0.1","typescript":"^5.9.3","typescript-eslint":"^8.70.0","@earendil-works/pi-coding-agent":"^0.87.1"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"peerDependenciesMeta":{"typebox":{"optional":true},"@earendil-works/pi-coding-agent":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/brandobot_0.4.0_1790739330440_0.3816506782784985"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-06T23:11:00.844Z","modified":"2026-09-30T03:35:30.812Z","0.1.0":"2026-09-06T23:11:01.211Z","0.1.1":"2026-09-11T02:20:57.630Z","0.2.0":"2026-09-13T18:30:40.023Z","0.2.1":"2026-09-13T21:38:44.275Z","0.3.0":"2026-09-19T23:55:01.102Z","0.3.1":"2026-09-27T23:54:35.424Z","0.4.0":"2026-09-30T03:35:30.541Z"},"bugs":{"url":"https://github.com/bwanamaker/brandobot/issues"},"license":"Apache-2.0","homepage":"https://github.com/bwanamaker/brandobot#readme","keywords":["opencode","pi-package","plugin","playwright","browser-automation"],"repository":{"url":"git+https://github.com/bwanamaker/brandobot.git","type":"git"},"description":"Browser automation for OpenCode and Pi through Playwright CLI.","maintainers":[{"name":"bwanamaker","email":"hello@brandonwanamaker.com"}],"readme":"# @bwanamaker/brandobot\n\nBrowser automation for [OpenCode](https://opencode.ai) and the [Pi coding agent](https://pi.dev), powered by [Playwright CLI](https://playwright.dev/agent-cli/introduction).\n\nView the [NPM](https://www.npmjs.com/package/@bwanamaker/brandobot) package.\n\n## Install\n\n### OpenCode\n\nAdd the published package to your OpenCode configuration:\n\n```json\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"plugin\": [\"@bwanamaker/brandobot\"]\n}\n```\n\nRestart OpenCode after changing its configuration. OpenCode installs the package and its Playwright CLI dependency when it starts.\n\n### Pi\n\nInstall the package with Pi:\n\n```bash\npi install npm:@bwanamaker/brandobot\n```\n\nRun `/reload` in an existing Pi session or restart Pi. Brandobot registers `open_url`, `browser`, and `run_ui_test` and adds Pi-specific tool guidance. Browser sessions and optional labels are scoped to the current Pi session, including after switching or forking sessions.\n\nTo install from a local checkout, build the extension and add the checkout as a project package:\n\n```bash\nbun install\nbun run build\npi install -l .\n```\n\nPi records the package in `.pi/settings.json` and loads it after you grant project trust. Run `/reload` in an existing session or restart Pi after building changes. To load the built extension for one run without adding it to settings, use `pi --extension ./dist/pi.js`.\n\nThe Pi extension runs on Node.js; Bun is only needed for development. Compatibility is checked against `@earendil-works/pi-coding-agent` 0.87.1. Pi supplies its own extension API and TypeBox runtime.\n\n### Runtime requirements\n\nNode.js `^22.22.2 || ^24.15.0 || >=26.0.0` is required. Brandobot downloads managed Chromium before a Chromium browser operation or temporary UI test needs it. Chromium installation is shared across requests, so cancelling one request does not cancel an already-started download. On Linux, install missing system browser dependencies separately; Brandobot does not run privileged dependency installation. The browser CLI defaults to a system Chrome installation, so pass `--browser=chromium` to use managed Chromium.\n\n## Choosing Tools\n\nBrandobot guides the agent to select the appropriate tool:\n\n| Request | Tool |\n| --- | --- |\n| Open a URL in the host's browser | `open_url` |\n| Test, inspect, navigate, interact with, or screenshot a page | `browser` |\n| Run a temporary Playwright Test check | `run_ui_test` |\n| Read, summarize, or extract content from a URL | OpenCode `webfetch`, or an available fetch tool / `curl` in Pi |\n\nUse `open_url` only when explicitly asked to open an `http` or `https` URL in the host's default browser. For mixed or unclear requests, Brandobot asks a short clarifying question.\n\n## Browser Tool\n\nThe plugin adds a `browser` tool with these arguments:\n\n| Argument | Required | Description |\n| --- | --- | --- |\n| `args` | Yes | Each token after `playwright-cli`; do not include the executable name. |\n| `session` | No | A labeled browser isolated to the current conversation. |\n\nUse the tool in the same order as the CLI. Start with `open --browser=chromium`, call `snapshot` when you need element refs, refresh the snapshot after page-changing actions, and close the session when finished. The `type` command writes to the focused field; use snapshot refs for targeted actions such as `click`. Browser sessions are isolated automatically for each conversation in either host. Set `session` to create a separate labeled browser within that same conversation; labels never share state across conversations. Attaching to an existing browser, persistent profiles, external endpoints, and custom Playwright configuration are not supported.\n\n```text\nbrowser({ args: [\"open\", \"https://demo.playwright.dev/todomvc\", \"--browser=chromium\"] })\nbrowser({ args: [\"snapshot\"] })\nbrowser({ args: [\"type\", \"Buy groceries\"] })\nbrowser({ args: [\"press\", \"Enter\"] })\nbrowser({ args: [\"snapshot\"] })\nbrowser({ args: [\"screenshot\", \"--filename\", \"artifacts/todo.png\"] })\nbrowser({ args: [\"close\"] })\n```\n\nScreenshot and video filenames receive a UTC timestamp automatically, such as `artifacts/todo-20260905-203834123.png`, to prevent overwriting prior captures.\n\nIf a capture has no destination directory, the agent asks where to save it. OpenCode uses its `question` tool; Pi asks in the conversation. An `artifacts/ (Always)` choice applies to the current conversation.\n\nLabeled sessions retain their own browser, navigation history, cookies, and storage between tool calls within the current conversation:\n\n```text\nbrowser({ session: \"admin\", args: [\"open\", \"https://example.com\", \"--browser=chromium\"] })\nbrowser({ session: \"admin\", args: [\"goto\", \"/settings\"] })\nbrowser({ session: \"admin\", args: [\"close\"] })\n```\n\nThe browser runs headlessly by default. Pass `--headed` to `open` to display it. Brandobot uses an isolated Playwright configuration and temporary per-session internal output for browser launches.\n\n## Ephemeral UI Tests\n\n`run_ui_test` runs a complete TypeScript Playwright Test spec with Brandobot's bundled `@playwright/test`. Brandobot writes its spec, runner configuration, and evidence only to an OS temporary directory; no project files, dependencies, or CI configuration are changed by the plugin.\n\n```text\nrun_ui_test({ source: 'import { expect, test } from \"@playwright/test\"; test(\"home page\", async ({ page }) => { await page.goto(\"https://example.com\"); await expect(page).toHaveTitle(/Example Domain/); });' })\n```\n\nThe result includes test counts, diagnostics, and temporary trace, screenshot, or video paths. It is Brandobot-only evidence. To save a regression test, ask the agent to write it using the target project's own test conventions and runner.\n\nThe supplied source is local code execution with the host process's machine access. In OpenCode, require approval for the tool when that boundary matters:\n\n```json\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"permission\": {\n    \"run_ui_test\": \"ask\"\n  }\n}\n```\n\nTo require approval before browser operations, configure the OpenCode permission by tool name:\n\n```json\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"permission\": {\n    \"browser\": \"ask\",\n    \"open_url\": \"ask\"\n  }\n}\n```\n\n## Development\n\n```bash\nbun install\nbun run typecheck\nbun run test\nbun run build\n```\n\nThe tests exercise the OpenCode tools and load the built Pi extension under Node.js, including CLI execution, validation, session isolation, cancellation, and temporary test results. They do not launch or download a browser. `bun run test:pi` runs the Node.js compatibility checks separately.\n","readmeFilename":"README.md"}