{"_id":"@iliasabk/geolint","_rev":"8-59c62e1781f658d153a78a559270b062","name":"@iliasabk/geolint","dist-tags":{"latest":"0.4.0"},"versions":{"0.1.0":{"name":"@iliasabk/geolint","version":"0.1.0","keywords":["geo","generative-engine-optimization","llms-txt","llms.txt","ai-search","seo","aeo","chatgpt","perplexity","claude","ai-crawler","robots-txt","structured-data","lint","cli"],"author":{"name":"Ilias Aberkane"},"license":"MIT","_id":"@iliasabk/geolint@0.1.0","maintainers":[{"name":"iliasabk","email":"ilias.abkne@gmail.com"}],"homepage":"https://github.com/iliasaberkane6-lab/geolint#readme","bugs":{"url":"https://github.com/iliasaberkane6-lab/geolint/issues"},"bin":{"geolint":"dist/cli.js"},"dist":{"shasum":"29a1e979dad40ff2fdd212306f0c288d5e2048db","tarball":"https://registry.npmjs.org/@iliasabk/geolint/-/geolint-0.1.0.tgz","fileCount":9,"integrity":"sha512-ctmnHN3tqQHiRcLqqqXHcEKArADr0FZeag3+XcVX7mqngkTdPANcr+ROPTeZbWUMDkAJZ+OVTKRNeGZkpxOyIg==","signatures":[{"sig":"MEUCIHm558OVrgf7AYs2nZf8ShT9XX34V/TRwtX44aVlZVOrAiEA+xQLtXaVfKfirC5cK7rrQVS9IP7mTnEyOUu3uhdzRmM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":802175},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"0d9997af1e7dd9d9b11008a9b4ef8b7f91d1c846","scripts":{"dev":"tsup --watch","lint":"biome check --write .","test":"vitest run","build":"tsup","geolint":"tsx src/cli.ts","lint:ci":"biome check .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"iliasabk","email":"ilias.abkne@gmail.com"},"repository":{"url":"git+https://github.com/iliasaberkane6-lab/geolint.git","type":"git"},"_npmVersion":"11.19.0","description":"Lint your website for AI search readiness. Audit AI crawler access, llms.txt, structured data and citability for ChatGPT, Perplexity, Claude & co.","directories":{},"_nodeVersion":"26.8.1","dependencies":{"cheerio":"^1.1.2","commander":"^12.1.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.0","@biomejs/biome":"^1.9.4"},"_npmOperationalInternal":{"tmp":"tmp/geolint_0.1.0_1789374092603_0.5251533183347237","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@iliasabk/geolint","version":"0.2.0","keywords":["geo","generative-engine-optimization","llms-txt","llms.txt","ai-search","seo","aeo","chatgpt","perplexity","claude","ai-crawler","robots-txt","structured-data","lint","cli"],"author":{"name":"Ilias Aberkane"},"license":"MIT","_id":"@iliasabk/geolint@0.2.0","maintainers":[{"name":"iliasabk","email":"ilias.abkne@gmail.com"}],"homepage":"https://github.com/iliasaberkane6-lab/geolint#readme","bugs":{"url":"https://github.com/iliasaberkane6-lab/geolint/issues"},"bin":{"geolint":"dist/cli.js"},"dist":{"shasum":"660a558367833725ff3c4f6162a372c13379d414","tarball":"https://registry.npmjs.org/@iliasabk/geolint/-/geolint-0.2.0.tgz","fileCount":17,"integrity":"sha512-+Q/3CZozUypPbVJ27SozK+8Tvzwu5/Ojn9gX8/Ku8/opThqyDghd0WeS81T67i1ueUVG/G6JrUIDyV+j5Hs0cg==","signatures":[{"sig":"MEYCIQD8jRHnuT9fPRP7WOsITW4FaLjAd30+A5kjEvHJWLHHcwIhAICDMSU8bevGunxlf9ror+XGoB94/jhJkHKslMijVIha","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDjK1+AuSvIBbcfFPtnXXn2QfNZefQ+NTngLQY+dH5FxAiEAxY/tx2nSGk7m142RP3GRe6sOcB7QH1eMZkgo6OR5wPI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":523948},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f4559ec5c423f8e0e75b3c5977e876cfe6876a16","scripts":{"dev":"tsup --watch","lint":"biome check --write .","test":"vitest run","build":"tsup","geolint":"tsx src/cli.ts","lint:ci":"biome check .","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"iliasabk","email":"ilias.abkne@gmail.com"},"repository":{"url":"git+https://github.com/iliasaberkane6-lab/geolint.git","type":"git"},"_npmVersion":"11.19.0","description":"Lint your website for AI search readiness. Audit AI crawler access, llms.txt, structured data and citability for ChatGPT, Perplexity, Claude & co.","directories":{},"_nodeVersion":"26.8.1","dependencies":{"zod":"^4.5.4","cheerio":"^1.1.2","commander":"^12.1.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.0","@biomejs/biome":"^1.9.4"},"_npmOperationalInternal":{"tmp":"tmp/geolint_0.2.0_1789380451141_0.24269190754332537","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@iliasabk/geolint","version":"0.2.1","keywords":["geo","generative-engine-optimization","llms-txt","llms.txt","ai-search","seo","aeo","chatgpt","perplexity","claude","ai-crawler","robots-txt","structured-data","lint","cli"],"author":{"name":"Ilias Aberkane"},"license":"MIT","_id":"@iliasabk/geolint@0.2.1","maintainers":[{"name":"iliasabk","email":"ilias.abkne@gmail.com"}],"homepage":"https://github.com/iliasaberkane6-lab/geolint#readme","bugs":{"url":"https://github.com/iliasaberkane6-lab/geolint/issues"},"bin":{"geolint":"dist/cli.js"},"dist":{"shasum":"a38653766eb9ab820d1d187e0704d34ddf6c2e5d","tarball":"https://registry.npmjs.org/@iliasabk/geolint/-/geolint-0.2.1.tgz","fileCount":17,"integrity":"sha512-RaQq9xajYAKbKi3QHnwr6h7grg4+nNJeZxYmN54hIMm9P+MZ6Vv8tVQUz9lXncTflH2fuZ9UKVfNVOD51/+B1w==","signatures":[{"sig":"MEYCIQCo5A3x6AEMn8PC4C80dn32W+E2FekPsfIR9+tpkgrU/AIhAKImBPt2d9bjcyeb8i6vJ+/dYZGkPFSiBX/5mLSDo2hu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD0zhXAEtaN/fgcnqgKpDqZf5CiT7LBwbyknnVcCFsugwIhAIvilny9oAa1qnxM3yJq5wyX9/UGmDPyHjHQtsIoUF0i","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":524079},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ce6e2b825586a9f7360663aaa91b4bbea1b5d956","scripts":{"dev":"tsup --watch","lint":"biome check --write .","test":"vitest run","build":"tsup","geolint":"tsx src/cli.ts","lint:ci":"biome check .","version":"tsx scripts/sync-version.mjs && biome check --write package.json && git add package.json package-lock.json src/core/types.ts","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"iliasabk","email":"ilias.abkne@gmail.com"},"repository":{"url":"git+https://github.com/iliasaberkane6-lab/geolint.git","type":"git"},"_npmVersion":"11.19.0","description":"Lint your website for AI search readiness. Audit AI crawler access, llms.txt, structured data and citability for ChatGPT, Perplexity, Claude & co.","directories":{},"_nodeVersion":"26.8.1","dependencies":{"zod":"^4.5.4","cheerio":"^1.1.2","commander":"^12.1.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.0","@biomejs/biome":"^1.9.4"},"_npmOperationalInternal":{"tmp":"tmp/geolint_0.2.1_1789380753929_0.33683921159141406","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@iliasabk/geolint","version":"0.2.2","keywords":["geo","generative-engine-optimization","llms-txt","llms.txt","ai-search","seo","aeo","chatgpt","perplexity","claude","ai-crawler","robots-txt","structured-data","lint","cli"],"author":{"name":"Ilias Aberkane"},"license":"MIT","_id":"@iliasabk/geolint@0.2.2","maintainers":[{"name":"iliasabk","email":"ilias.abkne@gmail.com"}],"homepage":"https://github.com/iliasabk/geolint#readme","bugs":{"url":"https://github.com/iliasabk/geolint/issues"},"bin":{"geolint":"dist/cli.js"},"dist":{"shasum":"079699c919132077579e452d59e73f0df56a6819","tarball":"https://registry.npmjs.org/@iliasabk/geolint/-/geolint-0.2.2.tgz","fileCount":17,"integrity":"sha512-utYimdWdRWcf3OLeUr5GJ3Roz35V5qLhjui8t+LHRi9Zk+OHu+mnlr3ysb1IiXFf3ap+a+JM4bxKcQcUKNqPdA==","signatures":[{"sig":"MEUCIExO9yYV7ZmaYe2J9zE9ngT1/tO1sQA60gBBoYjPIY/KAiEAnTfq4Qt28F/jHoacC31hRRUeyD0E2GMOuaw3zR4ZmY0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIH/qCf7P54oWgbgGd9B42yDGDs4r/kqNDkBuTvvC3zE5AiAm/ug6PB6rXVXWelH6DmkjxUFiGEJ+8KMfrA8CAnul3g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":523909},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"28d006402a0443f400ff5e984ef6216e3df5a8b5","scripts":{"dev":"tsup --watch","lint":"biome check --write .","test":"vitest run","build":"tsup","geolint":"tsx src/cli.ts","lint:ci":"biome check .","version":"tsx scripts/sync-version.mjs && biome check --write package.json && git add package.json package-lock.json src/core/types.ts","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"iliasabk","email":"ilias.abkne@gmail.com"},"repository":{"url":"git+https://github.com/iliasabk/geolint.git","type":"git"},"_npmVersion":"11.19.0","description":"Lint your website for AI search readiness. Audit AI crawler access, llms.txt, structured data and citability for ChatGPT, Perplexity, Claude & co.","directories":{},"_nodeVersion":"26.8.1","dependencies":{"zod":"^4.5.4","cheerio":"^1.1.2","commander":"^12.1.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.0","@biomejs/biome":"^1.9.4"},"_npmOperationalInternal":{"tmp":"tmp/geolint_0.2.2_1789381706033_0.7893809512897749","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@iliasabk/geolint","version":"0.3.0","keywords":["geo","generative-engine-optimization","llms-txt","llms.txt","ai-search","seo","aeo","chatgpt","perplexity","claude","ai-crawler","robots-txt","structured-data","lint","cli"],"author":{"name":"Ilias Aberkane"},"license":"MIT","_id":"@iliasabk/geolint@0.3.0","maintainers":[{"name":"iliasabk","email":"ilias.abkne@gmail.com"}],"homepage":"https://github.com/iliasabk/geolint#readme","bugs":{"url":"https://github.com/iliasabk/geolint/issues"},"bin":{"geolint":"dist/cli.js"},"dist":{"shasum":"2d32f109e849a6379669e4bfc20cf026dfb3826c","tarball":"https://registry.npmjs.org/@iliasabk/geolint/-/geolint-0.3.0.tgz","fileCount":17,"integrity":"sha512-HrRJ6FsaRRfeBTL0yVYKoChvhpnjG5hmsL4xLsevHao3ccVSmCZ+m5lfGKNERtbDtJWc/ob4gwRQascrIUHnXQ==","signatures":[{"sig":"MEUCIQDyQQ5htQbfBijDOqdCWxPFK3PcPMuUQo2TDmwzvK9QBgIge+VQ3urBb2qcdFPc5DygnyIqMfXvoyeMhhFScFErCl0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCOUDD26MSRsxe/94d6UJJiLfpiMFNMZz4jLsg5VrsQFwIgX0rY8dz2xXg8mEjxTiwpbOhuO5xRyoeQEyZKShlhnUI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":641170},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"fb589f1e469217c7fea2def01b66677141207b16","scripts":{"dev":"tsup --watch","lint":"biome check --write .","test":"vitest run","build":"tsup","dogfood":"node scripts/dogfood.mjs","geolint":"tsx src/cli.ts","lint:ci":"biome check .","version":"tsx scripts/sync-version.mjs && biome check --write package.json && git add package.json package-lock.json src/core/types.ts","showcase":"npm run build && node scripts/gen-showcase.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"iliasabk","email":"ilias.abkne@gmail.com"},"repository":{"url":"git+https://github.com/iliasabk/geolint.git","type":"git"},"_npmVersion":"11.19.0","description":"Lint your website for AI search readiness. Audit AI crawler access, llms.txt, structured data and citability for ChatGPT, Perplexity, Claude & co.","directories":{},"_nodeVersion":"26.8.1","dependencies":{"zod":"^4.5.4","cheerio":"^1.1.2","commander":"^12.1.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.0","@biomejs/biome":"^1.9.4"},"_npmOperationalInternal":{"tmp":"tmp/geolint_0.3.0_1789388152904_0.3033332544110019","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@iliasabk/geolint","version":"0.3.1","keywords":["geo","generative-engine-optimization","llms-txt","llms.txt","ai-search","seo","aeo","chatgpt","perplexity","claude","ai-crawler","robots-txt","structured-data","lint","cli"],"author":{"name":"Ilias Aberkane"},"license":"MIT","_id":"@iliasabk/geolint@0.3.1","maintainers":[{"name":"iliasabk","email":"ilias.abkne@gmail.com"}],"homepage":"https://github.com/iliasabk/geolint#readme","bugs":{"url":"https://github.com/iliasabk/geolint/issues"},"bin":{"geolint":"dist/cli.js"},"dist":{"shasum":"59d17b24bd013dab56cc77ba05c15edbfd6323fc","tarball":"https://registry.npmjs.org/@iliasabk/geolint/-/geolint-0.3.1.tgz","fileCount":17,"integrity":"sha512-N7EdYm0t5MTkilO9952fyLEY8UhcuNSAvRIlbhjATtVVFHWUVd32g/M5Z+Fe/fd8ikc0tvHFr2K0t5hMQysHrQ==","signatures":[{"sig":"MEYCIQDVhH+18IBsz9c5hvtIRA0Dn9BGIAoaX4K+YE/NtxYsCgIhAPsq2T+M/VodqCHbKIBOuRnGNiFceN0ROlXXQ7rg2kIQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGbT8KTMrt/S/osX9UcSRBUDqFNN5ULqEKXB10YrV+DlAiAsDEUXnOhUpzsMZ0et19pn8S/jYrGhG8oBDMAhA8dYIQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":641083},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"d2b72763576634a70f915480e34b277545045459","scripts":{"dev":"tsup --watch","lint":"biome check --write .","test":"vitest run","build":"tsup","dogfood":"node scripts/dogfood.mjs","geolint":"tsx src/cli.ts","lint:ci":"biome check .","version":"tsx scripts/sync-version.mjs && biome check --write package.json && git add package.json package-lock.json src/core/types.ts","showcase":"npm run build && node scripts/gen-showcase.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"iliasabk","email":"ilias.abkne@gmail.com"},"repository":{"url":"git+https://github.com/iliasabk/geolint.git","type":"git"},"_npmVersion":"11.19.0","description":"Lint your website for AI search readiness. Audit AI crawler access, llms.txt, structured data and citability for ChatGPT, Perplexity, Claude & co.","directories":{},"_nodeVersion":"26.8.1","dependencies":{"zod":"^4.5.4","cheerio":"^1.1.2","commander":"^12.1.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.0","@biomejs/biome":"^1.9.4"},"_npmOperationalInternal":{"tmp":"tmp/geolint_0.3.1_1789391464466_0.1586199418175651","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@iliasabk/geolint","version":"0.3.2","keywords":["geo","generative-engine-optimization","llms-txt","llms.txt","ai-search","seo","aeo","chatgpt","perplexity","claude","ai-crawler","robots-txt","structured-data","lint","cli"],"author":{"name":"Ilias Aberkane"},"license":"MIT","_id":"@iliasabk/geolint@0.3.2","maintainers":[{"name":"iliasabk","email":"ilias.abkne@gmail.com"}],"homepage":"https://github.com/iliasabk/geolint#readme","bugs":{"url":"https://github.com/iliasabk/geolint/issues"},"bin":{"geolint":"dist/cli.js"},"dist":{"shasum":"27ff9b23370d3171bafd0bd45da85144990c2c9b","tarball":"https://registry.npmjs.org/@iliasabk/geolint/-/geolint-0.3.2.tgz","fileCount":17,"integrity":"sha512-ep5i06UbjudYnlh1e2M2jiVzkOdO41vc/5eHBDVkfMRApzYbtqlvu8aqsxvIK5JD5VuFbW2erYNT3JFahf8ZQg==","signatures":[{"sig":"MEQCIGjadS+nn9WpKRYJmx171I1PxthW7zqlgkPgBk6jAVNJAiB6cEV4EnBSJmFXIf8XocGp0/GT32PVfSi4oTmN5DRTPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBeQn+rT8axNIhF7EhRoD8cPXGf2xPgQtkIjXatmO11DAiBW499At/cAyhIzyqrF4jZF+mDmd54/QTE9OcI8Lfic4A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":641207},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"381e64adacfebe76ddc47bd0f25352c1c8d67c6f","mcpName":"io.github.iliasabk/geolint","scripts":{"dev":"tsup --watch","lint":"biome check --write .","test":"vitest run","build":"tsup","dogfood":"node scripts/dogfood.mjs","geolint":"tsx src/cli.ts","lint:ci":"biome check .","version":"tsx scripts/sync-version.mjs && biome check --write package.json && git add package.json package-lock.json src/core/types.ts","showcase":"npm run build && node scripts/gen-showcase.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"iliasabk","email":"ilias.abkne@gmail.com"},"repository":{"url":"git+https://github.com/iliasabk/geolint.git","type":"git"},"_npmVersion":"11.19.0","description":"Lint your website for AI search readiness. Audit AI crawler access, llms.txt, structured data and citability for ChatGPT, Perplexity, Claude & co.","directories":{},"_nodeVersion":"26.8.1","dependencies":{"zod":"^4.5.4","cheerio":"^1.1.2","commander":"^12.1.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.0","@biomejs/biome":"^1.9.4"},"_npmOperationalInternal":{"tmp":"tmp/geolint_0.3.2_1789429049643_0.19408832856936709","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"_id":"@iliasabk/geolint@0.4.0","bin":{"geolint":"dist/cli.js"},"bugs":{"url":"https://github.com/iliasabk/geolint/issues"},"dist":{"shasum":"20577057e2a441818edcd245a5b3afa01b1d2079","tarball":"https://registry.npmjs.org/@iliasabk/geolint/-/geolint-0.4.0.tgz","fileCount":17,"integrity":"sha512-llHXhV9mmv0UfQXGtnHqFWqax65xBXwZ1NbL1+6g3wrwq0jZMGvNi3m4YBzXMaChBhbF87kpu4MSEf5nSFMEig==","signatures":[{"sig":"MEQCIHrnI7xFivh2ZWya78E9841+7YKCwzEq78lSS3pPpYfjAiB7rgPsBrYy1et+WrWB1sOlVSRbtdrqeAIF1s8W/RQ4qA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCJqzbpcRqmZ0tGn0c+Vk/0cB3ravm1qSvdoMUGlwu3fQIhAMQYU5SE5wwFrO7j+3Z5gZzLhMxqXF/UudKvfu1nYdmC"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@iliasabk%2fgeolint@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":661313},"main":"./dist/index.js","name":"@iliasabk/geolint","type":"module","types":"./dist/index.d.ts","author":{"name":"Ilias Aberkane"},"engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8bfa738434b4a858eecd9eade8bf6967a2fbf91c","license":"MIT","mcpName":"io.github.iliasabk/geolint","scripts":{"dev":"tsup --watch","lint":"biome check --write .","test":"vitest run","build":"tsup","dogfood":"node scripts/dogfood.mjs","geolint":"tsx src/cli.ts","lint:ci":"biome check .","version":"tsx scripts/sync-version.mjs && biome check --write package.json && git add package.json package-lock.json src/core/types.ts","showcase":"npm run build && node scripts/gen-showcase.mjs","typecheck":"tsc --noEmit","test:watch":"vitest"},"version":"0.4.0","_npmUser":{"name":"iliasabk","email":"ilias.abkne@gmail.com"},"homepage":"https://github.com/iliasabk/geolint#readme","keywords":["geo","generative-engine-optimization","llms-txt","llms.txt","ai-search","seo","aeo","chatgpt","perplexity","claude","ai-crawler","robots-txt","structured-data","lint","cli"],"repository":{"url":"git+https://github.com/iliasabk/geolint.git","type":"git"},"_npmVersion":"10.9.8","description":"Lint your website for AI search readiness. Audit AI crawler access, llms.txt, structured data and citability for ChatGPT, Perplexity, Claude & co.","directories":{},"maintainers":[{"name":"iliasabk","email":"ilias.abkne@gmail.com"}],"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","cheerio":"^1.1.2","commander":"^12.1.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","tsup":"^8.3.5","vitest":"^2.1.8","typescript":"^5.7.2","@types/node":"^22.10.0","@biomejs/biome":"^1.9.4"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/geolint_0.4.0_1789556326461_0.23396506379841875"}}},"time":{"created":"2026-09-14T08:21:32.265Z","modified":"2026-09-16T10:58:46.892Z","0.1.0":"2026-09-14T08:21:32.735Z","0.2.0":"2026-09-14T10:07:31.257Z","0.2.1":"2026-09-14T10:12:34.026Z","0.2.2":"2026-09-14T10:28:26.112Z","0.3.0":"2026-09-14T12:15:53.000Z","0.3.1":"2026-09-14T13:11:04.579Z","0.3.2":"2026-09-14T23:37:29.773Z","0.4.0":"2026-09-16T10:58:46.582Z"},"bugs":{"url":"https://github.com/iliasabk/geolint/issues"},"author":{"name":"Ilias Aberkane"},"license":"MIT","homepage":"https://github.com/iliasabk/geolint#readme","keywords":["geo","generative-engine-optimization","llms-txt","llms.txt","ai-search","seo","aeo","chatgpt","perplexity","claude","ai-crawler","robots-txt","structured-data","lint","cli"],"repository":{"url":"git+https://github.com/iliasabk/geolint.git","type":"git"},"description":"Lint your website for AI search readiness. Audit AI crawler access, llms.txt, structured data and citability for ChatGPT, Perplexity, Claude & co.","maintainers":[{"name":"iliasabk","email":"ilias.abkne@gmail.com"}],"readme":"<p align=\"center\">\n  <img src=\"media/logo.svg\" alt=\"geolint logo\" width=\"96\">\n</p>\n\n<h1 align=\"center\">geolint</h1>\n\n<p align=\"center\">\n  <strong>ESLint for AI search.</strong> Lint your website for AI-search readiness —\n  AI crawler access, llms.txt, structured data and citability.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/@iliasabk/geolint\"><img src=\"https://img.shields.io/npm/v/@iliasabk/geolint\" alt=\"npm version\"></a>\n  <a href=\"https://github.com/iliasabk/geolint/actions/workflows/ci.yml\"><img src=\"https://github.com/iliasabk/geolint/actions/workflows/ci.yml/badge.svg\" alt=\"CI\"></a>\n  <a href=\"https://securityscorecards.dev/viewer/?uri=github.com/iliasabk/geolint\"><img src=\"https://api.securityscorecards.dev/projects/github.com/iliasabk/geolint/badge\" alt=\"OpenSSF Scorecard\"></a>\n  <a href=\"LICENSE\"><img src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"MIT license\"></a>\n  <img src=\"https://img.shields.io/badge/node-%3E%3D22-brightgreen\" alt=\"node >= 22\">\n  <a href=\"https://www.npmjs.com/package/@iliasabk/geolint\"><img src=\"https://img.shields.io/npm/dm/@iliasabk/geolint\" alt=\"npm downloads\"></a>\n  <a href=\"CONTRIBUTING.md\"><img src=\"https://img.shields.io/badge/PRs-welcome-brightgreen.svg\" alt=\"PRs welcome\"></a>\n</p>\n\n<p align=\"center\">\n  <a href=\"docs/i18n/README.de.md\">🇩🇪 Deutsch</a> ·\n  <a href=\"docs/i18n/README.es.md\">🇪🇸 Español</a> ·\n  <a href=\"docs/i18n/README.ja.md\">🇯🇵 日本語</a>\n</p>\n\n<p align=\"center\">\n  <img src=\"media/demo.gif\" alt=\"geolint terminal demo\" width=\"720\">\n</p>\n\n## 30-second quickstart\n\nNo install, no config:\n\n```bash\nnpx @iliasabk/geolint check yoursite.com\n```\n\ngeolint fetches the page, its robots.txt and llms.txt, evaluates **51 known AI\ncrawler tokens** against your robots.txt, runs **52 audit rules**, and prints a\nscored report with a concrete fix for every finding.\n\n## Why\n\n- **AI answers are the new front page.** ChatGPT, Perplexity, Claude, Copilot and\n  Google AI Overviews send traffic — or don't — based on whether their crawlers\n  can fetch and quote your pages.\n- **Most sites accidentally block or confuse AI crawlers.** A stale\n  `Disallow: /`, a `noindex` left over from staging, a client-rendered page that\n  looks empty to a bot that doesn't run JavaScript.\n- **Existing tools are blocklists or score-only web apps.** They tell you to\n  block everything, or give you a number with no path to improve it. geolint is\n  the *linter*: concrete findings, concrete fixes, runnable in CI on every PR.\n\n## What it checks\n\n52 rules across 5 categories — `geolint rules` lists them all, and\n[docs/rules.md](docs/rules.md) documents what each rule checks, why it matters\nand how to fix violations.\n\n| Category | Rules | Examples |\n| --- | ---: | --- |\n| AI Crawler Access | 10 | `ai-crawler/search-bots-blocked`, `ai-crawler/wildcard-block-all`, `ai-crawler/user-fetch-bypass`, `ai-crawler/stale-tokens` |\n| llms.txt | 10 | `llms-txt/missing`, `llms-txt/invalid-structure`, `llms-txt/broken-links`, `llms-txt/relative-links` |\n| Structured Data | 6 | `schema/no-jsonld`, `schema/invalid-jsonld`, `schema/missing-article-fields` |\n| Citability | 9 | `content/thin-content`, `content/no-h1`, `content/missing-dates`, `content/no-question-headings` |\n| Technical Foundation | 10 | `technical/client-rendered`, `technical/https`, `technical/slow-response`, `technical/sitemap-missing` |\n\n## What a report looks like\n\nReal output, auditing the bundled demo site (`examples/demo-site`, which\ndeliberately blocks two bots) — trimmed for width:\n\n```text\n$ geolint check localhost:4173 --ignore technical/https\n\n  geolint v0.2.1 — AI-search readiness\n  http://localhost:4173/\n  200 OK · text/html · TTFB 113ms · robots 200 · llms.txt 404\n\n  ██████████████████████████░░░░  86/100  Grade B\n\n  CATEGORIES\n    AI Crawler Access     ███████░░░   70  ✗ 2 errors\n    llms.txt              █████████░   92  ⚠ 1 warning · 1 hint\n    Structured Data       █████████░   88  ⚠ 1 warning · 3 hints\n    Citability            ████████░░   82  ⚠ 2 warnings · 3 hints\n    Technical Foundation  ██████████  100  ✓ clean\n\n  AI CRAWLER ACCESS — 49/51 allowed · 2 blocked\n    OpenAI\n      GPTBot                        ✓  training\n      OAI-SearchBot                 ✓  search\n      ChatGPT-User                  ✓  user-fetch\n    Perplexity\n      PerplexityBot                 ✗  search\n      Perplexity-User               ✓  user-fetch\n    Google\n      Googlebot                     ✓  search\n      Google-Extended               ✓  training\n    … 51 tokens total, grouped by vendor …\n\n  FINDINGS\n    AI Crawler Access\n      ✗ ai-crawler/search-bots-blocked  PerplexityBot is blocked by robots.txt — Perplexity cannot use your pages as AI answer sources\n          fix: Remove the Disallow covering PerplexityBot in robots.txt, or add an explicit \"Allow: /\" for it.\n          evidence: Disallow: / (matched by PerplexityBot)\n    llms.txt\n      ⚠ llms-txt/missing                No llms.txt found\n          fix: Create /llms.txt at the site root: an H1 title, a short blockquote summary, and ## sections linking to your key content.\n          evidence: http://localhost:4173/llms.txt → HTTP 404\n\n  ────────────────────────────────────────────────────────────────────\n  2 errors · 4 warnings · 7 hints · 32/44 checks passed\n```\n\nEvery finding carries a rule id, a severity, the evidence geolint matched, and a\nfix. Compare two pages or two competitors head-to-head:\n\n```bash\ngeolint check a.com --compare b.com\n```\n\n## Commands\n\n| Command | What it does | Key flags |\n| --- | --- | --- |\n| `geolint check <url>` | Audit a single URL | `--format`, `--fail-under`, `--only`/`--ignore`/`--category`, `--compare`, `--baseline`, `--badge`, `--verbose` |\n| `geolint crawl <url>` | Crawl same-origin pages and audit the whole site | `--max-pages`, `--max-depth`, `--concurrency`, `--fail-under` |\n| `geolint init <url>` | Crawl the site and generate a `llms.txt` | `-o`, `--max-pages` |\n| `geolint diff <old.json> <new.json>` | Compare two JSON reports: score delta, added/resolved findings | — |\n| `geolint rules` | List the 52 audit rules | `--category`, `--format table\\|json\\|markdown` |\n| `geolint bots` | List the 51 known AI crawlers and the impact of blocking each | `--format table\\|json` |\n| `geolint mcp` | Run an MCP server on stdio for AI assistants | `--timeout` |\n\nFull flag reference: [docs/configuration.md](docs/configuration.md).\n\n## Run it in CI\n\n### GitHub Action\n\n```yaml\n- uses: iliasabk/geolint@v1\n  id: geolint\n  with:\n    url: https://example.com\n    fail-under: 80\n\n- uses: github/codeql-action/upload-sarif@v3\n  if: always()\n  with:\n    sarif_file: ${{ steps.geolint.outputs.sarif-file }}\n```\n\nThe action produces score/grade step outputs, a SARIF report for GitHub code\nscanning, and a markdown report for job summaries and PR comments. Full recipes\n— SARIF upload, updating a single PR comment, baseline drift detection — in\n[docs/github-action.md](docs/github-action.md).\n\n### Any other CI\n\n```bash\nnpx @iliasabk/geolint check https://example.com --fail-under 80\n```\n\nExit code is `1` when the score drops below the gate (or findings regress\nagainst `--baseline`), `0` otherwise — works in GitLab CI, CircleCI, npm\nscripts, pre-deploy hooks.\n\n### Show your score as a README badge\n\n```bash\nnpx @iliasabk/geolint check https://example.com --badge\n# → writes geolint-badge.svg + prints the markdown snippet to paste\n```\n\nCommit the SVG, or regenerate a [shields endpoint JSON](docs/badges.md) in CI\n(`--badge-endpoint`) for a badge that never goes stale.\n\n## Output formats\n\n`-f pretty` (default) renders the terminal report above. The machine formats:\n\n- `-f json` — the full `ScanReport`: findings, per-category scores, bot access matrix\n- `-f sarif` — SARIF 2.1.0, upload straight to GitHub code scanning\n- `-f markdown` — PR-comment/job-summary-ready tables\n- `-f html` — a self-contained interactive report (score ring, findings filter,\n  bot matrix) you can share or host anywhere\n\nAdd `-o report.json` to write to a file; stdout stays clean for piping.\n\n## geolint on the real web\n\nThe repo dogfoods itself: a [nightly workflow](metrics/) re-audits eight\nwell-known sites and commits the scores back, and the [showcase\nsite](https://iliasabk.github.io/geolint/) publishes the full interactive\nreports — github.com, anthropic.com, stripe.com and more, regenerated on every\npush to `main`.\n\n## Programmatic API\n\n```ts\nimport { scan } from '@iliasabk/geolint';\n\nconst report = await scan('https://example.com', {\n  ignore: ['technical/https'],\n  timeout: 10_000,\n});\n\nconsole.log(report.score, report.grade);          // e.g. 86 'B'\nfor (const f of report.findings) {\n  console.log(f.severity, f.ruleId, f.message, f.fix);\n}\n```\n\n`scan(url, options)` returns a typed `ScanReport`. Also exported: the bot\nregistry (`AI_BOTS`, `botsByPurpose`), the rule registry (`allRules`,\n`ruleById`), robots.txt/llms.txt parsers, badge generators, scorers and all\nfour reporters.\n\n## Use it from AI assistants (MCP)\n\n`geolint mcp` speaks the [Model Context Protocol](https://modelcontextprotocol.io)\nover stdio — Claude Desktop, Cursor, VS Code and Windsurf can audit sites,\ngenerate `llms.txt` and compare URLs as native tools:\n\n```jsonc\n// claude_desktop_config.json / ~/.cursor/mcp.json\n{\n  \"mcpServers\": {\n    \"geolint\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@iliasabk/geolint\", \"mcp\"]\n    }\n  }\n}\n```\n\nFive tools: `audit_url`, `generate_llms_txt`, `compare_urls`, `list_rules`,\n`list_ai_bots` — all read-only, with structured output and per-call timeouts.\nSetup for every client: [docs/mcp.md](docs/mcp.md).\n\n## The bot registry is the point\n\n`geolint bots` lists 51 AI crawler tokens with a **purpose-aware** impact\nassessment — because \"should I block this bot?\" has a different answer for each:\n\n| Purpose | Examples | If you block it |\n| --- | --- | --- |\n| `training` | GPTBot, ClaudeBot, CCBot | absent from *future* training data |\n| `search` | OAI-SearchBot, PerplexityBot, Claude-SearchBot | invisible in AI answers *now* |\n| `user-fetch` | ChatGPT-User, Claude-User | invisible in AI answers *now* |\n| `mixed` | Bytespider, Amazonbot, Diffbot | both |\n\nAnd two nuances other tools miss:\n\n- **Some fetchers ignore robots.txt.** OpenAI, Perplexity and Meta document that\n  their user-triggered fetchers (ChatGPT-User, Perplexity-User,\n  Meta-ExternalFetcher) may not honor robots.txt. `ai-crawler/user-fetch-bypass`\n  tells you when a `Disallow` won't work — enforce at the WAF/auth layer instead.\n- **Stale tokens.** `anthropic-ai`, `Claude-Web`, `FacebookBot` are retired.\n  `ai-crawler/stale-tokens` flags them and names the replacement token — a\n  `User-agent: anthropic-ai` rule does nothing today.\n\nControl-only tokens like `Google-Extended` and `Applebot-Extended` never fetch\nat all — they only set a preference — and geolint treats them accordingly.\n\n## What geolint is honest about\n\n- **llms.txt is a proposal, not a standard.** No major AI vendor has committed\n  to reading it — so `llms-txt/*` findings are weighted as warnings and hints,\n  not errors. geolint still checks it (and `geolint init` generates it) because\n  adoption is growing and the cost is one file.\n- **Correlation ≠ causation.** The citability rules are grounded in published\n  GEO research (quotations/statistics/citations measurably lift share-of-answer;\n  AI crawlers other than Googlebot and Applebot don't execute JavaScript), but\n  signals like question-shaped headings are hints, not facts — they're `info`\n  severity and geolint says so.\n- **Every rule shows its reasoning.** [docs/rules.md](docs/rules.md) documents\n  why each rule exists; the research sources are in\n  [docs/research-notes.md](docs/research-notes.md), including the vendor docs\n  behind every bot's robots.txt posture.\n\n## Compared to the alternatives\n\n| | Purpose-aware bot registry | Per-vendor robots.txt posture | Runs in CI | Fix per finding | Generates llms.txt | Free / OSS |\n| --- | :-: | :-: | :-: | :-: | :-: | :-: |\n| **geolint** | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |\n| ai.robots.txt-style blocklists | ❌ | ❌ | n/a | ❌ | ❌ | ✅ |\n| GEO-optimizer skills / prompt packs | ❌ | ❌ | ❌ | ❌ | ❌ | varies |\n| llms.txt validators | ❌ | ❌ | some | partial | some | ✅ |\n| Hosted GEO audit web apps | partial | ❌ | ❌ | partial | ❌ | ❌ |\n\nDetails and the reasoning behind each column: [docs/comparison.md](docs/comparison.md).\ngeolint also ships an MCP server, a score badge and regression baselines.\n\n## Roadmap\n\nPlanned for v0.4+:\n\n- `geolint watch` — re-audit on deploys/file changes\n- Custom rule API for project-specific checks\n- Deeper schema coverage (more `@type` validators)\n- Homebrew formula\n- Report localization beyond English\n\n## Contributing\n\nIssues and PRs welcome — see [CONTRIBUTING.md](CONTRIBUTING.md). New rules are\nthe best contribution: each needs a `check(ctx)`, findings with `fix`, a test\nand a docs entry.\n\n## License\n\n[MIT](LICENSE) · [changelog](CHANGELOG.md) · [security](SECURITY.md)\n\n---\n\n<p align=\"center\">\n  If geolint helped, a ⭐ helps others find it.\n</p>\n","readmeFilename":"README.md"}