{"_id":"@jokeran/frontend-code-skimmer","_rev":"35-c031e15e13c82317d5b48e71f7c9153e","name":"@jokeran/frontend-code-skimmer","dist-tags":{"latest":"0.8.1"},"versions":{"0.1.6":{"name":"@jokeran/frontend-code-skimmer","version":"0.1.6","_id":"@jokeran/frontend-code-skimmer@0.1.6","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"c8bd98a1aafbecc41dfd5e99c9fd7e217b5ecbe0","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.1.6.tgz","fileCount":3,"integrity":"sha512-wzA6btwsMYBafilo1SbTNTHj1Qi4rXRZ+KZfwzZwOknEYT4NSzO3/MFVw0kYehmWyCDRILfsMp2R1ODWYAuvFQ==","signatures":[{"sig":"MEYCIQC6/CJ1UEBQ5+omenDgxRXubAUDKLVZXIgjk2KtZNPWSwIhANqW4P0oHtVg6vGoc4TPuv8OLbTf+Y2PKpndK5tIoV+B","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":554169},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"8b50d5760b37e9d6e0220ee2ce2b4ed7fdc4bc4b","scripts":{"dev":"tsx watch src/index.ts","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"^1.6.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.1.6_1772682707076_0.8792909110650726","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@jokeran/frontend-code-skimmer","version":"0.1.7","_id":"@jokeran/frontend-code-skimmer@0.1.7","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"d0a52b3575a0dd3f1ae847826ae5a205cc57c523","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.1.7.tgz","fileCount":3,"integrity":"sha512-LxdwPQb1rNU4+nmNd2RYpffE4Vt2nkbF9FNj5VTGclq/GU5+SLtza+UgIMG60s5736LkwxaoAoMK8Cmu51ndxQ==","signatures":[{"sig":"MEUCIQDb2zfSRmTB/jMylmhLA8y8o7VVO+90+bd71t0nz5EsmQIgHRRHWPcwH54u/m+vqbxU1uR1t0FEYi2A8EZEieMFIAI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96158},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"7fbc27f068dfd33103de05c440e769a2d2c4cdd9","scripts":{"dev":"tsx watch src/index.ts","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"^1.6.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.1.7_1772685621435_0.7711872011267502","host":"s3://npm-registry-packages-npm-production"}},"0.1.9":{"name":"@jokeran/frontend-code-skimmer","version":"0.1.9","_id":"@jokeran/frontend-code-skimmer@0.1.9","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"bff2fcffb01da24e8987a1ea3d94486c24a09d6a","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.1.9.tgz","fileCount":3,"integrity":"sha512-sB2RkmesL1fg8GPSUB3kQbJ57KF1Ad1CGB1VQ+xuqSR7iHBERwdul9rJXhRhXrdF9Mg8ebA0O/8EFytxMB2DcQ==","signatures":[{"sig":"MEUCIQC179vXobEIvcvk27IubbZ04CZ4kXk3M8+tTCqnmfjkBwIgYKrhIx8qtF+ctkMwNBlGm22EEO0iMhT+xL45fxHrsZA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96419},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"fc40a0aa75f65850fe6a293365469fa4002f6abb","scripts":{"dev":"tsx watch src/index.ts","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"^1.6.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.1.9_1772686365216_0.13834676818557456","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@jokeran/frontend-code-skimmer","version":"0.2.0","_id":"@jokeran/frontend-code-skimmer@0.2.0","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"ed30e41d8c8607518c92d93e85c7ccccf94d7298","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.2.0.tgz","fileCount":3,"integrity":"sha512-6jHb//f927bwtx6ynrl9Cto6PDItUI8u/E7UZUxwu2jxbtmkiYxZ9MHN/L0N02djtJwhPpYjbiNqQzvWEWoVEQ==","signatures":[{"sig":"MEYCIQDIpMBfi55vgCOiuGlqNJ+zPG44It602GZc4VxacgFt0QIhAMUlNYPBu1BHEk9iQPuZiCD1PfooIXWp1i4X3wJxbtU3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96745},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"8b4d3d17918a256d31a4e6660505e16192f65f00","scripts":{"dev":"tsx watch src/index.ts","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"^1.6.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.2.0_1772687761679_0.6410784997639145","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@jokeran/frontend-code-skimmer","version":"0.2.2","_id":"@jokeran/frontend-code-skimmer@0.2.2","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"c4a70d70494cb1d1fe0840123d0ab549dc5810f7","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.2.2.tgz","fileCount":3,"integrity":"sha512-WjPUIRAfubrhKE/0qUC+utvSNhixKY7yYAC73ODHj1VTXgVS3F8ZtsmOTZsT52ATXy8ungQxgnnxeYonsGB0Hw==","signatures":[{"sig":"MEQCIAG47RaqlsWvS+XC0YK4rUzcBWD/5fSUkj4R2g0EOy7EAiBpHUfiXp1/p/ON5c+aJJr9PgZW0VYA5TMLqFR1h83KTw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":108728},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"7911bcc3eb5f86f72235b156c7b05536253c19bf","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"^1.6.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.2.2_1772766151503_0.07620846308810014","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@jokeran/frontend-code-skimmer","version":"0.2.3","_id":"@jokeran/frontend-code-skimmer@0.2.3","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"83cf41154995b5e33e13342115f98f0bae3418ba","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.2.3.tgz","fileCount":3,"integrity":"sha512-sy75DQhorEANh87OoRTe6xD8qSKwkxWFNb3Jssk9lBpdOxrUeM3cjszFWWjJHRyMUkIGo7LscgsH6HuULZwdtQ==","signatures":[{"sig":"MEUCIDd0JtG33xiOMcjeU1HMEnYxO+assUqx6ODsFoHrh7S4AiEA8hNehBTtn9UmjzC+2zbRAR4EA7ZTYDE8pHCj3+Hi/5Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114463},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"a46db8a48a30232ca53a7a3899a2215fa34f1e33","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.1","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"^1.6.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.2.3_1774237594218_0.811395937639289","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@jokeran/frontend-code-skimmer","version":"0.2.4","_id":"@jokeran/frontend-code-skimmer@0.2.4","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"4b15903db3107c7897b5909fc54da2f4d917a38b","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.2.4.tgz","fileCount":3,"integrity":"sha512-/SoDBIFfsR5CE+vXsE+xwLEzHH30vi9ZkoNZJANTRN9+wIkBnCH5bU1YHLyXjh8PnM3KGVoznKRohAPayGhmrg==","signatures":[{"sig":"MEUCIAsSCIXcIyonO2RwBxieIykqQBjdD+haVXPrlyil1EBEAiEA7clX3H0PmFx2yKRrAaKdwUpzHkCKCSbPFPgzefPJ03E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118686},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"407b8968d8f87a5cbefb24e41be5c429dc92d7f8","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.1","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"^1.6.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.2.4_1774255197698_0.772598040641091","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@jokeran/frontend-code-skimmer","version":"0.2.5","_id":"@jokeran/frontend-code-skimmer@0.2.5","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"c3dde5209fddebf57f9b1a21ed7f847ba07b8912","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.2.5.tgz","fileCount":3,"integrity":"sha512-APZU7b513zACCje/5qXQuhUZwfAndJfLDiuWk9zaiAuKinotnKdSaT2YnaZX3B4wB1egjlt4gMCOy6BTU8d/ow==","signatures":[{"sig":"MEYCIQDPkvn4XARP3b5AuwDJGCGW64qo8frp9/F+KLuQC0L9WAIhAKXEu/AQQbANwjURdyZtqCQE0xnOX6EPH329752pN6VB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":118976},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"1ddd1101c0026fa5a9e58448db1dfb13867d7c1a","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.1","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"^1.6.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.2.5_1775115235857_0.9799490050365796","host":"s3://npm-registry-packages-npm-production"}},"0.2.6":{"name":"@jokeran/frontend-code-skimmer","version":"0.2.6","_id":"@jokeran/frontend-code-skimmer@0.2.6","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"686d06bf1251be023ba9ffdbbfb846a72abb6235","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.2.6.tgz","fileCount":3,"integrity":"sha512-quME+vXs6tkf1bQJH6t8m6oI9nkm2h/rN1447opMmKUFfhlqf4DZT4S4snz2FfUx7vvPOW5FBDCY2IQYMVlxcg==","signatures":[{"sig":"MEYCIQCOCw6BkdejbfOQt20Nc8BQSLUbmVUu2aYAbmSxTRqrYwIhAMeOvp5KG4am8Fm4jbz8Ys7tKVcczdD+gqUxQ+MPLadQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":120270},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"fd3dca4d0689e6ed1fbd71a68fd836fd8f644002","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"^1.6.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.2.6_1776434212303_0.42767504633820663","host":"s3://npm-registry-packages-npm-production"}},"0.2.7":{"name":"@jokeran/frontend-code-skimmer","version":"0.2.7","_id":"@jokeran/frontend-code-skimmer@0.2.7","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"f5848f94c15c36d630932c9236bc937339d6f9af","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.2.7.tgz","fileCount":3,"integrity":"sha512-c9p6FSVmCX7iRKQOtTrze93b8Ka3e93puIzaVyJML1VUsbCcn29aP+CnJPOo9GGJVNUdWeI4DWtpH+8MEU9VPw==","signatures":[{"sig":"MEYCIQDfMbKOsa9gYCkFu31Wk1r+zunIk8n7zSZgP8JMEALaZgIhAN26Co0vh7/92LeoujK6gEWVBzYJkuTiiZ7rD7uZvZzq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":125647},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"84a143cfd140db3fc608db82f8c40688dd2dbd3b","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"^1.6.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.2.7_1776436515885_0.7059348455865784","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@jokeran/frontend-code-skimmer","version":"0.4.0","_id":"@jokeran/frontend-code-skimmer@0.4.0","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"7fa910bf8b52b010d3cbea7e4220e242d73238c1","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.4.0.tgz","fileCount":3,"integrity":"sha512-L4UgY2TFWTGJDDXh8gqcVcVo/XYQMZ4jfYZHsR3LHt9Ck7DmwFnki7REN4AfaZl52jUzGMT00/BUwWXCd9SIGg==","signatures":[{"sig":"MEYCIQD5EZLH2w/T4hsL3LSqtEnDlnXIXODnAlknUHRUPQzSmgIhAOuQumF1JLdqCcVzcGuvwqf12ytOW+G+mXl0Csev2O9Q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172068},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"afbc290c87420fae0a87e2c256e570f985c43b07","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"^1.6.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.4.0_1778868770119_0.060042494632716714","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@jokeran/frontend-code-skimmer","version":"0.4.1","_id":"@jokeran/frontend-code-skimmer@0.4.1","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"91113a4586d9117a3172eda8774d99cbdf55fdc3","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.4.1.tgz","fileCount":3,"integrity":"sha512-o6fQVqcs937TK0nuhdOeB1R1bkhTs2i5xYRRfwUoQnCE/AVRYsQ8xl17AHG/DyAJF8zsY/c97tAHziYP51udnw==","signatures":[{"sig":"MEUCIQCEom+Y27SuSgrjnkkxAa9zin7Hb49ImShTiU9BfK7AqgIgKiAbsLhEKlW3pW2ymAeaH5F5M4bnK5G1eJ947R+5PUM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":172068},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"866d8cd65a8794398944ba6361d8c5efa9a144c1","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.4.1_1778871012026_0.1152458564358041","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@jokeran/frontend-code-skimmer","version":"0.4.2","_id":"@jokeran/frontend-code-skimmer@0.4.2","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"6f850e2f98a35e509a06976e7ce139821b8754b5","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.4.2.tgz","fileCount":3,"integrity":"sha512-tb4QUj9wfRchBEvY14vTV5jaXDWO9wD1eOvXscbNGtf1l5ti2vrhPISyzWZ1ybsdzNzvnzuqB51uEshyi0tSgQ==","signatures":[{"sig":"MEQCIGHKbHxtfPrYVjVAFnuIKLbJzZU+deUO0336lXgf6euzAiA81NmSu8xEVENXuexF92jnIBfyUTLgel9muXSk0dhYag==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":189099},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"7ae0f8833a35fce7f050fe9fb6dcb3c2a520805d","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.4.2_1778907062981_0.4536760586470405","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@jokeran/frontend-code-skimmer","version":"0.4.3","_id":"@jokeran/frontend-code-skimmer@0.4.3","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"1fe29495241759f36d94533410288e8d8a0474a9","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.4.3.tgz","fileCount":3,"integrity":"sha512-W5CT0HjwUqExiHALtU0X0P4OxctW5P2kVlE4nxbovw2IbVeQevJm2iqK78pElQjL78ebypQLeDW8uUjSW2itCg==","signatures":[{"sig":"MEUCIQD7oQLOK8a2L6w/e6w8w6OEWWQpsaXbzE6WFDt43igW2AIgWh2S0BjBp2o5B1L+dVZospJbWvjOeILLcFLbCZXzzP8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":189148},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"5679ee7b95f414842858c6dd81c4b9207a870c31","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.4.3_1778907916806_0.720299262992216","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@jokeran/frontend-code-skimmer","version":"0.4.4","_id":"@jokeran/frontend-code-skimmer@0.4.4","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"d2cde42686089ac50fdbcf474e8041f85e7ca43d","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.4.4.tgz","fileCount":3,"integrity":"sha512-heOAtpL/9O0UFxunUE2G00+UofBFm/uWsRDDXgo0AP/lC+a+cytQCuKjn1Lj7Bxr3mFOAbKawKs9pJrabXb2Iw==","signatures":[{"sig":"MEUCIQDZ4/M21LkQt4NPE/Iqvkd6mjb0mXj7bFNlSIsdrc7XrAIgBv5juUP2s7sfue1PkYaUKfBgJc+Z2hAUDFA4b6u2mbo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192005},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"4e90652d0460aa919c4cd19c30a2c8a911f73114","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.4.4_1778911765050_0.24118955947827492","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@jokeran/frontend-code-skimmer","version":"0.4.5","_id":"@jokeran/frontend-code-skimmer@0.4.5","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"d06f67428cb8009a87de6a8ead70b83fe8939d82","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.4.5.tgz","fileCount":3,"integrity":"sha512-MjooWZdum7gE3ebmXOm2qWGOW/VEDP/jRG1ntlLal2Ms1A3uz/wFJgm2BzvxMalfK9mqmaAy3YuUrgTQJNzVkg==","signatures":[{"sig":"MEQCIFzwX1QTH6oFngqJ9uOeONctb+PXzZb7nR72Y7+16WNMAiAhdjptM0DLKV9i00bomaglWRLokrwXKjL74Z+C6dbf2g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":192003},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"498befc23037ae8c4d73ed0b95181f00f27f5a6d","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.4.5_1778912220119_0.5518431284192911","host":"s3://npm-registry-packages-npm-production"}},"0.4.6":{"name":"@jokeran/frontend-code-skimmer","version":"0.4.6","_id":"@jokeran/frontend-code-skimmer@0.4.6","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"efd3c717fb00d847b5fc5ed0b66ce05e5849a9a0","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.4.6.tgz","fileCount":3,"integrity":"sha512-/WXsOUt8eAIXtLtzS3XiWrHNlVPBc0J1y1hZHARk59Mxc8RU/VhjIIuJgBdWyVRiUy2dlaTinlnZKlxPrxGLIg==","signatures":[{"sig":"MEYCIQCVUnosXKYFCltvYk9ymMW73+Kxv5CbFb4uhim+NTVtTAIhANxOcBM+B7MhkWzW2H7zPWsNaRwaC2PHVwtPZJnEGXnK","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194401},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"ce021c03588f5dea0f5870d3d0bf87140623e901","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.4.6_1778932633802_0.5810715019614885","host":"s3://npm-registry-packages-npm-production"}},"0.4.7":{"name":"@jokeran/frontend-code-skimmer","version":"0.4.7","_id":"@jokeran/frontend-code-skimmer@0.4.7","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"7b75bb55c8f87cc360205d86434abc3c7873948a","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.4.7.tgz","fileCount":3,"integrity":"sha512-MT615i635KA7I7YAzLwF10vJ2F42veI8XzLSIUjTNcIlte6y+b37mKjx4InkAaKBqK2M406aiGY/yKHritazvQ==","signatures":[{"sig":"MEUCIQCbEHaWVj3XVJ4KCWkTEsxZG2kUCmRu7++/KNwLA0Z9yAIgK3+ej8csTGA5UVadPS/w2HyBRnMG8QmXvXnPOZqnYzo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":199159},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"02264caf58a66ef77014deaa8777dec3482af2bc","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.4.7_1778935823431_0.361690623929682","host":"s3://npm-registry-packages-npm-production"}},"0.4.8":{"name":"@jokeran/frontend-code-skimmer","version":"0.4.8","_id":"@jokeran/frontend-code-skimmer@0.4.8","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"a940908f16a30cba61d3da31ebc5e571967707c9","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.4.8.tgz","fileCount":3,"integrity":"sha512-kIYYKxfEiucD4uLdpoQe+0OjooFcgWtu5YXtm3vDBv/PEU2ih0xVYP47FbY71PvKY3h8fukTeXiUUazQSp5VkQ==","signatures":[{"sig":"MEUCIEqB+6BYbaxcyouJd55bkw+G2E0YigrqjrlaJJcGOdufAiEA/41SJuHK+nBCU8SZyf2Xq2m2TSnJZZkKwrYZI903lDg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201977},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"2f59547a963ede270cc228e8f475eb3e5f1470e1","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.8.2","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.4.8_1778938358187_0.4571114407115544","host":"s3://npm-registry-packages-npm-production"}},"0.4.9":{"name":"@jokeran/frontend-code-skimmer","version":"0.4.9","_id":"@jokeran/frontend-code-skimmer@0.4.9","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"a8cc779fdfcecf7ef9a064172f75b0319b3525c5","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.4.9.tgz","fileCount":3,"integrity":"sha512-G9lIjk//qhLZEcCEn0TGfEOYMFStlHNqrkOjDxqzHLb+U9POD3mQs1tqY6rjEmq1sr9i7mJYSc2IWco047aoRA==","signatures":[{"sig":"MEUCIQChs/+bXvtweYendpdzdd83UjR4PZVbBEWS9B9uTwyJFQIgBacrJ43CkjEnBadpPc+mZ7wMWHZfnE6AyiWqogUdFps=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":220264},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"7e41d19109ed9f97b0b2ccc6a6c23b388240cfea","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js","eval:snippet":"tsx scripts/run-snippet-eval.ts"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"10.9.3","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"22.20.0","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.4.9_1780394000432_0.3326568801007421","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@jokeran/frontend-code-skimmer","version":"0.5.1","_id":"@jokeran/frontend-code-skimmer@0.5.1","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"caf63ee35ac2fe2d5e5c24ff520e6e1ffd5a123f","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.5.1.tgz","fileCount":3,"integrity":"sha512-NTH8/n+c57bLqHytgw15iIN2gJEEEscL7RrmAVsa0bWDsqsjoTZVsDX2PizMu8X7UDhNK5rMoHBb7lKjqPWSTg==","signatures":[{"sig":"MEYCIQCj6Z/26aWsWLD6zw+sSDiTaG0mjtcmAgom2U8tYFs8bQIhAKO6+nmsy0zIwOChWYq2Yen9V0p8IXPqvbOh1yLXgxUQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":224226},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"6802f3af5dec823828b3f1a349b394fb587e9dc9","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js","eval:snippet":"tsx scripts/run-snippet-eval.ts"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"11.13.0","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"24.17.0","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.5.1_1782800824992_0.6757017698952406","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@jokeran/frontend-code-skimmer","version":"0.6.1","_id":"@jokeran/frontend-code-skimmer@0.6.1","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"e52a31f71bd8e48de7ccb0a987f574152f881e44","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.6.1.tgz","fileCount":3,"integrity":"sha512-rpa3sjLeaN2zhyiWCm/I2Jo1MljCOArCsDG0c2/J7T8Vr6fUg6EwlNJIT/+uB7gevHGO4sB/plu8tQYw9gBURQ==","signatures":[{"sig":"MEUCICnNGm5nD7BcDZJDwirCNTt9+8gJNjtSk2MTQW1qXPM6AiEA26DZ0t5LV789cPp6eF34roE0kfH7JP7E1ENuKyHp0V0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":240863},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"87ec7a360f37ad44959aa92d6dcd06bb206bbc78","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js","eval:snippet":"tsx scripts/run-snippet-eval.ts"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"11.16.0","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.6.1_1783401849636_0.4876423826938574","host":"s3://npm-registry-packages-npm-production"}},"0.6.91":{"name":"@jokeran/frontend-code-skimmer","version":"0.6.91","_id":"@jokeran/frontend-code-skimmer@0.6.91","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"119124795603088bd056dd75521fc1c5b7adbfec","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.6.91.tgz","fileCount":3,"integrity":"sha512-8WGXaBRBRbr/AExHCXj9tf+g2xBWn45Mnmm6zfKXswCy3k1BKtNS635ndCckY5uovQanfvQWzF26x0f9VaOHkw==","signatures":[{"sig":"MEUCIQCR3YEfZT1/s3z7nzxYFtG3z+m2I38f2v1A5n/KRo4liwIgLMTQk6WKKGiOL+KCvU7cvZPbQBJo11lbg6yfjPe/x4g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":252017},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"a821fdd9475e50fc83338fcf3840879d105b938f","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","clean":"rm -rf dist","start":"node dist/index.js","eval:snippet":"tsx scripts/run-snippet-eval.ts"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"_npmVersion":"11.16.0","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.23.8","acorn":"^8.12.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.0","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.0","vue-template-compiler":"^2.7.16","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.0.0","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.6.91_1783413080449_0.2936129239103995","host":"s3://npm-registry-packages-npm-production"}},"0.6.93":{"name":"@jokeran/frontend-code-skimmer","version":"0.6.93","_id":"@jokeran/frontend-code-skimmer@0.6.93","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"571ca713e6deaffd7aa9579c943620271ad0d679","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.6.93.tgz","fileCount":3,"integrity":"sha512-gWoidiFk49Da+uMKKbUunTCyDpIq4TVM8SZuG3RX6GbtKJmKatSkVngyK67pHO2PuucTiIZ/PJtLN1Lhgvy2KA==","signatures":[{"sig":"MEQCICbWGMBakfdUBA/pQ17qnUh2kXjRHFHF/4Gxae48R/URAiBdD5LgpCzwq0GfmnHUF2xgg75ted1EW/g06SZnyMBXlQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":256968},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"f652db6b7ace940483686779e34356f3a13fbe03","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","check":"npm run typecheck && npm test && npm run build","clean":"rm -rf dist","start":"node dist/index.js","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","eval:snippet":"tsx scripts/run-snippet-eval.ts"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"overrides":{"qs":"^6.15.2","hono":"^4.12.25"},"_npmVersion":"11.16.0","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^3.23.8","acorn":"^8.17.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.7","better-sqlite3":"^11.0.0","@vue/compiler-sfc":"^3.5.39","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.0","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.20.1","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.6.93_1783673550451_0.9205425545012236","host":"s3://npm-registry-packages-npm-production"}},"0.6.97":{"name":"@jokeran/frontend-code-skimmer","version":"0.6.97","_id":"@jokeran/frontend-code-skimmer@0.6.97","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"1077314538809085213b99d6c7b4ad7ab095b13e","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.6.97.tgz","fileCount":3,"integrity":"sha512-ZCKpSfZgyp7SfjI5VEfdlk4PQuBx/PM2jhDOJeIAEra+bF/M16EABDDZuJyZagNTQc17ZQ20rtHpDBV4ZvJhqA==","signatures":[{"sig":"MEUCICczjVZSI7l/QV+0VK8KS6wLZCril85HV3EWOfCZx2IgAiEA7a5gggNXVaCpCf3gWv6Y1Rinu4N8PuoxhzQa8QasvGA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":268184},"main":"dist/index.js","type":"module","engines":{"node":">=18"},"gitHead":"f2055f20b1cfb634676503dcd39fa1f57a346a71","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","check":"npm run typecheck && npm test && npm run build","clean":"rm -rf dist","start":"node dist/index.js","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","eval:snippet":"tsx scripts/run-snippet-eval.ts"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"overrides":{"qs":"^6.15.2","hono":"^4.12.25"},"_npmVersion":"11.17.0","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"24.19.0","allowScripts":{"esbuild@0.27.7":true,"esbuild@0.28.1":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^3.23.8","acorn":"^8.17.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.7","better-sqlite3":"^12.11.1","@vue/compiler-sfc":"^3.5.39","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.0","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.20.1","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.6.97_1787109513992_0.3769085460343322","host":"s3://npm-registry-packages-npm-production"}},"0.6.98":{"name":"@jokeran/frontend-code-skimmer","version":"0.6.98","_id":"@jokeran/frontend-code-skimmer@0.6.98","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"f0f760fa37732ea4a40bd0180364791a5fd51e24","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.6.98.tgz","fileCount":3,"integrity":"sha512-nRP/dEl1qoYO76ZDP+Kwj1rT3276eUJYB4wEbkCKGpDUnBgZGtbd6uDXv5DSFbrvZtjREGE3JK9ccJA1++QDqg==","signatures":[{"sig":"MEUCIQDRBIZQX8Ue4L5hrMHjGWxySlHk9GDPfCYAN5VAba80uQIgU/62johiQUc2pyC+seYo+kfHFcBZd/DBYXyRgyqdVtg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":287598},"main":"dist/index.js","type":"module","engines":{"node":">=22"},"gitHead":"b39d25d7237c28d1b6f35ef9a6d4b8c5bdb69328","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","check":"npm run typecheck && npm test && npm run build","clean":"rm -rf dist","start":"node dist/index.js","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","eval:snippet":"tsx scripts/run-snippet-eval.ts"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"overrides":{"qs":"^6.15.2","hono":"^4.12.25"},"_npmVersion":"11.17.0","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"24.19.0","allowScripts":{"esbuild@0.27.7":true,"esbuild@0.28.1":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^3.23.8","acorn":"^8.17.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.7","better-sqlite3":"^13.0.3","@vue/compiler-sfc":"^3.5.39","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.0","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.20.1","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.6.98_1787213542585_0.03160166577348544","host":"s3://npm-registry-packages-npm-production"}},"0.6.99":{"name":"@jokeran/frontend-code-skimmer","version":"0.6.99","_id":"@jokeran/frontend-code-skimmer@0.6.99","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"4518f1324edd9e7092f4106b5a0abc579e47577b","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.6.99.tgz","fileCount":3,"integrity":"sha512-/zruWBj47ZStCtsl30LkAtK4cp2rVLnbmDevz5KtnA8/VvE7EFymPxNlBHq+xvaqauW387YoP/2yNUwZBn8aEA==","signatures":[{"sig":"MEUCIQCzchA5mVa1Ij30A+8pXM0YAH5iHl1TsNOjX96IxrHYQgIgd+8uujjrHs5sRMooWe8eUed5GBA+fgyxCY3MmJ9aY+I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":287995},"main":"dist/index.js","type":"module","engines":{"node":">=22"},"gitHead":"43af904bd37ce33f2c116d5c03df056d2457ef1f","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","check":"npm run typecheck && npm test && npm run build","clean":"rm -rf dist","start":"node dist/index.js","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","eval:snippet":"tsx scripts/run-snippet-eval.ts"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"overrides":{"qs":"^6.15.2","hono":"^4.12.25"},"_npmVersion":"11.17.0","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"24.19.0","allowScripts":{"esbuild@0.27.7":true,"esbuild@0.28.1":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^3.23.8","acorn":"^8.17.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.7","better-sqlite3":"^13.0.3","@vue/compiler-sfc":"^3.5.39","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.0","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.20.1","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.6.99_1787218477669_0.5645882742077022","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@jokeran/frontend-code-skimmer","version":"0.7.0","_id":"@jokeran/frontend-code-skimmer@0.7.0","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"b4e9c06dfbba2981ae9d2bd1be921b83a3134665","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.7.0.tgz","fileCount":3,"integrity":"sha512-JZPRM5mhrOeidO1pd/nqG+z+lvbKDZhE9fizhJ7+rY5q0rRhGwlXRiOkBU194RZyN0od8zEV1o59/a9UdQaCZA==","signatures":[{"sig":"MEUCIH8cWj+RyyRFXDF3B909AXxJwhzCDmwEjU3ySOF4HiQjAiEAr13aWQhX2RoLisrZ2Dx8Kth7iF1nlmyBvajy8LlbVys=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":288035},"main":"dist/index.js","type":"module","engines":{"node":">=22"},"gitHead":"8d9fc73e9d90bb4f828737863a330c6d08903942","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","check":"npm run typecheck && npm test && npm run build","clean":"rm -rf dist","start":"node dist/index.js","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","eval:snippet":"tsx scripts/run-snippet-eval.ts"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"overrides":{"qs":"^6.15.2","hono":"^4.12.25"},"_npmVersion":"11.17.0","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"24.19.0","allowScripts":{"esbuild@0.27.7":true,"esbuild@0.28.1":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^3.23.8","acorn":"^8.17.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.7","better-sqlite3":"^13.0.3","@vue/compiler-sfc":"^3.5.39","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.0","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.20.1","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.7.0_1787222018137_0.7452697666534647","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@jokeran/frontend-code-skimmer","version":"0.7.1","_id":"@jokeran/frontend-code-skimmer@0.7.1","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"d9b4ba2d5892a0e81bace7f0236be16882d0d109","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.7.1.tgz","fileCount":3,"integrity":"sha512-2Q2MVgBXUAz0VB6LIAnwjfne2rDvzngGN1HI8FCqFuabuiZiyxFFHqKpJCdrUutfTK6Uqi0MS2PTlh8IxhpIdg==","signatures":[{"sig":"MEYCIQCPWUJW1ZI0Xob7bS9jmwLRPuXRYBuMHarDznHH19TQXgIhAOpBXifnUPGXT72AuGuwNYDd1azlJFQf6U5jAz9CFLy+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":291048},"main":"dist/index.js","type":"module","engines":{"node":">=22"},"gitHead":"dc19878ea4e8f550ffbe888d62273ab2c6f72e68","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","check":"npm run typecheck && npm test && npm run build","clean":"rm -rf dist","start":"node dist/index.js","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","eval:snippet":"tsx scripts/run-snippet-eval.ts"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"overrides":{"qs":"^6.15.2","hono":"^4.12.25"},"_npmVersion":"11.17.0","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"24.19.0","allowScripts":{"esbuild@0.27.7":true,"esbuild@0.28.1":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^3.23.8","acorn":"^8.17.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.7","better-sqlite3":"^13.0.3","@vue/compiler-sfc":"^3.5.39","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.0","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.20.1","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.7.1_1787653930625_0.5139682070886855","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"@jokeran/frontend-code-skimmer","version":"0.7.2","_id":"@jokeran/frontend-code-skimmer@0.7.2","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"e03fa2598614690e78792dc36bfb3c0b7d1d8010","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.7.2.tgz","fileCount":3,"integrity":"sha512-0+MMeAGe8XwppS/ovNSW3SP0Jp+VMblv5w2XbUlguMyiN0B3JUkAFb7/k7iyllV4oPR7aNtmwub8fn2vWlzy1A==","signatures":[{"sig":"MEQCIBUbrBCvL3T4NQUYeyWW9b6+jqwQsWWMETceDSMm5fcrAiA6yMPqG3lOQI/2BECRRm8v6MHHlZvr5BMEivZF+BLpDg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":292116},"main":"dist/index.js","type":"module","engines":{"node":">=22"},"gitHead":"be6fe881d019ae162c34ef434f7b8c803f95fe07","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","check":"npm run typecheck && npm test && npm run build","clean":"rm -rf dist","start":"node dist/index.js","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","eval:snippet":"tsx scripts/run-snippet-eval.ts"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"overrides":{"qs":"^6.15.2","hono":"^4.12.25"},"_npmVersion":"11.17.0","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"24.19.0","allowScripts":{"esbuild@0.27.7":true,"esbuild@0.28.1":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^3.23.8","acorn":"^8.17.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.7","better-sqlite3":"^13.0.3","@vue/compiler-sfc":"^3.5.39","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.0","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.20.1","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.7.2_1787655108265_0.4840952853514593","host":"s3://npm-registry-packages-npm-production"}},"0.7.3":{"name":"@jokeran/frontend-code-skimmer","version":"0.7.3","_id":"@jokeran/frontend-code-skimmer@0.7.3","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"2574c367228d2ec9b4604167d481be7b5aed42bc","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.7.3.tgz","fileCount":3,"integrity":"sha512-gbqcPzKeDe4uPwdLyab04Qo77xq3RgyIlEo5Jq43qlY9odpOzQPF9N8XENTc45W1ENRk3huULkALS1EPFqv7mw==","signatures":[{"sig":"MEUCIE72wXYBNHRO7aDOn3fCVcZFt8qX74jjR/PWjjWj+WUlAiEAqCfALd8P4mCboKusJfrCoFqsnToBZkHwfWTvDq1w6FI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":293258},"main":"dist/index.js","type":"module","engines":{"node":">=22"},"gitHead":"55f92ed1d2f796e50e60ae016a5a16c8072f37e3","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","check":"npm run typecheck && npm test && npm run build","clean":"rm -rf dist","start":"node dist/index.js","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","eval:snippet":"tsx scripts/run-snippet-eval.ts"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"overrides":{"qs":"^6.15.2","hono":"^4.12.25"},"_npmVersion":"11.19.0","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"24.20.0","allowScripts":{"esbuild@0.27.7":true,"esbuild@0.28.1":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^3.23.8","acorn":"^8.17.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.7","better-sqlite3":"^13.0.3","@vue/compiler-sfc":"^3.5.39","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.0","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.20.1","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.7.3_1788535889616_0.12585896238374983","host":"s3://npm-registry-packages-npm-production"}},"0.7.4":{"name":"@jokeran/frontend-code-skimmer","version":"0.7.4","_id":"@jokeran/frontend-code-skimmer@0.7.4","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"678793ed892110c62bf33dbfe6660c724d487a8d","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.7.4.tgz","fileCount":3,"integrity":"sha512-KrtM4HzQ25uuMUg5KSDiEYhrKpzzg4KF+f+kfD6O3xBU0rX4VdSgFC9oFkNy5SfHZ6TI+7nZAl7iQsX7pgOsiQ==","signatures":[{"sig":"MEUCIA0frbDhzt/CKeLlkewZQ5qJRrEl592DePcjxMKHoTUZAiEAoxwKABefU1lWlOH1LXUuiNbW1i+pfkyNb9UV8eKx1K0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":300964},"main":"dist/index.js","type":"module","engines":{"node":">=22"},"gitHead":"c2d65f351c1dda99de96687b32fff2076e73f884","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","check":"npm run typecheck && npm test && npm run build","clean":"rm -rf dist","start":"node dist/index.js","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","eval:snippet":"tsx scripts/run-snippet-eval.ts"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"overrides":{"qs":"^6.15.2","hono":"^4.12.25"},"_npmVersion":"11.19.0","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"24.20.0","allowScripts":{"esbuild@0.27.7":true,"esbuild@0.28.1":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^3.23.8","acorn":"^8.17.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.7","better-sqlite3":"^13.0.3","@vue/compiler-sfc":"^3.5.39","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.0","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.20.1","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.7.4_1788951190035_0.46954525230367206","host":"s3://npm-registry-packages-npm-production"}},"0.7.5":{"name":"@jokeran/frontend-code-skimmer","version":"0.7.5","_id":"@jokeran/frontend-code-skimmer@0.7.5","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"5f2e522067e4261610b56b77b75b22acb4c4134c","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.7.5.tgz","fileCount":3,"integrity":"sha512-C3GSww1JxVbGl8dzVGGQQW+TIj7XrStcLzVVAHvqCK61SDPC38L55X7QszBwI7gHOGoUcbQBPhhkK8kvOv1qjA==","signatures":[{"sig":"MEYCIQDJatpxdtrNyc4YgZdOqMKLjHiFgsEx7V91mVIrGF8UxQIhALVPCPJFSm0X4JfMSTFoxTtyx9mzlcvEu8okkMoGsV1N","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":315538},"main":"dist/index.js","type":"module","engines":{"node":">=22"},"gitHead":"c6abeb5af867bcbb81c9f4363dfe528e6529e172","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","check":"npm run typecheck && npm test && npm run build","clean":"rm -rf dist","start":"node dist/index.js","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","eval:snippet":"tsx scripts/run-snippet-eval.ts"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"overrides":{"qs":"^6.15.2","hono":"^4.12.25"},"_npmVersion":"11.19.0","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"24.20.0","allowScripts":{"esbuild@0.27.7":true,"esbuild@0.28.1":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^3.23.8","acorn":"^8.17.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.7","better-sqlite3":"^13.0.3","@vue/compiler-sfc":"^3.5.39","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.0","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.20.1","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.7.5_1788967349577_0.555505834207753","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@jokeran/frontend-code-skimmer","version":"0.8.0","_id":"@jokeran/frontend-code-skimmer@0.8.0","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"bin":{"frontend-code-skimmer":"dist/index.js"},"dist":{"shasum":"a237f8a93b0332a01a5de8ca71af865110add774","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.8.0.tgz","fileCount":3,"integrity":"sha512-kD1LnCKvlF857a/iCMCIGg2FAyFeradEPEepifjfdXjvOQUH2Q5KmQg/wYoLMFhSkMzQit4iDSKk92jvCi/KrA==","signatures":[{"sig":"MEUCIH8n9Xf9pfKVmbKWVpYih6nXNO2NrkVtQETwnR+0jwrMAiEAl/KnvA9Gzl+b6gxZiTwlve985IRLMQsXPZt9s+W7370=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":336395},"main":"dist/index.js","type":"module","engines":{"node":">=22"},"gitHead":"fb8fdcdc00f9591b082f89e1ab352516b1f278b1","scripts":{"dev":"tsx watch src/index.ts","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","build":"tsup","check":"npm run typecheck && npm test && npm run build","clean":"rm -rf dist","start":"node dist/index.js","prepack":"npm run clean && npm run build","typecheck":"tsc --noEmit","eval:snippet":"tsx scripts/run-snippet-eval.ts"},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"overrides":{"qs":"^6.15.2","hono":"^4.12.25"},"_npmVersion":"11.19.0","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","directories":{},"_nodeVersion":"24.20.0","allowScripts":{"esbuild@0.27.7":true,"esbuild@0.28.1":true,"fsevents@2.3.3":true},"dependencies":{"zod":"^3.23.8","acorn":"^8.17.0","chokidar":"^4.0.0","acorn-jsx":"^5.3.2","fast-glob":"^3.3.0","acorn-walk":"^8.3.0","@babel/parser":"^7.29.7","better-sqlite3":"^13.0.3","@vue/compiler-sfc":"^3.5.39","@modelcontextprotocol/sdk":"~1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.0","tsup":"^8.5.1","typescript":"^5.7.2","@types/node":"^22.20.1","@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0"},"_npmOperationalInternal":{"tmp":"tmp/frontend-code-skimmer_0.8.0_1789002275646_0.6987411746610774","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@jokeran/frontend-code-skimmer","version":"0.8.1","description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","publishConfig":{"registry":"https://registry.npmjs.org/","access":"public"},"type":"module","main":"dist/index.js","bin":{"frontend-code-skimmer":"dist/index.js"},"scripts":{"build":"tsup","dev":"tsx watch src/index.ts","start":"node dist/index.js","clean":"rm -rf dist","test":"tsc -p tsconfig.test.json && node --test .tmp-test/tests/*.test.js","eval:snippet":"tsx scripts/run-snippet-eval.ts","typecheck":"tsc --noEmit","check":"npm run typecheck && npm test && npm run build","prepack":"npm run clean && npm run build"},"engines":{"node":">=22"},"dependencies":{"@babel/parser":"^7.29.7","@modelcontextprotocol/sdk":"~1.29.0","@vue/compiler-sfc":"^3.5.39","acorn":"^8.17.0","acorn-jsx":"^5.3.2","acorn-walk":"^8.3.0","better-sqlite3":"^13.0.3","chokidar":"^4.0.0","fast-glob":"^3.3.0","zod":"^3.23.8"},"devDependencies":{"@types/acorn":"^4.0.6","@types/better-sqlite3":"^7.6.0","@types/node":"^22.20.1","tsup":"^8.5.1","tsx":"^4.23.0","typescript":"^5.7.2"},"overrides":{"hono":"^4.12.25","qs":"^6.15.2"},"allowScripts":{"esbuild@0.27.7":true,"esbuild@0.28.1":true,"fsevents@2.3.3":true},"gitHead":"111032b3a6139b9abe32d9e780dc0fde0e8b6cef","_id":"@jokeran/frontend-code-skimmer@0.8.1","_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-TPVKkHpOLzJHPGA79VBc7aHFoyjI24KcBQiHWI0o6UwpVjAIQjve3+9AbYNy+nGEFy9dI1Cmebg0jLW701OS6A==","shasum":"8d5ecce83cab4f2a8cb36bed07d92d2bdd58b6c9","tarball":"https://registry.npmjs.org/@jokeran/frontend-code-skimmer/-/frontend-code-skimmer-0.8.1.tgz","fileCount":3,"unpackedSize":344667,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDsySOLrMIJOLyKVYe7dVmiuWrHRelEE4WkaRNDtAhlTwIhAJJ0rvyMpntep1B1GnIqfnOjK1EtDLkgmhWhomZn4c3B"}]},"_npmUser":{"name":"jokeran","email":"divfooter@163.com"},"directories":{},"maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/frontend-code-skimmer_0.8.1_1789020019992_0.9605543051289736"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-05T03:51:46.926Z","modified":"2026-09-10T06:00:21.110Z","0.1.6":"2026-03-05T03:51:47.281Z","0.1.7":"2026-03-05T04:40:21.618Z","0.1.9":"2026-03-05T04:52:45.373Z","0.2.0":"2026-03-05T05:16:01.840Z","0.2.2":"2026-03-06T03:02:31.657Z","0.2.3":"2026-03-23T03:46:34.352Z","0.2.4":"2026-03-23T08:39:57.842Z","0.2.5":"2026-04-02T07:33:56.003Z","0.2.6":"2026-04-17T13:56:52.444Z","0.2.7":"2026-04-17T14:35:16.065Z","0.4.0":"2026-05-15T18:12:50.312Z","0.4.1":"2026-05-15T18:50:12.165Z","0.4.2":"2026-05-16T04:51:03.131Z","0.4.3":"2026-05-16T05:05:16.969Z","0.4.4":"2026-05-16T06:09:25.207Z","0.4.5":"2026-05-16T06:17:00.276Z","0.4.6":"2026-05-16T11:57:13.953Z","0.4.7":"2026-05-16T12:50:23.617Z","0.4.8":"2026-05-16T13:32:38.325Z","0.4.9":"2026-06-02T09:53:20.569Z","0.5.1":"2026-06-30T06:27:05.128Z","0.6.1":"2026-07-07T05:24:09.795Z","0.6.91":"2026-07-07T08:31:20.675Z","0.6.93":"2026-07-10T08:52:30.599Z","0.6.97":"2026-08-19T03:18:34.120Z","0.6.98":"2026-08-20T08:12:22.729Z","0.6.99":"2026-08-20T09:34:37.802Z","0.7.0":"2026-08-20T10:33:38.300Z","0.7.1":"2026-08-25T10:32:10.750Z","0.7.2":"2026-08-25T10:51:48.423Z","0.7.3":"2026-09-04T15:31:29.748Z","0.7.4":"2026-09-09T10:53:10.164Z","0.7.5":"2026-09-09T15:22:29.706Z","0.8.0":"2026-09-10T01:04:35.796Z","0.8.1":"2026-09-10T06:00:20.140Z"},"description":"Frontend-Code-Skimmer: 不读全文，只看骨架；不搜字符，搜语义关联。支持 Vue2/Vue3/React Hooks","maintainers":[{"name":"jokeran","email":"divfooter@163.com"}],"readme":"# Frontend-Code-Skimmer MCP\n\n> 不读全文，只看骨架；不搜字符，搜语义关联。\n\nAI 代码助手的智能代码索引引擎，面向 **Vue 2 / Vue 3 / React / 纯 TS/JS 工具模块** 的结构化检索与影响分析场景。\n\n当前版本的能力重点：\n\n- `skimmer_query` 作为**唯一推荐入口**：一句自然语言后端自动分派多路并行查询，一次返回符号/片段/调用链/行为/影响/数据流全貌\n- 来源类问题会区分**直接赋值/缓存读取、后端字段初始化、下游属性修改**，避免把所有关联接口都解释成“原始来源”\n- 同一方法甚至同一行出现多次同名请求调用时，会结合赋值片段和 endpoint 精确绑定当前调用点\n- 支持 Vue 2、Vue 3、React 组件/模块索引\n- `precision_mode=\"precise\"` 支持 **JS / JSX / TS / TSX** 的跨文件 import/export 精确绑定\n- 对 **纯 TS/JS 工具类模块** 提供基础符号提取（class / method / function / constant）\n- `skimmer_index_health` 可显示**真实失败文件与错误信息**，便于排障\n- `skimmer_search_snippets` 已支持 **query intent 分类 + snippet-first 排序 + 业务文件优先**\n\n## 解决什么问题？\n\n- **一次问全貌，少绕圈子**：`skimmer_query` 用一句自然语言聚合多维度，命中即自足返回（top-1 内联源码、附一层调用链），避免\"查符号→看代码→看调用方\"逐跳追加调用\n- **7000 行大文件**：`skimmer_get_component_outline` 将其压缩为 60 行骨架，节省 95% Token\n- **自然语言第一跳太吵**：`skimmer_search_snippets` 直接返回高相关代码片段，避免先猜函数名再二跳读文件\n- **API 查询先落到 util 包装层**：`skimmer_search_snippets` 会优先抬升 `views/pages/features` 等业务实现，压低 `config/utils/helpers` 这类通用封装\n- **函数名拼写错误**：搜 `changeCash` 能找到 `changeCashValue`，自动提示 \"cash 可能是 cache 的拼写错误\"；低分弱匹配（默认 <78%）自动折叠，不刷屏\n- **不知道函数名**：`skimmer_find_by_behavior` 按行为搜索，搜 `storage` 直接列出所有操作 localStorage 的函数\n- **同名函数串台**：`skimmer_find_symbol` / `skimmer_find_by_behavior` / `skimmer_get_call_graph` 支持 `file_path` 过滤\n- **修改前评估影响**：`skimmer_get_blast_radius` 告诉你改一个函数会影响哪些地方\n- **变量数据流追踪**：`skimmer_trace_data_lifecycle` 一次聚合声明、属性修改、参数传递、读取引用、Storage 落点 5 个维度；对 `const x = this.getXxx()` 这类赋值自动解析来源函数的行为标签（如缓存回显 → localStorage.getItem）\n- **原始来源不混淆**：查询“某变量从哪个接口/缓存获取原始值”时，优先给出直接赋值或缓存读取，再补充后端字段初始化接口；对象别名传播后的下游请求不直接当作原始来源\n- **常见局部别名不串链**：`params`、`storP` 等对象别名按方法作用域隔离，减少跨方法同名变量污染\n- **Vue 证据行号可直接定位**：行为证据统一使用整个 `.vue` SFC 的真实文件行号，可直接交给 Read 或代码切片工具\n- **模板事件不断链**：`@click` / `@initReceiveAdr` 等 Vue 模板事件、React `onXxx` JSX 事件都作为调用边入库，`skimmer_get_call_graph` 能查到\"模板事件 → 方法\"这一跳（🖼️ / ⚛️ 标记）\n- **索引过期行号偏移**：`skimmer_get_component_outline` 和 `skimmer_get_code_slice` 会自动检测索引是否过期并给出警告\n- **纯 TS/JS 工具类模块也能审**：支持提取 class、method、top-level function、const，适合 parser / indexer / cache / CLI / MCP 工具模块\n- **跨文件 import 关系误判少**：precise 模式会识别本地 shadowing，import 名在局部作用域被参数/变量遮蔽时不会误标为精确边\n- **索引坏了怎么查**：`skimmer_index_health` 可直接看到失败文件数量、最近失败文件和错误摘要\n\n## 12 个 MCP 工具\n\n| 工具                             | 用途                                         |\n| -------------------------------- | -------------------------------------------- |\n| `skimmer_query`                  | 🚀 唯一推荐入口：自然语言智能查询；来源类问题区分直接来源、后端初始化与下游修改 |\n| `skimmer_index_project`          | 初始化/更新代码索引（支持 `force: true` 全量重建） |\n| `skimmer_get_component_outline`  | 获取文件骨架（极致 Token 节省，自动检测索引过期） |\n| `skimmer_find_symbol`            | 智能符号搜索（精确 → FTS5 → Levenshtein 三层，top-1 内联源码） |\n| `skimmer_search_snippets`        | 代码片段搜索（snippet-first，适合自然语言第一跳） |\n| `skimmer_get_code_slice`         | 精准代码切片（只取一个函数，自动检测行号偏移） |\n| `skimmer_find_by_behavior`       | 按行为标签搜索（绕过命名问题）               |\n| `skimmer_trace_data_lifecycle`   | 变量完整生命周期追踪（聚合 5 维度、作用域消歧、精确绑定请求调用点） |\n| `skimmer_get_call_graph`         | 函数调用关系图谱（支持 callers / callees / both） |\n| `skimmer_get_blast_radius`       | 修改影响范围评估                             |\n| `skimmer_index_health`           | 索引健康检查（索引文件/符号/关系/行为、失败文件、watcher、DB 大小） |\n| `skimmer_get_project_overview`   | 项目整体概览（文件数、符号数、框架分布）     |\n\n## 最近增强 / 稳定性说明\n\n- **组件使用关系入索引 —— React JSX / Vue 模板（v0.8.0）**：\n  - `<Button />`、`<Form.Item />`（React）与 `<pagination />`、`<el-button />`（Vue 模板）现在都是 `component_render` 关系，`skimmer_get_blast_radius` / `skimmer_get_call_graph` 在组件类符号上不再大面积空结果（展示层标 🧩 组件渲染）\n  - 归因规则：`<Form.Item />` 归到根对象 `Form`（它才是被 import 进来的名字）；组件内定义的 `function Inner(){}` / `const renderItem = () => {}` 各自的 JSX 归它们自己，匿名回调（`items.map(i => <Row />)`）归外层组件\n  - Vue 模板扫描前先剥离 HTML 注释、属性值与插值 → 注释掉的组件、`:tip=\"'<el-button>'\"` 这类字符串不会误入关系\n  - 实测：ant-design 关系 8781 → **13671**（精确边占比 18.7% → **40%**，call_graph 空结果 37.5% → **30%**）；shadcn/ui 关系 10725 → **71850**（精确边 12.5% → **53.6%**）；vue2-admin 的 `<Pagination />` 可查到精确调用方\n- **行为语义扩展到现代前端生态（v0.8.0）**：\n  - 行为类别 **8 → 18**（新增 `state` / `effect` / `memo` / `ref` / `context` / `store` / `data` / `form` / `realtime` / `worker`），覆盖 `useState` / `useEffect` / `useMemo` / `useRef` / `useContext` / `useSelector` / `useQuery` / `useMutation` / `useForm` / `useI18n` 等；`React.useState(...)` 命名空间式调用同样识别\n  - `find_by_behavior` 的 `keyword` 现在同时匹配参数值 / API 名 / **符号名**，可直接搜业务词\n  - 实测行为覆盖率：react-hook-form 3.8% → **48.3%**｜ant-design 5.0% → **31.9%**｜shadcn/ui 3.1% → **20.7%**\n- **精确度：barrel 再导出链 + 符号表校验（v0.8.0）**：\n  - `export { X } from './y'` / `export * from './y'` / `export { default as X } from './y'` 会顺着链落到**真正的定义文件**（最多 8 层，带去环），不再指向空壳 `index.ts`\n  - 精确提示只写向真实存在的符号：追不到目标就保留原值（宁可不命中，不伪造）\n  - 实测 ant-design 提示命中率 74.5% → **87.5%**（`nameMismatch` 69 → **0**）；shadcn/ui 97.5%\n- **Vue 2 覆盖补齐（v0.8.0）**：\n  - 普通 `.js / .ts` 里的 **mixin / 自定义指令 / 插件**（`export default { bind(){} }`、`install(Vue){}`）不再 0 符号，新增 `directive` 类别\n  - SFC 的 `export default { name: 'Pagination' }` 映射为**真实组件符号名**（否则精确提示停在 `::default`）；`<script>` 顶层函数/常量入索引\n  - Babel AST 的 `StringLiteral` 全面支持：组件名、数组式 `props: ['value']`、`'kebab-case': fn` 字符串键选项\n- **影响面与索引可观测性（v0.8.0）**：\n  - `blast_radius` 区分「📤 导出符号（仓库内无调用者属正常）」与「真无人用」，并把影响面拆成「M 处调用 + K 处组件渲染」\n  - 新增 `max_affected_files`（默认 200）控制 precise 反向依赖扩散上限，截断时明确提示（此前逐文件写 stderr，ant-design 上 674 条刷屏）\n  - 索引阶段计时区分**墙钟**（`filesPhaseMs`）与**并发累计**（`readFilesMs/parseMs/saveToDbMs`），不再出现「累计 > 总耗时」的困惑；`behaviorSearch` 上限 200 可配并提示截断\n- **查询性能（v0.8.0）**：自然语言长句不再触发 Levenshtein 模糊匹配（实测占 `search()` 总耗时 92% 且命中恒为 0）→ TanStack Query 上 `skimmer_query` 23.2ms → **3.6ms**\n- **升级注意（v0.8.0）**：新增 migration **v18** 持久化 `symbols.is_exported`，升级后会把文件指纹置空 → **老库下次索引会全量重解析一次**（ant-design 约 32s，属预期）；大型 monorepo 建议调大 `max_affected_files`\n- **React Hooks 数据流与写入链路升级（v0.7.5）**：\n  - **useState setter 入符号索引**：`const [payData, payDataSet] = useState({})` 现在会额外产出 `payDataSet [state_setter/react]` 符号（`symbols.state_name` 记录它写入的 state，migration v17）。此前 setter 完全不进符号表，`skimmer_find_symbol(\"payDataSet\")` 只能靠 FTS5 前缀匹配到 `payData`\n  - **state_write 写入口**：新增 `state_write` 关系（handler/effect → state），`skimmer_trace_data_lifecycle` 的「② 属性修改」现在会列出 `payDataSet(...)` 调用点；`skimmer_get_call_graph(\"payDataSet\")` 可反查调用者\n  - **Promise 回调归因**：`extractCallbackFunctionCalls` / `extractCallbackBehaviors` 改为递归收集任意位置的匿名回调（IIFE、`new Promise`、回调内再套 Promise），修复 `.then((res) => setX(res.data))` 类写入口漏检\n  - **data_flow 形态补齐**：新增成员调用（`await api.getData()`）、对象/数组解构、可选链与 `??` 兜底、Promise 回调写入；过滤 `useState`/`map`/`filter` 等噪声。真实项目数据流覆盖率 53.8% → **79.7%**\n  - **请求封装识别统一**：`network-wrappers.ts` 由 React/Vue2/Vue3/工具类解析器共用；`post(url)` 这类变量实参保留，仅排除「字面量且不像路径」的 `get('key')`\n  - **误报收敛**：`<Form onFinish={handleSubmit} />` 这类「引用 handler」不再把组件染成 `wrapped_network`；声明初始化归入「🌱 初始化来源」而非「❓ 未知来源」\n  - **JSX 内联 handler**：`onClick={() => payDataSet(x)}` 的调用与写入口也会归因到组件\n- **tsconfig paths 别名真解析 + 索引健康度升级（v0.7.04）**：\n  - precise 模式现在会读取「最近祖先」`tsconfig.json` / `jsconfig.json` 的 `compilerOptions.baseUrl` + `paths`，支持精确映射、通配符（如 `@components/*`）、`extends` 继承链（含省略 `.json` 的写法和 `<包名>/tsconfig.json`）\n  - **不再“谎报精确”**：解析不到本地文件的 import（未映射别名、node_modules 裸模块）一律保留 heuristic，不再生成指向不存在文件的 precise 提示\n  - 遇到 `package.json` / `.git` 项目边界即停止向上查找，嵌套子项目不会误用父项目 paths\n  - 配置解析带 10s TTL 缓存，改了 tsconfig 重新索引即可生效；别名解析走缓存，裸模块解析实测约 2.4µs/次\n  - `skimmer_index_health` 新增**分维度解析覆盖率**（符号/调用关系/行为/数据流 × 有产出文件占比）、precise / heuristic 边数、precise 待处理数\n  - ⚠️ 行为变化：外部库/未解析别名不再计入 precise，precise 边数会下降；首次重新索引因 import 签名变化可能触发一次较多文件重算\n- **文件监听自愈 + 关闭安全（v0.7.0）**：\n  - watcher 遇到 `error`（EMFILE / 权限抖动 / 临时文件竞态等瞬时故障）不再永久钉死在 `errored`，而是**线性退避自动重建**（`WATCH_RESTART_DELAY_MS=2000ms × 尝试次数`，上限 5 次），重建成功即恢复 `running`\n  - 每个 watcher 实例带**世代号（epoch）**：出错实例一旦失效，其迟到的 `ready` / `error` 事件一律被丢弃，不会错误清零重试计数，首次重建稳定记录为「第 1 次尝试」\n  - 重建期间（旧 watcher 已停、新 watcher 尚未 `ready`，`ignoreInitial` 生效）发生的文件增删改会被**补扫（resync）** 兜底：重建实例 `ready` 后自动跑一次签名驱动的增量索引，补齐窗口期缺口，不会漏索引\n  - **关闭安全**：`closeProject()` / `closeAll()` / 进程 `SIGINT|SIGTERM` 退出前，都会先 `await watcher.stop()`（内部等待进行中的补扫收尾）再关闭数据库，杜绝补扫落库过程中触发 `The database connection is not open`\n  - 上述行为均有回归测试覆盖（含「首次 ready 前就 error」「退避期间旧实例迟到 ready」「关闭时补扫仍在进行」三个竞态场景）\n- **调用点与证据链准确性升级（v0.6.97）**：\n  - 同一方法内多次调用同名请求函数时，结合当前赋值片段、endpoint detail 和调用行绑定 behavior，不再简单取第一条同名调用\n  - 同一行存在多个不同 endpoint 也可消歧，例如 `savedData = request('/right-api')` 不会误绑定同一行的 `/wrong-api`\n  - 对象别名持久化方法作用域，避免 `params`、`storP` 等常见局部变量跨方法串链\n  - Vue 2 / Vue 3 behavior 行号统一换算为整个 SFC 的真实文件行号，证据可直接用于代码定位\n- **三元表达式变量提取 + 信息屏蔽彻底解决（v0.6.9）**：\n  - 新增 `extractTernaryVariables()` 支持从 `(type == 1 ? cashData?.receiveAdr : cashData?.fetchAdr)` 提取 `cashData`\n  - 递归溯源引擎集成三元表达式候选项（`ternary_ref`），追踪优先级：函数 → 三元变量 → 普通变量 → fallback\n  - 工具描述强化\"不可过度信任\"警告：明确\"返回 0 ≠ 不存在\"，\"必须启动人工推理\"\n  - \"未找到链路\"输出增强为 10+ 行强警告 + 人工验证步骤，防止模型因工具返回空就放弃推理\n  - 三层防御解决信息屏蔽问题：工具层覆盖更多表达式模式 + 描述层强制怀疑 + 输出层强警告\n- **answer-first 返回（v0.6）**：`skimmer_query` 定为唯一推荐入口，命中即自足返回（top-1 内联源码 + 一层调用链摘要），命中成功不再推销其它工具；空结果自动放宽重查一次，仍空则明确告知\"确认无结果 + 已尝试的查询方式\"，杜绝空转\n- **递归赋值溯源（v0.6.3-v0.6.8）**：`skimmer_trace_data_lifecycle` 对 `const x = this.getXxx()` 这类\"赋值右侧是函数调用\"自动递归追踪到 `localStorage.getItem`，打通 `storageParams ← savedData ← getPageCashF() ← localStorage` 完整链路；支持 || fallback 追踪\n- **camelCase / v-model 模板事件入库（v0.6）**：Vue 模板事件提取覆盖 `@initReceiveAdr`（camelCase 自定义事件）、`@update:modelValue`（v-model 语法糖）、带修饰符事件，跨\"模板事件 → 方法\"的调用链不再断链\n- **response_format + 参数容错（v0.6）**：检索类工具支持 `response_format: concise|detailed`（默认 concise 省 token）；`trace_data_lifecycle` 接受 variable 的多种别名参数；`find_symbol` 低分弱匹配按 `min_score`（默认 78）折叠\n- **引用度加权排序（v0.6）**：`find_symbol` / `skimmer_query` 对被引用多的核心 API 加权，并对与已验证符号同文件/同目录的候选加分\n- **JSX precise 生效**：precise 模式不再局限于 `ts/tsx`，现在会对 `js/jsx/ts/tsx` 模块做跨文件 import/export 绑定增强\n- **re-export / barrel 链扩散更完整**：`selective_precise=true` 会把 `re-export` 也纳入依赖签名和反向依赖扩散，barrel 变更不再只重算当前文件\n- **local shadowing 保护**：若 import 名在函数局部被参数或变量重新声明，会保留 heuristic，避免把本地变量误判成跨文件精确调用\n- **工具类模块覆盖增强**：新增 Tooling TS/JS Parser，能抽取 class、class method、top-level function、constant 等基础符号\n- **index health 更真实**：索引失败文件会持久化，`skimmer_index_health` 可查看最近失败文件和错误，而不是只看总量\n- **snippet 搜索引入 query intent**：区分 `symbol_like / behavior_like / api_like / natural_language`，工具输出会直接显示意图，便于调权和排障\n- **业务文件优先排序**：对 `views/pages/features/modules` 等业务文件加分，对 `config/utils/helpers/lib/shared` 等通用封装降权；在真实 Vue2 项目中，`localStorage setItem` 已可优先命中业务页实现而不是 `mUtils.js`\n- **评测集已固化**：仓库内有固定 snippet 回归测试，外部真实项目可通过 `eval/snippet-suites/*.json` + `npm run eval:snippet` 一键复跑\n\n## 安装\n\n### 方式一：npx 直接使用（推荐）\n\n无需克隆仓库，直接在 MCP 配置中使用：\n\n```json\n{\n  \"mcpServers\": {\n    \"frontend-code-skimmer\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@jokeran/frontend-code-skimmer\"]\n    }\n  }\n}\n```\n\n### 方式二：本地克隆构建\n\n```bash\ngit clone <this-repo>\ncd frontend-code-skimmer\nnpm install\nnpm run build\n```\n\n### 方式三：运行 snippet 评测集（开发调权用）\n\n```bash\n# 仓库内固定评测集\nnpm test\n\n# 真实项目回归（以 apply-claim 为例）\nnpm run eval:snippet -- --project /Users/anshunli1/jd/workSpace/jdGit/apply-claim --suite ./eval/snippet-suites/apply-claim.json\n```\n\n说明：\n\n- `npm test` 会跑固定 fixture 评测集，适合日常开发时快速防回归\n- `npm run eval:snippet` 用于真实项目相关性回归，适合调权、改 query 规则、评估业务文件优先是否生效\n- `eval/snippet-suites/*.json` 只属于研发保障设施，不参与运行时主链路\n\n## 配置（Cursor / Claude Desktop）\n\n### npx 安装（推荐）\n\n```json\n{\n  \"mcpServers\": {\n    \"frontend-code-skimmer\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@jokeran/frontend-code-skimmer\"],\n      \"autoApprove\": [\n        \"skimmer_query\", \"skimmer_index_project\", \"skimmer_get_component_outline\",\n        \"skimmer_find_symbol\", \"skimmer_search_snippets\", \"skimmer_get_code_slice\",\n        \"skimmer_find_by_behavior\", \"skimmer_trace_data_lifecycle\",\n        \"skimmer_get_call_graph\", \"skimmer_get_blast_radius\",\n        \"skimmer_index_health\", \"skimmer_get_project_overview\"\n      ]\n    }\n  }\n}\n```\n\n### 本地构建安装\n\n```json\n{\n  \"mcpServers\": {\n    \"frontend-code-skimmer\": {\n      \"command\": \"node\",\n      \"args\": [\"/path/to/frontend-code-skimmer/dist/index.js\"],\n      \"autoApprove\": [\n        \"skimmer_query\", \"skimmer_index_project\", \"skimmer_get_component_outline\",\n        \"skimmer_find_symbol\", \"skimmer_search_snippets\", \"skimmer_get_code_slice\",\n        \"skimmer_find_by_behavior\", \"skimmer_trace_data_lifecycle\",\n        \"skimmer_get_call_graph\", \"skimmer_get_blast_radius\",\n        \"skimmer_index_health\", \"skimmer_get_project_overview\"\n      ]\n    }\n  }\n}\n```\n\n不需要任何 `env` 配置。项目路径在**每次工具调用时动态指定**。\n\n### 多项目工作流\n\n```\n优先从编辑器工作区、已打开文件和当前上下文自动推断项目根目录绝对路径，填入 project_path（无需向用户追问）。\n\n项目 A: skimmer_index_project({ project_path: \"/work/project-a\" })\n项目 B: skimmer_index_project({ project_path: \"/work/project-b\" })\n\n→ 两个项目的索引同时缓存（最多 8 个项目，LRU 淘汰）\n\n→ 查项目 A:\n   skimmer_get_component_outline({ project_path: \"/work/project-a\", file_path: \"src/views/home.vue\" })\n\n→ 查项目 B:\n   skimmer_find_symbol({ project_path: \"/work/project-b\", query: \"handleSubmit\" })\n\n→ 省略 project_path 时，自动使用上次操作的项目：\n   skimmer_find_symbol({ query: \"handleSubmit\" })\n\n→ 文件修改后强制全量重建索引：\n   skimmer_index_project({ project_path: \"/work/project-a\", force: true })\n```\n\n### 数据库存放位置\n\n| 情况         | 数据库位置                                                        |\n| ------------ | ----------------------------------------------------------------- |\n| 项目目录可写 | `<项目根>/.agent/skimmer_find_symbol/.skimmer-index.db`           |\n| 项目只读     | `~/.frontend-code-skimmer/databases/<hash>_<path尾部>.db`         |\n| 自定义路径   | `SKIMMER_DB` 环境变量指定的路径（仅单项目场景有效）              |\n\n## 环境变量（全部可选）\n\n| 变量                        | 说明                                       | 默认值  |\n| --------------------------- | ------------------------------------------ | ------- |\n| `SKIMMER_PROJECT`           | 全局默认项目路径                           | 无      |\n| `SKIMMER_AUTO_INDEX`        | 启动时自动索引默认项目（需配合上一项使用） | `false` |\n| `SKIMMER_DB`                | 自定义数据库路径（仅单项目场景有效）       | 自动    |\n| `SKIMMER_MAX_OPEN_PROJECTS` | 最大同时打开的项目数（LRU 淘汰）           | `8`     |\n| `SKIMMER_DB_IDLE_MINUTES`   | 项目空闲多久后自动关闭数据库连接（分钟）   | `30`    |\n| `SKIMMER_DB_TTL_DAYS`       | 全局缓存数据库的 TTL（天），过期自动清理   | `14`    |\n\n## 使用示例\n\n### 1. 首次使用\n\n```\n调用 skimmer_index_project → 等待索引完成（50 个文件约 2 秒）\n```\n\n### 1.5 ⭐ 一句话智能查询（唯一推荐入口）\n\n```\n调用 skimmer_query({ question: \"提交按钮的数据流是怎样的\" })\n调用 skimmer_query({ question: \"persistDraft 改了会影响哪些地方\" })\n调用 skimmer_query({ question: \"所有写 localStorage 的地方\" })\n调用 skimmer_query({ question: \"src/views/apply/index.vue 中 storageParams 是从哪个接口获取的原始值\" })\n→ 必填参数名是 question（不是 query）；为容错也接受别名 query / q，内部会归一到 question\n→ 来源类问题会收敛到 lifecycle/source 主链：先识别直接来源，再补充后端字段初始化来源\n→ 示例结论：直接来源是 `localStorage.getItem(\"apply-claim/apply-cash\")`；缓存缺失字段的后端初始化来源是 `/gw/generic/bx/newh5/m/queryApplyDynamicInfoFromServiceType`\n→ “直接来源”和“字段初始化来源”可能不同；下游属性修改关联的 endpoint 不等于原始来源\n→ 后端按意图自动分派多路并行查询，一次返回全貌（命中即内联 top-1 源码 + 一层调用链）\n→ 命中成功不再推销其它工具；结果为空时自动放宽重查一次，仍空则明确告知\"确认无结果 + 已尝试的查询方式\"\n→ 下面 2~11 的细粒度工具是本入口的\"深入维度\"，仅在需要单维度精查时使用\n```\n\n### 2. 快速了解组件\n\n```\n调用 skimmer_get_component_outline({ file_path: \"src/views/apply/index.vue\" })\n→ 返回组件所有方法、状态、行为标签的骨架视图（7000 行 → 60 行）\n→ 若文件在索引后被修改，自动输出 ⚠️ [索引已过期] 警告并提示重建\n```\n\n### 3. 查找拼写错误的函数\n\n```\n调用 skimmer_find_symbol({ query: \"changeCash\" })\n→ 找到 changeCashValue，提示 \"cash 可能是 cache 的拼写错误\"\n→ 行为标签显示: [storage:localStorage.setItem]\n```\n\n### 3.5 ⭐ 自然语言第一跳代码片段搜索\n\n```\n调用 skimmer_search_snippets({ query: \"save to cache\" })\n→ 直接返回 changeCacheValue / persistDraft 等高相关代码片段\n→ 优先看 snippet，不必先猜函数名再调用 get_code_slice\n→ 输出会显示查询意图，如 `behavior_like`\n\n调用 skimmer_search_snippets({ query: \"localStorage setItem\" })\n→ 直接返回 localStorage.setItem 所在实现片段\n→ 显式 API 查询会识别为 `api_like`，优先按行为实现排序\n→ 若同时存在业务页实现和 util 封装，默认优先业务文件\n```\n\n当前排序信号（面向 Agent 第一跳）：\n\n- query intent：`symbol_like / behavior_like / api_like / natural_language`\n- definition boost：可执行定义（function / method / hook / lifecycle）优先于常量/元数据\n- file coherence：同一文件内多处相关命中会整体抬升\n- file role：`views/pages/features/modules` 业务文件优先，`config/utils/helpers/lib/shared` 通用封装降权\n- noise penalty：测试、mock、demo、声明文件降权\n\n### 4. 查找操作本地存储的函数\n\n```\n调用 skimmer_find_by_behavior({ category: \"storage\", operation: \"setItem\", file_path: \"src/views/apply/index.vue\" })\n→ 列出所有写入 localStorage 的函数，带文件位置\n```\n\n### 5. 变量完整数据流追踪（query 的深入维度）\n\n```\n调用 skimmer_trace_data_lifecycle({\n  variable: \"storageParams\",\n  file_path: \"src/views/apply/index.vue\",\n  storage_api: \"localStorage\",\n  max_depth: 2\n})\n→ 一次返回 5 个维度：\n  ① 声明 & 整体赋值（含来源分层：初始化/缓存回显/用户交互；赋值右侧是函数调用时自动解析来源）\n  ② 属性修改（object.prop = xxx，含别名展开）\n  ③ 作为参数被传入的调用\n  ④ template 绑定 / watch / computed / return 中的读取引用\n  ⑤ Storage 落点追踪（自动顺着调用链打通到 localStorage 写入）\n→ 同名请求调用会结合赋值片段、endpoint 和调用行消歧；对象别名按方法作用域隔离\n→ Vue 文件中的行为证据使用整个 SFC 的真实行号，可直接定位源代码\n→ variable 参数支持 variable_name / symbol_name / symbol / name 别名容错\n→ 默认 concise 只列命中行；response_format: \"detailed\" 附前后各 2 行上下文\n```\n\n### 6. 单维度追踪（trace_data_lifecycle 已覆盖）\n\n```\n# 只想看某变量的赋值/属性修改，直接用 trace_data_lifecycle 并按需读对应维度即可\nskimmer_trace_data_lifecycle({ variable: \"changeResult\", file_path: \"src/views/apply/index.vue\" })\n```\n\n说明：\n\n- 变量数据流一律用 `skimmer_trace_data_lifecycle`，它一次聚合声明、属性修改、参数传递、读取引用、Storage 落点五个维度，并对 `const x = this.getXxx()` 这类\"赋值右侧是函数调用\"自动解析来源函数的行为标签。\n- 完整生命周期中的“属性修改”可能包含对象别名传播后的下游请求；判断原始来源时按“直接赋值/缓存读取 > 后端字段初始化 > 下游属性修改”的顺序解读。\n- 如果问题本身是“从哪个接口/缓存获取原始值”，优先调用 `skimmer_query` 并在问题中带上相对文件路径；需要展开全部证据时再调用本工具。\n- 早期的 `skimmer_trace_assignments` / `skimmer_trace_property_changes` 两个降级工具已合并进 `skimmer_trace_data_lifecycle`，不再单独暴露。\n\n### 7. 函数调用图谱 & 影响评估\n\n```\nskimmer_get_call_graph({ symbol_name: \"saveToCache\", direction: \"both\" })\nskimmer_get_blast_radius({ symbol_name: \"saveToCache\" })\n```\n\n### 8. 精度模式（precise）\n\n`precision_mode=\"precise\"` 用于增强跨文件 import/export 绑定。\n\n前提与边界：\n\n- 需要项目根目录存在 `tsconfig.json` 或 `jsconfig.json`，否则会自动降级到 `heuristic`\n- 会读取该配置（含最近祖先配置）的 `compilerOptions.baseUrl` + `paths` 解析别名，支持通配符与 `extends` 继承；遇到 `package.json` / `.git` 项目边界即停止向上查找\n- 解析不到本地文件的 import（未映射别名、node_modules 裸模块）保留 heuristic，不会伪造精确绑定\n- 当前精确绑定覆盖 **JS / JSX / TS / TSX** 文件\n- 适合查 `import { foo } from './bar'` 这类跨文件调用，不等于完整类型系统求值\n- 若 import 名在局部作用域被参数/变量遮蔽，会保留 heuristic，避免误判\n\n示例：\n\n```js\nskimmer_index_project({\n  project_path: \"/work/project-a\",\n  precision_mode: \"precise\"\n})\n```\n\n### 9. 选择性 precise 重算（大项目推荐）\n\n`selective_precise=true` 会在索引后只重算**变更文件 + 受影响文件**，降低 precise 全量成本。\n\n当前规则：\n\n- `body_only`：只重算当前文件 precise\n- `import_changed`：只重算当前文件\n- `export_changed` / `full_changed`：重算当前文件 + 所有直接/间接依赖它的文件\n- `re-export` / barrel 链会纳入 import 签名与反向依赖扩散\n\n示例：\n\n```js\nskimmer_index_project({\n  project_path: \"/work/project-a\",\n  precision_mode: \"precise\",\n  selective_precise: true,\n  max_precise_files: 20\n})\n```\n\n### 10. 索引行号不准怎么办？\n\n行号偏移的根本原因通常是索引未及时更新。排查步骤：\n\n1. `skimmer_get_component_outline` 返回 `⚠️ [索引已过期]` → 立即执行第 3 步\n2. `skimmer_get_code_slice` 返回 `⚠️ [行号偏移]` → 说明代码切片位置不对\n3. 强制重建：`skimmer_index_project({ project_path: \"...\", force: true })`\n\n> 当前增量索引使用 **mtime + 文件大小** 做快速跳过，能覆盖大多数变更场景；如果你的编辑器或同步工具存在极端时间戳行为，仍建议在异常时执行 `force: true` 全量重建。\n\n### 11. 索引坏了怎么排障？\n\n```js\nskimmer_index_health({ project_path: \"/work/project-a\" })\n```\n\n可直接看到：\n\n- 已索引文件数 / 符号数 / 关系数 / 行为数\n- 最后索引时间\n- 失败文件数量\n- 最近失败文件和错误信息\n- watcher 是否活跃\n- 数据库大小与路径\n\n当你发现“文件明明在，但工具查不到”时，先看这里，而不是只看总文件数。\n\n## 框架支持\n\n| 类型 | 解析方式 | 支持范围 | 说明 |\n| ---- | -------- | -------- | ---- |\n| Vue 2 | `@vue/compiler-sfc` + `@babel/parser` | Options API | 仅解析 SFC 块和 AST，不执行模板代码；适合组件骨架、行为标签、调用关系 |\n| Vue 3 | `@vue/compiler-sfc` + `@babel/parser` | `<script setup>` + Composition API | 适合现代 Vue 单文件组件分析 |\n| React | `@babel/parser` + JSX | 函数组件 + Hooks | 适合组件骨架、事件入口、行为标签、调用关系 |\n| 纯 TS/JS 工具模块 | `@babel/parser` | class / method / top-level function / constant | 基础结构化符号提取，适合 parser / indexer / cache / CLI / MCP / util，不等于完整框架语义分析 |\n\n## 行为检测\n\n自动识别以下 API 调用并打上标签：\n\n- `storage`：localStorage / sessionStorage\n- `network`：axios / fetch\n- `router`：$router / useRouter / navigate\n- `vuex`：$store / useStore / dispatch / commit\n- `dom`：document / $refs / $nextTick\n- `event`：$emit / EventBus\n- `timer`：setTimeout / setInterval\n- `i18n`：$t / useI18n\n","readmeFilename":"README.md"}