{"_id":"scenescout","_rev":"20-ba3b4f53659f6ae20af5637e78f2b33f","name":"scenescout","dist-tags":{"latest":"3.9.0"},"versions":{"1.0.0":{"name":"scenescout","version":"1.0.0","keywords":["mcp","model-context-protocol","exploratory-testing","ui-testing","playwright","claude-code","qa","ai-agent"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@1.0.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"4ca131e2b6ff8f8d76c97009184d6b5239aba14a","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-1.0.0.tgz","fileCount":26,"integrity":"sha512-cujXMmpHqTBbhSZHo8kM2TT4fHHQnMg3RRK77Pph07cdY+ytk8ZYcAO7UIzBX4o5+BANaLo9r231LLxYcK3H4g==","signatures":[{"sig":"MEYCIQDit2GHhjrcUJ+4KTVCY/MnLT5L4EpqK+iy55K0+Bp34gIhAJsa8G+rattpk3FQh2DAse/3KAoV8vx27DDYvKzUS0Fh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":471836},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"16539bb8155287b07f47bc6e9939a9bd7f5c64fa","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","mcp-check":"npm run build && npm run mcp-check:run","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run memory-test && npm run install-test","demo:serve":"node demo-app/server.mjs","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","install-test":"tsx --test scripts/install-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only"},"_npmUser":{"name":"brunoboto96","email":"brunoboto96@gmail.com"},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.6.2","description":"SceneScout — AI-agent exploratory UI testing engine: an MCP server exposing Playwright browser tools with state-fingerprint memory, invariant oracles, structured findings and reports. Claude Code (or any MCP client) is the brain.","directories":{},"_nodeVersion":"24.11.1","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_1.0.0_1789760848644_0.03222895666576431","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"scenescout","version":"1.1.0","keywords":["mcp","model-context-protocol","exploratory-testing","ui-testing","playwright","claude-code","qa","ai-agent"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@1.1.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"15e1a1d24bed8bdc51fac274a253cb155afe95ca","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-1.1.0.tgz","fileCount":27,"integrity":"sha512-BUR5m40SsRoadejuHOaRoKnkK+aCXb09CUiCN0g9r4ZdDbUW+A8i+JWLYW59tsYPOOCWtZ+/yUe9CLwcTZqfmQ==","signatures":[{"sig":"MEQCIBgsMQuy1ZG+jTCWHEGOd8gKLkuUyAQolot5xtWNi+AdAiA55hQSWnUJIhxsFZzYFgwtYZypt/sXZx447KqVB4dJVA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBN86z7vHbsKJLzjAdZUouVaLQ4CIdtANePX2g8WcgQ9AiBo6BMMh4atSBlMeEcu3pIf0gYpuWONfU4rG5vzt0ULCA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":517743},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"36d3d2e133bb1c8ffe5f746978c4decc62ea6f1b","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","mcp-check":"npm run build && npm run mcp-check:run","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run memory-test && npm run install-test && npm run hygiene-test","demo:serve":"node demo-app/server.mjs","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — AI-agent exploratory UI testing engine: an MCP server exposing Playwright browser tools with state-fingerprint memory, invariant oracles, structured findings and reports. Claude Code (or any MCP client) is the brain.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_1.1.0_1789809796548_0.05984429247204326","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"scenescout","version":"1.2.0","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@1.2.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"30484d0580c92568546476db463ff0595f67638c","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-1.2.0.tgz","fileCount":31,"integrity":"sha512-5g3dLI5A5ebzxLFm9IbPhKiIcrvfEP+vrLHYDI3TENEoKtzShWVAJG9oy03NOo2yUeT955mf1fBz6Z0kfdg9jw==","signatures":[{"sig":"MEQCIHWdT0XIBowwvLLo8LYGRzy736WaClWrKWU+R7sAIr03AiBRsUz0fwZk0XLSjPsJth64aEZKk5ICTSgChhCXQCkimw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC8h/xEbhepCWRjwQH4HKjYR/iWl7WIUO18xYxgD2Y4/QIgMGYi0C8to+eIae2cU4gkx+AVR2ScDYLTnApu6vqczs8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":565497},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"7b50b63b1c65f937b9768bbe3797b0324572a5f1","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","mcp-check":"npm run build && npm run mcp-check:run","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run memory-test && npm run install-test && npm run hygiene-test","demo:serve":"node demo-app/server.mjs","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_1.2.0_1789822089155_0.663259795154103","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"scenescout","version":"1.3.0","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@1.3.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"c1977f4bc5a3132437a3eba1876e434cdccb705c","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-1.3.0.tgz","fileCount":33,"integrity":"sha512-i+Kr8KpgfbOAqKiB5dsVrk9+iHvEoYMyUssaF7jInNZ9mqVFvbQIrcd8nu9W9It0SGbgdv1TwH5PTwSX4W2alA==","signatures":[{"sig":"MEUCIQChmvQW900vufc5k1vDnMmQBDO2ANB7WKndD0ulDnsiBQIgdyPeF6whM6vCGKgQauSnjR/6BxYJI79rrBxDYFS78zI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD3rGDxAnnfd7iaPpZ0CsapnNMJsJZxcswgbjClcb6qdAIgckhXmHCbWJEIZr7bu5idwWTjFkud7vH0rc1GBusg14U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@1.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":656571},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"c3cd1d1ba3a23c1620240c8859be1430ada8b33d","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run memory-test && npm run install-test && npm run live-test && npm run hygiene-test","demo:serve":"node demo-app/server.mjs","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_1.3.0_1789855035437_0.22320108234160907","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"scenescout","version":"1.4.0","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@1.4.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"4f8481a8e3db88194398ceae1f1b02ef050c20ed","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-1.4.0.tgz","fileCount":34,"integrity":"sha512-3seZ5575+HreiX2ybxisUFdLdhb41UXX7rDXmSzk6kOg5rAYWTD4IQlhYTRUdXNZVx/n2XLfG5FzY5uzBHW72Q==","signatures":[{"sig":"MEQCIFSlVDBVKNXhTWPLaXhciiodZdlk9rWl3VslwJpqKvVSAiAOj5na/Oc4zuUJNVb0sfBBfcTYghOwZzbbIYJNLy6DRQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHksHfrHLtRlvT837vj3HE6WY2bzjEygR1+P/wrMD7dtAiEAyq6zxTa2ka7H/n7+85QLFX3ylSKXOcf5QK8kpnSAT68=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@1.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":671795},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"4729160caa738bfb64973c898348c72a3568045d","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","demo:serve":"node demo-app/server.mjs","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_1.4.0_1789858824109_0.1724928308318756","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"scenescout","version":"1.5.0","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@1.5.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"59fe4078530a88a161f98a7706036d7f52159add","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-1.5.0.tgz","fileCount":34,"integrity":"sha512-Z1ZPPYp0JVEtj4k6ea6G7UcIpCHf5fUg6MtJ/iuhri+MYF51tbqcoL1R0R93WNdWCyEzw0eQn0Fj/SyY+Z2pNA==","signatures":[{"sig":"MEYCIQDEFlrAnJZFTtIJL3rS2SMDShZi8+gE8aCRs/MMTMGv2wIhAPQL2x9/5hd11eWvONFWOmnLPt9OlXlc8Ypvg/qUN2gC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDWzGJEl05mkoR7yCbEb6ouCVtCFl+P4zUWM9kXt99P9gIgdkpwHt8RntYtws8PnpjTW7vU6r83BcW77o3210HnJMs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@1.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":677491},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"1ae4ce771cf6061a44094c3b5b6f0c6d111c1e57","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","demo:serve":"node demo-app/server.mjs","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_1.5.0_1789861286118_0.7546976918066082","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"scenescout","version":"2.0.0","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@2.0.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"7e64486fb2b35710a54e2bf4d1f1f78daf867da1","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-2.0.0.tgz","fileCount":35,"integrity":"sha512-dzDl6SIshbeW7Kc/uHmDUAY6H4BC7UYFKvcYOTEcwCklOS9cE5sEFdcM2Qab3Y6uUXF1hufvrVaiPYmT+OtsBg==","signatures":[{"sig":"MEUCIDDZQn6hsUA/47QnI5lcZGFvYpKw+pabL2IofBdq0KGhAiEA6CUUZudmW33O5onlA2Gq8OBTwbxRBslk4hKD4b/a+DI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFQRa/XcbmMfJK4Rz6TVOnEhWyyST1e6HqGb3j0kDa/nAiBlcCB1L2pybV2DRYfP5sF6CxKTVXqjn9CxDAi1dUUBSA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":685505},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"6ab19ea4d554366348fe39e818c8ae14be9df4e9","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","demo:serve":"node demo-app/server.mjs","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_2.0.0_1789864396465_0.7130006274569862","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"scenescout","version":"3.0.0","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@3.0.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"607ab69a005073b71533a1c1dd662dec6c9be706","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-3.0.0.tgz","fileCount":35,"integrity":"sha512-DkaVuXY5FsEUmJ3FQPRWydYnOa2OWYsfgHGQg7aYmIijimijgMJhpZWazwAN3/+RDwxC+ZQ6dKA6lIvS3WhVig==","signatures":[{"sig":"MEUCIQDf0rt4Lahozp5JXtOVr/FxXBBaiGPLohNFHAFiLUb2+wIgKekC9XPIhQ/LFNm/qC/vhPsgAVUPI5tMEnLVxEM3ccE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGMEpdLS4B14oLbf7Iew9IpCxGiZeUmsiNvb2dNs+fpiAiEA7IsPagq9fSBOg1LZP4mb1XZncxO5j7FRFQT6L+Oyd04=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":690419},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"1eed9055450a705f5184d4f2d18ea7250b760ec0","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","demo:serve":"node demo-app/server.mjs","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_3.0.0_1789867734077_0.23591557325657742","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"scenescout","version":"3.0.1","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@3.0.1","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"533b76a7ff9645776253a30f121cf7f99de1f2b4","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-3.0.1.tgz","fileCount":35,"integrity":"sha512-AFz5U+dCuS5f1in2ej6tGxKPlT+YaFQElIustQRCyNFucKt9oJhklERjqlq90XHHr9qVlUH/6ZgqCpUTklfxKg==","signatures":[{"sig":"MEUCIB1UDmXs0GvT/2XxkZJ5tfciuPrMs33/taykz/5/N9MEAiEApMugVD36MKsA3F9jheTq3gKi5ndKNA88vYxziWeYdWQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD+rjHP7yIgVudiTE9gl2s0TbAH1h9GHGeXgzbyftBwSQIhAKDO8UgUCV0PBJGuHeodi9Nm8acz7iZy6aI8CZOGSPBW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@3.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":692612},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"0c0c7cd5f3e58a18ac292fa95a29e06e4de110ee","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","demo:serve":"node demo-app/server.mjs","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_3.0.1_1789869876080_0.7239321431970542","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"scenescout","version":"3.1.0","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@3.1.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"b5912bd3d00ca96ea6517bf82a3dc747907d0851","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-3.1.0.tgz","fileCount":36,"integrity":"sha512-iDL78sxA2RTd6rW1iG0LpunW/JmJvrfHaCRWPOUGyoMJd8nyWYShFNm58+14OkpSO+hoCz+5GkLqEWautpVaZw==","signatures":[{"sig":"MEQCIGgyHx2PPURo6erjnvDHy4eczN92hU6JSexz3beTsd0BAiBcgxiqS7/TZIl7cB0kBDM86kXLiQ/PgDwJyzSwsCNgSA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFoOOp9m3sThKtN9IpJ5Y3RqrofQTBaO5dE2Z1TzuCNxAiB+z4ahTpPuv7hZn+87z48+c6vSQD7L48wJHWqsmg0WIQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@3.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":740115},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"3ab252f868f18543be2881b55903de1d5e1a6020","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","demo:serve":"node demo-app/server.mjs","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_3.1.0_1789923394076_0.5096211411590688","host":"s3://npm-registry-packages-npm-production"}},"3.1.1":{"name":"scenescout","version":"3.1.1","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@3.1.1","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"66fc90866da45e63c7b22755b7f05e296206c82e","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-3.1.1.tgz","fileCount":36,"integrity":"sha512-gYwzIC7j3yrcwAShbeSQTpx6+OocciXLzew9RaFqHT0sAPhZcOd0Qj2G14xVlSQNDs24Ztw194UqSWXn179bzQ==","signatures":[{"sig":"MEUCIHwaxASoSTa+b+tIx1+QHPiKf5N2XZzoo6O3xzTyNgiHAiEAjEyq3tq3oYB4AmLqpgRmgYdEDqOMHhvGMD/B7fOBC4U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCyqxJwXESHpdBNEv+8qgQ5KviWIaV2g8JxvSVCAfZr/wIgaZsq8IRU51VmA8jzIkwtcruOCTSweJ438hcRQ0IpxO8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@3.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":744598},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"43a7e9d4c1ccbfe5337cc684d00e3a309ad535e7","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","demo:serve":"node demo-app/server.mjs","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_3.1.1_1789928543569_0.6992732941758311","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"scenescout","version":"3.2.0","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@3.2.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"990115491ad61169b8627fc5ef8f028388475b1d","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-3.2.0.tgz","fileCount":37,"integrity":"sha512-1N4Qwaqg/mbD3toMiZrbzdKcvCHyQgIngiPd72NfPpK3PE/bQK+KINuMEj9k3PGAZZcIeOM72Ld9ax/TQzK3sQ==","signatures":[{"sig":"MEUCIQD0fZydi8QAbEVPIJ/JOjRVDZKVv9AYq6j2tRT8RhvWlAIgJYTxHgRIBewabPbqJR9t2IBcwKX/UyYP04psB7QZ9ak=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDY7VWHimfxx9aOEECVA1cc6IFLc4v/tbNXY376vpmA9wIgZ7i3PhP6Bk08tueLXDXvIeXpEhIk8xk1xKKT2z6KbRM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@3.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":762275},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"dd6d81ce94020b3be15c7f50da0368c5c48502eb","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","lane-test":"tsx --test scripts/lane-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run lane-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","demo:serve":"node demo-app/server.mjs","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_3.2.0_1789934342291_0.1012719599023284","host":"s3://npm-registry-packages-npm-production"}},"3.3.0":{"name":"scenescout","version":"3.3.0","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@3.3.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"67cf792e97506d843f991cb1aca0a5d65a9f31fd","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-3.3.0.tgz","fileCount":43,"integrity":"sha512-Yt93H3JFFTx0/T2B/cYYyh+ihfNmwIZM/vbybMgBUKPzAec4zHFk4EqKIiN0d1IBo53naZD/smnd2FR6zjrkyw==","signatures":[{"sig":"MEUCIQCTOTLxb0wQT5F/3HEIpCHbZtuuCq2hMyOIugFmQY3CtwIgE0vdSaTSUf5sA8/LS7VhFq7/nK7wyu9cg0mWTvyrY5U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCID6unIiYSDpYq2auzjpF6rwTvaGnSbDBkiAt65WeWZbGAiEAvzMZ0Kt/1ntC0TTVEHBURWxF36K17OC/DSk2ae7AQgk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@3.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":862772},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"c9b8b3ca1159beef7c621e7229a7f9d8f4ad6f23","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","lane-test":"tsx --test scripts/lane-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","pace-test":"tsx --test scripts/pace-test.ts","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run pace-test && npm run request-test && npm run settle-test && npm run claims-test && npm run verify-test && npm run brief-test && npm run lane-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","brief-test":"tsx --test scripts/brief-test.ts","demo:serve":"node demo-app/server.mjs","claims-test":"tsx --test scripts/claims-test.ts","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","settle-test":"tsx --test scripts/settle-test.ts","verify-test":"tsx --test scripts/verify-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","request-test":"tsx --test scripts/request-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_3.3.0_1789990355960_0.3158279956164498","host":"s3://npm-registry-packages-npm-production"}},"3.4.0":{"name":"scenescout","version":"3.4.0","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@3.4.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"30510009beb347cea4bde5e04bdd882d746fa1b3","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-3.4.0.tgz","fileCount":44,"integrity":"sha512-9fqaiZ72QO6Nr+UYWwq1vucNhwG8z4TUUqcJFdTBIGQ5Tmg6lkqIAZD+MckcOiLFZRaWcBmLgrOQUd6NpeoURA==","signatures":[{"sig":"MEUCIAy4rr8PzR5U8f6MtZ3ZIqkrseqPkKUl6r6++hXgmpezAiEA0BgDXrc5AX3B4gCD51MAv1mS1cfeNO7a56xkXV/l3cM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDztfMu8BU1LA/09JxUf4djIRn8/hqijm6tswYj+DBRVwIgSXcP4VqFPBuc8gkdpclSxJMOW66pgkVZnh1rK3799SE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@3.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":882206},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"eb8300bd00c588d030a887f2bbb01212f908fecb","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","lane-test":"tsx --test scripts/lane-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","pace-test":"tsx --test scripts/pace-test.ts","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run pace-test && npm run request-test && npm run settle-test && npm run claims-test && npm run verify-test && npm run brief-test && npm run lane-test && npm run calibration-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","brief-test":"tsx --test scripts/brief-test.ts","demo:serve":"node demo-app/server.mjs","claims-test":"tsx --test scripts/claims-test.ts","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","settle-test":"tsx --test scripts/settle-test.ts","verify-test":"tsx --test scripts/verify-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","request-test":"tsx --test scripts/request-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","calibration-test":"tsx --test scripts/calibration-test.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_3.4.0_1790066737311_0.6403022981421782","host":"s3://npm-registry-packages-npm-production"}},"3.5.0":{"name":"scenescout","version":"3.5.0","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@3.5.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"6b6f9b3cc385b8efe51db33bff923dad69599fdf","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-3.5.0.tgz","fileCount":45,"integrity":"sha512-Y8piZ6sqB8138VMlpY0LLd8p8Nohda/yaPN1K2pw8qcQPjrt9gawYHD6gA0MG6ueUoXu1UNynt8tmnirtdMxeQ==","signatures":[{"sig":"MEYCIQCMtdSRPD4t8pGSfT7/nYYAIOwmIPrJ4FCWbMvGcngY0wIhALsIUp3r0KledmlydHJhzDspnzAe4cRpmWuq9EDVZmKe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC9kMr7SDzEwVXkVxNx3dJxtKjngUBjlfvK86v1Fqf9pQIgM6xq39kV7hFKBm3a+cPBswGuZiGR9LRMxZ8jydn+izA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@3.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":930618},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"dfd4d8bb9a2f441e7c587e72321265abb13b8739","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","bench":"tsx scripts/bench.ts","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","lane-test":"tsx --test scripts/lane-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","pace-test":"tsx --test scripts/pace-test.ts","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run pace-test && npm run request-test && npm run settle-test && npm run claims-test && npm run verify-test && npm run brief-test && npm run lane-test && npm run calibration-test && npm run bench-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","bench-test":"tsx --test scripts/bench-test.ts","brief-test":"tsx --test scripts/brief-test.ts","demo:serve":"node demo-app/server.mjs","claims-test":"tsx --test scripts/claims-test.ts","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","settle-test":"tsx --test scripts/settle-test.ts","verify-test":"tsx --test scripts/verify-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","request-test":"tsx --test scripts/request-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","calibration-test":"tsx --test scripts/calibration-test.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_3.5.0_1790111703534_0.09494892645187747","host":"s3://npm-registry-packages-npm-production"}},"3.6.0":{"name":"scenescout","version":"3.6.0","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@3.6.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"85d1e610e228c0f701294721a86277e0f4dda111","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-3.6.0.tgz","fileCount":45,"integrity":"sha512-GoSK620KiZRvqOyZRlKZlnge4Ln0aWmEDp9UT9MYwv8gNrVxVZVSnuBW4VG3picfKrO0VfgWehQR6ZObuOLhag==","signatures":[{"sig":"MEUCIBULetsWi/2DXjIAP2cloCFZrLdmM4NOwYAl84R8fn4CAiEAykXPuNAoWRV7gdCBuI3NvRIdYa7CCDceOLJ6MAf28cA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCqompH+1WsDqTiwbTpyg7di54c2DiiQedSLNELHLlO6QIgbRBJsYQPMDPobUnUZXlNSc7onlLTJd8w4Kz6Rkg1kOI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@3.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":933859},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"d67df23a8610c3082edb70ce252423da71cd5492","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","bench":"tsx scripts/bench.ts","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","lane-test":"tsx --test scripts/lane-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","pace-test":"tsx --test scripts/pace-test.ts","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run pace-test && npm run request-test && npm run settle-test && npm run claims-test && npm run verify-test && npm run brief-test && npm run lane-test && npm run calibration-test && npm run bench-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","bench-test":"tsx --test scripts/bench-test.ts","brief-test":"tsx --test scripts/brief-test.ts","demo:serve":"node demo-app/server.mjs","claims-test":"tsx --test scripts/claims-test.ts","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","settle-test":"tsx --test scripts/settle-test.ts","verify-test":"tsx --test scripts/verify-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","request-test":"tsx --test scripts/request-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","calibration-test":"tsx --test scripts/calibration-test.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.21.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_3.6.0_1790119102174_0.9706221461712479","host":"s3://npm-registry-packages-npm-production"}},"3.6.1":{"name":"scenescout","version":"3.6.1","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@3.6.1","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"86711ae908e9c58c6f3ce3005a9d30e8568cd9e6","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-3.6.1.tgz","fileCount":45,"integrity":"sha512-Hxy3FLK6E6qR8qjB+isqPMHSTUgVdlwYQqX8r+joeJRP92YqRhPIgWp6b5EiYHUpkPcKw/jetcSidIBbMO6P5g==","signatures":[{"sig":"MEQCIAC9SfBpmGRcW5D5JQuECZBmSMyCyy4PAylzLLFYhOm8AiAf7diwS6R2PbJOAh3ZF0eFMPil/IYfWPU606+hCCrjJA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBhOp4Pkk48UMSkuw9+vgFPt2kWBqagEAwZ9noVIl8nUAiAaFzSVh75b/8p2/fQIggm+TlKGjS2PUqg0SwOLOHRHUQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@3.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":942147},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"500b94f0d475dce89bd68e2c8b6a52846ca7bc85","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","bench":"tsx scripts/bench.ts","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","lane-test":"tsx --test scripts/lane-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","pace-test":"tsx --test scripts/pace-test.ts","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run pace-test && npm run request-test && npm run settle-test && npm run claims-test && npm run verify-test && npm run brief-test && npm run lane-test && npm run calibration-test && npm run bench-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","bench-test":"tsx --test scripts/bench-test.ts","brief-test":"tsx --test scripts/brief-test.ts","demo:serve":"node demo-app/server.mjs","claims-test":"tsx --test scripts/claims-test.ts","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","settle-test":"tsx --test scripts/settle-test.ts","verify-test":"tsx --test scripts/verify-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","request-test":"tsx --test scripts/request-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","calibration-test":"tsx --test scripts/calibration-test.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_3.6.1_1790123374741_0.5345839390323275","host":"s3://npm-registry-packages-npm-production"}},"3.7.0":{"name":"scenescout","version":"3.7.0","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@3.7.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"900a15f78af36cd2fb39cdc05e56785211092f0c","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-3.7.0.tgz","fileCount":45,"integrity":"sha512-v5c2TOnDeyyzHzoXQlI/T0aJOOrl3vUdbN1KYQmOMYhzlSPoDlOruk4hawws+lqhYdaKU3Ay9o+I/o40LtB3GA==","signatures":[{"sig":"MEQCIGbe8wsNR+hZGnUBuDtvFl2JqkdpwWLL+7zYfbXHxsqeAiA/0fnxywCwS+mHUIdWKAAWHqJssYgeErxyn3Bg6QDvEw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCbKUtdZczweFfydlRFPl58T52mQ0Yla53abxBlaLG5PgIgM61BsyzIGaq7rY70RpU4Hi7NRgDvjpUHhTbLxKgOpmw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@3.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":954184},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"2749b44631844020d468eb0c6a5e300f5fe22d75","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","bench":"tsx scripts/bench.ts","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","lane-test":"tsx --test scripts/lane-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","pace-test":"tsx --test scripts/pace-test.ts","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run pace-test && npm run request-test && npm run settle-test && npm run claims-test && npm run verify-test && npm run brief-test && npm run lane-test && npm run calibration-test && npm run bench-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","bench-test":"tsx --test scripts/bench-test.ts","brief-test":"tsx --test scripts/brief-test.ts","demo:serve":"node demo-app/server.mjs","claims-test":"tsx --test scripts/claims-test.ts","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","settle-test":"tsx --test scripts/settle-test.ts","verify-test":"tsx --test scripts/verify-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","request-test":"tsx --test scripts/request-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","calibration-test":"tsx --test scripts/calibration-test.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_3.7.0_1790130079801_0.8718634581826614","host":"s3://npm-registry-packages-npm-production"}},"3.8.0":{"name":"scenescout","version":"3.8.0","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"author":{"name":"brunoboto96"},"license":"MIT","_id":"scenescout@3.8.0","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"homepage":"https://github.com/brunoboto96/SceneScout#readme","bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"bin":{"scenescout":"dist/cli.js"},"dist":{"shasum":"0408b4deed2dbc070008cc5bb1437fd2f767ecd7","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-3.8.0.tgz","fileCount":45,"integrity":"sha512-Y3jAUpGc0xoKQUYcKcPJTtj0sEzOSR/DnbkIuktSNg+5kqqtuJ4fEg1Dohw8n3jFgmb5cN3L4ExuZPHaJ388eQ==","signatures":[{"sig":"MEUCICNYW98R4Rkt0Gf1QxYIlFEZUUS6Rsp6NqVbSQEFY9jPAiEA1C4oLk4NUa3OBgDF7l3UkQ36aQErBqENP9MpuwyOCPE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIESLAUVxxmaZX/wWOGJywOST0CcKsnHLEjVEs+AtkVQQAiAw3mTSvcqjQh/h62VYtc+O6sW0mNoszQL/QacKvaCUtA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@3.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":984358},"main":"dist/mcp-server.js","type":"module","engines":{"node":">=20"},"gitHead":"d2f112a54d24aa954becceef72a09d71ef101f23","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","bench":"tsx scripts/bench.ts","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","lane-test":"tsx --test scripts/lane-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","pace-test":"tsx --test scripts/pace-test.ts","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run pace-test && npm run request-test && npm run settle-test && npm run claims-test && npm run verify-test && npm run brief-test && npm run lane-test && npm run calibration-test && npm run bench-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","bench-test":"tsx --test scripts/bench-test.ts","brief-test":"tsx --test scripts/brief-test.ts","demo:serve":"node demo-app/server.mjs","claims-test":"tsx --test scripts/claims-test.ts","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","settle-test":"tsx --test scripts/settle-test.ts","verify-test":"tsx --test scripts/verify-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","request-test":"tsx --test scripts/request-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","calibration-test":"tsx --test scripts/calibration-test.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"_nodeVersion":"24.21.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"tmp":"tmp/scenescout_3.8.0_1790352388005_0.060855648469821055","host":"s3://npm-registry-packages-npm-production"}},"3.9.0":{"_id":"scenescout@3.9.0","bin":{"scenescout":"dist/cli.js"},"bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"dist":{"shasum":"8d5a1bc808b07c57f53ddb74d10a92a7da8aab5b","tarball":"https://registry.npmjs.org/scenescout/-/scenescout-3.9.0.tgz","fileCount":45,"integrity":"sha512-TdMyfZnGpQc3XzLY5pZ9Ra9dDULrGG1rm0HWXdvTNDugjRCn7dxewMoS5Xh7ZJ8Z8KfuClZTPN7ROHmeKKcyTg==","signatures":[{"sig":"MEUCIQDebDtHAU3AS2wqNd3Zlb52IgW1McefUul+YUkCL99rBQIgX3c6XWwbKITmnqYZrXePXWj9T2CSwjsPYidpQmbglmE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIE1ni/McLIpRvm9o0CfCPFE3eGkxyJG182NuYYlibGOQAiEA31ucqyNCPGkzbTNnIsUwsJabQZHXJSS5DtNGjJzCCeE="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/scenescout@3.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1012910},"main":"dist/mcp-server.js","name":"scenescout","type":"module","author":{"name":"brunoboto96"},"engines":{"node":">=20"},"gitHead":"186d9b2d8f8b6ab1d648dcd8508e6503b3f50ccf","license":"MIT","scripts":{"dev":"tsx src/cli.ts","demo":"npm run build && tsx scripts/demo.ts","test":"npm run build && npm run test:unit && npm run smoke:run && npm run mcp-check:run","bench":"tsx scripts/bench.ts","build":"tsc","serve":"node dist/mcp-server.js","setup":"node dist/cli.js install","smoke":"npm run build && npm run smoke:run","doctor":"node dist/cli.js doctor","format":"prettier --write .","prepare":"npm run build","release":"npm run build && changeset publish","changeset":"changeset","demo-test":"tsx --test scripts/demo-test.ts","lane-test":"tsx --test scripts/lane-test.ts","live-test":"tsx --test scripts/live-test.ts","mcp-check":"npm run build && npm run mcp-check:run","pace-test":"tsx --test scripts/pace-test.ts","scan-test":"tsx scripts/scan-test.ts","smoke:run":"tsx scripts/smoke.ts","test:unit":"npm run scan-test && npm run oracle-test && npm run policy-test && npm run fixture-test && npm run dispatch-test && npm run design-test && npm run contract-test && npm run pace-test && npm run request-test && npm run settle-test && npm run claims-test && npm run verify-test && npm run brief-test && npm run lane-test && npm run calibration-test && npm run bench-test && npm run memory-test && npm run install-test && npm run live-test && npm run demo-test && npm run hygiene-test","bench-test":"tsx --test scripts/bench-test.ts","brief-test":"tsx --test scripts/brief-test.ts","demo:serve":"node demo-app/server.mjs","claims-test":"tsx --test scripts/claims-test.ts","design-test":"tsx --test scripts/design-test.ts","memory-test":"tsx --test scripts/memory-test.ts","oracle-test":"tsx --test scripts/oracle-test.ts","policy-test":"tsx --test scripts/policy-test.ts","settle-test":"tsx --test scripts/settle-test.ts","verify-test":"tsx --test scripts/verify-test.ts","fixture-test":"tsx --test scripts/fixture-test.ts","format:check":"prettier --check .","hygiene-test":"tsx --test scripts/hygiene-test.ts","install-test":"tsx --test scripts/install-test.ts","request-test":"tsx --test scripts/request-test.ts","contract-test":"tsx --test scripts/contract-test.ts","dispatch-test":"tsx --test scripts/dispatch-test.ts","mcp-check:run":"tsx scripts/mcp-check.ts","calibration-test":"tsx --test scripts/calibration-test.ts","version-packages":"changeset version && node scripts/sync-plugin-version.mjs && npm install --package-lock-only && prettier --write package.json .claude-plugin/plugin.json"},"version":"3.9.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6af8eab4-c085-4c95-a8f7-c758353c0d21"}},"homepage":"https://github.com/brunoboto96/SceneScout#readme","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"_npmVersion":"11.19.1","description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","directories":{},"maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"_nodeVersion":"24.21.0","dependencies":{"zod":"^3.25.0","playwright":"^1.63.0","@modelcontextprotocol/sdk":"^1.12.0"},"publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","prettier":"3.9.8","typescript":"^5.9.3","@types/node":"^20.19.0","@changesets/cli":"3.0.3"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/scenescout_3.9.0_1790369405424_0.8823391519754735"}}},"time":{"created":"2026-09-18T19:47:28.484Z","modified":"2026-09-25T20:50:05.930Z","1.0.0":"2026-09-18T19:47:28.794Z","1.1.0":"2026-09-19T09:23:16.652Z","1.2.0":"2026-09-19T12:48:09.248Z","1.3.0":"2026-09-19T21:57:15.566Z","1.4.0":"2026-09-19T23:00:24.211Z","1.5.0":"2026-09-19T23:41:26.207Z","2.0.0":"2026-09-20T00:33:16.561Z","3.0.0":"2026-09-20T01:28:54.190Z","3.0.1":"2026-09-20T02:04:36.160Z","3.1.0":"2026-09-20T16:56:34.192Z","3.1.1":"2026-09-20T18:22:23.656Z","3.2.0":"2026-09-20T19:59:02.390Z","3.3.0":"2026-09-21T11:32:36.044Z","3.4.0":"2026-09-22T08:45:37.399Z","3.5.0":"2026-09-22T21:15:03.617Z","3.6.0":"2026-09-22T23:18:22.298Z","3.6.1":"2026-09-23T00:29:34.831Z","3.7.0":"2026-09-23T02:21:19.911Z","3.8.0":"2026-09-25T16:06:28.126Z","3.9.0":"2026-09-25T20:50:05.538Z"},"bugs":{"url":"https://github.com/brunoboto96/SceneScout/issues"},"author":{"name":"brunoboto96"},"license":"MIT","homepage":"https://github.com/brunoboto96/SceneScout#readme","keywords":["mcp","mcp-server","model-context-protocol","exploratory-testing","ui-testing","e2e-testing","qa","playwright","browser-automation","ai-agent","ai-testing","accessibility","claude-code","cursor","vscode","github-copilot","codex","gemini-cli","windsurf"],"repository":{"url":"git+https://github.com/brunoboto96/SceneScout.git","type":"git"},"description":"SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memo","maintainers":[{"name":"brunoboto96","email":"brunoboto96@gmail.com"}],"readme":"<div align=\"center\">\n\n# 🔭 SceneScout\n\n**Exploratory UI testing, driven by the AI agent you already use.**\n\nWorks with Claude Code · Cursor · VS Code (Copilot) · Codex CLI · Gemini CLI · Copilot CLI · Windsurf · any [MCP](https://modelcontextprotocol.io) client\n\n[![test](https://github.com/brunoboto96/SceneScout/actions/workflows/test.yml/badge.svg)](https://github.com/brunoboto96/SceneScout/actions/workflows/test.yml)\n[![npm](https://img.shields.io/npm/v/scenescout.svg)](https://www.npmjs.com/package/scenescout)\n[![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n![node >= 20](https://img.shields.io/badge/node-%E2%89%A5%2020-339933?logo=node.js&logoColor=white)\n![MCP server](https://img.shields.io/badge/MCP-server-8A2BE2)\n\n[👀 See it work](#-see-it-work) · [✨ Why](#-why-its-different) · [🎯 Two ways to use it](#-two-ways-to-use-it) · [🚀 Quickstart](#-quickstart) · [🧰 Toolbox](#-the-toolbox) · [🔌 Other clients](#-other-mcp-clients) · [🔒 Safety](#-safety-model) · [🩺 Troubleshooting](#-troubleshooting)\n\n</div>\n\nSceneScout is an [MCP](https://modelcontextprotocol.io) server that hands an agent a *structured view* of a running web app — every element, its geometry, and a set of always-on correctness oracles — and lets the agent explore it like a curious user. Your coding agent is the brain; SceneScout is the hands, eyes, and memory. Any MCP client can drive it, and the testing method comes with the server, so the agent knows how to use the tools wherever it runs.\n\n```\n┌─────────────────────┐   MCP (stdio)   ┌───────────────────────────────┐\n│ Your coding agent   │ ──────────────▶ │ SceneScout engine             │\n│ (intent, judgment,  │ ◀────────────── │ Playwright · oracles · memory │\n│  your subscription) │  tool results   │ findings · report — no LLM    │\n└─────────────────────┘                 └───────────────────────────────┘\n```\n\nScripted E2E suites answer one question — *\"does this exact flow still work?\"* — and say nothing about the 95% of the app they don't touch. SceneScout covers both gaps: it finds what's **broken** (crashes, dead ends, permission leaks) *and* reports how the product could be **better** (confusing flows, weak hierarchy, design-system drift), with concrete measurements.\n\n\n## 👀 See it work\n\nThis is a real run against the small demo app bundled in this repository. The app has bugs planted in it on purpose, and two of them are visible on its dashboard:\n\n<p align=\"center\"><img src=\"examples/screenshots/dashboard-annotated.png\" alt=\"The demo app's dashboard with two defects outlined in red: 1, a yellow badge covering the All orders button; 2, the weekly chart image failing to load\" width=\"760\" /></p>\n\n**The broken chart is the demo app's bug, not this page's** — it is one of the twelve findings SceneScout filed, next to the badge sitting on a button. The red callouts were added for this README; the [unmarked screenshots](examples/screenshots/) are the ones the engine took.\n\nAn excerpt of the report it wrote — [read the whole thing](examples/report.md):\n\n> **🔴 [HIGH] A double-click on Create order creates two orders**\n> Evidence: `2× click fired the same state-changing request 2× (POST /api/orders)`\n> The submit button stays enabled while the request is in flight, and the endpoint accepts the repeat.\n>\n> **🔴 [HIGH] Filtering orders by Archived fails, and the page shows an empty table instead of an error**\n> Evidence: `GET /api/orders?status=archived → HTTP 500`\n>\n> **🔴 [HIGH] A clerk can approve an order by calling the endpoint the page hides from them**\n> Evidence: `POST /api/orders/1037/approve 200 as clerk; POST /api/orders/1038/reject 403 as clerk` — the button was hidden, the server did not agree.\n>\n> **🟠 [MEDIUM] The \"New: bulk import\" badge sits on top of the All orders button** *(callout 1)*\n> Evidence: `\"All orders\" overlaps \"New: bulk import\" (81%)` — measured from layout boxes, no screenshot needed.\n>\n> **🟡 [LOW] The dashboard chart image is missing** *(callout 2)*\n> Evidence: `GET /img/weekly-chart.png → HTTP 404`\n>\n> **Gap ledger — what was NOT tested:** 9/12 visited routes never design-audited · single-role run, so permission boundaries are untested\n\nEvery finding comes with a repro trace and a Playwright regression-test skeleton. To try it yourself, clone this repository, run `npm run demo:serve`, then `/scenescout --url http://127.0.0.1:4173` — see [demo-app/](demo-app/). Its README lists every seeded defect and which oracle catches it.\n\n---\n\n## ✨ Why it's different\n\n- 🧠 **Your agent is the brain — no API key.** The engine contains no LLM. Exploration runs on the agent and subscription you already have (Claude Code, Cursor, Copilot, Codex, Gemini CLI and others); SceneScout just gives it deterministic tools and the method for using them.\n- 📐 **Structured scene, not pixels.** The agent reads element lists *with layout geometry*, not screenshots. Overlap and off-screen bugs are computed from boxes — deterministic, no vision guessing. Images that failed to load are read from the DOM too. (Screenshots exist only for pixel-native residue like a canvas or a rendering glitch.)\n- 🛡️ **Read-only by default, enforced on the wire.** Destructive actions are blocked at the network layer, not by asking the model nicely. Opt into writes only against disposable data.\n- ✅ **Completion is a contract, not a vibe.** The engine knows the app's routes and *refuses* to file an \"extensive\" report while any known route is unvisited, unexercised, or un-audited. \"Explored a bit and stopped\" is structurally impossible.\n- 🧭 **It remembers.** UI states are fingerprinted and stored in the project's `.scenescout/`. Run N+1 skips what run N already covered, and every run starts smarter than the last.\n\n---\n\n## 🎯 Two ways to use it\n\nSceneScout needs only a URL. Give it the source code as well and it gets noticeably better.\n\n| | 🏠 **Next to the codebase** *(recommended)* | 🌐 **Against a remote URL** |\n|---|---|---|\n| **You run it from** | the app's repository | any folder — an empty `qa/` directory is fine |\n| **It plays the role of** | a developer-tester who can read the code | a black-box QA tester, like a person with a browser |\n| **How it finds pages** | 📂 reads routes from the source **and** follows links: file-based routing (Next.js, SvelteKit, Nuxt) and router configuration written in code (React Router, Vue Router, Angular). Routes built at runtime are not seen | 🔗 follows same-origin links only — pages nothing links to, or on another subdomain, stay unknown |\n| **\"Did we cover everything?\"** | checked against the routes found in source *plus* discovered links — an unvisited one blocks the report | checked against the pages it managed to discover |\n| **Setup it figures out** | framework, dev command, saved Playwright logins (`playwright/.auth/`), whether the app uses `data-testid` | none — you pass the URL, and the path to a login state if the app needs one |\n| **What a finding looks like** | the symptom, **plus** the file behind it and a suggested fix | the symptom, a repro trace, and a regression-test skeleton |\n| **Typical target** | `localhost` while you build | staging, a preview deploy, a client's site |\n\n**Why the codebase helps.** The agent driving SceneScout is a coding agent, which can already read your repository. With the source at hand it knows the app's static routes before opening the browser, so coverage is measured against the real app instead of whatever happened to be linked. It can also check a suspicion against the code before reporting it: \"there is no way to export this table\" is a much stronger finding once the agent has confirmed no export handler exists. And when something breaks it can open the component or handler responsible and tell you *where* and *how* to fix it — \"the save button does nothing\" becomes \"`OrderForm` swallows the rejected promise in `onSubmit`; surface the error and re-enable the button\".\n\n**Why it still works without it.** Everything SceneScout *observes* comes from the running page — elements, layout geometry, console and network errors, design-audit scores, task-ease measurements — and none of that needs source code. Point it at a URL you are allowed to test and it behaves like a thorough QA tester: it explores, reproduces, and files findings with evidence.\n\n```\n# next to the code — run inside the app's repository\n/scenescout --url http://localhost:3000\n\n# remote — run from any folder; memory and the report are kept there\n/scenescout --url https://staging.example.com --role ./auth/qa.json\n```\n\n> [!IMPORTANT]\n> Only test sites you own or are authorized to test. A remote environment is more likely to hold real data, so for a remote URL with no source the skill attaches in **`observe`** mode: nothing but `GET` requests leaves the page. The default **read-only** mode blocks `PUT`/`PATCH`/`DELETE` and destructive-looking requests, but an ordinary form submission (a plain `POST`: contact form, comment, order, signup) still reaches the server and can create a record. Say so when that is acceptable on your target. See the [safety model](#-safety-model).\n\n---\n\n## 🚀 Quickstart\n\n### 📦 Prerequisites\n\n| | |\n|---|---|\n| **Node** | ≥ 20 |\n| **An MCP client** | Claude Code, Cursor, VS Code with Copilot, Codex CLI, Gemini CLI, GitHub Copilot CLI, Windsurf, or [any other](#-other-mcp-clients) |\n| **A web app to test** | SceneScout tests a *live* app: start yours locally first (e.g. `npm run dev`, `make dev-up`), or have the URL of a deployed one you're allowed to test |\n\n### 1️⃣ Install\n\nIt is on npm. Nothing to clone:\n\n```bash\nnpx -y scenescout install                      # Claude Code: skill + server + Chromium (one-time download)\nnpx -y scenescout install --client cursor      # or: vscode, codex, gemini, copilot, windsurf (comma-separated for several)\n```\n\nEither way it downloads the browser and registers the server with the client you named. Claude Code also gets the method as a skill; every other client receives the same method from the server. [What each client gets](#-other-mcp-clients).\n\n**Prefer a Claude Code plugin?** The skill and the server arrive together:\n\n```\n/plugin marketplace add brunoboto96/SceneScout\n/plugin install scenescout@scenescout-marketplace\n```\n\nThen download the browser once with `npx -y scenescout install --browser-only`. The command becomes `/scenescout:scenescout`. A plugin's skill comes from this repository and its server from the latest npm release, so right after a release lands here the two can differ for a short while; `/plugin marketplace update scenescout-marketplace` brings the skill up to date.\n\n**A client that is not in that list?** Run `npx -y scenescout install --browser-only` and [add the server to its config by hand](#-other-mcp-clients).\n\n<details>\n<summary>What <code>install</code> actually does</summary>\n\n1. puts the `/scenescout` skill into `~/.claude/skills/` (or `$CLAUDE_CONFIG_DIR/skills/`) — a `scenescout` folder it didn't create is moved aside to a `.backup-…` copy, never deleted,\n2. downloads the browser SceneScout drives (skipped if you already have it). By default that is Chromium, as two builds: the full browser for headed runs and the headless shell every other run uses. [Choose something else](#-choosing-browsers) with `--browsers`,\n3. registers the MCP server with Claude Code at user scope. Run through `npx`, the launcher is `npx -y scenescout serve`, with the absolute path of `npx` where one sits beside node, so it works under nvm/fnm. From a clone or a global install it is the absolute node path plus that install's `dist/mcp-server.js`,\n4. puts the `scenescout` command on your PATH, so `scenescout status`, `scenescout watch` and `scenescout doctor` work from any terminal. Run through `npx`, that is `npm install -g` of the version you just ran; from a clone it is `npm link`, so the command always runs what you last built. If npm refuses (a system-wide node usually needs `sudo` for this), the step prints the command to run by hand and the rest of the setup still counts as done: `npx -y scenescout <command>` works without it.\n\nRe-run it any time: after moving the folder or switching node versions it refreshes the stored paths. It exits non-zero if a step the tool depends on failed, so it is safe to chain. Opt out of a step with `--no-register`, `--skip-browser` or `--no-command`.\n\nIf `claude` isn't on the PATH of the shell you ran it from, it prints the registration command instead of running it:\n\n```bash\nclaude mcp add --scope user scenescout -- npx -y scenescout serve\n```\n\n</details>\n\n### 2️⃣ Check it\n\n```bash\nnpx -y scenescout doctor --engine   # any client: node + build + browser\nnpx -y scenescout doctor            # Claude Code: the above, plus the skill and the registration\n```\n\nEvery line should be a ✓. Anything that isn't prints the exact command that fixes it. Then **start a fresh session** in your client so it picks up the new tools.\n\n### 3️⃣ Run it\n\nNo app handy? Clone this repository and run `npm run demo:serve`: the [demo app](demo-app/) starts on `http://127.0.0.1:4173`.\n\nOpen your agent inside the project you want to test (or, for a [remote URL](#-two-ways-to-use-it), any folder) and ask:\n\n```\nUse SceneScout to test http://localhost:3000 at medium level\n```\n\nIn Claude Code the skill gives you a command with flags for the same thing:\n\n```\n/scenescout --level medium --url http://localhost:3000 --role qa\n```\n\nThe agent scans the project (if there is one), attaches read-only, explores, and writes findings to `.scenescout/report.md`. That's it.\n\n**Common flags** — `--level minimal|medium|extensive` · `--url <app>` · `--role <name\\|path>` (a Playwright storage-state to explore as: a name found by the scan, or a path to the JSON file) · `--observe` / `--safe-write` / `--allow-destructive`.\n\n---\n\n## 📺 Watching a run live\n\nWhen a session attaches, the engine starts a small live view and hands the agent its address on a `Live view:` line, which the agent passes on to you. From a terminal, `scenescout watch` opens the same page. There is one card per session:\n\n<p align=\"center\"><img src=\"examples/screenshots/live-view.png\" alt=\"The live view during a run of three parallel agents against the demo app: one card per session, each with its role and objective, the task it is on, the tool it is running, the page it is on, a live thumbnail, and a feed of the actions it just took, tinted one colour per task\" width=\"880\" /></p>\n\n- **What it is doing:** the tool it is running and for how long, the page it is on, and a thumbnail of that page. This works for headless runs too, which have no window to look at.\n- **What it just did:** a rolling feed of its actions, each with its target and how it turned out, with failures in red. It is the same trail a finding's repro trace uses. The engine never sees the agent's reasoning, so this is what the session *did*, not what it thought.\n- **Stuck, not slow:** a call still running past its own tool's watchdog budget turns the card red, so a wedged session is visible without asking. A crawl legitimately runs for minutes; it is judged against the crawl's budget, not a click's.\n- **Live stream:** switch it on for one card, or for all of them. Click a thumbnail for a close-up.\n- **The report, as it stands:** the Report button in the top bar shows the same document `scout_report` writes at the end, rendered from the run's current state, so findings can be read while the agents are still working.\n- **What it is for:** the close-up puts the feed beside the session's brief — the objective it was given when it attached (`scout_attach {objective}`), and underneath it the task it is on right now (`scout_task`), which the engine requires before any tool will act. Each task tints its own block of actions, so a change of task is a change of colour; point at a block and the brief names the task those actions served.\n- **Scrub it back:** under the page is a tick per action, coloured by task. Click one to see the frame from that moment, and `Back to live` to return. On a run that was not recorded the ticks still read the trail; they just have no picture behind them.\n\n<p align=\"center\"><img src=\"examples/screenshots/live-view-closeup.png\" alt=\"A close-up of one session: a frame from a step picked out of the timeline, the timeline itself as a tick per action coloured by task, the feed of the session's actions in the same colours, and beside it the objective and the task it is on\" width=\"880\" /></p>\n\n<p align=\"center\"><img src=\"examples/screenshots/live-view-report.png\" alt=\"The report opened from the live view's top bar while the run is still going: summary table, gap ledger, and the findings filed so far, each with an accordion of the screenshots taken around it\" width=\"880\" /></p>\n\nThe view is served on `127.0.0.1` only, behind a token that changes every time the engine starts. It answers `GET` and nothing else, so a viewer can watch a run but not act in it, and no frame it shows is written to disk ([ADR 7](docs/adr/0007-the-live-view-is-local-read-only-and-leaves-nothing-behind.md)) unless the run was recorded, which is asked for and off by default ([ADR 8](docs/adr/0008-a-recorded-run-is-evidence-and-must-be-asked-for.md)). A stream runs only while someone is watching it. `SCENESCOUT_LIVE=off` keeps the port closed.\n\n**Try it with parallel agents.** The demo app has three roles and several separate areas, so a run can be split between agents. Start it with `npm run demo:serve`, then ask your agent to explore it with several agents in parallel, one role and one area each. The pictures above come from a run of three. Two things keep a parallel run efficient:\n\n- **Each agent opens its own session when it starts, and the planner closes it once it has folded that agent's report.** An agent waiting for its turn then holds no browser. Opening every session up front leaves browsers idling while the machine runs out of memory for the agents that are working. Closing before the fold loses the lane's decisions, which have nowhere to be kept.\n- **Slow it down to follow along.** `scout_attach {paceMs}` (or `scout_session {paceMs}` mid-run) sets a floor between actions, for when you want to watch a flow rather than let it run as fast as the page allows.\n- **Run about as many agents at once as your machine has cores, less two.** Each one drives a real browser.\n\n---\n\n## 🎬 Recording a run, and reading it back\n\nA report says what happened. For QA work that is not always enough — the point\nis often to *show* what was checked, not to assert it. Ask for a recorded run\nand the engine keeps a frame of the page after every action:\n\n```\nUse SceneScout to test http://localhost:3000, record the run\n```\n\nor, on the tool directly, `scout_attach {record: true}`.\n\nThen `scout_report` writes two files side by side in `.scenescout/`:\n`report.md` as always, and `report.html` — the whole run as one self-contained\npage. It opens from the file system with nothing running, needs no network, and\nholds:\n\n- **The report**, rendered from the same Markdown.\n- **The screenshots around each finding**, in an accordion under it, from the\n  session that filed it.\n- **Every session's trail**, in the blocks its tasks made, each step with the\n  page as it was at that moment.\n\n<p align=\"center\"><img src=\"examples/screenshots/run-page.png\" alt=\"The saved copy of a run, opened from the file system with nothing running: a finding with its evidence accordion open, showing the four screenshots taken around it with the action and time under each\" width=\"880\" /></p>\n\nThe live view serves the same document at `run` while the engine is still up,\nand sends you there when the run ends — so the address survives a refresh\ninstead of a panel over a dead board.\n\n**What it costs.** Frames are pictures of the app under test, inside the tested\nproject's folder, and the secret redaction that protects everything else the\nengine writes cannot read a picture. That is why it is off unless asked for,\ncapped per session, and written only under `.scenescout/`, which ignores itself\nso `git add -A` in the tested project cannot pick the frames up. The reasoning is in\n[ADR 8](docs/adr/0008-a-recorded-run-is-evidence-and-must-be-asked-for.md).\n\n---\n\n## 🔄 How a run works\n\nOne curiosity loop, repeated — breadth first, then judgment where it matters:\n\n```\nscan ──▶ attach ──▶ crawl ──▶ investigate ──▶ measure ──▶ report\n │         │          │            │              │           │\nroutes   browser   every route  reproduce &   journeys +   gap-checked\n& auth   (r/o)     in ONE call   file findings  design audit  markdown\n```\n\n1. **Scan** the project — framework, routes, auth states.\n2. **Attach** a browser (read-only unless you said otherwise).\n3. **Crawl** every known route in a *single* call — per-route HTTP status, element counts, oracle violations, dead ends.\n4. **Investigate** what the crawl flagged: navigate, snapshot, reproduce, file a structured finding.\n5. **Measure** task ease (`scout_journey`) and design quality (`scout_design_audit`) on representative pages.\n6. **Report** — the engine checks the gap ledger and writes `.scenescout/report.md`.\n\nSnapshots are cheap: re-snapshotting a route returns only *what changed*, with stable refs (measured on a 130-element page: 10.7 kB → 0.7 kB).\n\n---\n\n## 🧰 The toolbox\n\n29 deterministic tools. The agent picks; you rarely call these by hand.\n\n| Phase | Tools | What they do |\n|---|---|---|\n| **Set up** | `scout_playbook` `scout_scan` `scout_attach` `scout_session` | Hand the testing method to an agent that has no skill loaded; discover routes; launch a browser in a write-mode; keep several authenticated roles alive at once |\n| **Explore** | `scout_crawl` `scout_coverage` | Sweep every route in one call; ask what's still untested |\n| **Look** | `scout_snapshot` `scout_hover` `scout_screenshot` | Read the structured scene (diffed); reveal tooltips/hover cards; capture pixels only when needed |\n| **Ask the server** | `scout_request` | Call the app's own API as this session, with the UI bypassed — the check that turns a hidden button into a proven refusal |\n| **Act** | `scout_click` `scout_type` `scout_select` `scout_upload` `scout_press` `scout_scroll` `scout_navigate` `scout_back` `scout_run_plan` | Drive the UI like a user; `scout_run_plan` batches a whole mechanical sequence into one call |\n| **Assess** | `scout_design_audit` `scout_journey` | Score a page's craft/a11y/consistency; measure how hard a task is to complete |\n| **Record** | `scout_note` `scout_finding` `scout_resolve` `scout_report` | Curate durable notes; file deduped findings; mark fixes; write the report, and on a recorded run the whole run as one page |\n| **Re-test** | `scout_verify` | List the findings earlier runs left open, worst route first, and record whether each is gone, still present, or changed |\n| **Split the work** | `scout_lane_brief` `scout_lane_report` | Divide the app between parallel agents by whole module, each with its own landing route and rules; fold what each hands back as one typed JSON object, and name any defect it judged but never filed |\n| **Close** | `scout_close` | Tear down one session or all |\n\nA few that punch above their weight:\n\n- **`scout_crawl`** — the entire breadth pass in one tool call. No visiting routes one-by-one.\n- **`scout_run_plan`** — up to 20 actions (fill form → submit → check) with semantic targets (`testid=…`, `text=…`), aborting at the first anomaly.\n- **`scout_journey`** — wraps one goal and reports interaction count, screens seen, and **backtracks**; an abandoned journey is a finding no passing E2E suite can produce.\n- **`scout_upload`** — generates a *valid* in-memory fixture (real PDF/PNG, kind inferred from `accept`) so file-upload flows stop being a blind spot.\n- **`scout_click {clicks: 2}`** — the impatient-user probe: states whether a double-click fired the same state-changing request twice (the classic double-submit bug).\n- **`scout_request`** — calls the app's own API as the session, so \"the button is hidden\" becomes \"the server refuses it\" (or doesn't).\n\nBeyond crashes and HTTP errors, two oracles catch a page **contradicting the server**: `refused_empty` (a list request was refused and the page shows its empty state with no error) and `false_success` (a save was refused and the page says it worked). A third, `dom_injection`, reports a typed markup value coming back as an element on any page any session opens.\n\n---\n\n## 📊 Test levels\n\nEach level is a contract. `scout_report` enforces what the engine can see for itself — routes visited, pages audited, and at `extensive` an empty gap ledger (every route exercised and audited, every filled form submitted, a completed journey, two roles) — and the report's gap ledger discloses the rest.\n\n| Level | What it guarantees | Rough size |\n|---|---|---|\n| `minimal` | Every route visited, ≥1 design audit, key journeys as plans, crawl problems triaged. Remaining gaps **disclosed**. | ~40 actions |\n| `medium` *(default)* | minimal + design audits across several routes (enforced) + every element class exercised + every form submitted valid **and** invalid (asked of the agent) | ~150 actions |\n| `extensive` | medium + fuzzing, back/refresh/deep-link resilience, keyboard-only pass, a journey per module, ≥2 roles compared, anonymous auth-surface walk. **Refuses to finalize while any gap in the ledger remains.** | budget-capped |\n\nThat refusal *is* the guarantee: an extensive report can only exist when nothing the engine can measure was left untested. Fuzzing, the keyboard pass and the auth-surface walk are the agent's to do; the engine cannot see whether they were done well.\n\n---\n\n## 🔒 Safety model\n\n- 🔵 **`observe`** (`--observe`) lets nothing but `GET` requests leave the page. The one exception is what a session needs in order to exist: logging in, logging out and refreshing a token. Signing up, changing or resetting a password and creating users are blocked like any other write. WebSocket frames are not inspected; the engine says so when the app opens a socket. It is what the skill picks for a remote URL with no source, where an ordinary form POST would create a real record. Forms that could not be submitted are listed in the gap ledger.\n- 🟢 **`read-only` by default.** Destructive-labeled elements (delete/revoke/archive/…) **and** all `PUT/PATCH/DELETE` + destructive `POST`s are blocked at the network layer — see [`src/engine/policy.ts`](src/engine/policy.ts). Non-destructive `POST`s are allowed, because submitting forms is how a tester finds validation bugs — so read-only means *nothing existing is changed or removed*, not *nothing is ever created*.\n- 🟡 **`safe-write`** (`--safe-write`) lets the agent create data and edit/delete **only what it created** this run — never pre-existing records.\n- 🔴 **`destructive`** (`--allow-destructive`) allows everything, and only ever when *you* confirm the environment is disposable. The skill will never choose this itself.\n- 📂 Findings, memory, and reports live in a `.scenescout/` folder where you ran it. It ignores itself in git, so a stray `git add -A` never commits test data.\n\nA `🛡 WRITE-POLICY blocked` notice is the safety net doing its job, not an app bug. The server never sees a blocked request, but a page's own `fetch` or XHR is answered with a `403` in its place rather than dropped, so the page's handling of a refusal really runs: a page that then claims success is reported as a `false_success` ([ADR 9](docs/adr/0009-a-refused-write-is-answered-not-dropped.md)).\n\n---\n\n## 📋 What you get\n\n`.scenescout/report.md` — a deduplicated, worst-first report with:\n\n- 🐛 **Findings** with repro traces and generated Playwright regression-test skeletons.\n- 💯 **Page scores** (0–100: a11y · craft · consistency · task-clarity), ranked worst-first, with stale scores from old runs marked as such.\n- 👥 **A role capability matrix** — what each role could and couldn't reach.\n- 🧾 **A gap ledger** — everything *not* done, so the report is honest about its own coverage.\n- ⏱️ **How the run was paced** — how closely each session kept working, and apart from that, how long finished lanes held their browsers waiting to be collected, so neither hides the other.\n- 🎯 **How well the lanes judged** — on a parallel run, whether the confidence each lane stated matched what the project went on to file, beside what later re-tests found ([ADR 10](docs/adr/0010-a-confidence-is-checked-not-trusted.md)).\n\n`.scenescout/report.html` — the same report as one self-contained page, with every session's trail beside it, and on a [recorded run](#-recording-a-run-and-reading-it-back) the screenshots under each finding.\n\n👀 Watch a run live: `node dist/cli.js status <project-path>`.\n\n---\n\n## 🩺 Troubleshooting\n\nRun `npx -y scenescout doctor` first — it checks every setup item below (everything but the last row, which is about your app) and prints the fix.\n\n| Symptom | Cause and fix |\n|---|---|\n| `/scenescout` isn't a known command | The skill isn't linked, or the session predates it. `npx -y scenescout install`, then start a **fresh** Claude Code session. |\n| The `scout_*` tools don't appear | The MCP server isn't registered, or points at an old path. `npx -y scenescout install` re-registers it; `claude mcp list` should show `scenescout` as connected. |\n| *\"Executable not found in $PATH\"* | The server was registered with a bare `node`. `npx -y scenescout install` registers an absolute path. |\n| Installed as a plugin, and the tools fail with *\"Executable not found in $PATH: npx\"* | A plugin starts the server with a bare `npx`, which Claude Code can only find if it was launched from an environment that has Node on its `PATH`. Under nvm or fnm that means starting Claude Code from a terminal, not from a dock or launcher. Or use `npx -y scenescout install` instead, which registers the absolute path of `npx`. |\n| *\"… build has not been downloaded yet\"* on attach | The browser download was skipped or failed, or the run asked for a browser you did not install. Run the command the message names, for example `npx -y scenescout install --browser-only --browsers firefox`. On Linux, system libraries may be missing too: `npx playwright install --with-deps chromium`. |\n| Tools broke after moving the folder or changing node version | The registration stores absolute paths. `npx -y scenescout install` refreshes them. |\n| Attach fails or every route lands on the login page | Your app isn't running at `--url`, or the `--role` storage state has expired — regenerate it the way your project's Playwright setup does. |\n\n### ⬆️ Upgrading from an older version\n\n- **Tools are now `scout_*`.** Up to v0.23 they were prefixed `ft_`. The rename happened before the first npm release, with no aliases, so an agent's context carries one tool list rather than two. Re-run `npx -y scenescout install` so the installed skill matches the server.\n- **Earlier names.** This tool was previously called SceneCraft (and, before that, frontend-tester). `scenescout install` cleans up after both: it removes the old skill link and the old `scenecraft` MCP registration when they point at this install, and the first attach in a project moves its `.scenecraft/` memory folder to `.scenescout/` so earlier coverage and findings carry over.\n\n### 🧹 Uninstall\n\n```bash\n# Claude Code\nclaude mcp remove --scope user scenescout\nrm -rf ~/.claude/skills/scenescout\n# Codex / Gemini / Copilot CLI\ncodex mcp remove scenescout        # likewise: gemini mcp remove …, copilot mcp remove …\n```\n\nFor Cursor, Windsurf and VS Code, delete the `scenescout` entry from the client's MCP server list.\n\nNothing else is installed: `npx` runs the package from npm's cache. Per-project memory lives in each tested project's `.scenescout/` folder; delete it there if you want it gone.\n\n---\n\n## 🌐 Choosing browsers\n\n`install` downloads Chromium and nothing else unless you ask. `--browsers` takes one name, a comma-separated list, or `all`:\n\n| `--browsers` | What is downloaded | About, on disk |\n|---|---|---|\n| `chromium` *(default)* | the full browser and the headless shell | 550 MB |\n| `chromium-headless-shell` | the headless shell only: every run works except `headed` | 200 MB |\n| `firefox` | Firefox | 270 MB |\n| `webkit` | WebKit, the engine behind Safari | 290 MB |\n| `all` | Chromium, Firefox and WebKit | 1.1 GB |\n\n```bash\nnpx -y scenescout install --browsers chromium-headless-shell   # the smallest working setup\nnpx -y scenescout install --browser-only --browsers firefox,webkit   # add two more later\n```\n\nSizes vary by platform. The builds go to Playwright's shared cache, so a build another tool already fetched is not downloaded again.\n\nTo drive another browser, pass `browser` when attaching (`scout_attach { browser: \"firefox\" }`), or set `SCENESCOUT_BROWSER=webkit` in the server's environment to change the default. `scenescout doctor` checks the browser named by that variable in the shell it runs from, so check another one with `SCENESCOUT_BROWSER=webkit scenescout doctor`. Two things differ outside Chromium:\n\n- **Service workers are not allowed to register** in Firefox and WebKit. The write policy works by intercepting requests, and only Chromium lets a request issued by a service worker be intercepted. An app that depends on its worker may behave differently there.\n- **A Firefox or WebKit left behind by a crash is not cleaned up** on the next start the way a leftover Chromium is.\n\nIn every browser, pages are not given shared workers unless the mode is `destructive`: a request a shared worker sends cannot be intercepted anywhere, so the app is made to do that work on the page, where the policy sees it.\n\n## 🔌 Other MCP clients\n\nThe engine is a plain MCP server over stdio, so any client can drive it, and the testing method reaches the agent through the server itself (see the end of this section). `install` can register it for you:\n\n```bash\nnpx -y scenescout install --client cursor            # one client\nnpx -y scenescout install --client vscode,codex      # several; add claude-code to keep that one too\n```\n\n| `--client` | How it is registered |\n|---|---|\n| `claude-code` *(default)* | `claude mcp add`, plus the skill |\n| `cursor` | adds an entry to `~/.cursor/mcp.json`, keeping the others |\n| `vscode` | VS Code's own `code --add-mcp`. A `code` command that belongs to another editor is not used |\n| `codex` | `codex mcp add` |\n| `gemini` | `gemini mcp add --scope user` |\n| `copilot` | `copilot mcp add` (GitHub Copilot CLI) |\n| `windsurf` | adds an entry to `~/.codeium/windsurf/mcp_config.json`, keeping the others |\n\nA config file that is not valid JSON is left untouched, and the entry to add by hand is printed instead; a config that is a link into a dotfiles repository is written through the link. When a client that is registered through its own command is not installed, `install` says so and prints the command to run later. Cursor and Windsurf are files, so their entry is written whether or not the editor is installed yet. On Windows, a client installed through npm is a `.cmd` shim that `install` cannot start; it prints the command for you to run instead. Then restart the client and ask its agent: *\"Use SceneScout to test http://localhost:3000\"*.\n\nWhat has been checked: registering through each command above was run against Codex CLI, Gemini CLI, GitHub Copilot CLI and VS Code, and Cursor's command line agent read the entry `install` wrote, connected and listed the tools. The Windsurf path follows its documentation. A full test session has been run in Claude Code, with and without the skill. If a client behaves differently for you, a correction is welcome (say which client version you checked).\n\nTo register by hand instead, the server entry is always the same command, `npx -y scenescout serve`:\n\n<details>\n<summary><strong>Cursor</strong> — <code>~/.cursor/mcp.json</code> (or <code>.cursor/mcp.json</code> in a project)</summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"scenescout\": { \"command\": \"npx\", \"args\": [\"-y\", \"scenescout\", \"serve\"] }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>VS Code</strong> (GitHub Copilot agent mode) — <code>.vscode/mcp.json</code></summary>\n\n```json\n{\n  \"servers\": {\n    \"scenescout\": { \"type\": \"stdio\", \"command\": \"npx\", \"args\": [\"-y\", \"scenescout\", \"serve\"] }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Codex CLI</strong> — <code>~/.codex/config.toml</code></summary>\n\n```toml\n[mcp_servers.scenescout]\ncommand = \"npx\"\nargs = [\"-y\", \"scenescout\", \"serve\"]\n```\n\n</details>\n\n<details>\n<summary><strong>Gemini CLI</strong> — <code>~/.gemini/settings.json</code> (or <code>.gemini/settings.json</code> in a project)</summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"scenescout\": { \"command\": \"npx\", \"args\": [\"-y\", \"scenescout\", \"serve\"] }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Windsurf</strong> — <code>~/.codeium/windsurf/mcp_config.json</code></summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"scenescout\": { \"command\": \"npx\", \"args\": [\"-y\", \"scenescout\", \"serve\"] }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Cline</strong> — MCP Servers → Configure → Configure MCP Servers (or <code>~/.cline/mcp.json</code> for the CLI)</summary>\n\n```json\n{\n  \"mcpServers\": {\n    \"scenescout\": { \"command\": \"npx\", \"args\": [\"-y\", \"scenescout\", \"serve\"], \"disabled\": false, \"autoApprove\": [] }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Zed</strong> — <code>settings.json</code> (command palette: <code>zed: open settings file</code>)</summary>\n\n```json\n{\n  \"context_servers\": {\n    \"scenescout\": { \"command\": \"npx\", \"args\": [\"-y\", \"scenescout\", \"serve\"], \"env\": {} }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Anything else</strong></summary>\n\nMost clients accept the same `mcpServers` JSON shape shown for Cursor.\n\n</details>\n\n**The method travels with the server.** The tools are only hands and eyes; [`skills/scenescout/SKILL.md`](skills/scenescout/SKILL.md) is the method: what to look at first, when to stop, what counts as a finding. Claude Code loads it as a skill. Every other client gets the same text from the server, with nothing to copy:\n\n- the server's instructions tell the agent to call `scout_playbook` before its first attach, and that tool returns the method,\n- clients that list server prompts as commands also get an `explore` prompt, which loads the method and takes an optional URL, level and focus.\n\nSo in any client, a first message like *\"Use SceneScout to test http://localhost:3000\"* is enough. If an agent starts clicking without having called `scout_playbook`, tell it to call that first; how closely a model follows server instructions varies by client.\n\nThe CLI is also useful on its own:\n\n```bash\nnpx -y scenescout scan <path>       # project discovery: framework, routes, saved logins\nnpx -y scenescout status <path>     # what every session of a running engine is doing right now\nnpx -y scenescout watch <path>      # the same, live in your browser, with each session's page\n```\n\n---\n\n## 📁 Project layout\n\n```\nsrc/\n  mcp-server.ts     the 29 tools + per-session dispatch\n  scan.ts           project discovery (framework, routes, auth)\n  cli.ts            scan · serve · install · doctor · status\n  installer.ts      setup logic (skill link, MCP registration, diagnostics)\n  engine/\n    browser.ts      the engine class: attach, snapshot, actions, crawl, plans\n    probes.ts       in-page scroll + overlay + focus probes (needs a browser too)\n    fingerprint.ts  route + element-set identity (state hashing)\n    oracles.ts      console/page/network/HTTP error detection\n    injection.ts    the DOM-injection oracle's rules (what to watch for, how to find it)\n    claims.ts       when the page contradicts the server (refused_empty, false_success)\n    request.ts      what a replayed API call may be and where it may go\n    brief.ts        splitting the app between parallel lanes\n    lane.ts         the typed report a lane hands back\n    calibration.ts  whether a lane's confidence held up; what it judged and never filed\n    pace.ts         how a run spent its time\n    bench.ts        scoring a run against the demo app's answer key\n    policy.ts       the write-policy safety net\n    ownership.ts    safe-write: which records were created in this process?\n    uploads.ts      disk uploads, fenced to the project by real path\n    journey.ts      task-ease measurement from the action log\n    design.ts       the design audit + page scoring\n    memory.ts       cross-run storage + finding dedup\n    report.ts       the gap ledger + report generation\n    replay.ts       the run as one page: steps, tasks, frames under each finding\n    …               collector · dispatch · fixtures · authloss · reaper\nscripts/            the 23 test suites (smoke/ holds the real-browser ones)\ntest-app/           fixtures for the real-browser smoke tests\nskills/scenescout/   the testing method (SKILL.md): a skill in Claude Code, served by the server everywhere else\ndocs/how-it-works.md  what happens at each stage, in diagrams\ndocs/benchmark.md   measuring whether a change made runs better\ndocs/adr/           why it's built this way\n```\n\n> Design principle: logic that *doesn't* need Playwright lives outside `browser.ts`, so it can be unit-tested without launching a browser. That's why `fingerprint`, `policy`, `memory`, `report`, etc. are their own modules.\n\n---\n\n## 🧠 Design decisions\n\n**[How it works, stage by stage](docs/how-it-works.md)** — diagrams of the run lifecycle, what happens inside one action, the write policy on the wire, how a violation becomes a finding, how a parallel run is split and folded, how roles hand work to each other, where a run's time goes, and how a lane's confidence is checked afterwards.\n\n**[Measuring whether a change helped](docs/benchmark.md)** — the demo app's answer key, the scorecard (recall, precision, judged-not-filed, severity, calibration), and the results log of every run, including what did not help.\n\nThe load-bearing choices are recorded as ADRs — read the relevant one before changing a rule it covers:\n\n- [1 · Completion is an enforced contract, not a claim](docs/adr/0001-completion-is-a-contract-not-a-vibe.md)\n- [2 · The write policy is enforced on the wire, not in the prompt](docs/adr/0002-enforce-the-write-policy-at-the-network-layer.md)\n- [3 · A gap-ledger entry must be actionable, and suppression must be visible](docs/adr/0003-a-noisy-ledger-is-a-broken-ledger.md)\n- [4 · Findings dedup on machine signals, and a merge must never lose a finding](docs/adr/0004-dedup-on-machine-signals-not-prose.md)\n- [5 · Testable logic lives outside `browser.ts`](docs/adr/0005-keep-testable-logic-out-of-the-browser-module.md)\n- [6 · Nothing in this repo names or is tuned for a tested app](docs/adr/0006-stay-project-agnostic.md)\n- [7 · The live view is local, read-only, and leaves nothing behind](docs/adr/0007-the-live-view-is-local-read-only-and-leaves-nothing-behind.md)\n- [8 · Recording is opt-in, and a recorded run is one self-contained page](docs/adr/0008-a-recorded-run-is-evidence-and-must-be-asked-for.md)\n- [9 · A refused write is answered, not dropped](docs/adr/0009-a-refused-write-is-answered-not-dropped.md)\n- [10 · A lane's confidence is checked, not trusted](docs/adr/0010-a-confidence-is-checked-not-trusted.md)\n\n---\n\n## 🔧 Development\n\nWorking on SceneScout itself is the only reason to clone it:\n\n```bash\ngit clone https://github.com/brunoboto96/SceneScout.git scenescout && cd scenescout\nnpm install        # installs dependencies and builds\nnpm run setup      # same as `scenescout install`, but registers THIS checkout (the skill is linked, so edits are live)\nnpm test           # build + 23 suites: 21 pure-logic suites (scan, oracle, policy, … bench, hygiene),\n                   #                     then smoke and mcp-check (the server over stdio), both with real browsers\nnpm run bench -- --all   # re-score every archived benchmark run against the current answer key\nnpm run demo       # regenerate examples/ from the demo app\n```\n\nContributing? Start with [VISION.md](VISION.md) (what is in scope) and [CONTRIBUTING.md](CONTRIBUTING.md) (how changes land), then see [AGENTS.md](AGENTS.md) for the house rules — chiefly: bug fixes need a regression test at the cheapest layer that can fail, keep the repo project-agnostic (ADR 6), and `npm test` must pass.\n\n## 🔐 Security\n\nFound a way past the write policy, or another security problem? Please report it privately — see [SECURITY.md](SECURITY.md).\n\n## 📄 License\n\n[MIT](LICENSE).\n\n<details>\n<summary><strong>Full capability list</strong> — every behavior, for the curious</summary>\n\n- **Structured render-state, not pixels.** Element lists with geometry; screenshots reserved for pixel-native residue (canvas, rendering glitches). Images that failed to load are reported from the DOM, including ones whose URL answered 200 with something that is not an image.\n- **Diff snapshots with stable refs.** Re-snapshots return only what changed (10.7 kB → 0.7 kB on a 130-element page); old refs stay valid.\n- **Geometry oracles.** Overlap and off-screen defects computed from layout boxes.\n- **Oracles after every action.** Console errors, page errors, failed requests, HTTP 4xx/5xx drained into every tool result — and DOM injection: a markup-shaped value the agent typed that later renders as an element on any page (stored or reflected XSS).\n- **Multi-role, genuinely concurrent.** Commands to *different* sessions run in parallel; safe-write ownership is shared, so role A can create what role B approves. The report renders a role capability matrix.\n- **Task ease, not just correctness.** `scout_journey` measures interaction cost, distinct screens, path, and backtracks.\n- **Design audit with page scores.** Two tiers (⚠ measurable defects / → craft suggestions incl. AI-slop tells), per-page 0–100 score persisted per route, plus an automatic overlay/modal probe on every snapshot. Shared shell scored once, separately.\n- **Scrolls like a user — and notices when it can't.** Reports `SCROLL LOCKED` for a leaked modal scroll-lock, finds the real inner scroll pane on app-shell layouts, and flags `UNREACHABLE` controls clipped inside `overflow:hidden`.\n- **Uploads like a user.** Answers a styled file-chooser or sets a hidden input directly, with a valid in-memory fixture; `filePath` is fenced to the project under test; files violating `accept` are flagged at selection.\n- **Auth via Playwright storage states.** Expired tokens caught at attach; repeated login-bounces raise `SESSION AUTH LOST`; a bounced route is recorded as *not* covered — a dead session can't certify routes it never reached.\n- **A trustworthy gap ledger.** Entries must be actionable (a search box or wizard sub-step isn't \"form filled but never submitted\"); API/download URLs never enter the route contract.\n- **Honest reporting.** Shared chrome counted once, stale scores marked, role matrix compares only roles that actually attempted a route.\n- **Cross-run written knowledge.** `scout_note` curates `.scenescout/ASSUMPTIONS.md` — app model, personas, constraints, risks — in prose.\n- **Daemon-grade robustness.** Per-tool watchdogs, orphaned-browser reaping, bounded teardown, live status via `scenescout status <project>`, and a live view of every session's page: the agent gives you its address when it attaches, or run `scenescout watch <project>` (loopback only, read-only, nothing written to disk: [ADR 7](docs/adr/0007-the-live-view-is-local-read-only-and-leaves-nothing-behind.md)).\n\n</details>\n","readmeFilename":"README.md"}