{"_id":"medula","_rev":"5-47af9e87ab94b8eeba6e5757bf5ee866","name":"medula","dist-tags":{"latest":"0.4.0"},"versions":{"0.0.0":{"name":"medula","version":"0.0.0","keywords":[],"author":{"url":"https://www.npmjs.com/~posva","name":"posva"},"license":"UNLICENSED","_id":"medula@0.0.0","maintainers":[{"name":"posva","email":"posva13@gmail.com"}],"dist":{"shasum":"f84989721898080cdca275b7d7fefbc9b69150a6","tarball":"https://registry.npmjs.org/medula/-/medula-0.0.0.tgz","fileCount":2,"integrity":"sha512-bfnQHtVSOO2+4qGBHgww6Azs+6W4eDu9yIzuaWm78Qw8WhW29wfsPmwcC7YEopqjY5Jmc2vHOn69yC4QhFZ3sQ==","signatures":[{"sig":"MEUCIQCTZLx6yiLaurl923pjc6VaYE0bseWnEM7NeYY4WwWPXwIgENhBwV9uIH+Ui+bHqCjW0IXTKk/Swrqztp35ssZC86k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":258},"main":"index.js","private":false,"scripts":{},"_npmUser":{"name":"posva","email":"posva13@gmail.com"},"_npmVersion":"11.19.0","description":"Placeholder for medula","directories":{},"_nodeVersion":"26.8.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/medula_0.0.0_1789396760322_0.9770789963466411","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"medula","version":"0.0.2","keywords":["mcp","devtools","devframe","agent","state","vue","react","svelte","nuxt","next"],"author":{"name":"Eduardo San Martin Morote","email":"posva13@gmail.com"},"license":"MIT","_id":"medula@0.0.2","maintainers":[{"name":"posva","email":"posva13@gmail.com"}],"homepage":"https://github.com/posva/medula","bugs":{"url":"https://github.com/posva/medula/issues"},"dist":{"shasum":"855d7ed750cfc80ba3ca4609ec068afea80c3d94","tarball":"https://registry.npmjs.org/medula/-/medula-0.0.2.tgz","fileCount":34,"integrity":"sha512-A3IDaboIgZ59UWXOVNWZ4tIM/q0TA+z7yQkqWQ4UXtXbOOuH6GgRI2WqQDiy7gdg1yWLhJYQLsa75Tn55ZfYTA==","signatures":[{"sig":"MEUCIHD+Gril/fWA3o+Nx6J7m7s3vrEJPjfOXA6tdBxIcdp3AiEAhO7FF24KbuaSiZrAZVVhu1XOw2v/gnWgh44ullu/URs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCZnny9e3gC0DkuU7mTJ1qiR8qA3NAIADZ+YnEsGPlASwIgMT2vIU16MNtumMeIgnWRL3oeBWiSOA4fTDy8atwQDPY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":301134},"type":"module","types":"./dist/index.d.mts","exports":{".":"./dist/index.mjs","./vue":"./dist/vue.mjs","./next":"./dist/next.mjs","./nuxt":"./dist/nuxt.mjs","./vite":"./dist/vite.mjs","./react":"./dist/react.mjs","./client":"./dist/client.mjs","./svelte":"./dist/svelte.mjs","./package.json":"./package.json"},"funding":"https://github.com/sponsors/posva","scripts":{"dev":"vitest --ui","fmt":"oxfmt","lint":"oxlint ${CI:+--deny-warnings} .","test":"pnpm run build && pnpm run test:cov && pnpm run test:types --force","build":"tsdown && vite build --config panel.vite.config.ts","release":"node scripts/release.ts","lint:fix":"oxlint --fix .","play:vue":"pnpm -C playgrounds/vue-vite dev","test:cov":"vitest run --coverage","build:lib":"tsdown","e2e:agent":"node e2e/agent.mjs","play:next":"pnpm -C playgrounds/nextjs dev","play:nuxt":"pnpm -C playgrounds/nuxt dev","play:react":"pnpm -C playgrounds/react-vite dev","test:types":"tsc --build ./tsconfig.json","build:panel":"vite build --config panel.vite.config.ts","play:svelte":"pnpm -C playgrounds/svelte-vite dev","e2e:agent:vue":"node e2e/agent.mjs --scenario vue","e2e:agent:codex":"node e2e/agent.mjs --agent codex","e2e:agent:svelte":"node e2e/agent.mjs --scenario svelte"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:24a8df2a-8ff4-4925-9d73-9cd462767029"}},"repository":{"url":"posva/medula","type":"git"},"description":"Headless devtools that let a coding agent read and change the state of an open web page through MCP","directories":{},"lint-staged":{"*":["oxfmt --no-error-on-unmatched-pattern","oxlint --no-error-on-unmatched-pattern --fix"]},"sideEffects":false,"dependencies":{"zod":"^4.6.4","devframe":"file:vendor/devframe-0.9.18.tgz","@devframes/next":"file:vendor/devframes-next-0.9.18.tgz","@modelcontextprotocol/client":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.42","next":"^16.3.5","vite":"^8.3.0","oxfmt":"^0.66.0","pinia":"^4.0.3","react":"^19.2.8","oxlint":"^1.80.0","semver":"^7.8.5","svelte":"^5.57.0","tsdown":"^0.23.0","vitest":"^5.0.0","@nuxt/kit":"^4.5.2","happy-dom":"^20.12.0","react-dom":"^19.2.8","@vitest/ui":"^5.0.0","typescript":"~7.0.2","@types/node":"^26.4.0","lint-staged":"^17.4.1","@nuxt/schema":"^4.5.2","@types/react":"^19.2.18","@types/semver":"^7.8.0","@posva/prompts":"^2.4.4","@types/react-dom":"^19.2.7","simple-git-hooks":"^2.14.0","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"^5.0.0","oxlint-plugin-posva":"^0.0.2","conventional-changelog":"^8.1.3","conventional-changelog-angular":"^9.4.0"},"peerDependencies":{"vue":"^3.5.0","next":"^15.0.0 || ^16.0.0","vite":"^7.0.0 || ^8.0.0","pinia":"^3.0.0 || ^4.0.0","react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0","@nuxt/kit":"^4.0.0 || ^5.0.0-0"},"simple-git-hooks":{"commit-msg":"node scripts/verifyCommit.js","pre-commit":"pnpm lint-staged"},"peerDependenciesMeta":{"vue":{"optional":true},"next":{"optional":true},"vite":{"optional":true},"pinia":{"optional":true},"react":{"optional":true},"svelte":{"optional":true},"@nuxt/kit":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/medula_0.0.2_1789398973448_0.4934178793807851","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"medula","version":"0.2.0","keywords":["mcp","devtools","devframe","agent","state","vue","react","svelte","solid","nuxt","next"],"author":{"name":"Eduardo San Martin Morote","email":"posva13@gmail.com"},"license":"MIT","_id":"medula@0.2.0","maintainers":[{"name":"posva","email":"posva13@gmail.com"}],"homepage":"https://github.com/posva/medula","bugs":{"url":"https://github.com/posva/medula/issues"},"dist":{"shasum":"699bf9a4451edbfcf27da077f520513b79fb746b","tarball":"https://registry.npmjs.org/medula/-/medula-0.2.0.tgz","fileCount":19,"integrity":"sha512-BVVRCg9FUXBoKRc3KpivOaxStiDCTlmy8vWVRBtTaxKBSsbtS0Vz3L3MoNNhqC7l8lPgDw0ajf4o6cwkgoDFaw==","signatures":[{"sig":"MEYCIQDWP0p7bdHTT8/nTz2OzuBB9zVL96OOcmzJvkRNiolAvwIhAKqUxN4f5Ri85qPJervwkwjp6FldUM35fF/E07oKX6nP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCvyoDzGdTkIJDSYuTcMzhB9wj9q+qiJS8D7uEbUnj70gIhAOoPJzfsuTnjPhxj9ur9aeTyGdhWDnQPq8k1geoeDM6f","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/medula@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":201572},"type":"module","types":"./dist/index.d.mts","exports":{".":"./dist/index.mjs","./next":"./dist/next.mjs","./nuxt":"./dist/nuxt.mjs","./vite":"./dist/vite.mjs","./package.json":"./package.json"},"funding":"https://github.com/sponsors/posva","scripts":{"dev":"vitest --ui","fmt":"oxfmt","lint":"oxlint ${CI:+--deny-warnings} .","test":"pnpm run build && pnpm run test:cov && pnpm run test:types --force","build":"tsdown && vite build --config panel.vite.config.ts","release":"node scripts/release.ts","lint:fix":"oxlint --fix .","play:vue":"pnpm -C playgrounds/vue-vite dev","test:cov":"vitest run --coverage","build:lib":"tsdown","e2e:agent":"node e2e/agent.mjs","play:next":"pnpm -C playgrounds/nextjs dev","play:nuxt":"pnpm -C playgrounds/nuxt dev","play:react":"pnpm -C playgrounds/react-vite dev","play:solid":"pnpm -C playgrounds/solid-vite dev","test:types":"tsc --build ./tsconfig.json","build:panel":"vite build --config panel.vite.config.ts","play:svelte":"pnpm -C playgrounds/svelte-vite dev","e2e:agent:vue":"node e2e/agent.mjs --scenario vue","e2e:agent:codex":"node e2e/agent.mjs --agent codex","e2e:agent:solid":"node e2e/agent.mjs --scenario solid","e2e:agent:svelte":"node e2e/agent.mjs --scenario svelte"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:24a8df2a-8ff4-4925-9d73-9cd462767029"}},"repository":{"url":"posva/medula","type":"git"},"description":"Headless devtools that let a coding agent read and change the state of an open web page through MCP","directories":{},"lint-staged":{"*":["oxfmt --no-error-on-unmatched-pattern","oxlint --no-error-on-unmatched-pattern --fix"]},"sideEffects":false,"dependencies":{"zod":"^4.6.4","devframe":"file:vendor/devframe-0.9.19.tgz","@vitejs/devtools-kit":"^0.7.3","@modelcontextprotocol/client":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.42","next":"^16.3.5","vite":"^8.3.0","oxfmt":"^0.66.0","pinia":"^4.0.3","react":"^19.2.8","oxlint":"^1.80.0","semver":"^7.8.5","svelte":"^5.57.0","tsdown":"^0.23.0","vitest":"^5.0.0","solid-js":"^1.9.15","@nuxt/kit":"^4.5.2","happy-dom":"^20.12.0","react-dom":"^19.2.8","@vitest/ui":"^5.0.0","typescript":"~7.0.2","@types/node":"^26.4.0","lint-staged":"^17.4.1","@nuxt/schema":"^4.5.2","@types/react":"^19.2.18","@types/semver":"^7.8.0","@posva/prompts":"^2.4.4","@devframes/next":"file:vendor/devframes-next-0.9.19.tgz","@types/react-dom":"^19.2.7","@vitejs/devtools":"^0.7.3","simple-git-hooks":"^2.14.0","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"^5.0.0","oxlint-plugin-posva":"^0.0.2","conventional-changelog":"^8.1.3","conventional-changelog-angular":"^9.4.0"},"peerDependencies":{"vue":"^3.5.0","next":"^15.0.0 || ^16.0.0","vite":"^7.0.0 || ^8.0.0","pinia":"^3.0.0 || ^4.0.0","react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0","solid-js":"^1.9.0","@nuxt/kit":"^4.0.0 || ^5.0.0-0"},"simple-git-hooks":{"commit-msg":"node scripts/verifyCommit.js","pre-commit":"pnpm lint-staged"},"peerDependenciesMeta":{"vue":{"optional":true},"next":{"optional":true},"vite":{"optional":true},"pinia":{"optional":true},"react":{"optional":true},"svelte":{"optional":true},"solid-js":{"optional":true},"@nuxt/kit":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/medula_0.2.0_1789483919146_0.712908895686089","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"medula","version":"0.3.0","keywords":["mcp","devtools","devframe","agent","state","vue","react","svelte","solid","nuxt","next"],"author":{"name":"Eduardo San Martin Morote","email":"posva13@gmail.com"},"license":"MIT","_id":"medula@0.3.0","maintainers":[{"name":"posva","email":"posva13@gmail.com"}],"homepage":"https://github.com/posva/medula","bugs":{"url":"https://github.com/posva/medula/issues"},"dist":{"shasum":"2c1b497892fe5e6f9ff743201787cc6c724798ce","tarball":"https://registry.npmjs.org/medula/-/medula-0.3.0.tgz","fileCount":19,"integrity":"sha512-gS/grdhXl6l4B78sDNLkUC2qAG5dLqVqk1tnaIcN9ev+Rg0RyZtqvjBwWOdKLqPQlnH1Gc2sA7vJk+nuDfX6bQ==","signatures":[{"sig":"MEUCIQCfhuC6/Nu0XZua2wHTpmUP1XzOMAZBhruQEYrGGdncFwIgPgRvpfD9T2BTJ+V/Q0Zjf18um+n7wZIlRDGObNA+5/0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCodF9S0tZObV8Fc3EfHH9jSljclM4F/2o0f6JQtVl0sgIhAMpamOa5fCtVBbKycdb8+BLsq2vEaGNFF0RzlZfelnUm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/medula@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":207664},"type":"module","types":"./dist/index.d.mts","exports":{".":"./dist/index.mjs","./next":"./dist/next.mjs","./nuxt":"./dist/nuxt.mjs","./vite":"./dist/vite.mjs","./package.json":"./package.json"},"funding":"https://github.com/sponsors/posva","scripts":{"dev":"vitest --ui","fmt":"oxfmt","lint":"oxlint ${CI:+--deny-warnings} .","test":"pnpm run build && pnpm run test:cov && pnpm run test:types --force","build":"tsdown && vite build --config panel.vite.config.ts","release":"node scripts/release.ts","lint:fix":"oxlint --fix .","play:vue":"pnpm -C playgrounds/vue-vite dev","test:cov":"vitest run --coverage","build:lib":"tsdown","e2e:agent":"node e2e/agent.mjs","play:next":"pnpm -C playgrounds/nextjs dev","play:nuxt":"pnpm -C playgrounds/nuxt dev","play:react":"pnpm -C playgrounds/react-vite dev","play:solid":"pnpm -C playgrounds/solid-vite dev","test:types":"tsc --build ./tsconfig.json","build:panel":"vite build --config panel.vite.config.ts","play:solid2":"pnpm -C playgrounds/solid2-vite dev","play:svelte":"pnpm -C playgrounds/svelte-vite dev","e2e:agent:vue":"node e2e/agent.mjs --scenario vue","e2e:agent:codex":"node e2e/agent.mjs --agent codex","e2e:agent:solid":"node e2e/agent.mjs --scenario solid","e2e:agent:svelte":"node e2e/agent.mjs --scenario svelte"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:24a8df2a-8ff4-4925-9d73-9cd462767029"}},"repository":{"url":"posva/medula","type":"git"},"description":"Headless devtools that let a coding agent read and change the state of an open web page through MCP","directories":{},"lint-staged":{"*":["oxfmt --no-error-on-unmatched-pattern","oxlint --no-error-on-unmatched-pattern --fix"]},"sideEffects":false,"dependencies":{"zod":"^4.6.4","devframe":"^1.0.0","@devframes/agentic":"^1.0.0","@vitejs/devtools-kit":"^0.7.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.42","next":"^16.3.5","vite":"^8.3.0","oxfmt":"^0.66.0","pinia":"^4.0.3","react":"^19.2.8","oxlint":"^1.80.0","semver":"^7.8.5","svelte":"^5.57.0","tsdown":"^0.23.0","vitest":"^5.0.0","solid-js":"^1.9.15","@nuxt/kit":"^4.5.2","happy-dom":"^20.12.0","react-dom":"^19.2.8","@vitest/ui":"^5.0.0","typescript":"~7.0.2","@types/node":"^26.4.0","lint-staged":"^17.4.1","solid-js-v2":"npm:solid-js@2.0.0-rc.8","@nuxt/schema":"^4.5.2","@types/react":"^19.2.18","@types/semver":"^7.8.0","@posva/prompts":"^2.4.4","@devframes/next":"^1.0.0","@types/react-dom":"^19.2.7","@vitejs/devtools":"^0.7.5","simple-git-hooks":"^2.14.0","@vitejs/plugin-vue":"^6.0.8","@vitest/coverage-v8":"^5.0.0","oxlint-plugin-posva":"^0.0.2","conventional-changelog":"^8.1.3","conventional-changelog-angular":"^9.4.0"},"peerDependencies":{"vue":"^3.5.0","next":"^15.0.0 || ^16.0.0","vite":"^7.0.0 || ^8.0.0","pinia":"^3.0.0 || ^4.0.0","react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0","solid-js":"^1.9.0 || ^2.0.0-rc.8","@nuxt/kit":"^4.0.0 || ^5.0.0-0"},"simple-git-hooks":{"commit-msg":"node scripts/verifyCommit.js","pre-commit":"pnpm lint-staged"},"peerDependenciesMeta":{"vue":{"optional":true},"next":{"optional":true},"vite":{"optional":true},"pinia":{"optional":true},"react":{"optional":true},"svelte":{"optional":true},"solid-js":{"optional":true},"@nuxt/kit":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/medula_0.3.0_1789568572938_0.4407928591944843","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"_id":"medula@0.4.0","bugs":{"url":"https://github.com/posva/medula/issues"},"dist":{"shasum":"786e3eb5e7ebdb385bd7103416ed5138cafa063f","tarball":"https://registry.npmjs.org/medula/-/medula-0.4.0.tgz","fileCount":19,"integrity":"sha512-3iP6ycCRXuPRs1hEn6rvaFMpWhYtZgXlmDSMx+KPNH04saQtRXQUR0lq3ihwbgsz7r4EROLCmUBiBmeAcSJWCA==","signatures":[{"sig":"MEUCIQDnbnp9unLqjY6oXlLFCJ9UH5NzVviqHmN+QHxq0WHuWQIgAK9vExB+WpgZOoewvX1W9H0bojnEmx2aEAEYw1Ux3K8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIA18Oq/FEZnqcihetmMJv7QRy3k7/LZnJRupdAUWFHEYAiEA8iLF6wiWmRU2FlU6NyCwglKBzM+BBXCexvA7Xlv2srQ="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/medula@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":207476},"name":"medula","type":"module","types":"./dist/index.d.mts","author":{"name":"Eduardo San Martin Morote","email":"posva13@gmail.com"},"exports":{".":"./dist/index.mjs","./next":"./dist/next.mjs","./nuxt":"./dist/nuxt.mjs","./vite":"./dist/vite.mjs","./package.json":"./package.json"},"funding":"https://github.com/sponsors/posva","license":"MIT","scripts":{"dev":"vitest --ui","fmt":"oxfmt","lint":"oxlint ${CI:+--deny-warnings} .","test":"pnpm run build && pnpm run test:cov && pnpm run test:types --force","build":"tsdown && vite build --config panel.vite.config.ts","release":"node scripts/release.ts","lint:fix":"oxlint --fix .","play:vue":"pnpm -C playgrounds/vue-vite dev","test:cov":"vitest run --coverage","build:lib":"tsdown","e2e:agent":"node e2e/agent.mjs","play:next":"pnpm -C playgrounds/nextjs dev","play:nuxt":"pnpm -C playgrounds/nuxt dev","play:react":"pnpm -C playgrounds/react-vite dev","play:solid":"pnpm -C playgrounds/solid-vite dev","test:types":"tsc --build ./tsconfig.json","build:panel":"vite build --config panel.vite.config.ts","play:solid2":"pnpm -C playgrounds/solid2-vite dev","play:svelte":"pnpm -C playgrounds/svelte-vite dev","e2e:agent:vue":"node e2e/agent.mjs --scenario vue","e2e:agent:codex":"node e2e/agent.mjs --agent codex","e2e:agent:solid":"node e2e/agent.mjs --scenario solid","e2e:agent:svelte":"node e2e/agent.mjs --scenario svelte"},"version":"0.4.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"24a8df2a-8ff4-4925-9d73-9cd462767029"}},"homepage":"https://github.com/posva/medula","keywords":["mcp","devtools","devframe","agent","state","vue","react","svelte","solid","nuxt","next"],"repository":{"url":"posva/medula","type":"git"},"description":"Headless devtools that let a coding agent read and change the state of an open web page through MCP","directories":{},"lint-staged":{"*":["oxfmt --no-error-on-unmatched-pattern","oxlint --no-error-on-unmatched-pattern --fix"]},"maintainers":[{"name":"posva","email":"posva13@gmail.com"}],"sideEffects":false,"dependencies":{"zod":"^4.6.5","devframe":"1.2.0","@devframes/agentic":"1.2.0","@vitejs/devtools-kit":"^0.7.6"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vue":"^3.5.43","next":"^16.3.8","vite":"^8.3.1","oxfmt":"^0.71.0","pinia":"^4.0.3","react":"^19.3.0","oxlint":"^1.86.0","semver":"^7.8.5","svelte":"^5.57.1","tsdown":"^0.23.0","vitest":"^5.0.3","solid-js":"^1.9.15","@nuxt/kit":"^4.5.2","happy-dom":"^20.14.5","react-dom":"^19.3.0","@vitest/ui":"^5.0.3","typescript":"~7.0.2","@types/node":"^26.6.3","lint-staged":"^17.6.0","solid-js-v2":"npm:solid-js@2.0.0-rc.13","@nuxt/schema":"^4.5.2","@types/react":"^19.3.0","@types/semver":"^7.8.0","@posva/prompts":"^2.4.4","@devframes/next":"1.2.0","@types/react-dom":"^19.3.0","@vitejs/devtools":"^0.7.6","simple-git-hooks":"^2.14.0","@vitejs/plugin-vue":"^6.0.9","@vitest/coverage-v8":"^5.0.3","oxlint-plugin-posva":"^0.0.2","conventional-changelog":"^8.1.3","conventional-changelog-angular":"^9.4.0"},"peerDependencies":{"vue":"^3.5.0","next":"^15.0.0 || ^16.0.0","vite":"^7.0.0 || ^8.0.0","pinia":"^3.0.0 || ^4.0.0","react":"^18.0.0 || ^19.0.0","svelte":"^5.0.0","solid-js":"^1.9.0 || ^2.0.0-rc.8","@nuxt/kit":"^4.0.0 || ^5.0.0-0"},"simple-git-hooks":{"commit-msg":"node scripts/verifyCommit.js","pre-commit":"pnpm lint-staged"},"peerDependenciesMeta":{"vue":{"optional":true},"next":{"optional":true},"vite":{"optional":true},"pinia":{"optional":true},"react":{"optional":true},"svelte":{"optional":true},"solid-js":{"optional":true},"@nuxt/kit":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/medula_0.4.0_1790936648463_0.3957098417632192"}}},"time":{"created":"2026-09-14T14:39:20.249Z","modified":"2026-10-02T10:24:08.925Z","0.0.0":"2026-09-14T14:39:20.454Z","0.0.2":"2026-09-14T15:16:13.569Z","0.2.0":"2026-09-15T14:51:59.231Z","0.3.0":"2026-09-16T14:22:53.049Z","0.4.0":"2026-10-02T10:24:08.645Z"},"bugs":{"url":"https://github.com/posva/medula/issues"},"author":{"name":"Eduardo San Martin Morote","email":"posva13@gmail.com"},"license":"MIT","homepage":"https://github.com/posva/medula","keywords":["mcp","devtools","devframe","agent","state","vue","react","svelte","solid","nuxt","next"],"repository":{"url":"posva/medula","type":"git"},"description":"Headless devtools that let a coding agent read and change the state of an open web page through MCP","maintainers":[{"name":"posva","email":"posva13@gmail.com"}],"readme":"# medula\n\n[![npm version](https://img.shields.io/npm/v/medula.svg)](https://npmx.dev/package/medula)\n[![ci](https://github.com/posva/medula/actions/workflows/ci.yml/badge.svg)](https://github.com/posva/medula/actions/workflows/ci.yml)\n\n> Change your web app's state from within it\n\nmedula lets your coding agent inspect and change the internal state of a running web app through\n[MCP](https://modelcontextprotocol.io). Ask it to check a component, change a value, or navigate\nto another route, and see the result in your browser.\n\nIt supports **Vue 3, React, Svelte 5, and Solid**, with integrations for **Vite, Nuxt, and\nNext.js**. Vue apps also get support for Pinia and Vue Router. Add medula to your dev server, it infiltrates your app so you don't need to adapt anything in it.\n\n| Framework        | What your agent can do                                                                                    |\n| ---------------- | --------------------------------------------------------------------------------------------------------- |\n| Vue 3            | Inspect the component tree, read and edit component state and Pinia stores, and navigate with Vue Router. |\n| React            | Inspect components, read and edit hook state, and override props.                                         |\n| Svelte 5         | Inspect components, read props and derived values, and edit `$state`.                                     |\n| Solid 1.9 / 2 RC | Inspect components, read props and memos, and edit signals and stores.                                    |\n\nmedula runs during development and uses [devframe](https://devfra.me) to connect your app to\nyour agent.\n\n## Setup\n\n### Vue, React, Svelte, and Solid with Vite 8\n\nInstall medula and Vite DevTools in your app:\n\n```sh\npnpm add -D medula @vitejs/devtools\n```\n\nEnable Vite DevTools and add `medula()` next to your existing framework plugin. For example,\nwith Vue:\n\n```ts\n// vite.config.ts\nimport { defineConfig } from 'vite'\nimport vue from '@vitejs/plugin-vue'\nimport { medula } from 'medula/vite'\n\nexport default defineConfig({\n  devtools: true,\n  plugins: [vue(), medula()],\n})\n```\n\nFor React, Svelte, or Solid, use the same config with your framework's import and `plugins` entry:\n\n```ts\n// React\nimport react from '@vitejs/plugin-react'\n// plugins: [react(), medula()]\n\n// Svelte 5\nimport { svelte } from '@sveltejs/vite-plugin-svelte'\n// plugins: [svelte(), medula()]\n\n// Solid 1\nimport solid from 'vite-plugin-solid'\n// plugins: [solid(), medula()]\n\n// Solid 2\nimport solid from '@solidjs/vite-plugin'\n// plugins: [solid(), medula()]\n```\n\nmedula detects the Solid version installed in the app. Solid 2 support is tested against\n`2.0.0-rc.13`. It captures public setters from instrumented primitive imports; pending or failed\nvalues appear as `null` until they can be read.\n\nVite DevTools 0.7.6 publishes its hub automatically for `devframe connect`. Registration starts\nwith the first hub request, when its origin is known.\n\n### Nuxt\n\nInstall medula:\n\n```sh\npnpm add -D medula\n```\n\nAdd the module to your Nuxt config. This requires Nuxt DevTools 4.\n\n```ts\n// nuxt.config.ts\nexport default defineNuxtConfig({\n  devtools: { enabled: true },\n  modules: ['medula/nuxt'],\n})\n```\n\n### Next.js (App Router)\n\nInstall medula and the devframe packages:\n\n```sh\npnpm add -D medula @devframes/agentic @devframes/next @devframes/hub-ui\n```\n\nWrap your Next.js config with `withDevframe`:\n\n```ts\n// next.config.ts\nimport { withDevframe } from '@devframes/next/single'\n\nexport default withDevframe({})\n```\n\nCreate the route below to serve the devtools. Use the folder name `%5F_devframes` exactly as\nshown: Next.js treats folders that start with `_` as private.\n\n```ts\n// app/%5F_devframes/[[...path]]/route.ts\nimport { nextDevframeHub } from '@devframes/next/hub'\n\nexport const runtime = 'nodejs'\nexport const dynamic = 'force-dynamic'\n\nconst hub = nextDevframeHub({\n  devframes: [\n    () =>\n      import(/* webpackIgnore: true */ /* turbopackIgnore: true */ 'medula').then((m) =>\n        m.medulaHubEntry(),\n      ),\n  ],\n  auth: false, // for local development on a single-user machine\n  register: true,\n})\n\nconst handler = (request: Request) => hub.handler(request)\n\nexport { handler as DELETE, handler as GET, handler as POST }\n```\n\nKeep the import comments: they let medula load its assets correctly with Webpack and Turbopack.\n`register: true` lets your agent discover the dev server.\n\nAdd `<Medula />` to the head of your root layout and the devtools script to the body:\n\n```tsx\n// app/layout.tsx\nimport type { ReactNode } from 'react'\nimport { Medula } from 'medula/next'\n\nexport default function RootLayout({ children }: { children: ReactNode }) {\n  return (\n    <html lang=\"en\">\n      <head>\n        <Medula />\n      </head>\n      <body>\n        {children}\n        {process.env.NODE_ENV === 'development' && (\n          <script type=\"module\" src=\"/__devframes/embedded.js\" />\n        )}\n      </body>\n    </html>\n  )\n}\n```\n\n## Connect your agent\n\nAdd this server to your agent's MCP configuration:\n\n```json\n{\n  \"mcpServers\": {\n    \"devframe\": {\n      \"command\": \"npx\",\n      \"args\": [\"devframe\", \"connect\"]\n    }\n  }\n}\n```\n\n`devframe connect` finds all running dev servers. Its instance list identifies each app and its\nport, and tool calls use that port to select the app.\n\nStart your dev server and open the app in your browser. If DevTools asks for a connection code,\ncomplete that step. Keep the app tab visible while your agent works: its tools are available\nwhile the page is connected.\n\nTry asking your agent:\n\n- “Show me the components on this page and their current state.”\n- “Set the cart quantity to 3 so I can check the total.”\n- “Open the settings route.” (Vue Router)\n\nYour agent can call `medula_help` for guidance and discover the tools for your app. Changes affect\nthe running page; they do not edit your source files.\n\n## Contributing\n\nSee [CONTRIBUTING.md](./CONTRIBUTING.md) for local setup, playgrounds, and checks.\n\n## License\n\n[MIT](./LICENSE)\n","readmeFilename":""}