{"_id":"opendevbrowser","_rev":"17-4d858d345fab31829f77adbb79c5e877","name":"opendevbrowser","dist-tags":{"latest":"0.0.28"},"versions":{"0.0.10":{"name":"opendevbrowser","version":"0.0.10","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome"],"license":"MIT","_id":"opendevbrowser@0.0.10","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"51b775f10a722c411d5bb0314635822a40b3a1ec","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.10.tgz","fileCount":34,"integrity":"sha512-OCw4N7bB5iqsvcFpLmh/jbC22Pypc7uIpqlMJ3H1RHwL0QKEZ7CwQWOrPAq7zVDa9sWJNDmZREEJy56q2jTMIQ==","signatures":[{"sig":"MEQCIDQXojrj42aSLVE1qApZlUZHEVyidMQr/fdi173R8zSnAiBaQBGJSrqbUQ5HOmT4jlp3Du0UV8iWcIAiS1qhBwUoTg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":833094},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"8cca58b7162d5b159e7110d613a7a0eae661a691","scripts":{"dev":"tsup src/index.ts src/cli/index.ts --format esm --dts --watch","lint":"eslint \"{src,tests}/**/*.ts\"","test":"vitest run --coverage","build":"tsup src/index.ts src/cli/index.ts --format esm --dts --clean --sourcemap && node --input-type=module -e \"import { copyFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nconst dist = resolve('dist');\nconst pairs = [\n  ['index.js', 'opendevbrowser.js'],\n  ['index.js.map', 'opendevbrowser.js.map'],\n  ['index.d.ts', 'opendevbrowser.d.ts'],\n  ['index.d.ts.map', 'opendevbrowser.d.ts.map'],\n];\nfor (const [src, dst] of pairs) {\n  const from = resolve(dist, src);\n  const to = resolve(dist, dst);\n  if (existsSync(from)) copyFileSync(from, to);\n}\"","prepack":"npm run build && npm run extension:build","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && tsc -p extension/tsconfig.json"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.2","description":"OpenCode plugin for browser automation via CDP with snapshot-refs-actions workflow","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ws":"^8.17.1","zod":"^3.23.8","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.49.1","@opencode-ai/plugin":"^1.0.203","@puppeteer/browsers":"^2.2.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.12.0","vitest":"^4.0.16","@types/ws":"^8.18.1","happy-dom":"^20.0.11","typescript":"^5.9.3","@types/node":"^20.19.27","@types/chrome":"^0.0.270","@vitest/coverage-v8":"^4.0.16","@typescript-eslint/parser":"^8.9.0","@typescript-eslint/eslint-plugin":"^8.9.0"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.10_1767379188913_0.4916235836490337","host":"s3://npm-registry-packages-npm-production"}},"0.0.11":{"name":"opendevbrowser","version":"0.0.11","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome"],"license":"MIT","_id":"opendevbrowser@0.0.11","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"83089be2a6bf1399e1f7ac6fd36d364520888075","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.11.tgz","fileCount":34,"integrity":"sha512-q+CENJ7ZH2pjuW5TvcmXb+bhTk4zEYG/Q6/DPQ6H653nLKRKLCKpTPDq1mHCCPZl83lqhhbBRP8UHWyOmFLPCQ==","signatures":[{"sig":"MEUCIHeSGXlvxwVFufdXEZwv2hhPG8/dj+qcoMK3WXhO6PQMAiEA7yEC/XhDZ+E/2VHrvSafMvYQDrkp3Bc2eOgZKhownE8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":859788},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"cc89f83473c97606147f0131626ea76ea016dafe","scripts":{"dev":"tsup src/index.ts src/cli/index.ts --format esm --dts --watch","lint":"eslint \"{src,tests}/**/*.ts\"","test":"vitest run --coverage","build":"tsup src/index.ts src/cli/index.ts --format esm --dts --clean --sourcemap && node --input-type=module -e \"import { copyFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nconst dist = resolve('dist');\nconst pairs = [\n  ['index.js', 'opendevbrowser.js'],\n  ['index.js.map', 'opendevbrowser.js.map'],\n  ['index.d.ts', 'opendevbrowser.d.ts'],\n  ['index.d.ts.map', 'opendevbrowser.d.ts.map'],\n];\nfor (const [src, dst] of pairs) {\n  const from = resolve(dist, src);\n  const to = resolve(dist, dst);\n  if (existsSync(from)) copyFileSync(from, to);\n}\"","prepack":"npm run version:check && npm run build && npm run extension:build","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && tsc -p extension/tsconfig.json"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.2","description":"OpenCode plugin for browser automation via CDP with snapshot-refs-actions workflow","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ws":"^8.17.1","zod":"^3.23.8","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.49.1","@opencode-ai/plugin":"^1.0.203","@puppeteer/browsers":"^2.2.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.12.0","vitest":"^4.0.16","@types/ws":"^8.18.1","happy-dom":"^20.0.11","typescript":"^5.9.3","@types/node":"^20.19.27","@types/chrome":"^0.0.270","@vitest/coverage-v8":"^4.0.16","@typescript-eslint/parser":"^8.9.0","@typescript-eslint/eslint-plugin":"^8.9.0"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.11_1767389958364_0.3357795677819293","host":"s3://npm-registry-packages-npm-production"}},"0.0.12":{"name":"opendevbrowser","version":"0.0.12","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome"],"license":"MIT","_id":"opendevbrowser@0.0.12","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"4f208031772c0b55b9287862715da3a6d56a1fde","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.12.tgz","fileCount":34,"integrity":"sha512-54l0MeFaV5Fd9ohrUpRRTswMweM68x9UdR2dHH2l2a8ioZv0+oSqQKjtGVPcUQCwIQOlmrFLLc1lq4drzRf5lw==","signatures":[{"sig":"MEUCIElD48vfgWVBQMiwpqRkYRxjkn2rzV8yMIoYxhdwegKVAiEA4BreaLv6YBkjMnDBXpMKRkCH10jtyeKbut2s8s7gyuw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":778487},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"7756dee17d0b6c14347402d2b602e6863830a220","scripts":{"dev":"tsup src/index.ts src/cli/index.ts --format esm --dts --watch","lint":"eslint \"{src,tests}/**/*.ts\"","test":"vitest run --coverage","build":"tsup src/index.ts src/cli/index.ts --format esm --dts --clean --sourcemap && node --input-type=module -e \"import { copyFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nconst dist = resolve('dist');\nconst pairs = [\n  ['index.js', 'opendevbrowser.js'],\n  ['index.js.map', 'opendevbrowser.js.map'],\n  ['index.d.ts', 'opendevbrowser.d.ts'],\n  ['index.d.ts.map', 'opendevbrowser.d.ts.map'],\n];\nfor (const [src, dst] of pairs) {\n  const from = resolve(dist, src);\n  const to = resolve(dist, dst);\n  if (existsSync(from)) copyFileSync(from, to);\n}\"","prepack":"npm run version:check && npm run build && npm run extension:build","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && tsc -p extension/tsconfig.json"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.2","description":"OpenCode plugin for browser automation via CDP with snapshot-refs-actions workflow","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ws":"^8.17.1","zod":"^3.23.8","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.49.1","@opencode-ai/plugin":"^1.0.203","@puppeteer/browsers":"^2.2.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.12.0","vitest":"^4.0.16","@types/ws":"^8.18.1","happy-dom":"^20.0.11","typescript":"^5.9.3","@types/node":"^20.19.27","@types/chrome":"^0.0.270","@vitest/coverage-v8":"^4.0.16","@typescript-eslint/parser":"^8.9.0","@typescript-eslint/eslint-plugin":"^8.9.0"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.12_1768183051400_0.12180680329804527","host":"s3://npm-registry-packages-npm-production"}},"0.0.15":{"name":"opendevbrowser","version":"0.0.15","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome"],"license":"MIT","_id":"opendevbrowser@0.0.15","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"8a0ca09e66dbebcf430770e65e335de086215719","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.15.tgz","fileCount":47,"integrity":"sha512-M7RtK2DMFqyJgEETgOvQPggoBnpzkEqZ7Ew7tUEZTBJ5hBl+GFmH6HLhKi/vwQDFw5okoD1fsbFK32Zzzi2bkw==","signatures":[{"sig":"MEUCIQDQcDZvWYDostTXWpWY5Sggo+9LoGytSMydpHGDPt0cBQIgNsgIiuKvstkCF5e3NhsQPxNPU0YZ7zBXBu9w/CVmoe4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1866811},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"408ea5ae3c59dd873e0a50ddc440925a45852fa0","scripts":{"dev":"tsup src/index.ts src/cli/index.ts --format esm --dts --watch","lint":"eslint \"{src,tests}/**/*.ts\"","test":"vitest run --coverage","build":"tsup src/index.ts src/cli/index.ts --format esm --dts --clean --sourcemap && node --input-type=module -e \"import { copyFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nconst dist = resolve('dist');\nconst pairs = [\n  ['index.js', 'opendevbrowser.js'],\n  ['index.js.map', 'opendevbrowser.js.map'],\n  ['index.d.ts', 'opendevbrowser.d.ts'],\n  ['index.d.ts.map', 'opendevbrowser.d.ts.map'],\n];\nfor (const [src, dst] of pairs) {\n  const from = resolve(dist, src);\n  const to = resolve(dist, dst);\n  if (existsSync(from)) copyFileSync(from, to);\n}\"","prepack":"npm run version:check && npm run build && npm run extension:build","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.2","description":"OpenCode plugin for browser automation via CDP with snapshot-refs-actions workflow","directories":{},"_nodeVersion":"22.14.0","dependencies":{"ws":"^8.17.1","zod":"^3.23.8","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.49.1","@opencode-ai/plugin":"^1.0.203","@puppeteer/browsers":"^2.2.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.12.0","vitest":"^4.0.16","@types/ws":"^8.18.1","happy-dom":"^20.0.11","typescript":"^5.9.3","@types/node":"^20.19.27","@types/chrome":"^0.0.270","@vitest/coverage-v8":"^4.0.16","@typescript-eslint/parser":"^8.9.0","@typescript-eslint/eslint-plugin":"^8.9.0"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.15_1770605548540_0.25668468882718676","host":"s3://npm-registry-packages-npm-production"}},"0.0.16":{"name":"opendevbrowser","version":"0.0.16","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome"],"license":"MIT","_id":"opendevbrowser@0.0.16","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"589d35755e3528edbbeb7bd9c604febb8ed038f8","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.16.tgz","fileCount":579,"integrity":"sha512-39QiLEAk4nok5omL/SQJG7rxqBsEcX5zdwkP5aUp1GO0eMwTVx2MHV5697Kaa7WDKcff/Rd4GShwyRJMmkjsHA==","signatures":[{"sig":"MEYCIQCAaIVR8o1Zr4SUshkFvum32gMMbx0GCXLFlmEqOi4A/AIhAJMS5AHZHE58DXkHfpRV/drNgxDZwCf0FG9bI8OEMZ7g","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":4033093},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"6ba6677636c745b32e3cd6da96e59bafcea4c14e","scripts":{"dev":"tsup src/index.ts src/cli/index.ts --format esm --dts --watch","lint":"eslint \"src/**/*.ts\" \"tests/**/*.ts\"","test":"vitest run --coverage","build":"tsup src/index.ts src/cli/index.ts --format esm --clean --sourcemap && tsc --emitDeclarationOnly --declaration --declarationMap -p tsconfig.json && node --input-type=module -e \"import { copyFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nconst dist = resolve('dist');\nconst pairs = [\n  ['index.js', 'opendevbrowser.js'],\n  ['index.js.map', 'opendevbrowser.js.map'],\n  ['index.d.ts', 'opendevbrowser.d.ts'],\n  ['index.d.ts.map', 'opendevbrowser.d.ts.map'],\n];\nfor (const [src, dst] of pairs) {\n  const from = resolve(dist, src);\n  const to = resolve(dist, dst);\n  if (existsSync(from)) copyFileSync(from, to);\n}\"","prepack":"npm run version:check && npm run build && npm run extension:build","typecheck":"tsc --noEmit -p tsconfig.json","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs","extension:store":"node scripts/chrome-store-publish.mjs","test:release-gate":"node scripts/release-gate-test-groups.mjs","test:release-gate:g1":"node scripts/release-gate-test-groups.mjs --group 1","test:release-gate:g2":"node scripts/release-gate-test-groups.mjs --group 2","test:release-gate:g3":"node scripts/release-gate-test-groups.mjs --group 3","test:release-gate:g4":"node scripts/release-gate-test-groups.mjs --group 4","test:release-gate:g5":"node scripts/release-gate-test-groups.mjs --group 5"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.4","description":"OpenCode plugin for browser automation via CDP with snapshot-refs-actions workflow","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.19.0","zod":"^3.25.76","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.58.2","@opencode-ai/plugin":"^1.2.11","@puppeteer/browsers":"^2.13.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.3","vitest":"^4.0.18","@types/ws":"^8.18.1","happy-dom":"^20.7.0","typescript":"^5.9.3","@types/node":"^20.19.35","@types/chrome":"^0.1.37","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.56.1","@typescript-eslint/eslint-plugin":"^8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.16_1772334853382_0.4970301567515112","host":"s3://npm-registry-packages-npm-production"}},"0.0.17":{"name":"opendevbrowser","version":"0.0.17","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome"],"license":"MIT","_id":"opendevbrowser@0.0.17","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"d42a1d285fe0d10e742028bc473ecef2731e1539","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.17.tgz","fileCount":649,"integrity":"sha512-zwpsxEHG3NQ2bBx2TUEpl7xrmQeEIdp/L8QLdZBrjsHLBgUeag5grT4l/GxpXiW/trJORFmUBGBt0pfknr6Chg==","signatures":[{"sig":"MEYCIQCYxsQaY+FCOAgqlOhf03sj4ZwhFJxXUeSq6ksJFkIQ+gIhAPzlaInG0Z4mDmYh0rfUIOvz6cAQcy3kjzVFJL0CPA+R","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5168009},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"scripts":{"dev":"tsup src/index.ts src/cli/index.ts --format esm --dts --watch","lint":"eslint \"src/**/*.ts\" \"tests/**/*.ts\"","test":"node --input-type=module -e \"import { mkdirSync } from 'node:fs'; mkdirSync('coverage/.tmp', { recursive: true });\" && vitest run --coverage","build":"tsup src/index.ts src/cli/index.ts --format esm --clean --sourcemap && tsc --emitDeclarationOnly --declaration --declarationMap -p tsconfig.json && node --input-type=module -e \"import { copyFileSync, existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\nconst dist = resolve('dist');\nconst pairs = [\n  ['index.js', 'opendevbrowser.js'],\n  ['index.js.map', 'opendevbrowser.js.map'],\n  ['index.d.ts', 'opendevbrowser.d.ts'],\n  ['index.d.ts.map', 'opendevbrowser.d.ts.map'],\n];\nfor (const [src, dst] of pairs) {\n  const from = resolve(dist, src);\n  const to = resolve(dist, dst);\n  if (existsSync(from)) copyFileSync(from, to);\n}\"","prepack":"npm run version:check && npm run build && npm run extension:build","typecheck":"tsc --noEmit -p tsconfig.json","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html canvas.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs","extension:store":"node scripts/chrome-store-publish.mjs","test:release-gate":"node scripts/release-gate-test-groups.mjs","test:release-gate:g1":"node scripts/release-gate-test-groups.mjs --group 1","test:release-gate:g2":"node scripts/release-gate-test-groups.mjs --group 2","test:release-gate:g3":"node scripts/release-gate-test-groups.mjs --group 3","test:release-gate:g4":"node scripts/release-gate-test-groups.mjs --group 4","test:release-gate:g5":"node scripts/release-gate-test-groups.mjs --group 5"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.4","description":"OpenCode plugin for browser automation via CDP with snapshot-refs-actions workflow","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.19.0","yjs":"^13.6.29","zod":"^3.25.76","typescript":"^5.9.3","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.58.2","@opencode-ai/plugin":"^1.2.11","@puppeteer/browsers":"^2.13.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.3","vitest":"^4.0.18","@types/ws":"^8.18.1","happy-dom":"^20.7.0","@types/node":"^20.19.35","@types/chrome":"^0.1.37","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.56.1","@typescript-eslint/eslint-plugin":"^8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.17_1773455670123_0.7448235243312462","host":"s3://npm-registry-packages-npm-production"}},"0.0.18":{"name":"opendevbrowser","version":"0.0.18","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome","annotation","design-canvas","screencast","desktop-observation","browser-replay","computer-use","challenge-automation"],"license":"MIT","_id":"opendevbrowser@0.0.18","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"9860b7ad5ca383684d922459df22a399b5f2b4a1","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.18.tgz","fileCount":919,"integrity":"sha512-NqRo2lHhkDzzr2aWHVCZODLIPi+VwggwTw1IPpzs8UVuF1SGcp1zwtv4dG6lQ2NSwoqkvOjErS5pF58PoTCg1w==","signatures":[{"sig":"MEYCIQD0AIs3KjN6xiSygwqEPMSdxQEljceaY5wC9OkDSn8VigIhANdCQx00IQNP6Z0pMA9KWRQuhIxWMrs3MFNILV8i0Jnc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9061123},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"scripts":{"dev":"tsup src/index.ts src/cli/index.ts src/skills/skill-loader.ts --format esm --dts --watch","lint":"eslint \"src/**/*.ts\" \"tests/**/*.ts\"","test":"node scripts/run-vitest-coverage.mjs","build":"tsup src/index.ts src/cli/index.ts src/skills/skill-loader.ts --format esm --clean --sourcemap && tsc --emitDeclarationOnly --declaration --declarationMap -p tsconfig.json && node scripts/postbuild-dist.mjs","prepack":"npm run version:check && npm run build && npm run extension:build","typecheck":"tsc --noEmit -p tsconfig.json","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html canvas.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs","extension:store":"node scripts/chrome-store-publish.mjs","test:release-gate":"node scripts/release-gate-test-groups.mjs","test:release-gate:g1":"node scripts/release-gate-test-groups.mjs --group 1","test:release-gate:g2":"node scripts/release-gate-test-groups.mjs --group 2","test:release-gate:g3":"node scripts/release-gate-test-groups.mjs --group 3","test:release-gate:g4":"node scripts/release-gate-test-groups.mjs --group 4","test:release-gate:g5":"node scripts/release-gate-test-groups.mjs --group 5"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.4","description":"Browser automation runtime with snapshot-refs-actions, browser replay screencasts, public read-only desktop observation, and browser-scoped computer-use orchestration","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.19.0","yjs":"^13.6.29","zod":"^3.25.76","parse5":"^8.0.0","typescript":"^5.9.3","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.58.2","@opencode-ai/plugin":"^1.2.25","@puppeteer/browsers":"^2.13.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.3","vitest":"^4.0.18","@types/ws":"^8.18.1","happy-dom":"^20.7.0","@types/node":"^20.19.35","@types/chrome":"^0.1.37","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.56.1","@typescript-eslint/eslint-plugin":"^8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.18_1776049679482_0.06051603963845609","host":"s3://npm-registry-packages-npm-production"}},"0.0.19":{"name":"opendevbrowser","version":"0.0.19","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome","annotation","design-canvas","screencast","desktop-observation","browser-replay","computer-use","challenge-automation"],"license":"MIT","_id":"opendevbrowser@0.0.19","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"c8f2ca68c3aa548ae2ebed9f724f6bb1d04d85cc","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.19.tgz","fileCount":919,"integrity":"sha512-z+gh+hCEE3BvCGvl8Z/ti4fA9qx+0oLxq7KCTwbwayqR35o/KbsO7UUo29NpdlTcJiLrpWvZIzF1ctBOeISHtw==","signatures":[{"sig":"MEYCIQDHXM4/XVv577rgRY0A5QCtC3ZrlS9VnmGwi4N1K4sUqwIhAL3OQYxPb4gxYS2VxTtgtbdE2WOLxqKLfiXrOmtYcmqe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9063103},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"0002d7ddeca8c170cec56cf1d1f97de9604955df","scripts":{"dev":"tsup src/index.ts src/cli/index.ts src/skills/skill-loader.ts --format esm --dts --watch","lint":"eslint \"src/**/*.ts\" \"tests/**/*.ts\"","test":"node scripts/run-vitest-coverage.mjs","build":"tsup src/index.ts src/cli/index.ts src/skills/skill-loader.ts --format esm --clean --sourcemap && tsc --emitDeclarationOnly --declaration --declarationMap -p tsconfig.json && node scripts/postbuild-dist.mjs","prepack":"npm run version:check && npm run build && npm run extension:build","typecheck":"tsc --noEmit -p tsconfig.json","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html canvas.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs","extension:store":"node scripts/chrome-store-publish.mjs","test:release-gate":"node scripts/release-gate-test-groups.mjs","test:release-gate:g1":"node scripts/release-gate-test-groups.mjs --group 1","test:release-gate:g2":"node scripts/release-gate-test-groups.mjs --group 2","test:release-gate:g3":"node scripts/release-gate-test-groups.mjs --group 3","test:release-gate:g4":"node scripts/release-gate-test-groups.mjs --group 4","test:release-gate:g5":"node scripts/release-gate-test-groups.mjs --group 5"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.4","description":"Browser automation runtime with snapshot-refs-actions, browser replay screencasts, public read-only desktop observation, and browser-scoped computer-use orchestration","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.19.0","yjs":"^13.6.29","zod":"^3.25.76","parse5":"^8.0.0","typescript":"^5.9.3","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.58.2","@opencode-ai/plugin":"^1.2.25","@puppeteer/browsers":"^2.13.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.3","vitest":"^4.0.18","@types/ws":"^8.18.1","happy-dom":"^20.7.0","@types/node":"^20.19.35","@types/chrome":"^0.1.37","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.56.1","@typescript-eslint/eslint-plugin":"^8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.19_1776108700791_0.8782881477442042","host":"s3://npm-registry-packages-npm-production"}},"0.0.20":{"name":"opendevbrowser","version":"0.0.20","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome","annotation","design-canvas","screencast","desktop-observation","browser-replay","computer-use","challenge-automation"],"license":"MIT","_id":"opendevbrowser@0.0.20","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"25c4b2c78a088607f8396b661acc8b2dc6efa8dc","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.20.tgz","fileCount":957,"integrity":"sha512-Pqjo+2H5ayKbWzFh0AlMk3iTV6C977pRF3nmhz1qlV8/9A69njiB/H0hEwwTIxGDLnOO8aP88aR9vXRlYGCkYw==","signatures":[{"sig":"MEQCICaEKSkvYzNiualGAKUYyP4Qgf+AK/gC6sVK2EbqCpFjAiBYz+D2mt4qEviI5bRsVR+fqD1qT0npquiU2ZCwbqm/zw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9640870},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"10301ba73e062697672c2f65c56c89b216f331a6","scripts":{"dev":"tsup src/index.ts src/cli/index.ts src/skills/skill-loader.ts --format esm --dts --watch","lint":"node scripts/run-package-tool.mjs eslint \"src/**/*.ts\" \"tests/**/*.ts\"","test":"node scripts/run-vitest-coverage.mjs","build":"node scripts/run-package-tool.mjs tsup src/index.ts src/cli/index.ts src/skills/skill-loader.ts --format esm --clean --sourcemap && node scripts/run-package-tool.mjs tsc --emitDeclarationOnly --declaration --declarationMap -p tsconfig.json && node scripts/postbuild-dist.mjs","prepack":"npm run version:check && npm run build && npm run extension:build","typecheck":"node scripts/run-package-tool.mjs tsc --noEmit -p tsconfig.json","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html canvas.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && node scripts/run-package-tool.mjs tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs","extension:store":"node scripts/chrome-store-publish.mjs","test:release-gate":"node scripts/release-gate-test-groups.mjs","test:release-gate:g1":"node scripts/release-gate-test-groups.mjs --group 1","test:release-gate:g2":"node scripts/release-gate-test-groups.mjs --group 2","test:release-gate:g3":"node scripts/release-gate-test-groups.mjs --group 3","test:release-gate:g4":"node scripts/release-gate-test-groups.mjs --group 4","test:release-gate:g5":"node scripts/release-gate-test-groups.mjs --group 5"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.4","description":"Browser automation runtime with snapshot-refs-actions, browser replay screencasts, public read-only desktop observation, and browser-scoped computer-use orchestration","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.19.0","yjs":"^13.6.29","zod":"^3.25.76","parse5":"^8.0.0","typescript":"^5.9.3","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.58.2","@opencode-ai/plugin":"^1.2.25","@puppeteer/browsers":"^2.13.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.3","vitest":"^4.0.18","@types/ws":"^8.18.1","happy-dom":"^20.7.0","@types/node":"^20.19.35","@types/chrome":"^0.1.37","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.56.1","@typescript-eslint/eslint-plugin":"^8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.20_1776459786598_0.5978540795378859","host":"s3://npm-registry-packages-npm-production"}},"0.0.21":{"name":"opendevbrowser","version":"0.0.21","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome","annotation","design-canvas","screencast","desktop-observation","browser-replay","computer-use","challenge-automation"],"license":"MIT","_id":"opendevbrowser@0.0.21","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"5e17042204927d230deeb70b86587f98f2800405","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.21.tgz","fileCount":961,"integrity":"sha512-2TsdTtTsU9qYogyrvr0pfOwlRf/4wLTSYqDRtcSEcR8tJGi2X08l2hISesQQObeHytHftdWMH5ZcaCYtcvfvxw==","signatures":[{"sig":"MEYCIQCgildZN4dqSoppbZYt9rKNC2VgsxPjXyRCRBgkBv/qPgIhAPrIkQDfeDniVJRUeZZsEGBe8jkfH4LHXGdpgNtg5+SX","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9679537},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"85709f3f00b9d3022dbeaede431ee7b538387474","scripts":{"dev":"tsup src/index.ts src/cli/index.ts src/skills/skill-loader.ts --format esm --dts --watch","lint":"node scripts/run-package-tool.mjs eslint \"src/**/*.ts\" \"tests/**/*.ts\"","test":"node scripts/run-vitest-coverage.mjs","build":"node scripts/run-package-tool.mjs tsup src/index.ts src/cli/index.ts src/skills/skill-loader.ts --format esm --clean --sourcemap && node scripts/run-package-tool.mjs tsc --emitDeclarationOnly --declaration --declarationMap -p tsconfig.json && node scripts/postbuild-dist.mjs","prepack":"npm run version:check && npm run build && npm run extension:build","typecheck":"node scripts/run-package-tool.mjs tsc --noEmit -p tsconfig.json","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html canvas.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && node scripts/run-package-tool.mjs tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs","extension:store":"node scripts/chrome-store-publish.mjs","test:release-gate":"node scripts/release-gate-test-groups.mjs","test:release-gate:g1":"node scripts/release-gate-test-groups.mjs --group 1","test:release-gate:g2":"node scripts/release-gate-test-groups.mjs --group 2","test:release-gate:g3":"node scripts/release-gate-test-groups.mjs --group 3","test:release-gate:g4":"node scripts/release-gate-test-groups.mjs --group 4","test:release-gate:g5":"node scripts/release-gate-test-groups.mjs --group 5"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.4","description":"Browser automation runtime with snapshot-refs-actions, browser replay screencasts, public read-only desktop observation, and browser-scoped computer-use orchestration","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.19.0","yjs":"^13.6.29","zod":"^3.25.76","parse5":"^8.0.0","typescript":"^5.9.3","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.58.2","@opencode-ai/plugin":"^1.2.25","@puppeteer/browsers":"^2.13.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.3","vitest":"^4.0.18","@types/ws":"^8.18.1","happy-dom":"^20.7.0","@types/node":"^20.19.35","@types/chrome":"^0.1.37","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.56.1","@typescript-eslint/eslint-plugin":"^8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.21_1776612561388_0.29917164040685984","host":"s3://npm-registry-packages-npm-production"}},"0.0.22":{"name":"opendevbrowser","version":"0.0.22","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome","annotation","design-canvas","screencast","desktop-observation","browser-replay","computer-use","challenge-automation"],"license":"MIT","_id":"opendevbrowser@0.0.22","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"0357625d0deb533e315746af2e6a549d7d7c5fe8","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.22.tgz","fileCount":974,"integrity":"sha512-+bn4qAjEkqxp/gSykftmYZdmKMsVMFNbwj27uYQcqjZ2oN127EolQ73yMlPOdrwy1ZqScLhYD/hbumnMoApNqQ==","signatures":[{"sig":"MEUCIApFNu+rz8vEMMotnbz/GyzJmIWZFrR9USX6mdaGOhh/AiEA0AWOgNvAblhIrjicrzGeTbmyzaP3Z6ruvbk7dxRYXA8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9715988},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"eeda592be35c1db76bfacc06dff9d53c5fcc81da","scripts":{"dev":"tsup src/index.ts src/cli/index.ts src/cli/installers/postinstall-skill-sync.ts src/skills/skill-loader.ts --format esm --dts --watch","lint":"node scripts/run-package-tool.mjs eslint \"src/**/*.ts\" \"tests/**/*.ts\"","test":"node scripts/run-vitest-coverage.mjs","build":"node scripts/run-package-tool.mjs tsup src/index.ts src/cli/index.ts src/cli/installers/postinstall-skill-sync.ts src/skills/skill-loader.ts --format esm --clean --sourcemap && node scripts/run-package-tool.mjs tsc --emitDeclarationOnly --declaration --declarationMap -p tsconfig.json && node scripts/postbuild-dist.mjs","prepack":"npm run version:check && npm run build && npm run extension:build","typecheck":"node scripts/run-package-tool.mjs tsc --noEmit -p tsconfig.json","postinstall":"node scripts/postinstall-sync-skills.mjs","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html canvas.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && node scripts/run-package-tool.mjs tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs","extension:store":"node scripts/chrome-store-publish.mjs","test:release-gate":"node scripts/release-gate-test-groups.mjs","test:release-gate:g1":"node scripts/release-gate-test-groups.mjs --group 1","test:release-gate:g2":"node scripts/release-gate-test-groups.mjs --group 2","test:release-gate:g3":"node scripts/release-gate-test-groups.mjs --group 3","test:release-gate:g4":"node scripts/release-gate-test-groups.mjs --group 4","test:release-gate:g5":"node scripts/release-gate-test-groups.mjs --group 5"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.4","description":"Browser automation runtime with snapshot-refs-actions, browser replay screencasts, public read-only desktop observation, and browser-scoped computer-use orchestration","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.19.0","yjs":"^13.6.29","zod":"^3.25.76","parse5":"^8.0.0","typescript":"^5.9.3","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.58.2","@opencode-ai/plugin":"^1.2.25","@puppeteer/browsers":"^2.13.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.3","vitest":"^4.0.18","@types/ws":"^8.18.1","happy-dom":"^20.7.0","@types/node":"^20.19.35","@types/chrome":"^0.1.37","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.56.1","@typescript-eslint/eslint-plugin":"^8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.22_1776685957830_0.3249847456719257","host":"s3://npm-registry-packages-npm-production"}},"0.0.23":{"name":"opendevbrowser","version":"0.0.23","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome","annotation","design-canvas","screencast","desktop-observation","browser-replay","computer-use","challenge-automation"],"license":"MIT","_id":"opendevbrowser@0.0.23","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"07967f4e609ff7ac68995529e25b4385b4eebba7","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.23.tgz","fileCount":974,"integrity":"sha512-ajhdsCjOsPCv07CF2/3dSm0Ze2bBssEOF6iB2fvnA0ARn0UtwR06EUNZ/nUjEsWJnBimfXdgiRSC6QNP4mR8mg==","signatures":[{"sig":"MEUCIQCkgy0rPCO0jxqvlIQpuZsGQlgzUIzxS3GOCcWrDqLJzgIgCRIXYYBh6yPgf1L6UMpGaXLnPXqy8oLjwkO78G3lEXc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9817038},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"scripts":{"dev":"tsup src/index.ts src/cli/index.ts src/cli/installers/postinstall-skill-sync.ts src/skills/skill-loader.ts --format esm --dts --watch","lint":"node scripts/run-package-tool.mjs eslint \"src/**/*.ts\" \"tests/**/*.ts\"","test":"node scripts/run-vitest-coverage.mjs","build":"node scripts/run-package-tool.mjs tsup src/index.ts src/cli/index.ts src/cli/installers/postinstall-skill-sync.ts src/skills/skill-loader.ts --format esm --clean --sourcemap && node scripts/run-package-tool.mjs tsc --emitDeclarationOnly --declaration --declarationMap -p tsconfig.json && node scripts/postbuild-dist.mjs","prepack":"npm run version:check && npm run build && npm run extension:build","typecheck":"node scripts/run-package-tool.mjs tsc --noEmit -p tsconfig.json","postinstall":"node scripts/postinstall-sync-skills.mjs","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html canvas.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && node scripts/run-package-tool.mjs tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs","extension:store":"node scripts/chrome-store-publish.mjs","test:release-gate":"node scripts/release-gate-test-groups.mjs","test:release-gate:g1":"node scripts/release-gate-test-groups.mjs --group 1","test:release-gate:g2":"node scripts/release-gate-test-groups.mjs --group 2","test:release-gate:g3":"node scripts/release-gate-test-groups.mjs --group 3","test:release-gate:g4":"node scripts/release-gate-test-groups.mjs --group 4","test:release-gate:g5":"node scripts/release-gate-test-groups.mjs --group 5"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.4","description":"Browser automation runtime with snapshot-refs-actions, browser replay screencasts, public read-only desktop observation, and browser-scoped computer-use orchestration","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.19.0","yjs":"^13.6.29","zod":"^3.25.76","parse5":"^8.0.0","typescript":"^5.9.3","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.58.2","@opencode-ai/plugin":"^1.2.25","@puppeteer/browsers":"^2.13.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.3","vitest":"^4.0.18","@types/ws":"^8.18.1","happy-dom":"^20.7.0","@types/node":"^20.19.35","@types/chrome":"^0.1.37","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.56.1","@typescript-eslint/eslint-plugin":"^8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.23_1776721330009_0.9822534236667644","host":"s3://npm-registry-packages-npm-production"}},"0.0.24":{"name":"opendevbrowser","version":"0.0.24","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome","annotation","design-canvas","screencast","desktop-observation","browser-replay","computer-use","challenge-automation"],"license":"MIT","_id":"opendevbrowser@0.0.24","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"2a9d6641873160d3178fa01257022612e6b263fd","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.24.tgz","fileCount":974,"integrity":"sha512-dHl0jGSa/gdVp41NeDsrUK+d/LamcdmNg+sOXU+zzZBlp9AI9WzPvhBURSHIvoZExVGaZhDtFNeFM7QLj1VYnA==","signatures":[{"sig":"MEUCICYwGz7iz0yh5qb5eIYumrs9U1i7kzfT8cnIbOl2K1DDAiEA+fAaMAWDVVo/9dMF+m6SJ20CoQoBj0OyZcygEvGSKHc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10576793},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"44247e930d9d20d8333e14184de2c06f9a46f5d5","scripts":{"dev":"node scripts/run-package-tool.mjs tsup --config tsup.config.ts --dts --watch","lint":"node scripts/run-package-tool.mjs eslint \"src/**/*.ts\" \"tests/**/*.ts\"","test":"node scripts/run-vitest-coverage.mjs","build":"node scripts/run-package-tool.mjs tsup --config tsup.config.ts && node scripts/run-package-tool.mjs tsc --emitDeclarationOnly --declaration --declarationMap -p tsconfig.json && node scripts/postbuild-dist.mjs","prepack":"npm run version:check && npm run build && npm run extension:build","typecheck":"node scripts/run-package-tool.mjs tsc --noEmit -p tsconfig.json","postinstall":"node scripts/postinstall-sync-skills.mjs","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html canvas.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && node scripts/run-package-tool.mjs tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs","extension:store":"node scripts/chrome-store-publish.mjs","test:release-gate":"node scripts/release-gate-test-groups.mjs","test:release-gate:g1":"node scripts/release-gate-test-groups.mjs --group 1","test:release-gate:g2":"node scripts/release-gate-test-groups.mjs --group 2","test:release-gate:g3":"node scripts/release-gate-test-groups.mjs --group 3","test:release-gate:g4":"node scripts/release-gate-test-groups.mjs --group 4","test:release-gate:g5":"node scripts/release-gate-test-groups.mjs --group 5"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.4","description":"Browser automation runtime with snapshot-refs-actions, browser replay screencasts, public read-only desktop observation, and browser-scoped computer-use orchestration","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.19.0","yjs":"^13.6.29","zod":"^3.25.76","parse5":"^8.0.0","typescript":"^5.9.3","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.58.2","@opencode-ai/plugin":"^1.2.25","@puppeteer/browsers":"^2.13.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.3","vitest":"^4.0.18","@types/ws":"^8.18.1","happy-dom":"^20.7.0","@types/node":"^20.19.35","@types/chrome":"^0.1.37","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.56.1","@typescript-eslint/eslint-plugin":"^8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.24_1776737870252_0.8476176371770439","host":"s3://npm-registry-packages-npm-production"}},"0.0.25":{"name":"opendevbrowser","version":"0.0.25","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome","annotation","design-canvas","screencast","desktop-observation","browser-replay","computer-use","challenge-automation"],"license":"MIT","_id":"opendevbrowser@0.0.25","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"c8231b8a18d440b4e7601b2a8f3cb3ab3496cd9f","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.25.tgz","fileCount":979,"integrity":"sha512-9t5PWSUTZrI00oh/uwQogglfl7Watdh6mHMQpIb52xQKbpqMx+kvQa9Uo23UgJWdn+dKG84iheNXOcWhYkEPvg==","signatures":[{"sig":"MEYCIQC5LsRTo73esJqiNjTWFMl+nfiJIi8Qp4ClV5fotiJAogIhAICy8BigsY+xjuSAb/UT4jidk4Jy35EWG6vEiCwwR6NH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10910590},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"3772d0a43cfade6eb050c06d58dfac4f4d80c697","scripts":{"dev":"node scripts/run-package-tool.mjs tsup --config tsup.config.ts --dts --watch","lint":"node scripts/run-package-tool.mjs eslint \"src/**/*.ts\" \"tests/**/*.ts\"","test":"node scripts/run-vitest-coverage.mjs","build":"node scripts/run-package-tool.mjs tsup --config tsup.config.ts && node scripts/run-package-tool.mjs tsc --emitDeclarationOnly --declaration --declarationMap -p tsconfig.json && node scripts/postbuild-dist.mjs","prepack":"npm run version:check && npm run build && npm run extension:build","typecheck":"node scripts/run-package-tool.mjs tsc --noEmit -p tsconfig.json","postinstall":"node scripts/postinstall-sync-skills.mjs","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html canvas.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && node scripts/run-package-tool.mjs tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs","extension:store":"node scripts/chrome-store-publish.mjs","test:release-gate":"node scripts/release-gate-test-groups.mjs","test:release-gate:g1":"node scripts/release-gate-test-groups.mjs --group 1","test:release-gate:g2":"node scripts/release-gate-test-groups.mjs --group 2","test:release-gate:g3":"node scripts/release-gate-test-groups.mjs --group 3","test:release-gate:g4":"node scripts/release-gate-test-groups.mjs --group 4","test:release-gate:g5":"node scripts/release-gate-test-groups.mjs --group 5"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.4","description":"Browser automation runtime with snapshot-refs-actions, browser replay screencasts, public read-only desktop observation, and browser-scoped computer-use orchestration","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.19.0","yjs":"^13.6.29","zod":"^3.25.76","parse5":"^8.0.0","typescript":"^5.9.3","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.58.2","@opencode-ai/plugin":"^1.2.25","@puppeteer/browsers":"^2.13.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.3","vitest":"^4.0.18","@types/ws":"^8.18.1","happy-dom":"^20.7.0","@types/node":"^20.19.35","@types/chrome":"^0.1.37","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.56.1","@typescript-eslint/eslint-plugin":"^8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.25_1776919228605_0.9836952949125379","host":"s3://npm-registry-packages-npm-production"}},"0.0.26":{"name":"opendevbrowser","version":"0.0.26","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome","annotation","design-canvas","screencast","desktop-observation","browser-replay","computer-use","challenge-automation"],"license":"MIT","_id":"opendevbrowser@0.0.26","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"b4b7ad44bb4271f2a4b5ca9e1bcda21cf81d8b09","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.26.tgz","fileCount":982,"integrity":"sha512-yKAQNPhY8WZU04Gt2CIk1cHW2ULpBAb+q9z+SVyb0acPGd8yKdF7JdV9y5xpFhTw7Vc8jISRXVGT/9CpJkOaPw==","signatures":[{"sig":"MEUCID6GuPHp/g/C+KED9uDrtzmHaVf9bnhKiiO6iF8Oo+rtAiEA+VDSkyij2XyTFqwjdFtRtADiIt0AR3N9biInmRn8Ths=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10961171},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=18"},"gitHead":"1bb6c57b2088cd26ead55022f6484ab18c8e0930","scripts":{"dev":"node scripts/run-package-tool.mjs tsup --config tsup.config.ts --dts --watch","lint":"node scripts/run-package-tool.mjs eslint \"src/**/*.ts\" \"tests/**/*.ts\"","test":"node scripts/run-vitest-coverage.mjs","build":"node scripts/run-package-tool.mjs tsup --config tsup.config.ts && node scripts/run-package-tool.mjs tsc --emitDeclarationOnly --declaration --declarationMap -p tsconfig.json && node scripts/postbuild-dist.mjs","prepack":"npm run version:check && npm run build && npm run extension:build","typecheck":"node scripts/run-package-tool.mjs tsc --noEmit -p tsconfig.json","postinstall":"node scripts/postinstall-sync-skills.mjs","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html canvas.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && node scripts/run-package-tool.mjs tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs","extension:store":"node scripts/chrome-store-publish.mjs","test:release-gate":"node scripts/release-gate-test-groups.mjs","test:release-gate:g1":"node scripts/release-gate-test-groups.mjs --group 1","test:release-gate:g2":"node scripts/release-gate-test-groups.mjs --group 2","test:release-gate:g3":"node scripts/release-gate-test-groups.mjs --group 3","test:release-gate:g4":"node scripts/release-gate-test-groups.mjs --group 4","test:release-gate:g5":"node scripts/release-gate-test-groups.mjs --group 5"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.4","description":"Browser automation runtime with snapshot-refs-actions, browser replay screencasts, public read-only desktop observation, and browser-scoped computer-use orchestration","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.19.0","yjs":"^13.6.29","zod":"^3.25.76","parse5":"^8.0.0","typescript":"^5.9.3","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.58.2","@opencode-ai/plugin":"^1.2.25","@puppeteer/browsers":"^2.13.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.3","vitest":"^4.0.18","@types/ws":"^8.18.1","happy-dom":"^20.7.0","@types/node":"^20.19.35","@types/chrome":"^0.1.37","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.56.1","@typescript-eslint/eslint-plugin":"^8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.26_1777031597670_0.03458667392533221","host":"s3://npm-registry-packages-npm-production"}},"0.0.27":{"name":"opendevbrowser","version":"0.0.27","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome","annotation","design-canvas","screencast","desktop-observation","browser-replay","computer-use","challenge-automation"],"license":"MIT","_id":"opendevbrowser@0.0.27","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"bin":{"opendevbrowser":"dist/cli/index.js"},"dist":{"shasum":"45d3273220f98165a36b791b5189c70526298d54","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.27.tgz","fileCount":984,"integrity":"sha512-rpH90ItzrxAwTCmrUBYXjnfxO6akVS6xCxLRum3vL91BKzF4hyccnnv1xHDVPclhj5xyiWUYaJ0FtmcV751Z8A==","signatures":[{"sig":"MEUCIQCM2wb7b1HEpe6+GeGpMfXMJv2Qjmf6T8DKrs1M9xfwWwIgS84W9v4yylq3eFz4LarVCqr596pYn1mOA8hrE+3ensA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11110657},"main":"dist/index.js","type":"module","_from":"file:opendevbrowser-0.0.27.tgz","types":"dist/index.d.ts","engines":{"node":">=18"},"scripts":{"dev":"node scripts/run-package-tool.mjs tsup --config tsup.config.ts --dts --watch","lint":"node scripts/run-package-tool.mjs eslint \"src/**/*.ts\" \"tests/**/*.ts\"","test":"node scripts/run-vitest-coverage.mjs","build":"node scripts/run-package-tool.mjs tsup --config tsup.config.ts && node scripts/run-package-tool.mjs tsc --emitDeclarationOnly --declaration --declarationMap -p tsconfig.json && node scripts/postbuild-dist.mjs","prepack":"npm run version:check && npm run build && npm run extension:build","typecheck":"node scripts/run-package-tool.mjs tsc --noEmit -p tsconfig.json","postinstall":"node scripts/postinstall-sync-skills.mjs","version:check":"node scripts/verify-versions.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html canvas.html dist/ icons/","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && node scripts/run-package-tool.mjs tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs","extension:store":"node scripts/chrome-store-publish.mjs","test:release-gate":"node scripts/release-gate-test-groups.mjs","test:release-gate:g1":"node scripts/release-gate-test-groups.mjs --group 1","test:release-gate:g2":"node scripts/release-gate-test-groups.mjs --group 2","test:release-gate:g3":"node scripts/release-gate-test-groups.mjs --group 3","test:release-gate:g4":"node scripts/release-gate-test-groups.mjs --group 4","test:release-gate:g5":"node scripts/release-gate-test-groups.mjs --group 5"},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"_resolved":"/Users/bishopdotun/Documents/DevProjects/opendevbrowser/opendevbrowser-0.0.27.tgz","_integrity":"sha512-rpH90ItzrxAwTCmrUBYXjnfxO6akVS6xCxLRum3vL91BKzF4hyccnnv1xHDVPclhj5xyiWUYaJ0FtmcV751Z8A==","repository":{"url":"git+https://github.com/freshtechbro/opendevbrowser.git","type":"git"},"_npmVersion":"10.9.4","description":"Browser automation runtime with snapshot-refs-actions, browser replay screencasts, public read-only desktop observation, and browser-scoped computer-use orchestration","directories":{},"_nodeVersion":"22.22.0","dependencies":{"ws":"^8.19.0","yjs":"^13.6.29","zod":"^3.25.76","parse5":"^8.0.0","typescript":"^5.9.3","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","playwright-core":"^1.58.2","@opencode-ai/plugin":"^1.2.25","@puppeteer/browsers":"^2.13.0"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","eslint":"^9.39.3","vitest":"^4.0.18","@types/ws":"^8.18.1","happy-dom":"^20.7.0","@types/node":"^20.19.35","@types/chrome":"^0.1.37","@vitest/coverage-v8":"^4.0.18","@typescript-eslint/parser":"^8.56.1","@typescript-eslint/eslint-plugin":"^8.56.1"},"_npmOperationalInternal":{"tmp":"tmp/opendevbrowser_0.0.27_1777383741319_0.4666805599283037","host":"s3://npm-registry-packages-npm-production"}},"0.0.28":{"name":"opendevbrowser","version":"0.0.28","description":"Browser automation runtime with snapshot-refs-actions, browser replay screencasts, public read-only desktop observation, and browser-scoped computer-use orchestration","type":"module","main":"dist/index.js","types":"dist/index.d.ts","bin":{"opendevbrowser":"dist/cli/index.js"},"keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome","annotation","design-canvas","screencast","desktop-observation","browser-replay","computer-use","challenge-automation"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/freshtechbro/opendevbrowser.git"},"engines":{"node":">=18"},"scripts":{"build":"node scripts/run-package-tool.mjs tsup --config tsup.config.ts && node scripts/run-package-tool.mjs tsc --emitDeclarationOnly --declaration --declarationMap -p tsconfig.json && node scripts/postbuild-dist.mjs","dev":"node scripts/run-package-tool.mjs tsup --config tsup.config.ts --dts --watch","lint":"node scripts/run-package-tool.mjs eslint \"src/**/*.ts\" \"tests/**/*.ts\"","typecheck":"node scripts/run-package-tool.mjs tsc --noEmit -p tsconfig.json","test":"node scripts/run-vitest-coverage.mjs","test:release-gate":"node scripts/release-gate-test-groups.mjs","test:release-gate:g1":"node scripts/release-gate-test-groups.mjs --group 1","test:release-gate:g2":"node scripts/release-gate-test-groups.mjs --group 2","test:release-gate:g3":"node scripts/release-gate-test-groups.mjs --group 3","test:release-gate:g4":"node scripts/release-gate-test-groups.mjs --group 4","test:release-gate:g5":"node scripts/release-gate-test-groups.mjs --group 5","extension:sync":"node scripts/sync-extension-version.mjs","extension:build":"npm run extension:sync && node scripts/run-package-tool.mjs tsc -p extension/tsconfig.json && node scripts/copy-extension-assets.mjs","extension:pack":"cd extension && zip -r ../opendevbrowser-extension.zip manifest.json popup.html canvas.html dist/ icons/","extension:store":"node scripts/chrome-store-publish.mjs","version:check":"node scripts/verify-versions.mjs","prepack":"npm run version:check && npm run build && npm run extension:build","postinstall":"node scripts/postinstall-sync-skills.mjs"},"dependencies":{"@opencode-ai/plugin":"^1.2.25","@puppeteer/browsers":"^2.13.0","async-mutex":"^0.5.0","jsonc-parser":"^3.2.0","parse5":"^8.0.0","playwright-core":"^1.58.2","typescript":"^5.9.3","ws":"^8.19.0","yjs":"^13.6.29","zod":"^3.25.76"},"devDependencies":{"@types/chrome":"^0.1.37","@types/node":"^20.19.35","@types/ws":"^8.18.1","@typescript-eslint/eslint-plugin":"^8.56.1","@typescript-eslint/parser":"^8.56.1","@vitest/coverage-v8":"^4.0.18","eslint":"^9.39.3","happy-dom":"^20.7.0","tsup":"^8.5.1","vitest":"^4.0.18"},"_id":"opendevbrowser@0.0.28","gitHead":"ebb72f926b993cc3d45ecfd1b5a194788cbf3f2c","bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"homepage":"https://github.com/freshtechbro/opendevbrowser#readme","_nodeVersion":"22.22.0","_npmVersion":"10.9.4","dist":{"integrity":"sha512-kDpl8vi24R2WgJji6OXgwWx3rDah9N/JI6xMpch3DaqevSkIa4YPJb4JOKb2XjKzkZFhWVp9tz+L/lgPiXGhDA==","shasum":"2ea513b89f4f7098029dc18299ad249e1cd8a37d","tarball":"https://registry.npmjs.org/opendevbrowser/-/opendevbrowser-0.0.28.tgz","fileCount":986,"unpackedSize":11306743,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCRW1hyEntxfOCWVznDSsAQw/E8IqkAhoCQziwhJ/7lMwIgcPsYZiMbrHRb9IBkHC/yuKhxkTaQZHecB070EetZojU="}]},"_npmUser":{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"},"directories":{},"maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/opendevbrowser_0.0.28_1777520376092_0.43042260072149174"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-02T18:39:48.841Z","modified":"2026-04-30T03:39:36.431Z","0.0.10":"2026-01-02T18:39:49.087Z","0.0.11":"2026-01-02T21:39:18.540Z","0.0.12":"2026-01-12T01:57:31.615Z","0.0.15":"2026-02-09T02:52:28.716Z","0.0.16":"2026-03-01T03:14:13.603Z","0.0.17":"2026-03-14T02:34:30.391Z","0.0.18":"2026-04-13T03:07:59.718Z","0.0.19":"2026-04-13T19:31:40.998Z","0.0.20":"2026-04-17T21:03:06.859Z","0.0.21":"2026-04-19T15:29:21.773Z","0.0.22":"2026-04-20T11:52:38.059Z","0.0.23":"2026-04-20T21:42:10.222Z","0.0.24":"2026-04-21T02:17:50.448Z","0.0.25":"2026-04-23T04:40:28.822Z","0.0.26":"2026-04-24T11:53:17.905Z","0.0.27":"2026-04-28T13:42:21.595Z","0.0.28":"2026-04-30T03:39:36.343Z"},"bugs":{"url":"https://github.com/freshtechbro/opendevbrowser/issues"},"license":"MIT","homepage":"https://github.com/freshtechbro/opendevbrowser#readme","keywords":["opencode","plugin","browser","automation","cdp","playwright","testing","web-scraping","chrome","annotation","design-canvas","screencast","desktop-observation","browser-replay","computer-use","challenge-automation"],"repository":{"type":"git","url":"git+https://github.com/freshtechbro/opendevbrowser.git"},"description":"Browser automation runtime with snapshot-refs-actions, browser replay screencasts, public read-only desktop observation, and browser-scoped computer-use orchestration","maintainers":[{"name":"bishopdotun","email":"oladotun.olatunji@gmail.com"}],"readme":"# OpenDevBrowser\n\n[![npm version](https://img.shields.io/npm/v/opendevbrowser.svg?style=flat-square)](https://registry.npmjs.org/opendevbrowser)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square)](https://opensource.org/licenses/MIT)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue.svg?style=flat-square)](https://www.typescriptlang.org/)\n[![OpenCode Tool Calls](https://img.shields.io/badge/OpenCode-Tool_Calls-green.svg?style=flat-square)](https://opencode.ai)\n[![CLI](https://img.shields.io/badge/Interface-CLI-orange.svg?style=flat-square)](docs/CLI.md)\n[![Chrome Extension](https://img.shields.io/badge/Chrome-Extension-blue.svg?style=flat-square)](docs/EXTENSION.md)\n[![Test Coverage](https://img.shields.io/badge/coverage-97%25-brightgreen.svg?style=flat-square)](https://registry.npmjs.org/opendevbrowser)\n\n> **Script-first browser automation for AI agents.** Snapshot → Refs → Actions.\n\nOpenDevBrowser is an agent-agnostic browser automation runtime for CLI workflows, [OpenCode](https://opencode.ai) tool calls, and Chrome extension relay sessions. It supports managed launches, direct CDP attach, and extension-backed Ops sessions.\n\nThe current public surface includes [77 CLI commands and 70 `opendevbrowser_*` tools](docs/SURFACE_REFERENCE.md); see [docs/CLI.md](docs/CLI.md) for the operational command guide.\nGenerated help is the canonical first-contact discovery surface: `npx opendevbrowser --help` and `npx opendevbrowser help` now lead with a `Find It Fast` block that uses the exact lookup terms `screencast / browser replay`, `desktop observation`, and `computer use / browser-scoped computer use`.\nShipped builds include Browser replay through `screencast-start` or `screencast-stop` and a separate public read-only desktop observation plane through the `desktop-*` family; those lanes stay explicit, browser-scoped where applicable, and make it clear this is not a desktop agent.\n\n<p align=\"center\">\n  <img src=\"assets/hero-image.png\" alt=\"OpenDevBrowser hero image showing AI-assisted annotation and browser automation workflow\" width=\"920\" />\n  <br />\n  <em>AI-assisted annotation and browser automation workflow</em>\n</p>\n\n## Table of Contents\n\n- [Use It Your Way](#use-it-your-way)\n- [Why OpenDevBrowser?](#why-opendevbrowser)\n- [Installation](#installation)\n- [Quick Start](#quick-start)\n- [Challenge Handling Boundary](#challenge-handling-boundary)\n- [Recent Features](#recent-features)\n- [Features](#features)\n- [Tool Reference](#tool-reference)\n- [Bundled Skills](#bundled-skills)\n- [Browser Modes](#browser-modes)\n- [Relay Channels](#relay-channels)\n- [Breaking Changes (latest)](#breaking-changes-latest)\n- [Chrome Extension (Optional)](#chrome-extension-optional)\n- [Configuration](#configuration)\n- [CLI Commands](#cli-commands)\n- [Security](#security)\n- [Updating](#updating)\n- [Architecture](#architecture)\n- [Development](#development)\n- [Privacy](#privacy)\n- [License](#license)\n\n## Use It Your Way\n\n| Interface | OpenCode Required | Best For |\n|-----------|-------------------|----------|\n| **CLI (`npx opendevbrowser ...`)** | No | Any agent/workflow that can run shell commands |\n| **Chrome Extension + Relay** | No | Reusing existing logged-in tabs without launching a new browser |\n| **OpenCode Tool Calls** | Yes | Native tool-calling inside OpenCode (`opendevbrowser_*`) |\n| **Frontend Website (private repo)** | No | Product website and generated docs routes |\n\nThe public repo owns the automation runtime and canonical docs; see [docs/SURFACE_REFERENCE.md](docs/SURFACE_REFERENCE.md) for the full surface inventory.\n\n## Why OpenDevBrowser?\n\n- **Script-first automation model**: snapshot → refs → actions, built around accessibility-tree capture instead of brittle selector-first workflows.\n- **Stable interaction primitives**: refs resolve through `backendNodeId`, and low-level pointer commands remain available when normal DOM actions are not enough.\n- **Flexible session control**: run managed sessions, attach through direct CDP, or reuse logged-in tabs through the extension relay and `/ops`.\n- **Design and review workflows**: use the design canvas, shared annotation inbox, and repo-backed code-sync flows without leaving the runtime surface.\n- **Diagnostics and bounded challenge handling**: start with `session-inspector`, then drop to console or network polling and unified debug traces when you need channel-level detail.\n- **Production guardrails**: local-only CDP by default, timing-safe auth, sanitized exports, strict TypeScript, and branch coverage held at 97% or higher.\n\n---\n\n## Installation\n\nRequires Node.js `>=18`.\n\n### For Humans\n\n```bash\n# Interactive installer (recommended)\nnpx opendevbrowser\n\n# Or specify location\nnpx opendevbrowser --global   # ~/.config/opencode/opencode.json\nnpx opendevbrowser --local    # ./opencode.json\n\n# Full install (config + extension assets)\nnpx opendevbrowser --full\n\n# Optional: persistent global CLI\nnpm install -g opendevbrowser\nopendevbrowser --version\n```\n\n### Local Package Validation\n\nUse this flow to validate first-run onboarding from a source tarball without relying on the published registry package.\n\n```bash\ncd <public-repo-root>\nnpm pack\n\nWORKDIR=$(mktemp -d /tmp/opendevbrowser-first-run-XXXXXX)\nISOLATED_ROOT=$(mktemp -d /tmp/opendevbrowser-first-run-isolated-XXXXXX)\nexport HOME=\"$ISOLATED_ROOT/home\"\nexport OPENCODE_CONFIG_DIR=\"$ISOLATED_ROOT/opencode-config\"\nexport OPENCODE_CACHE_DIR=\"$ISOLATED_ROOT/opencode-cache\"\nexport CODEX_HOME=\"$ISOLATED_ROOT/codex-home\"\nexport CLAUDECODE_HOME=\"$ISOLATED_ROOT/claudecode-home\"\nexport AMP_CLI_HOME=\"$ISOLATED_ROOT/ampcli-home\"\ncd \"$WORKDIR\"\nnpm init -y\nnpm install <public-repo-root>/opendevbrowser-0.0.28.tgz\nnpx --no-install opendevbrowser --help\nnpx --no-install opendevbrowser help\n```\n\nPublished npm consumer proof is tracked separately in [docs/RELEASE_RUNBOOK.md](docs/RELEASE_RUNBOOK.md) through `scripts/registry-consumer-smoke.mjs`.\n\nSet `OPDEVBROWSER_SKIP_POSTINSTALL_SKILL_SYNC=1` before `npm install` only if you need a packaging smoke test that avoids the install-time managed-skill refresh entirely.\n\nSee [docs/FIRST_RUN_ONBOARDING.md](docs/FIRST_RUN_ONBOARDING.md) for the full onboarding checklist, [docs/DEPENDENCIES.md](docs/DEPENDENCIES.md) for runtime inventory, and [docs/SURFACE_REFERENCE.md](docs/SURFACE_REFERENCE.md) for the live CLI and tool surface.\n\nSuccessful installs reconcile daemon auto-start on supported platforms so the relay is available on login. macOS LaunchAgents persist a stable `WorkingDirectory` under `~/.cache/opendevbrowser` so launchd does not start the daemon from `/`. If the current CLI entrypoint lives under a transient temp-root path such as a first-run `/tmp` or `/private/tmp` workspace, OpenDevBrowser refuses to persist that path as auto-start. Rerun `opendevbrowser daemon install`, or `npx --no-install opendevbrowser daemon install` from a persistent local package install, from a stable install location if you want login auto-start; remove it later with `opendevbrowser daemon uninstall`.\n\nBundled skills sync to **OpenCode, Codex, ClaudeCode, and AmpCLI** targets during install. `npx opendevbrowser` manages global or project-local targets according to the selected skills mode, and package installation (`npm install -g`, local tarball install, or equivalent) best-effort syncs the canonical bundled packs into the managed global targets during package `postinstall`. See [docs/CLI.md](docs/CLI.md) for exact target paths.\n\n### CLI + Extension (No OpenCode)\n\n```bash\n# Start relay/daemon runtime\nnpx opendevbrowser serve\n\n# Launch using extension mode (requires extension popup connected)\nnpx opendevbrowser launch --extension-only --wait-for-extension\n\n# Or force managed mode without extension\nnpx opendevbrowser launch --no-extension\n```\n\nUnpacked extension load path after local install:\n- `<WORKDIR>/node_modules/opendevbrowser/extension`\n\n### Frontend Website (Private Repo)\n\n```bash\ngit clone https://github.com/freshtechbro/opendevbrowser-website-deploy.git\ncd opendevbrowser-website-deploy/frontend\nnpm install\nnpm run dev\n```\n\nWebsite build/data pipeline lives in the private repo:\n- `npm run sync:assets` copies mirrored assets into private `frontend/public/brand`.\n- `npm run generate:docs` regenerates docs, metrics, and roadmap JSON consumed by `/docs`.\n\n### OpenCode Tool-Call Installation\n\nUse OpenCode only when you want native `opendevbrowser_*` tool calls; the CLI and extension workflows work without it.\n\nRecommended (CLI, installs plugin + config + bundled skills + extension assets):\n\n```bash\nnpx opendevbrowser --full --global --no-prompt\n```\n\nExplicit flags (config + skills, no prompt):\n\n```bash\nnpx opendevbrowser --global --with-config --skills-global --no-prompt\n```\n\nManual fallback (edit OpenCode config):\n\n```json\n{\n  \"$schema\": \"https://opencode.ai/config.json\",\n  \"plugin\": [\"opendevbrowser\"]\n}\n```\n\nConfig location: `~/.config/opencode/opencode.json`\n\nRestart OpenCode, then run `opendevbrowser_status` to verify the plugin is loaded (daemon status when hub is enabled).\n\n---\n\n## Quick Start\n\nOpenDevBrowser uses the same automation model across plugin tools and CLI commands:\n\n```\n1. Launch a browser session\n2. Navigate to a URL\n3. Take a review to get target-aware actionables and refs\n4. Interact using refs (click, type, select)\n5. Re-review or re-snapshot after navigation\n```\n\nShipping checklist for first-time users (local-package install, daemon, extension, first task, multi-tab auth/cookies):\n- [`docs/FIRST_RUN_ONBOARDING.md`](docs/FIRST_RUN_ONBOARDING.md)\n\nParallel execution is target-scoped (`ExecutionKey = (sessionId,targetId)`): same target is FIFO, different targets can run concurrently up to the governor cap. `session-per-worker` remains the safest baseline for strict isolation. See [`docs/CLI.md`](docs/CLI.md) (Concurrency semantics) and [`skills/opendevbrowser-best-practices/artifacts/provider-workflows.md`](skills/opendevbrowser-best-practices/artifacts/provider-workflows.md) (Workflow E).\n\n### Core Workflow (Plugin Tools)\n\n| Step | Tool | Purpose |\n|------|------|---------|\n| 1 | `opendevbrowser_launch` | Launch a session (extension relay first; managed fallback is explicit) |\n| 2 | `opendevbrowser_goto` | Navigate to URL |\n| 3 | `opendevbrowser_review` | Inspect the active target and capture fresh actionables before acting |\n| 4 | `opendevbrowser_click` / `opendevbrowser_type` | Interact with elements |\n| 5 | `opendevbrowser_snapshot` | Re-capture refs after navigation or DOM changes |\n| 6 | `opendevbrowser_disconnect` | Clean up session |\n\n---\n\n### CLI Automation Quick Start\n\nRun a local daemon for persistent sessions, then drive automation via CLI commands:\n\n```bash\n# Start daemon\nnpx opendevbrowser serve\n\n# Install auto-start (recommended for resilience)\nopendevbrowser daemon install\n\n# Stop/kill the daemon before restarting\nnpx opendevbrowser serve --stop\n\n# Launch a session\nnpx opendevbrowser launch --start-url https://example.com\n\n# Review the active target and capture fresh refs\nnpx opendevbrowser review --session-id <session-id>\n\n# Interact by ref\nnpx opendevbrowser click --session-id <session-id> --ref r12\n```\n\n`opendevbrowser serve` includes stale-daemon preflight cleanup by default, so orphan daemon processes are terminated automatically\nbefore startup while preserving the active daemon on the requested port.\nIf you are running from a temporary onboarding workspace, rerun `opendevbrowser daemon install` from a stable install location\nbefore expecting auto-start to survive login. macOS auto-start also writes `WorkingDirectory=~/.cache/opendevbrowser`\nso launchd does not start the daemon from `/`.\n\nFor single-shot scripts:\n\n```bash\nnpx opendevbrowser run --script ./script.json --output-format json\n```\n\nUse `--output-format json|stream-json` for automation-friendly output.\n\n### Help-Led Discovery\n\nStart every surface check from generated help when you need the current public lanes. The terminal help now uses these exact phrases so agents can search by intent instead of guessing command names:\n\n- `screencast / browser replay`: `screencast-start`, `screencast-stop`\n- `desktop observation`: `desktop-status`, `desktop-windows`, `desktop-active-window`, `desktop-capture-desktop`, `desktop-capture-window`, `desktop-accessibility-snapshot`\n- `computer use / browser-scoped computer use`: `--challenge-automation-mode off|browser|browser_with_helper` on `research run`, `shopping run`, `product-video run`, `inspiredesign run`, and `macro-resolve --execute`; start with `npx opendevbrowser research run --topic \"account recovery flow\" --source-selection auto --challenge-automation-mode browser --mode json --output-format json` when you need the first entry point, and use `review` plus `session-inspector` as the quickest proof surfaces while the optional helper stays browser-scoped rather than becoming a desktop agent\n\n## Challenge Handling Boundary\n\n- `SessionStore` remains the blocker FSM source of truth. Managed and `/ops`-backed responses keep `meta.blocker`, `meta.blockerState`, and `meta.blockerResolution` stable and may append additive `meta.challenge` plus `meta.challengeOrchestration`.\n- Direct browser, `/ops`, and provider fallback paths now share one bounded challenge orchestration plane. It can try auth navigation, legitimate session or cookie reuse, non-secret field fill, and bounded interaction exploration before yielding to a human.\n- Workflow and manager callers can set `challengeAutomationMode` to `off`, `browser`, or `browser_with_helper`. Effective precedence is `run > session > config`, and hard gates still apply after resolution.\n- The optional helper bridge is browser-scoped, not a desktop agent. `browser` forces it to stand down, and `browser_with_helper` only evaluates it after the existing helper hard gates pass.\n- Shipped builds also expose a public read-only desktop observation plane under separate `desktop.*` config. It is enabled by default, does not widen `/ops` or `ChallengeRuntimeHandle`, and the internal composed path still routes desktop observation back through browser-owned review when challenge automation needs it.\n- Browser fallback returns explicit transport `disposition` values: `completed`, `challenge_preserved`, `deferred`, or `failed`. When orchestration runs during fallback, decision evidence is recorded under `details.challengeOrchestration`.\n- `ProviderRegistry` is the only durable anti-bot pressure authority. Shared runtime and policy own fallback ordering and resume policy; provider modules only contribute extraction logic and `recoveryHints()`.\n- In scope: preserved sessions, normal browser controls, bounded interaction experimentation, human yield packets for secret or human-authority boundaries, and owned-environment fixtures that use vendor test keys only.\n- Out of scope: hidden bypasses, CAPTCHA-solving services, token harvesting, or autonomous unsandboxed solving of third-party anti-bot systems.\n\n---\n\n## Recent Features\n\n### v0.0.21\n\n- **Workflow success handoffs are now first-class across the main workflow lanes** with explicit follow-through metadata for research, shopping, product-video, and Inspire Design instead of generic success text.\n- **Macro execution reports blocker truthfully** because `macro-resolve --execute` now preserves blocked execution wording when runtime blocker metadata survives the run.\n- **Release validation is more stable under extension mode** because the live harnesses reuse healthy relay ownership and the product-video follow-through or timeout teardown paths no longer drift into false failures.\n- **Help and docs now treat Inspire Design's canvas handoff as the reference workflow contract** for operator next-step guidance.\n\n### v0.0.16\n\n- **Release-gate hardening** with dedicated audit/compliance scripts (`audit-zombie-files`, `docs-drift-check`, `chrome-store-compliance-check`) and grouped release-gate tests.\n- **Live direct-run release gates** across provider-by-provider and scenario-by-scenario scripts with explicit artifacts instead of broad matrix evidence.\n- **CLI/runtime reliability fixes** including launch RPC timeout derivation from wait hints, bounded macro execute timeouts, and stale extension `/cdp` attach retry handling.\n- **Version/distribution integrity checks** now enforce parity across `package.json`, `extension/manifest.json`, and `extension/package.json`.\n- **Dependency and docs refresh** for v0.0.16 release readiness, onboarding parity, and public/private distribution operations.\n\n### v0.0.15\n\n- **Documentation and release readiness refresh** across README/CLI/extension guidance.\n- **Extension mode stabilization** with stronger native host flow and recovery paths.\n- **Ops/CDP hardening** for disconnect cleanup and extension routing reliability.\n- **Coverage expansion** for browser/target/native workflows while preserving the 97% threshold.\n\n### v0.0.14\n\n- **Ops parity delivery** across daemon, relay, and extension runtime paths.\n- **New automation surface**: expanded DOM query + interaction commands/tools.\n- **Multi-client/session improvements** in core tracking and extension router behavior.\n- **Security and reliability hardening** for relay + daemon connection handling.\n\nSee [CHANGELOG.md](CHANGELOG.md) for complete version history.\n\n## Features\n\n### Browser Control\n- **Launch & Connect** - Start managed Chrome or connect to existing browsers\n- **Multi-Tab Support** - Create, switch, and manage browser tabs\n- **Profile Persistence** - Maintain login sessions across runs\n- **Headless Mode** - Run without visible browser window\n\n### Page Interaction\n- **Snapshot** - Accessibility-tree based page capture (token-efficient)\n- **Click** - Click elements by ref\n- **Type** - Enter text into inputs\n- **Select** - Choose dropdown options\n- **Upload** - Send files to a file input or chooser by ref\n- **Scroll** - Scroll page or elements\n- **Wait** - Wait for selectors or navigation\n\n### DevTools Integration\n- **Console Capture** - Monitor console.log, errors, warnings\n- **Network Tracking** - Request/response metadata (method, url, status)\n- **Debug Trace Snapshot** - Combined page/console/network/exception diagnostics with blocker metadata\n- **Screenshot** - Visible, ref-targeted, or full-page PNG capture (file or base64)\n- **Dialog** - Inspect or handle JavaScript dialogs per target\n- **Performance** - Page load metrics\n\n### Session & Macro Utilities\n- **Cookie Import** - Validate and import cookies into active sessions\n- **Cookie List** - First-class cookie inspection with optional URL filters\n- **Session Inspector** - Session-first diagnostics with relay health, trace proof, and a suggested next action\n- **Macro Resolve/Execute** - Expand macro expressions into provider actions with optional execution\n\n### Export & Clone\n- **DOM Capture** - Extract sanitized HTML with inline styles\n- **React Emitter** - Generate React component code from pages\n- **CSS Extraction** - Pull computed styles\n\n---\n\n## Tool Reference\n\nOpenDevBrowser provides **70 tools** organized by category:\nMost runtime actions also have CLI command equivalents (see [docs/CLI.md](docs/CLI.md)).\nComplete source-accurate inventory (tools + CLI + `/ops` + `/canvas` + `/cdp`): [docs/SURFACE_REFERENCE.md](docs/SURFACE_REFERENCE.md).\nTerminal help now mirrors the generated public-surface manifest rooted at `src/public-surface/source.ts` and refreshed by `scripts/generate-public-surface-manifest.mjs`. `npx opendevbrowser --help` and `npx opendevbrowser help` both show every command with its usage and primary flags, every grouped CLI flag, and every bundled `opendevbrowser_*` tool with its CLI equivalent or tool-only scope.\nSee [docs/ASSET_INVENTORY.md](docs/ASSET_INVENTORY.md) for the brand and generated help/public-surface asset inventory used by packaging and website-sync flows.\n\n### Session Management\n| Tool | Description |\n|------|-------------|\n| `opendevbrowser_launch` | Launch a session (extension relay first; managed is explicit) |\n| `opendevbrowser_connect` | Connect to existing Chrome CDP endpoint (or relay `/ops`; legacy `/cdp` via `--extension-legacy`) |\n| `opendevbrowser_disconnect` | Disconnect browser session |\n| `opendevbrowser_status` | Get session status and connection info (daemon status in hub mode) |\n| `opendevbrowser_status_capabilities` | Inspect runtime capability discovery for the host and an optional session |\n| `opendevbrowser_cookie_import` | Import validated cookies into the current session |\n| `opendevbrowser_cookie_list` | List session cookies with optional URL filters |\n| `opendevbrowser_session_inspector` | Capture a session-first diagnostic bundle with relay health, trace proof, and a suggested next action |\n| `opendevbrowser_session_inspector_plan` | Inspect browser-scoped computer-use policy, eligibility, and safe suggested steps |\n| `opendevbrowser_session_inspector_audit` | Capture a correlated audit bundle across desktop evidence, browser review, and policy state |\n\n### Tab/Target Management\n| Tool | Description |\n|------|-------------|\n| `opendevbrowser_targets_list` | List all browser tabs/targets |\n| `opendevbrowser_target_use` | Switch to a specific tab by targetId |\n| `opendevbrowser_target_new` | Open new tab (optionally with URL) |\n| `opendevbrowser_target_close` | Close a tab by targetId |\n\n### Named Pages\n| Tool | Description |\n|------|-------------|\n| `opendevbrowser_page` | Open or focus a named page (logical tab alias) |\n| `opendevbrowser_list` | List all named pages in session |\n| `opendevbrowser_close` | Close a named page |\n\n### Navigation & Interaction\n| Tool | Description |\n|------|-------------|\n| `opendevbrowser_goto` | Navigate to URL |\n| `opendevbrowser_wait` | Wait for load state or element |\n| `opendevbrowser_snapshot` | Capture page accessibility tree with refs |\n| `opendevbrowser_review` | Capture target-aware actionables plus status context before acting |\n| `opendevbrowser_review_desktop` | Capture desktop-assisted browser review with read-only desktop evidence and browser-owned verification |\n| `opendevbrowser_click` | Click element by ref |\n| `opendevbrowser_hover` | Hover element by ref |\n| `opendevbrowser_press` | Press a keyboard key (optionally focusing a ref) |\n| `opendevbrowser_check` | Check checkbox/toggle by ref |\n| `opendevbrowser_uncheck` | Uncheck checkbox/toggle by ref |\n| `opendevbrowser_type` | Type text into input by ref |\n| `opendevbrowser_select` | Select dropdown option by ref |\n| `opendevbrowser_scroll` | Scroll page or element |\n| `opendevbrowser_scroll_into_view` | Scroll element into view by ref |\n| `opendevbrowser_upload` | Upload files to a file input or chooser by ref |\n| `opendevbrowser_pointer_move` | Move the pointer to viewport coordinates |\n| `opendevbrowser_pointer_down` | Press a mouse button at viewport coordinates |\n| `opendevbrowser_pointer_up` | Release a mouse button at viewport coordinates |\n| `opendevbrowser_pointer_drag` | Drag between viewport coordinates |\n| `opendevbrowser_run` | Execute multiple actions in sequence |\n\n### DOM Inspection\n| Tool | Description |\n|------|-------------|\n| `opendevbrowser_dom_get_html` | Get outerHTML of element by ref |\n| `opendevbrowser_dom_get_text` | Get innerText of element by ref |\n| `opendevbrowser_get_attr` | Get attribute value by ref |\n| `opendevbrowser_get_value` | Get input value by ref |\n| `opendevbrowser_is_visible` | Check if element is visible |\n| `opendevbrowser_is_enabled` | Check if element is enabled |\n| `opendevbrowser_is_checked` | Check if element is checked |\n\n### DevTools & Analysis\n| Tool | Description |\n|------|-------------|\n| `opendevbrowser_console_poll` | Poll console logs since sequence |\n| `opendevbrowser_network_poll` | Poll network requests since sequence |\n| `opendevbrowser_debug_trace_snapshot` | Capture a unified page + console + network + exception diagnostic bundle |\n| `opendevbrowser_screenshot` | Capture page screenshot |\n| `opendevbrowser_screencast_start` | Start a browser replay screencast capture |\n| `opendevbrowser_screencast_stop` | Stop a browser replay screencast capture and return artifact metadata |\n| `opendevbrowser_dialog` | Inspect or handle a JavaScript dialog |\n| `opendevbrowser_perf` | Get page performance metrics |\n| `opendevbrowser_prompting_guide` | Get best-practice prompting guidance |\n\n### Desktop Observation\n| Tool | Description |\n|------|-------------|\n| `opendevbrowser_desktop_status` | Inspect public read-only desktop observation availability |\n| `opendevbrowser_desktop_windows` | List windows exposed by the public read-only desktop observation plane |\n| `opendevbrowser_desktop_active_window` | Inspect the active window through the public read-only desktop observation plane |\n| `opendevbrowser_desktop_capture_desktop` | Capture the current desktop surface through the public read-only desktop observation plane |\n| `opendevbrowser_desktop_capture_window` | Capture a specific window through the public read-only desktop observation plane |\n| `opendevbrowser_desktop_accessibility_snapshot` | Capture desktop accessibility state through the public read-only desktop observation plane |\n\nDesktop observation currently ships as a public read-only macOS surface. Availability, window inventory, and accessibility snapshots rely on the local `swift` command, while screenshot capture uses the built-in `screencapture` utility. If `desktop-status` reports `desktop_unsupported` on macOS, install Xcode or a Swift toolchain and retry.\n\n### Macro Workflows\n| Tool | Description |\n|------|-------------|\n| `opendevbrowser_macro_resolve` | Resolve macro expressions into provider action/provenance (optionally execute) |\n\n### Annotation\n| Tool | Description |\n|------|-------------|\n| `opendevbrowser_annotate` | Capture interactive annotations via direct (CDP) or relay transport |\n\n### Design Canvas\n| Tool | Description |\n|------|-------------|\n| `opendevbrowser_canvas` | Execute typed design-canvas session, attach, code-sync, preview, feedback, and overlay commands |\n\n### Export & Cloning\n| Tool | Description |\n|------|-------------|\n| `opendevbrowser_clone_page` | Export page as React component + CSS |\n| `opendevbrowser_clone_component` | Export element subtree as React component |\n\n### Skills\n| Tool | Description |\n|------|-------------|\n| `opendevbrowser_skill_list` | List available skills before choosing a local workflow lane |\n| `opendevbrowser_skill_load` | Load a skill by name and topic, especially the bundled quick start |\n\n---\n\n## Bundled Skills\n\nOpenDevBrowser includes **9 OpenDevBrowser-specific skill packs**. Install, update, and uninstall own the managed skill lifecycle across OpenCode, Codex, ClaudeCode, and AmpCLI targets:\n\n| Skill | Purpose |\n|-------|---------|\n| `opendevbrowser-best-practices` | Core prompting patterns and workflow guidance |\n| `opendevbrowser-design-agent` | Contract-first, research-backed frontend and `/canvas` design execution |\n| `opendevbrowser-continuity-ledger` | Long-running task state management |\n| `opendevbrowser-login-automation` | Authentication flow patterns |\n| `opendevbrowser-form-testing` | Form validation and submission workflows |\n| `opendevbrowser-data-extraction` | Structured data scraping patterns |\n| `opendevbrowser-research` | Deterministic multi-source research workflows |\n| `opendevbrowser-shopping` | Deterministic multi-provider deal comparison workflows |\n| `opendevbrowser-product-presentation-asset` | Product screenshot/copy asset collection for presentation pipelines |\n\nInstaller note:\n- `--skills-global` and `--skills-local` sync the 9 canonical `opendevbrowser-*` packs into managed global or project-local agent directories.\n- Managed installs write a target-level ownership marker, so later update and uninstall only act on CLI-managed skill targets or older config installs that already contain canonical packs.\n- Reinstall and update refresh drifted managed copies and leave matching packs unchanged.\n- Uninstall removes managed canonical packs, retires repo-owned legacy alias directories that match shipped content, and leaves unrelated directories untouched.\n\nSkills are discovered from (priority order):\n1. `.opencode/skill/` (project)\n2. `~/.config/opencode/skill/` (global)\n3. `.codex/skills/` (project compatibility)\n4. `$CODEX_HOME/skills` (global compatibility; fallback `~/.codex/skills`)\n5. `.claude/skills/` (ClaudeCode project compatibility)\n6. `$CLAUDECODE_HOME/skills` (ClaudeCode global compatibility; fallback `~/.claude/skills`)\n7. `.amp/skills/` (AmpCLI project compatibility)\n8. `$AMP_CLI_HOME/skills` (AmpCLI global compatibility; fallback `~/.amp/skills`)\n9. Custom paths via `skillPaths` config\n10. Bundled package fallback: packaged `skills/` directory after `skillPaths` when no installed copy matches\n\nLoad a skill: `opendevbrowser_skill_load` with `name` and optional `topic` filter.\n`opendevbrowser_prompting_guide`, `opendevbrowser_skill_list`, and `opendevbrowser_skill_load` are local onboarding helpers, so they do not require a browser session, relay, or daemon bootstrap.\n\n---\n\n## Browser Modes\n\n| Mode | Tool | Use Case |\n|------|------|----------|\n| **Managed** | `opendevbrowser_launch` | Fresh browser, full control, automatic cleanup |\n| **CDP Connect** | `opendevbrowser_connect` | Attach to existing Chrome with `--remote-debugging-port` |\n| **Extension Relay** | Chrome Extension | Attach to logged-in tabs via relay server |\n\nDefault behavior: `opendevbrowser_launch` prefers **Extension Relay** when available. Use `--no-extension` (and `--headless` if desired) for managed sessions.\n\nExtension relay relies on **flat CDP sessions (Chrome 125+)** and uses DebuggerSession `sessionId` routing for multi-tab and child-target support. When hub mode is enabled, the hub daemon is the sole relay owner and there is **no local relay fallback**.\n\nRelay ops endpoint: `ws://127.0.0.1:<relayPort>/ops`.\nThe connect command also accepts base relay WS URLs (`ws://127.0.0.1:<relayPort>` or `ws://localhost:<relayPort>`) and normalizes them to `/ops`.\nRelay canvas endpoint: `ws://127.0.0.1:<relayPort>/canvas` for design-canvas editor, session attach/lease flow, code-sync, preview, public feedback pull streams, and overlay flows.\nLegacy relay `/cdp` remains available with explicit opt-in (`--extension-legacy`).\nWhen pairing is enabled, `/ops`, `/canvas`, and `/cdp` require a relay token (`?token=<relayToken>`). Tools and the CLI auto-fetch relay config and tokens.\n\n## Relay Channels\n\n| Channel | What It Does | When to Use It |\n|---------|---------------|----------------|\n| **`/ops` (default)** | High-level automation protocol with session ownership, event streaming, and multi-client handling | Preferred extension relay path for modern workflows |\n| **`/canvas`** | Typed design-canvas protocol for session handshakes/attach, Figma document import, reusable inventory list/insert, built-in starter list/apply flows, framework-adapter-backed code sync, preview tabs, public feedback pull streams, and overlay selection | Use with `opendevbrowser_canvas` or `opendevbrowser canvas` during design-canvas workflows |\n| **`/cdp` (legacy)** | Low-level CDP relay path with compatibility-focused behavior | Opt-in compatibility mode (`--extension-legacy`) |\n| **Direct CDP connect** | Attach to Chrome started with `--remote-debugging-port` | Existing debug/browser setups without extension relay |\n\nFor full `/ops` and `/canvas` command names, `/cdp` envelope details, and mode/flag matrices, see [docs/SURFACE_REFERENCE.md](docs/SURFACE_REFERENCE.md).\n\n---\n\n## Breaking Changes (latest)\n\n- `opendevbrowser_launch` now prefers the extension relay by default. Use `--no-extension` (and `--headless` if desired) for managed sessions.\n- Relay `/ops` (default) and legacy `/cdp` both require a token when pairing is enabled; tools/CLI handle this automatically.\n\n## Chrome Extension (Optional)\n\nThe extension enables **Extension Relay** mode - attach to existing logged-in browser tabs without launching a new browser.\n\n**Requirements:** Chrome 125+ (flat CDP sessions). Older versions will fail fast with a clear error.\n\n### Auto-Connect + Auto-Pair\n\nThe runtime (plugin or CLI daemon) and extension can automatically pair:\n\n1. **Runtime side**: Starts a local relay server and config discovery endpoint\n2. **Extension side**: Enable \"Auto-Pair\" toggle and click Connect\n3. Extension fetches relay port from discovery, then fetches token from the relay server\n4. Connection established with color indicator (green = connected)\n\n**Auto-connect** and **Auto-pair** are enabled by default for a seamless setup. The extension badge shows a small status dot (green = connected, red = disconnected).\nIf the relay is unavailable, the background worker retries `/config` + `/pair` with exponential backoff (using `chrome.alarms`).\n\n### Default Settings (Extension)\n\n| Setting | Default |\n|---------|---------|\n| Relay port | `8787` |\n| Auto-connect | `true` |\n| Auto-pair | `true` |\n| Require pairing token | `true` |\n| Pairing token | `null` (fetched on connect) |\n\n### Connection Flow (Extension Relay)\n\n1. Extension checks the discovery endpoint at `http://127.0.0.1:8787/config`.\n2. It learns the relay port and whether pairing is required.\n3. If pairing is required and Auto-pair is on, it fetches the token from `http://127.0.0.1:<relayPort>/pair`.\n4. It connects to `ws://127.0.0.1:<relayPort>/extension` using the extension origin.\n\n`/config` and `/pair` accept loopback requests with no `Origin` (including `Origin: null`) to support MV3 + PNA; non-extension origins are still rejected, and preflights include `Access-Control-Allow-Private-Network: true`.\n\n### Troubleshooting: Extension Won't Connect\n\n- Ensure the active tab is a normal `http(s)` page (not `chrome://` or extension pages).\n- Confirm `relayPort` and `relayToken` in `~/.config/opencode/opendevbrowser.jsonc` match the popup (Auto-pair should fetch the token).\n- If `relayPort` is `0`, the relay is off.\n- `relayToken: false` disables relay/hub behavior entirely.\n- `relayToken: \"\"` (empty string) keeps relay enabled but disables pairing requirements.\n- Install auto-start with `opendevbrowser daemon install` from a stable install location so the relay is available on login.\n- Clear extension local data and retry if the token/port seem stuck.\n- If another process owns the port, change `relayPort` or stop it; `opencode` listening is expected.\n\n### Manual Setup\n\n1. Ensure extension assets exist by running either:\n   - `npx opendevbrowser --full` (installer path), or\n   - `npm run extension:build` (repo/dev path)\n2. Load unpacked from `~/.config/opencode/opendevbrowser/extension`\n   (fallback: `~/.cache/opencode/node_modules/opendevbrowser/extension`).\n3. Open extension popup\n4. Enter the same relay port and token as the runtime config\n   (if `relayToken` is missing, either add one to `opendevbrowser.jsonc` or use Auto-Pair).\n5. Click Connect\n\n### Where Extension Assets Live\n\nExtension assets are bundled inside the NPM package and extracted on install/startup:\n\n- Primary: `~/.config/opencode/opendevbrowser/extension`\n- Fallback: `~/.cache/opencode/node_modules/opendevbrowser/extension`\n\nExtraction is handled by `extractExtension()` (see `src/extension-extractor.ts`).\n\n---\n\n## Configuration\n\nOptional config file: `~/.config/opencode/opendevbrowser.jsonc`\n\n```jsonc\n{\n  // Browser settings\n  \"headless\": false,\n  \"profile\": \"default\",\n  \"persistProfile\": true,\n  \"chromePath\": \"/path/to/chrome\",  // Custom Chrome executable\n  \"flags\": [\"--disable-extensions\"],  // Additional Chrome flags\n\n  // Snapshot limits\n  \"snapshot\": { \"maxChars\": 16000, \"maxNodes\": 1000 },\n\n  // Export limits\n  \"export\": { \"maxNodes\": 1000, \"inlineStyles\": true },\n\n  // DevTools output\n  \"devtools\": { \"showFullUrls\": false, \"showFullConsole\": false },\n\n  // Security (all default false for safety)\n  \"security\": {\n    \"allowRawCDP\": false,\n    \"allowNonLocalCdp\": false,\n    \"allowUnsafeExport\": false\n  },\n\n  // Provider workflow cookie defaults (optional)\n  \"providers\": {\n    \"cookiePolicy\": \"auto\",\n    \"cookieSource\": {\n      \"type\": \"file\",\n      \"value\": \"~/.config/opencode/opendevbrowser.provider-cookies.json\"\n    },\n    \"challengeOrchestration\": {\n      \"mode\": \"browser_with_helper\",\n      \"optionalComputerUseBridge\": {\n        \"enabled\": true\n      }\n    }\n  },\n\n  // Public read-only sibling desktop observation runtime (enabled by default; set \"off\" to opt out)\n  // On macOS, availability, window, and accessibility probes require the local swift command.\n  \"desktop\": {\n    \"permissionLevel\": \"observe\",\n    \"commandTimeoutMs\": 10000,\n    \"auditArtifactsDir\": \".opendevbrowser/desktop-runtime\",\n    \"accessibilityMaxDepth\": 2,\n    \"accessibilityMaxChildren\": 25\n  },\n\n  // Skills configuration\n  \"skills\": {\n    \"nudge\": {\n      \"enabled\": true,\n      \"keywords\": [\"form\", \"login\", \"extract\", \"scrape\"],\n      \"maxAgeMs\": 60000\n    }\n  },\n  \"skillPaths\": [\"./custom-skills\"],  // Additional skill directories\n\n  // Continuity ledger\n  \"continuity\": {\n    \"enabled\": true,\n    \"filePath\": \"opendevbrowser_continuity.md\",\n    \"nudge\": {\n      \"enabled\": true,\n      \"keywords\": [\"plan\", \"multi-step\", \"refactor\", \"migration\"],\n      \"maxAgeMs\": 60000\n    }\n  },\n\n  // Extension relay\n  \"relayPort\": 8787,\n  \"relayToken\": \"auto-generated-on-first-run\",\n\n  // Hub daemon (relay ownership + FIFO queue)\n  \"daemonPort\": 8788,\n  \"daemonToken\": \"auto-generated-on-first-run\",\n\n  // Updates\n  \"checkForUpdates\": false\n}\n```\n\nAll fields are optional. OpenDevBrowser works with sensible defaults.\n\n---\n\n## CLI Commands\n\nThe CLI is agent-agnostic and supports the full automation surface (session, navigation, interaction, DOM, browser capture and replay, desktop observation, targets, pages, export, devtools, annotate, and canvas).\nAll commands listed in the CLI reference are implemented and available in the current codebase.\nSee [docs/CLI.md](docs/CLI.md) for the full command and flag matrix.\nSee [docs/SURFACE_REFERENCE.md](docs/SURFACE_REFERENCE.md) for the source-accurate inventory matrix (77 CLI commands, 70 tools, `/ops`, `/canvas`, and `/cdp` channel contracts).\n\n### CLI Category Matrix (core command groups)\n\n| Category | Commands |\n|---------|----------|\n| Install/runtime | `install`, `update`, `uninstall`, `help`, `version`, `serve`, `daemon`, `native`, `run` |\n| Session/connection | `launch`, `connect`, `disconnect`, `status`, `status-capabilities`, `cookie-import`, `cookie-list` |\n| Navigation | `goto`, `wait`, `snapshot`, `review`, `review-desktop` |\n| Interaction | `click`, `hover`, `press`, `check`, `uncheck`, `type`, `select`, `scroll`, `scroll-into-view`, `upload`, `pointer-move`, `pointer-down`, `pointer-up`, `pointer-drag` |\n| Targets/pages | `targets-list`, `target-use`, `target-new`, `target-close`, `page`, `pages`, `page-close` |\n| DOM | `dom-html`, `dom-text`, `dom-attr`, `dom-value`, `dom-visible`, `dom-enabled`, `dom-checked` |\n| Browser capture | `screenshot`, `screencast-start`, `screencast-stop` |\n| Desktop observation | `desktop-status`, `desktop-windows`, `desktop-active-window`, `desktop-capture-desktop`, `desktop-capture-window`, `desktop-accessibility-snapshot` |\n| Design canvas | `canvas` |\n| Export/diagnostics/macro/annotation/power | `clone-page`, `clone-component`, `perf`, `dialog`, `console-poll`, `network-poll`, `debug-trace-snapshot`, `session-inspector`, `session-inspector-plan`, `session-inspector-audit`, `macro-resolve`, `annotate`, `rpc` |\n\n### Install/Management\n\n| Command | Description |\n|---------|-------------|\n| `npx opendevbrowser` | Interactive install |\n| `npx opendevbrowser --global` | Install to global config |\n| `npx opendevbrowser --local` | Install to project config |\n| `npx opendevbrowser --with-config` | Also create opendevbrowser.jsonc |\n| `npx opendevbrowser --full` | Full install (config + extension assets) |\n| `npm install -g opendevbrowser` | Install persistent global CLI |\n| `npx opendevbrowser --update` | Repair cached plugin pins |\n| `npx opendevbrowser --uninstall` | Remove from config |\n| `npx opendevbrowser --version` | Show version |\n\n### Common Automation Commands (Daemon-backed)\n\nStart the daemon with `npx opendevbrowser serve`, then use:\n\n| Command | Description |\n|---------|-------------|\n| `npx opendevbrowser launch` | Launch session (defaults to extension mode when available) |\n| `npx opendevbrowser connect` | Connect via relay or direct CDP endpoint |\n| `npx opendevbrowser disconnect` | Disconnect session |\n| `npx opendevbrowser status` | Show session status |\n| `npx opendevbrowser status-capabilities --session-id <id>` | Inspect host and session capability discovery before a workflow run |\n| `npx opendevbrowser session-inspector --session-id <id>` | Capture a session-first diagnostic bundle with relay health, trace proof, and a suggested next action |\n| `npx opendevbrowser session-inspector-plan --session-id <id>` | Inspect browser-scoped computer-use policy, eligibility, and safe suggested steps |\n| `npx opendevbrowser session-inspector-audit --session-id <id>` | Capture a correlated audit bundle across desktop evidence, browser review, and policy state |\n| `npx opendevbrowser goto` | Navigate to URL |\n| `npx opendevbrowser wait` | Wait for load or element |\n| `npx opendevbrowser snapshot` | Capture snapshot with refs |\n| `npx opendevbrowser review-desktop --session-id <id> --reason \"<context>\"` | Capture desktop-assisted browser review with read-only desktop evidence |\n| `npx opendevbrowser click` | Click element by ref |\n| `npx opendevbrowser type` | Type into element by ref |\n| `npx opendevbrowser select` | Select dropdown option by ref |\n| `npx opendevbrowser scroll` | Scroll page or element |\n| `npx opendevbrowser run` | Run a JSON script |\n| `npx opendevbrowser canvas --command canvas.session.open --params '{...}'` | Start or continue a design-canvas workflow through the daemon |\n| `npx opendevbrowser macro-resolve --expression '@media.search(\"youtube transcript parity\", \"youtube\", 5)' --execute --timeout-ms 120000` | Execute macro plans with extended timeout for slow runs |\n\nWorkflow cookie controls (`research run`, `shopping run`, `product-video run`, `inspiredesign run`):\n- Defaults come from `providers.cookiePolicy` (`off|auto|required`) and `providers.cookieSource` (`file|env|inline`).\n- Per-run overrides: `--use-cookies`, `--cookie-policy-override` (alias `--cookie-policy`).\n- `auto` is non-blocking when cookies are unavailable; `required` fails fast with `reasonCode=auth_required`.\n\nWorkflow challenge controls (`research run`, `shopping run`, `product-video run`, `inspiredesign run`):\n- Per-run override: `--challenge-automation-mode off|browser|browser_with_helper`, which maps to `challengeAutomationMode`.\n- Effective precedence is `run > session > config`.\n- `off` keeps detection and reporting active but stands down challenge actions.\n- `browser` allows browser-native lanes only and keeps the helper bridge disabled.\n- `browser_with_helper` keeps browser-native lanes first and evaluates the browser-scoped helper bridge second when hard gates pass.\n- The helper bridge remains browser-scoped and is not a desktop agent.\n\n---\n\n## Security\n\nOpenDevBrowser is **secure by default** with defense-in-depth protections:\n\n| Protection | Details |\n|------------|---------|\n| **CDP Localhost-Only** | Remote endpoints blocked; hostname normalized to prevent bypass |\n| **Timing-Safe Auth** | `crypto.timingSafeEqual()` for token comparison |\n| **Origin Validation** | `/extension` requires `chrome-extension://` origin; `/ops`, `/canvas`, `/cdp`, `/annotation`, and `/config`/`/status`/`/pair` allow loopback no-Origin requests |\n| **PNA Preflights** | HTTP preflights include `Access-Control-Allow-Private-Network: true` when requested |\n| **Rate Limiting** | 5 handshake attempts/minute per IP, plus HTTP rate limiting for `/config`, `/status`, `/pair` |\n| **Data Redaction** | Tokens, API keys, sensitive paths auto-redacted |\n| **Export Sanitization** | Scripts, event handlers, dangerous CSS stripped |\n| **Atomic Writes** | Config writes are atomic to prevent corruption |\n| **Secure Defaults** | `allowRawCDP`, `allowNonLocalCdp`, `allowUnsafeExport` all `false` |\n\n---\n\n## Updating\n\n```bash\n# Repair OpenCode's cached package and manifest pin, then restart OpenCode\nnpx opendevbrowser --update\n```\n\nArchitecture overview: [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)\nRelease checklist: [docs/DISTRIBUTION_PLAN.md](docs/DISTRIBUTION_PLAN.md)\nDocumentation index: [docs/README.md](docs/README.md)\nFrontend docs: [docs/FRONTEND.md](docs/FRONTEND.md)\nDependency inventory: [docs/DEPENDENCIES.md](docs/DEPENDENCIES.md)\nLocal-only generated artifacts such as `prompt-exports/`, root `artifacts/`, `coverage/`, `CONTINUITY*.md`, and `sub_continuity.md` stay uncommitted; `.gitignore` is authoritative.\n\n---\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────────────────┐\n│                      Distribution Layer                         │\n├──────────────────┬──────────────────┬──────────────────┬──────────────────────────┤\n│ OpenCode Tools   │       CLI        │    Hub Daemon    │    Chrome Extension       │\n│  (src/index.ts)  │ (src/cli/index)  │ (opendevbrowser  │   (extension/src/)        │\n│                  │                  │      serve)     │                           │\n└────────┬─────────┴────────┬─────────┴─────────┬────────┴──────────────┬────────────┘\n         │                  │                  │                       │\n         ▼                  ▼                  ▼                       ▼\n┌─────────────────────────────────────────────────────────────────┐\n│                    Core Runtime (src/core/)                    │\n│  bootstrap.ts → wires managers, sibling desktop runtime,       │\n│                   automation coordinator, injects ToolDeps     │\n└────────┬────────────────────────────────────────────────────────┘\n         │\n    ┌────┴────┬─────────────┬──────────────┬──────────────┬──────────────┐\n    ▼         ▼             ▼              ▼              ▼              ▼\n┌────────┐ ┌────────┐ ┌──────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐\n│Browser │ │Script  │ │Snapshot  │ │ Annotation │ │  Relay     │ │  Skills    │\n│Manager │ │Runner  │ │Pipeline  │ │  Manager   │ │  Server    │ │  Loader    │\n└───┬────┘ └────────┘ └──────────┘ └────────────┘ └─────┬──────┘ └────────────┘\n    │                                                  │\n    ▼                                                  ▼\n┌────────┐                                        ┌────────────┐\n│Target  │                                        │ Extension  │\n│Manager │                                        │ (WS relay) │\n└────────┘                                        └────────────┘\n```\n\nThe simplified map above omits the dedicated Challenge Coordinator, Desktop Runtime, and Automation Coordinator that now sit beside the browser managers; see [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the full component map and ownership boundaries.\n\n### Data Flow\n\n```\nTool Call → Zod Validation → Manager/Runner → CDP/Playwright → Response\n                                   ↓\n                            Snapshot (AX-tree → refs)\n                                   ↓\n                            Action (ref → backendNodeId → DOM)\n```\n\n### System Workflow (Happy Path)\n\n1. `launch` (extension or managed) -> `sessionId`\n2. `snapshot` -> refs\n3. Action commands (`click`, `type`, `press`, `hover`, `check`, etc.) -> repeat snapshot\n4. `disconnect` on completion\n\n### Repository Layout\n\n```\n.\n├── src/              # Runtime implementation\n│   ├── annotate/     # Annotation transports + output shaping\n│   ├── automation/    # Automation helpers and coordinator\n│   ├── browser/      # Browser sessions, target orchestration, canvas preview/code-sync\n│   ├── cache/        # Chrome executable resolution\n│   ├── canvas/       # Design-canvas document store, repo IO, code-sync, export helpers\n│   ├── challenges/   # Bounded challenge orchestration plane, evidence, recovery lanes\n│   ├── cli/          # CLI commands, daemon, installers\n│   ├── core/         # Bootstrap, runtime wiring, ToolDeps\n│   ├── desktop/      # Read-only desktop observation runtime\n│   ├── devtools/     # Console/network trackers with redaction\n│   ├── export/       # DOM capture, React emitter, CSS extraction\n│   ├── integrations/ # External integration adapters (Figma import, etc.)\n│   ├── macros/       # Macro parsing, resolution, provider-action expansion\n│   ├── providers/    # Provider runtime, policy, workflows, browser fallback\n│   ├── public-surface/ # Generated manifest source, CLI/tool metadata\n│   ├── relay/        # Extension relay server, protocol types\n│   ├── skills/       # SkillLoader for skill pack discovery\n│   ├── snapshot/     # AX-tree snapshots, ref management\n│   ├── tools/        # 70 opendevbrowser_* tool definitions\n│   └── utils/        # Shared utilities\n├── extension/        # Chrome extension (relay client)\n├── scripts/          # Operational scripts (build/sync/smoke)\n├── skills/           # Bundled skill directories (11 total; 9 canonical OpenDevBrowser packs + 2 shared compatibility packs)\n├── tests/            # Vitest tests (97% coverage required)\n└── docs/             # Architecture, CLI, extension, distribution plans\n```\n\nExtension relay uses flat CDP sessions (Chrome 125+) with DebuggerSession `sessionId` routing for multi-tab support. When hub mode is enabled, the hub daemon is the sole relay owner and enforces a FIFO lease queue for multi-client safety. See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the full architecture reference.\n\n---\n\n## Development\n\n```bash\nnpm install\nnpm run build      # Compile to dist/\nnpm run test       # Run tests with coverage (97% threshold)\nnpm run lint       # ESLint checks (strict TypeScript)\nnpm run extension:build  # Compile extension\nnpm run version:check    # Verify package/extension version alignment\nnpm run extension:pack   # Build extension zip for releases\n```\n\n### Packaging & Distribution (Public + Private)\n\nUniform versioning is required (source of truth: `package.json`):\n\n1. Bump `package.json` version.\n2. Run: `npm run extension:sync`\n3. Run: `npm run version:check`\n4. Run: `npm run test:release-gate`\n5. Run: `npm run build`\n6. Run: `npm run extension:build`\n7. Run release audits:\n   - `node scripts/audit-zombie-files.mjs`\n   - `node scripts/docs-drift-check.mjs`\n   - `node scripts/chrome-store-compliance-check.mjs`\n   - `./skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh`\n8. Run strict live release gates:\n   - `node scripts/provider-direct-runs.mjs --release-gate --out artifacts/release/vX.Y.Z/provider-direct-runs.json`\n   - `node scripts/live-regression-direct.mjs --release-gate --out artifacts/release/vX.Y.Z/live-regression-direct.json`\n9. Run first-time global install dry run checklist from `docs/FIRST_RUN_ONBOARDING.md`.\n10. Run: `npm run extension:pack` (outputs `./opendevbrowser-extension.zip`)\n11. Run: `npm pack`\n12. Tag `vX.Y.Z` and let `.github/workflows/release-public.yml` publish npm + GitHub release artifacts.\n13. Dispatch website content sync to private repo through `.github/workflows/dispatch-private-sync.yml`.\n\nRunbooks:\n- `docs/DISTRIBUTION_PLAN.md`\n- `docs/RELEASE_RUNBOOK.md`\n- `docs/EXTENSION_RELEASE_RUNBOOK.md`\n- `docs/CUTOVER_CHECKLIST.md`\n\n---\n\n## Privacy\n\nSee [Privacy Policy](docs/privacy.md) for data handling details.\n\n---\n\n## License\n\nMIT\n","readmeFilename":"README.md"}