{"_id":"@casoon/astro-site-files","_rev":"15-32e67286e44ccf4b4f3da242e4112016","name":"@casoon/astro-site-files","dist-tags":{"latest":"0.5.0"},"versions":{"0.1.0":{"name":"@casoon/astro-site-files","version":"0.1.0","keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"license":"MIT","_id":"@casoon/astro-site-files@0.1.0","maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"homepage":"https://github.com/casoon/astro-site-files#readme","bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"dist":{"shasum":"b11d3610b7aaf5c18bbc6f553ac628cbcb8825a7","tarball":"https://registry.npmjs.org/@casoon/astro-site-files/-/astro-site-files-0.1.0.tgz","fileCount":24,"integrity":"sha512-AMUeVwYJZJ+Xouv/UhPHN25bhopo8I0bthMWqTnvnqmsuHu956gGE5k4dgHFv1cjtIA2ixzXTvz+KXmtCka/Jg==","signatures":[{"sig":"MEQCIFl6I+FK1BcrApNdkCnBomYv+qlHiL1kpNcgE6zvaGfbAiB4EbxwIzXhl+6p7l46HdaVASY12hyzMWuho48OJWgomQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26352},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"32c95317f3137af413ac78509c65a997b7353850","scripts":{"test":"vitest run","build":"tsc","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"jseidel","email":"joern.seidel@casoon.de"},"repository":{"url":"git+https://github.com/casoon/astro-site-files.git","type":"git"},"_npmVersion":"11.6.2","description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"@casoon/astro-sitemap":"^0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.8.3","@types/node":"^25.5.2"},"peerDependencies":{"astro":">=6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-site-files_0.1.0_1778073269461_0.47600730639012645","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@casoon/astro-site-files","version":"0.1.1","keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"license":"MIT","_id":"@casoon/astro-site-files@0.1.1","maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"homepage":"https://github.com/casoon/astro-site-files#readme","bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"dist":{"shasum":"33ba98b32c9ca082be7a687ef79ea5ec54336881","tarball":"https://registry.npmjs.org/@casoon/astro-site-files/-/astro-site-files-0.1.1.tgz","fileCount":24,"integrity":"sha512-fzFA5HZrW/fsb0lWHdyzIUbQRThXVMqfDtsB1xm4Qscn0UfjRRzfXToylTH0OmT+mB5ia4uGSyclAKbrnLzEeA==","signatures":[{"sig":"MEUCIQCeWG3X4JbxsHI32tWWfXtKAB96EFj15lQhesOueBp0twIgaG1L2mN8WpCGvRydV68YjXhInnWkRuCy87seYjYubfo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26368},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ba0a6fd8fd4e63483b61969943d4a7fb00ac8e61","scripts":{"test":"vitest run","build":"tsc","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"jseidel","email":"joern.seidel@casoon.de"},"repository":{"url":"git+https://github.com/casoon/astro-site-files.git","type":"git"},"_npmVersion":"11.6.2","description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{"@casoon/astro-sitemap":"^0.2.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.8.3","@types/node":"^25.5.2"},"peerDependencies":{"astro":">=6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-site-files_0.1.1_1778077536619_0.17908646170250897","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@casoon/astro-site-files","version":"0.1.2","keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"license":"MIT","_id":"@casoon/astro-site-files@0.1.2","maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"homepage":"https://github.com/casoon/astro-site-files#readme","bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"dist":{"shasum":"a019a1065f0afeafef5d5359569c6a2fe94e9f5b","tarball":"https://registry.npmjs.org/@casoon/astro-site-files/-/astro-site-files-0.1.2.tgz","fileCount":36,"integrity":"sha512-dO6s2Ja6rFOXSh3M4QuIkui+YuAKiqHKbGPduaW4jlRk0b8L6nQbVmJ5YA9imWpNM8xKZkRt9Aiqq/qIs6XHRw==","signatures":[{"sig":"MEQCIAfzxHRu6QK0/1Y0EOLxUNbCcFB4vVwClEBHUb8KxWz3AiB0/VgJzIAY3pR7Ugehsb/CZgdvCVKzo9pCN5+RfMAw4g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":46408},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"09120221977de41b7cbf500c05f63337b592d8a8","scripts":{"test":"vitest run","build":"tsc","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"jseidel","email":"joern.seidel@casoon.de"},"repository":{"url":"git+https://github.com/casoon/astro-site-files.git","type":"git"},"_npmVersion":"11.6.2","description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.8.3","@types/node":"^25.5.2"},"peerDependencies":{"astro":">=6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-site-files_0.1.2_1778078278925_0.28958018704129773","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@casoon/astro-site-files","version":"0.1.3","keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"license":"MIT","_id":"@casoon/astro-site-files@0.1.3","maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"homepage":"https://github.com/casoon/astro-site-files#readme","bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"dist":{"shasum":"9e78e9ad943c8749e66989079bb1cb9d948302d9","tarball":"https://registry.npmjs.org/@casoon/astro-site-files/-/astro-site-files-0.1.3.tgz","fileCount":36,"integrity":"sha512-qE4d2I+e4Mw0/txqasWyhA7x6QvhWOyCjE9obOijWTDO8htzfMd70DM1kzKYQUoWMm2uAoAQ8uGyV3DDwkxhDA==","signatures":[{"sig":"MEYCIQCqmGtwXnsse7xfcK//Zd7unjzTCqyRn2CTBiLX1x3x3wIhALJoaWwdW1c9jQB6t8mDhNPKo36baY5HL195nEuOYRV1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":49028},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"c7d92a36e73a9fd9dc40c5e2710b1d24905299fa","scripts":{"test":"vitest run","build":"tsc","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"jseidel","email":"joern.seidel@casoon.de"},"repository":{"url":"git+https://github.com/casoon/astro-site-files.git","type":"git"},"_npmVersion":"11.6.2","description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.8.3","@types/node":"^25.5.2"},"peerDependencies":{"astro":">=6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-site-files_0.1.3_1778079109415_0.23536127454056888","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@casoon/astro-site-files","version":"0.1.4","keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"license":"MIT","_id":"@casoon/astro-site-files@0.1.4","maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"homepage":"https://github.com/casoon/astro-site-files#readme","bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"dist":{"shasum":"0578c1f39d072f0a42ba656eb5f4dd7c492c0aa3","tarball":"https://registry.npmjs.org/@casoon/astro-site-files/-/astro-site-files-0.1.4.tgz","fileCount":39,"integrity":"sha512-MoPmnwYaqgpKi+KGCBC0t1sfuEFLBD7JxUfxWYh3j4uPWBZhwFE3EOrz3swn3jXksDJF2YVnl2/EJEFOQNpsoA==","signatures":[{"sig":"MEUCIQCM9E9ZJhThNUoZSZBstOUbNeYZOaWp2Tm0aGOkLKW44AIgI4chEfJeFuJpitRRZCsISouYS76CI2ex8i1GArD7ksM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":55489},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"8922e958d778cd8e2f7087434c1443677f216de5","scripts":{"test":"vitest run","build":"tsc","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"jseidel","email":"joern.seidel@casoon.de"},"repository":{"url":"git+https://github.com/casoon/astro-site-files.git","type":"git"},"_npmVersion":"11.6.2","description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.8.3","@types/node":"^25.5.2"},"peerDependencies":{"astro":">=6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-site-files_0.1.4_1778079885058_0.7676330096281792","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@casoon/astro-site-files","version":"0.1.5","keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"license":"MIT","_id":"@casoon/astro-site-files@0.1.5","maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"homepage":"https://github.com/casoon/astro-site-files#readme","bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"dist":{"shasum":"d2354c4624b5525347f7d2853ef44f43a4d5edcd","tarball":"https://registry.npmjs.org/@casoon/astro-site-files/-/astro-site-files-0.1.5.tgz","fileCount":39,"integrity":"sha512-qgz9bYH0dblo7K6o0BDf/5bIlZTeyDwSfRrNfvUbvOqBQizD6BeOrgNalP9VU+opg2W08IMCEim1FyFJxEhChg==","signatures":[{"sig":"MEQCIBb11ZAYYPOcKiOtWezm7Z0wgHU7kp/FxZZ5z2sugIQXAiAw45xQ2XlS6oI8vZ+4++2bHFysCi97DYsOwPFb27tA+g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":58520},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"e99eae2d91bda15fa0345eadc22a1b95f0a25b1e","scripts":{"test":"vitest run","build":"tsc","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"jseidel","email":"joern.seidel@casoon.de"},"repository":{"url":"git+https://github.com/casoon/astro-site-files.git","type":"git"},"_npmVersion":"11.6.2","description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.8.3","@types/node":"^25.5.2"},"peerDependencies":{"astro":">=6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-site-files_0.1.5_1778080657441_0.9478643435116527","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@casoon/astro-site-files","version":"0.1.6","keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"license":"MIT","_id":"@casoon/astro-site-files@0.1.6","maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"homepage":"https://github.com/casoon/astro-site-files#readme","bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"dist":{"shasum":"416eed26f355cc3b15a7b9d4ed9e6b27e024669c","tarball":"https://registry.npmjs.org/@casoon/astro-site-files/-/astro-site-files-0.1.6.tgz","fileCount":39,"integrity":"sha512-vAJo44oJBzlm9RQ/UDZWMcAftV1yoge7thpt9CqAD5O+qRO6eg4kmVM/4rZXQoekR77F50WEq0bLb9eQka3iZg==","signatures":[{"sig":"MEQCIFhc7Tmvof1Io44lC8pTQsf71Ee3kklhEW8RxtCXarEqAiBFS2cmVwNj+CM8shfQhJuCQTAnMVsDch5tQyXu2BQ8aw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":59342},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"22637846c7676f7a6f2957d32671388566c36367","scripts":{"test":"vitest run","build":"tsc","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"jseidel","email":"joern.seidel@casoon.de"},"repository":{"url":"git+https://github.com/casoon/astro-site-files.git","type":"git"},"_npmVersion":"11.6.2","description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.8.3","@types/node":"^25.5.2"},"peerDependencies":{"astro":">=6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-site-files_0.1.6_1778340439463_0.29228647098489713","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@casoon/astro-site-files","version":"0.2.0","keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"author":{"url":"https://www.casoon.de","name":"Jörn Seidel","email":"info@casoon.de"},"license":"MIT","_id":"@casoon/astro-site-files@0.2.0","maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"homepage":"https://github.com/casoon/astro-site-files#readme","bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"dist":{"shasum":"c801f61fdfec763b584e79fab494be38eacb5709","tarball":"https://registry.npmjs.org/@casoon/astro-site-files/-/astro-site-files-0.2.0.tgz","fileCount":39,"integrity":"sha512-gWoHXGhgIt/1D0OR4bzN08ypV34BO5b9l3Q1SGLLtEWE2aTLRvqOy453IkTr6kRFz/feTLcut79D6buhQYFqaA==","signatures":[{"sig":"MEUCIC5p47OfD3h1mWxJw51x4jVvr9kkJYBiSbErES+rhDv+AiEAo4vYTw0mhSXfWUwgQ0wfELWqJCVlsjSE/9hpwY/oMtU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":61753},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"071b84737be7b00e0378dc4b3382774715dd381b","scripts":{"test":"vitest run","build":"tsc","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"jseidel","email":"joern.seidel@casoon.de"},"repository":{"url":"git+https://github.com/casoon/astro-site-files.git","type":"git"},"_npmVersion":"11.6.2","description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.8.3","@types/node":"^25.5.2"},"peerDependencies":{"astro":">=6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-site-files_0.2.0_1779777221659_0.9112045546336487","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@casoon/astro-site-files","version":"0.2.1","keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"author":{"url":"https://www.casoon.de","name":"Jörn Seidel","email":"info@casoon.de"},"license":"MIT","_id":"@casoon/astro-site-files@0.2.1","maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"homepage":"https://github.com/casoon/astro-site-files#readme","bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"dist":{"shasum":"8ff342d15abc335c004971ded6f0c606a2c5ebce","tarball":"https://registry.npmjs.org/@casoon/astro-site-files/-/astro-site-files-0.2.1.tgz","fileCount":39,"integrity":"sha512-RVHBSnYYwsYsSqC2b/XEzdV5KUPxS6kDp7x3HnErPEMc/RG5ImM3vSNRWMzo/vOrU3Q2WuHV64YzpmBPki3REQ==","signatures":[{"sig":"MEUCICuu9wFCtc2sIrrDiuufEWMgqla3RA3TCobuzrviBAL8AiEA3Tayr56aAiSCzg5h8J9oXtqMThDV1znhXue98CMBTT4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":61703},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"dfcc8d62d787ce58302c4749e60ab3ceae3ad6dc","scripts":{"test":"vitest run","build":"tsc","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"jseidel","email":"joern.seidel@casoon.de"},"repository":{"url":"git+https://github.com/casoon/astro-site-files.git","type":"git"},"_npmVersion":"11.6.2","description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.8.3","@types/node":"^25.5.2"},"peerDependencies":{"astro":">=6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-site-files_0.2.1_1779780578352_0.4853790257680042","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@casoon/astro-site-files","version":"0.3.0","keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"author":{"url":"https://www.casoon.de","name":"Jörn Seidel","email":"info@casoon.de"},"license":"MIT","_id":"@casoon/astro-site-files@0.3.0","maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"homepage":"https://github.com/casoon/astro-site-files#readme","bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"dist":{"shasum":"e3a239ea42a77b2ebdf890f10b8fba9ac43e2817","tarball":"https://registry.npmjs.org/@casoon/astro-site-files/-/astro-site-files-0.3.0.tgz","fileCount":42,"integrity":"sha512-wUiv8C00+TMAw4UpFH5gFqNZ7lrgkoopVE1rfwUDmHhYeOIgRUxda/CMQH8bnk01QfCn5NUyETT/Nq14ZQySWA==","signatures":[{"sig":"MEUCIGSg3Th09MUPPI70zOfq80jQwvurLA+0i9b8Gllba205AiEA5dwPmc5ONZVKVts5Jv2aPk+L2MCEAKwR09JCV3bR1hQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75101},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./rss":{"types":"./dist/rss.d.ts","import":"./dist/rss.js"}},"gitHead":"5d40ddc0627dc72d2948a0f66b045b90778633b0","scripts":{"test":"vitest run","build":"tsc","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"jseidel","email":"joern.seidel@casoon.de"},"repository":{"url":"git+https://github.com/casoon/astro-site-files.git","type":"git"},"_npmVersion":"11.6.2","description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.8.3","@types/node":"^25.5.2"},"peerDependencies":{"astro":">=6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-site-files_0.3.0_1779784459308_0.24471675260552583","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@casoon/astro-site-files","version":"0.3.1","keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"author":{"url":"https://www.casoon.de","name":"Jörn Seidel","email":"info@casoon.de"},"license":"MIT","_id":"@casoon/astro-site-files@0.3.1","maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"homepage":"https://github.com/casoon/astro-site-files#readme","bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"dist":{"shasum":"3d8d3ace05ee60185d11e13a58a6a97ff053fac2","tarball":"https://registry.npmjs.org/@casoon/astro-site-files/-/astro-site-files-0.3.1.tgz","fileCount":42,"integrity":"sha512-d9e4JImyWqYzznuTew7uLig3uGrESqyCNNpNZOmQmsghTAzo/6wJzQRatEZgSRgquUyMBNW+G+p+EPefA8GGaw==","signatures":[{"sig":"MEUCIQDtOlb0OI18cvxGZkOHTvxP7AeGo8GF3JCLao6pYylWagIgEmFZfExnjZ20MLd2a3y4fJ3N1O7XgjQmcyyZBO3BboQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75741},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./rss":{"types":"./dist/rss.d.ts","import":"./dist/rss.js"}},"gitHead":"1df722d011a19f937503e6bf3470d538f8d22432","scripts":{"test":"vitest run","build":"tsc","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"jseidel","email":"joern.seidel@casoon.de"},"repository":{"url":"git+https://github.com/casoon/astro-site-files.git","type":"git"},"_npmVersion":"11.6.2","description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.8.3","@types/node":"^25.5.2"},"peerDependencies":{"astro":">=6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-site-files_0.3.1_1779872997752_0.9403857527227506","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@casoon/astro-site-files","version":"0.4.0","keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"author":{"url":"https://www.casoon.de","name":"Jörn Seidel","email":"info@casoon.de"},"license":"MIT","_id":"@casoon/astro-site-files@0.4.0","maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"homepage":"https://github.com/casoon/astro-site-files#readme","bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"dist":{"shasum":"00f96e99463dcf5e3e0b56883822f47fc3991318","tarball":"https://registry.npmjs.org/@casoon/astro-site-files/-/astro-site-files-0.4.0.tgz","fileCount":48,"integrity":"sha512-O45rHr8mBj2Y8bnJOIbAWPmdDUNsLe1102UMFmDG7Og1mjUVnGiUmibB6c8c43qc8f16PoMo/SQpqtQ+8Wobuw==","signatures":[{"sig":"MEYCIQDNRgD2xVu9YUsBddbEwTWAfiqOl+euW7OhSKtOpaVabQIhAIrN3BYUkay/vXHx3aky/9cbcGY1Ph0J+06QDRleHwkN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96249},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./rss":{"types":"./dist/rss.d.ts","import":"./dist/rss.js"}},"gitHead":"5d9d111fe6c8e493f9d82b328bc5e5de3f1f7295","scripts":{"test":"vitest run","build":"tsc","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"jseidel","email":"joern.seidel@casoon.de"},"repository":{"url":"git+https://github.com/casoon/astro-site-files.git","type":"git"},"_npmVersion":"11.6.2","description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.8.3","@types/node":"^25.5.2"},"peerDependencies":{"astro":">=6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-site-files_0.4.0_1779886159443_0.8285263906667637","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@casoon/astro-site-files","version":"0.4.1","keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"author":{"url":"https://www.casoon.de","name":"Jörn Seidel","email":"info@casoon.de"},"license":"MIT","_id":"@casoon/astro-site-files@0.4.1","maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"homepage":"https://github.com/casoon/astro-site-files#readme","bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"dist":{"shasum":"c1b9ac2992eb9a3bc392df3e8d3a49e60aad1597","tarball":"https://registry.npmjs.org/@casoon/astro-site-files/-/astro-site-files-0.4.1.tgz","fileCount":48,"integrity":"sha512-LOGX1WYY4+ti9oAc4LGJIR4Qx1YUjTexjICUC/HGIXvO1BR62cbCYIBo6xFDOQsI9HWq03jDSVgMxf4/pXO5WQ==","signatures":[{"sig":"MEUCIGNI/zeq1kScvqvbZm/6kofbOUtqHJLgp1R7bAPhrBZ9AiEA/JFw8/qV1WA/gu6xNkw5hJwdmpREsrlEu5eA9Osn9NU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":98231},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./rss":{"types":"./dist/rss.d.ts","import":"./dist/rss.js"}},"gitHead":"0e46028b277d38247332bb632f367fbe61d495bc","scripts":{"test":"vitest run","build":"tsc","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"jseidel","email":"joern.seidel@casoon.de"},"repository":{"url":"git+https://github.com/casoon/astro-site-files.git","type":"git"},"_npmVersion":"11.6.2","description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.0.0","typescript":"^5.8.3","@types/node":"^25.5.2"},"peerDependencies":{"astro":">=6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-site-files_0.4.1_1780296434880_0.8144737993545099","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@casoon/astro-site-files","version":"0.4.2","keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"author":{"url":"https://www.casoon.de","name":"Jörn Seidel","email":"info@casoon.de"},"license":"MIT","_id":"@casoon/astro-site-files@0.4.2","maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"homepage":"https://github.com/casoon/astro-site-files#readme","bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"dist":{"shasum":"0d851bcc320debf83724d0c6bd5bf16380e582e2","tarball":"https://registry.npmjs.org/@casoon/astro-site-files/-/astro-site-files-0.4.2.tgz","fileCount":48,"integrity":"sha512-AsSRJrm0k3M91xU6jgw9btCvl79LyL72cnFHNnV+DTvQc65W1VoybneB4e9UfhHJdbzQkvTa6gR4Iy0FFMifTg==","signatures":[{"sig":"MEUCICGiXVyCHDnqOLJO26O5czBkpBZHGWV49mASbgU8hJzoAiEA5Vcrt/a+sHF4NcnU6+kyjYgBaBniSMznluwjUyDyZSM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97308},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=22.12.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./rss":{"types":"./dist/rss.d.ts","import":"./dist/rss.js"}},"gitHead":"e34939de5dbf34d2c1e5f7b0e6f72beaa14c923a","scripts":{"test":"vitest run","build":"tsc","prepublishOnly":"npm test && npm run build"},"_npmUser":{"name":"jseidel","email":"joern.seidel@casoon.de"},"repository":{"url":"git+https://github.com/casoon/astro-site-files.git","type":"git"},"_npmVersion":"11.6.2","description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","directories":{},"sideEffects":false,"_nodeVersion":"24.11.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.0","typescript":"^5.9.3","@types/node":"^26.0.0"},"peerDependenciesMeta":{"astro":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/astro-site-files_0.4.2_1782210010696_0.35853995364109825","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@casoon/astro-site-files","version":"0.5.0","description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","sideEffects":false,"exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"},"./rss":{"import":"./dist/rss.js","types":"./dist/rss.d.ts"}},"keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"license":"MIT","author":{"name":"Jörn Seidel","email":"info@casoon.de","url":"https://www.casoon.de"},"homepage":"https://github.com/casoon/astro-site-files#readme","repository":{"type":"git","url":"git+https://github.com/casoon/astro-site-files.git"},"bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"engines":{"node":">=22.12.0"},"peerDependencies":{"astro":">=6.0.0"},"peerDependenciesMeta":{"astro":{"optional":true}},"publishConfig":{"access":"public"},"scripts":{"build":"tsc","test":"vitest run","prepublishOnly":"npm test && npm run build"},"devDependencies":{"@types/node":"^26.5.0","typescript":"^7.0.2","vitest":"^5.0.0"},"gitHead":"4b1fd6fa2d3689f0982c682f2a1b9bf0db97a8d4","_id":"@casoon/astro-site-files@0.5.0","_nodeVersion":"24.11.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-IAhyR6tQgDvHNAwWsJaA1ZfESCJUKC+k6UNot+v1hfV5aeJNlEZAClDGNXoNFXrMe7kBarD/+lh25935BfSPGw==","shasum":"82551f9383dd0635b577d4882148a5fd90c3c9d9","tarball":"https://registry.npmjs.org/@casoon/astro-site-files/-/astro-site-files-0.5.0.tgz","fileCount":49,"unpackedSize":118417,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG2XhRfvqOqJeJgbuqWMAeBQhTFwxU1jYXY5tNaUslPdAiEA/4aeK0iJVNapfkfr+2Ja404C2JeS+z7vA+Z1SPO9J3U="}]},"_npmUser":{"name":"jseidel","email":"joern.seidel@casoon.de"},"directories":{},"maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/astro-site-files_0.5.0_1788972625609_0.9375894953992665"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-06T13:14:29.395Z","modified":"2026-09-09T16:50:26.034Z","0.1.0":"2026-05-06T13:14:29.613Z","0.1.1":"2026-05-06T14:25:36.759Z","0.1.2":"2026-05-06T14:37:59.068Z","0.1.3":"2026-05-06T14:51:49.570Z","0.1.4":"2026-05-06T15:04:45.215Z","0.1.5":"2026-05-06T15:17:37.709Z","0.1.6":"2026-05-09T15:27:19.618Z","0.2.0":"2026-05-26T06:33:41.823Z","0.2.1":"2026-05-26T07:29:38.485Z","0.3.0":"2026-05-26T08:34:19.450Z","0.3.1":"2026-05-27T09:09:57.864Z","0.4.0":"2026-05-27T12:49:19.574Z","0.4.1":"2026-06-01T06:47:14.999Z","0.4.2":"2026-06-23T10:20:10.871Z","0.5.0":"2026-09-09T16:50:25.782Z"},"bugs":{"url":"https://github.com/casoon/astro-site-files/issues"},"author":{"name":"Jörn Seidel","email":"info@casoon.de","url":"https://www.casoon.de"},"license":"MIT","homepage":"https://github.com/casoon/astro-site-files#readme","keywords":["astro","astro-integration","withastro","robots.txt","llms.txt","sitemap","security.txt","humans.txt","seo"],"repository":{"type":"git","url":"git+https://github.com/casoon/astro-site-files.git"},"description":"Astro integration that generates robots.txt, llms.txt, sitemap.xml, security.txt, and humans.txt at build time from typed configuration.","maintainers":[{"name":"jseidel","email":"joern.seidel@casoon.de"}],"readme":"# @casoon/astro-site-files\n\nAstro integration that generates all standard site meta-files from typed configuration at build time.\n\n## What it does\n\n- Generates `robots.txt` — crawl rules with per-agent overrides and automatic sitemap reference\n- Generates `llms.txt` — AI model discovery file following the [llmstxt.org](https://llmstxt.org) specification\n- Generates `sitemap.xml` — built-in, enabled by default, with dynamic sources, i18n hreflang, `noindex` filtering and sitemap-index support\n- Generates `rss.xml` — RSS 2.0 feed with CDATA escaping, custom namespaces and per-item hooks\n- Generates `/.well-known/security.txt` — vulnerability disclosure contact per [RFC 9116](https://www.rfc-editor.org/rfc/rfc9116)\n- Generates `humans.txt` — team and technology credits per [humanstxt.org](https://humanstxt.org)\n\nAll files are written to the build output directory when `astro build` runs.\n\n> **Successor package.** This integration replaces [@casoon/astro-crawler-policy](https://github.com/casoon/astro-crawler-policy) (robots.txt + llms.txt) and [@casoon/astro-sitemap](https://github.com/casoon/astro-sitemap) (sitemap.xml + rss.xml). Both predecessor packages are no longer actively maintained.\n\n## Changelog\n\nRelease notes live in [CHANGELOG.md](CHANGELOG.md). **0.5.0 contains behaviour changes that take effect without any config change** — `noindex` pages are dropped from the sitemap, hreflang alternates are derived from Astro's `i18n` config, locale prefixes no longer lower a page's priority, and bots with their own `robots.txt` group now inherit the global rules. See [the 0.5.0 entry](CHANGELOG.md#050--2026-09-09) before upgrading.\n\n## Requirements\n\n- Node.js **≥ 22.12.0** (aligned with Astro 6)\n- Astro **≥ 6.0.0**, including Astro 7 (peer dependency, optional for programmatic usage)\n\n## Installation\n\n```sh\nnpm install @casoon/astro-site-files\n```\n\n## Quick start\n\n```ts\n// astro.config.ts\nimport { defineConfig } from 'astro/config'\nimport siteFiles from '@casoon/astro-site-files'\n\nexport default defineConfig({\n  site: 'https://example.com',\n  integrations: [\n    siteFiles({\n      robots: {\n        preset: 'seoOnly',      // blocks AI training and archives; search engines stay allowed\n        disallow: ['/admin'],   // additional path rules on top of the preset\n      },\n      llms: { title: 'Example', description: 'An example website.' },\n      security: { contact: 'mailto:info@casoon.de' },\n      humans: {\n        team: [{ name: 'Alice', role: 'Development' }],\n        technology: ['Astro', 'TypeScript']\n      }\n    })\n  ]\n})\n```\n\n`robots.txt` and `sitemap.xml` are enabled by default. The other three files are generated only when their option is configured.\n\n## robots.txt\n\nThe recommended approach is to start with a preset and add path rules on top:\n\n```ts\nsiteFiles({\n  robots: {\n    preset: 'seoOnly',           // blocks AI training, archiving; search engines allowed\n    disallow: ['/admin'],        // additional paths for User-agent: *\n  }\n})\n```\n\nFor fine-grained control without a preset:\n\n```ts\nsiteFiles({\n  robots: {\n    disallow: ['/admin', '/private/'],\n    allow: ['/admin/public/'],\n    crawlDelay: 2,\n    sitemap: true,               // auto-derive from astro.config site URL (default)\n    agents: [\n      { userAgent: 'Googlebot', crawlDelay: 1 }\n    ]\n  }\n})\n```\n\n**Option reference:**\n\n| Option | Type | Default | Description |\n|---|---|---|---|\n| `disallow` | `string[]` | `[]` | Paths to disallow for `User-agent: *` |\n| `allow` | `string[]` | `[]` | Paths to explicitly allow for `User-agent: *` |\n| `crawlDelay` | `number` | — | Crawl-delay for `User-agent: *` |\n| `sitemap` | `boolean \\| string` | `true` | `true` = derive URL from `astro.config.site`, `string` = explicit URL, `false` = omit |\n| `preset` | `Preset` | — | Named preset — see [Presets](#presets) below |\n| `bots` | `Record<string, BotAction>` | `{}` | Per-bot overrides — keyed by bot id, take precedence over groups and preset |\n| `groups` | `Groups` | `{}` | Group-level action controls — see sub-table below |\n| `extraBots` | `RegistryBot[]` | `[]` | Additional bots to merge into the built-in registry |\n| `agents` | `AgentRule[]` | `[]` | Explicit per-agent rule blocks — appended after registry-derived rules |\n\n`BotAction` values: `'allow'` (emit `Allow: /`), `'disallow'` (emit `Disallow: /`), `'inherit'` (no rule emitted; `User-agent: *` applies).\n\n`Groups` fields:\n\n| Group key | Covers |\n|---|---|\n| `searchEngines` | Googlebot, Bingbot, DuckDuckBot |\n| `verifiedAi` | Verified AI bots — OpenAI, Anthropic, Google, Perplexity, You.com, Amazon, Apple, Meta, ByteDance |\n| `unknownAi` | Unverified or uncategorized scrapers (Diffbot, Omgilibot) |\n| `seoScanners` | SEO analytics tools — AhrefsBot, SemrushBot, MJ12bot, DotBot |\n| `archives` | Web archiving bots — ia_archiver, archive.org_bot |\n\nEach entry in `agents`:\n\n| Field | Type | Description |\n|---|---|---|\n| `userAgent` | `string \\| string[]` | User-agent value(s) |\n| `allow` | `string[]` | Paths to allow |\n| `disallow` | `string[]` | Paths to disallow |\n| `crawlDelay` | `number` | Crawl-delay for this agent |\n\n**Disable:** `robots: false`\n\n**Generated output:**\n\n```\nUser-agent: *\nDisallow: /admin\nDisallow: /private/\nAllow: /admin/public/\nCrawl-delay: 2\n\nUser-agent: Googlebot\nCrawl-delay: 1\n\nSitemap: https://example.com/sitemap.xml\n```\n\n### Presets\n\nA preset configures group defaults and known-bot rules in one step. Individual `bots` and `groups` options override the preset.\n\n```ts\nsiteFiles({\n  robots: { preset: 'seoOnly' }\n})\n```\n\n| Preset | searchEngines | verifiedAi | unknownAi | seoScanners | archives | Notes |\n|---|---|---|---|---|---|---|\n| `seoOnly` | allow | disallow | disallow | inherit | disallow | All AI training and archiving blocked; search engines stay |\n| `citationFriendly` | allow | allow | disallow | inherit | inherit | AI may read and cite; training crawlers overridden via `bots` |\n| `openToAi` | allow | allow | allow | inherit | allow | Everything allowed |\n| `blockTraining` | allow | allow | disallow | inherit | disallow | AI input/search allowed; training bots overridden via `bots` |\n| `lockdown` | disallow | disallow | disallow | disallow | disallow | Everything blocked |\n\n`inherit` means no rule is emitted for that group — `User-agent: *` applies. `citationFriendly` and `blockTraining` additionally override specific training bots via `bots` regardless of the `verifiedAi` group setting.\n\n**Global rules and bot groups:** a crawler obeys only the single most specific group that matches it, so a bot with its own block would otherwise ignore `User-agent: *` entirely. Your global `allow` / `disallow` / `crawlDelay` are therefore repeated inside every generated **allow** block:\n\n```ts\nsiteFiles({\n  robots: { disallow: ['/admin/'], preset: 'seoOnly' }\n})\n```\n\n```\nUser-agent: *\nDisallow: /admin/\n\nUser-agent: Googlebot\nAllow: /\nDisallow: /admin/\n```\n\nBlocked bots keep a bare `Disallow: /` — a global `Allow:` must not punch a hole into a bot you deliberately blocked outright. Explicit `agents` blocks are left exactly as you wrote them.\n\n**Group overrides** let you adjust one category without changing the preset for others:\n\n```ts\nsiteFiles({\n  robots: {\n    preset: 'seoOnly',\n    groups: { seoScanners: 'disallow' }  // also block SEO scanners\n  }\n})\n```\n\n**Per-bot overrides** take the highest precedence:\n\n```ts\nsiteFiles({\n  robots: {\n    preset: 'blockTraining',\n    bots: { PerplexityBot: 'disallow' }  // also block AI search\n  }\n})\n```\n\n**Adding custom bots:**\n\n```ts\nsiteFiles({\n  robots: {\n    preset: 'seoOnly',\n    extraBots: [\n      { id: 'MyBot', provider: 'Example', userAgents: ['MyBot/1.0'], categories: ['ai-training'], verified: false }\n    ]\n  }\n})\n```\n\n### Blocking AI crawlers and web archives\n\n`robots.txt` is voluntary — compliant bots respect it, aggressive scrapers often do not. For most sites the pragmatic approach is a layered \"soft block\": signal your preferences clearly while keeping search engines working normally.\n\n**Known bots to consider blocking**\n\n| User-agent | Origin |\n|---|---|\n| `ia_archiver` | Internet Archive / Wayback Machine |\n| `archive.org_bot` | Internet Archive (secondary agent) |\n| `GPTBot` | OpenAI training crawler |\n| `ChatGPT-User` | OpenAI — when ChatGPT fetches URLs on behalf of a user |\n| `ClaudeBot` | Anthropic |\n| `Claude-Web` | Anthropic |\n| `anthropic-ai` | Anthropic |\n| `Google-Extended` | Google — Gemini / AI Overviews training |\n| `CCBot` | Common Crawl — the base dataset behind many models |\n| `PerplexityBot` | Perplexity AI |\n| `YouBot` | You.com AI search |\n| `Amazonbot` | Amazon — Alexa / Rufus training |\n| `Applebot-Extended` | Apple AI features |\n| `Bytespider` | ByteDance / TikTok ecosystem |\n| `OAI-SearchBot` | OpenAI — search and browsing |\n| `meta-externalagent` | Meta AI |\n| `Diffbot` | Automated data extraction (unverified) |\n| `Omgilibot` | Social media data aggregator, used in training sets (unverified) |\n| `AhrefsBot` | Ahrefs SEO scanner |\n| `SemrushBot` | Semrush SEO scanner |\n| `MJ12bot` | Majestic SEO scanner |\n| `DotBot` | OpenLinkProfiler SEO scanner |\n\n**Important: block CCBot.** Many models are not trained directly from your site but via datasets derived from Common Crawl. Blocking only `GPTBot` while leaving `CCBot` open still lets your content reach training pipelines indirectly.\n\n**Variant 1 — Pragmatic / SEO-safe**\n\nGood for company sites, blogs, agencies. Normal search engines keep working; AI training and archiving are restricted.\n\n```ts\nsiteFiles({\n  robots: { preset: 'seoOnly' }\n})\n```\n\n**Variant 2 — Content-focused / block training**\n\nFor publishers, premium content, or media sites. AI may read and cite content; training crawlers and archives are blocked.\n\n```ts\nsiteFiles({\n  robots: { preset: 'blockTraining' }\n})\n```\n\n**Variant 3 — Maximum restriction**\n\nBlock everything including SEO scanners. Use with caution — this also prevents you from using SEO tools on your own site.\n\n```ts\nsiteFiles({\n  robots: {\n    preset: 'seoOnly',\n    groups: { seoScanners: 'disallow' }\n  }\n})\n```\n\n> **Note on SEO scanners:** Blocking AhrefsBot, SemrushBot, and similar tools prevents competitors from analysing your backlink profile or content, but also prevents you from using those tools on your own site. Evaluate the trade-off before adding them.\n\n**Meta tag and HTTP header**\n\n```html\n<meta name=\"robots\" content=\"noarchive\">\n```\n\n```\nX-Robots-Tag: noarchive\n```\n\nThis helps against **search engine caches and snapshots** (e.g. Google Cache). It does not protect against active scrapers, training data dumps, or content already copied.\n\n**What robots.txt cannot do**\n\nSince 2025–2026, many AI scrapers no longer identify themselves as bots. They use residential IPs, headless browsers with standard headers, and distributed request patterns that are indistinguishable from normal traffic. `robots.txt` cannot stop them.\n\nEffective countermeasures require infrastructure:\n\n- Rate limiting\n- Bot detection (e.g. Cloudflare Bot Fight Mode)\n- JS challenges for suspicious traffic\n- IP reputation filtering and login walls\n\nIf you use Cloudflare, a WAF rule can block unverified bots while allowing legitimate search crawlers:\n\n```\n(cf.client.bot and not cf.verified_bot_category in {\"Search Engine Crawler\"})\n→ Challenge / JS Challenge / Block\n```\n\n`robots.txt` is a declaration of intent, not an enforcement mechanism.\n\n## llms.txt\n\nFollows the [llmstxt.org](https://llmstxt.org) specification. Provides structured metadata for AI models discovering what your site is about.\n\n```ts\nsiteFiles({\n  llms: {\n    title: 'Example',\n    description: 'An example website focused on TypeScript tooling.',\n    details: 'This site documents internal tools and workflows.',\n    sections: [\n      {\n        title: 'Documentation',\n        links: [\n          { title: 'Getting started', url: '/docs/start', description: 'Setup guide' },\n          { title: 'API reference', url: '/docs/api' }\n        ]\n      }\n    ]\n  }\n})\n```\n\nUse `sources` to generate sections from code — for example from a content collection — instead of maintaining them manually:\n\n```ts\nsiteFiles({\n  llms: {\n    title: 'Example',\n    description: 'An example website.',\n    sources: [\n      async () => {\n        const posts = await getCollection('blog')\n        return {\n          title: 'Blog',\n          links: posts.map(p => ({ title: p.data.title, url: `/blog/${p.id}/` })),\n        }\n      },\n    ],\n  },\n})\n```\n\nSections from `sources` are appended after any manually defined `sections`.\n\n**Option reference:**\n\n| Option | Type | Description |\n|---|---|---|\n| `title` | `string` | **Required.** Site or project name |\n| `description` | `string` | Short description rendered as a blockquote |\n| `details` | `string` | Additional plain-text context |\n| `sections` | `LlmsSection[]` | Named sections with link lists (static) |\n| `sources` | `LlmsSource[]` | Async functions that return additional sections |\n\nEach entry in `sections`:\n\n| Field | Type | Description |\n|---|---|---|\n| `title` | `string` | Section heading |\n| `links` | `Link[]` | Optional list of links |\n\nEach entry in `links`:\n\n| Field | Type | Description |\n|---|---|---|\n| `title` | `string` | Link label |\n| `url` | `string` | Absolute or relative URL |\n| `description` | `string` | Optional inline description after the link |\n\n**Disable:** Omit the option or set `llms: false`\n\n**Generated output:**\n\n```md\n# Example\n\n> An example website focused on TypeScript tooling.\n\nThis site documents internal tools and workflows.\n\n## Documentation\n\n- [Getting started](/docs/start): Setup guide\n- [API reference](/docs/api)\n```\n\n## sitemap.xml\n\nSitemap generation is built-in and enabled by default. Static pages are discovered automatically from Astro's build output. Dynamic URLs can be added via `sources`.\n\n```ts\nsiteFiles({\n  sitemap: {\n    exclude: ['/landing/'],\n    priority: [{ pattern: '/blog/', priority: 0.9 }],\n    sources: [\n      async () => {\n        const posts = await getCollection('blog')\n        return posts.map(p => ({ loc: `/blog/${p.id}/`, lastmod: p.data.date }))\n      }\n    ]\n  }\n})\n```\n\n### Automatic HTML Metadata Extraction (Opt-in)\n\nThe sitemap builder automatically scans your built HTML files for page-specific metadata. If a page contains a JSON-LD `<script type=\"application/ld+json\">` tag with `data-sitemap-changefreq` or `data-sitemap-priority` attributes (such as those generated by `@casoon/astro-structured-data`), the generator will parse and apply them directly to that page's entry in `sitemap.xml`.\n\nThis integration is completely decoupled and optional: if a page does not contain these custom script attributes, the sitemap generator falls back gracefully to your global configuration rules and built-in path-based defaults.\n\n**Option reference:**\n\n| Option | Type | Description |\n|---|---|---|\n| `siteUrl` | `string` | Override the site URL (auto-detected from `astro.config.site`) |\n| `sources` | `SitemapSource[]` | Async functions returning additional `SitemapEntry[]` |\n| `exclude` | `(string \\| RegExp)[]` | URL paths or patterns to exclude — applies to auto-discovered pages only, not to `sources` |\n| `filter` | `(url: string) => boolean` | Custom filter on the full absolute URL — applies to auto-discovered pages only, not to `sources` |\n| `excludeNoindex` | `boolean` | Drop pages carrying `<meta name=\"robots\" content=\"noindex\">` — default `true` |\n| `priority` | `PriorityRule[]` | Pattern-based priority overrides (first match wins) |\n| `changefreq` | `ChangefreqRule[]` | Pattern-based changefreq overrides (first match wins) |\n| `localeAgnosticRules` | `boolean` | Make every `priority` / `changefreq` rule match without the locale prefix — default `false` |\n| `serialize` | `(entry) => entry \\| undefined` | Per-item transform or filter hook |\n| `i18n` | `{ defaultLocale, locales }` | Generates `<xhtml:link rel=\"alternate\">` hreflang entries, plus an `x-default` link pointing at the `defaultLocale` variant. Defaults to Astro's own `i18n` config when that is set |\n| `rss` | `RssConfig` | **Deprecated** — use the top-level `rss` option, see [RSS feed](#rss-feed) below |\n| `output.mode` | `'single' \\| 'index'` | `index` splits into numbered chunks (auto when > `maxUrls`). In index mode the index file is always `sitemap-index.xml` and chunks are `sitemap-1.xml`, `sitemap-2.xml`, … |\n| `output.maxUrls` | `number` | Max URLs per file in index mode — default `50 000` |\n| `output.filename` | `string` | Output filename in single-file mode — default `sitemap.xml`. Ignored in index mode. |\n| `audit.warnOnEmpty` | `boolean` | Warn when sitemap has zero entries — default `true` |\n| `audit.errorOnDuplicates` | `boolean` | Emit error instead of warning for duplicate URLs — default `false` |\n\nThe `Sitemap:` line in `robots.txt` automatically points at whichever file was actually written — `sitemap-index.xml` in index mode, or your `output.filename`. Set `robots.sitemap` to a string to override it.\n\n**Built-in exclusions** (always applied): `/404`, `/500`, `/_*`, `sitemap.xml`, `sitemap-index.xml`, `robots.txt`, `llms.txt`, `rss.xml`, `feed.xml`, and any page whose HTML starts with `<meta http-equiv=\"refresh\">` (meta-refresh redirect pages). Paths dropped by these rules are listed in the build log.\n\nThe error-page rules match a whole path segment only, so an article like `/blog/404-error-pages-guide/` stays in the sitemap.\n\nPages whose `<head>` carries `<meta name=\"robots\" content=\"noindex\">` are dropped as well — submitting them makes Search Console report *\"Submitted URL marked 'noindex'\"*. Set `excludeNoindex: false` to keep them.\n\nPath segments like `/api/`, `/landing/` and `/drafts/` are **not** excluded automatically — a docs or marketing site can serve real content there. Use `exclude` or `filter` to drop them:\n\n```ts\nsiteFiles({\n  sitemap: { exclude: ['/api/', '/drafts/'] }\n})\n```\n\n> **Note:** `exclude` and `filter` apply to pages Astro discovered in the build output. Entries you add yourself via `sources` are taken as-is and are not filtered again — drop them in the source function, or use `serialize` to filter across all entries.\n\n\n**Built-in priority defaults:** `/` → 1.0, depth 1 → 0.9, depth 2 → 0.8, depth 3+ → 0.7\n\n**Built-in changefreq defaults:** `/` and content paths (`/blog/`, `/artikel/`, etc.) → `weekly`, everything else → `monthly`\n\nBoth built-in defaults ignore a known locale prefix, so `/de/` is scored like `/` and `/de/blog/x/` like `/blog/x/` instead of being pushed a level down.\n\n**Your own rules match the real, prefixed path by default** — that is what lets you target a single language. On a multilingual site you usually want the opposite, so set `localeAgnosticRules: true` to have every rule matched against the locale-stripped path, and use a rule's own `allLocales` to make an exception either way:\n\n```ts\nsiteFiles({\n  sitemap: {\n    localeAgnosticRules: true,\n    changefreq: [\n      // matches /blog/, /de/blog/, /fr/blog/ …\n      { pattern: '/blog/', changefreq: 'daily' },\n      // opts back out — only the German campaign page\n      { pattern: '/de/aktion/', changefreq: 'hourly', allLocales: false },\n    ],\n  },\n})\n```\n\nLocales are taken from `sitemap.i18n`, which itself defaults to Astro's `i18n` config — so this works without repeating the locale list.\n\n**Disable:** `sitemap: false`\n\n## RSS feed\n\nConfigure the top-level `rss` option to generate an `rss.xml` at build time. `getItems` runs in `astro:build:done` — use filesystem reads rather than `getCollection()`, which is only available in Astro's SSR context.\n\n```ts\nsiteFiles({\n  rss: {\n    title: 'My Blog',\n    description: 'Latest articles about TypeScript and Astro.',\n    language: 'en',\n    getItems: async (siteUrl) => {\n      const { readdirSync, readFileSync } = await import('node:fs')\n      const matter = (await import('gray-matter')).default\n      const dir = './src/content/blog'\n      return readdirSync(dir)\n        .filter(f => f.endsWith('.mdx'))\n        .map(file => {\n          const { data } = matter(readFileSync(`${dir}/${file}`, 'utf-8'))\n          if (data.draft) return null\n          return {\n            title: data.title,\n            pubDate: data.date,\n            link: `${siteUrl}/blog/${file.replace(/\\.mdx$/, '')}/`,\n            description: data.description,\n          }\n        })\n        .filter(Boolean)\n        .sort((a, b) => new Date(b.pubDate) - new Date(a.pubDate))\n    },\n  },\n})\n```\n\nThe feed is its own resource, so it is written even with `sitemap: false`. The older `sitemap.rss` placement still works and is read as a fallback, but it is deprecated.\n\n**`rss` option reference:**\n\n| Option | Type | Description |\n|---|---|---|\n| `title` | `string` | **Required.** Feed title |\n| `description` | `string` | **Required.** Feed description |\n| `getItems` | `(siteUrl: string) => RssItem[]` | **Required.** Returns the feed items |\n| `filename` | `string` | Output filename — default `rss.xml` |\n| `feedUrl` | `string` | Self-link URL — defaults to `{siteUrl}/{filename}` |\n| `language` | `string` | BCP 47 language code, e.g. `'de-DE'` |\n| `copyright` | `string` | Copyright notice |\n| `managingEditor` | `string` | RFC 822 format: `email@domain.com (Name)` |\n| `feedCustomData` | `string` | Raw XML injected inside `<channel>` |\n| `xmlns` | `Record<string, string>` | Additional namespace declarations on `<rss>` |\n\nEach object returned by `getItems`:\n\n| Field | Type | Description |\n|---|---|---|\n| `title` | `string` | **Required.** Item title |\n| `pubDate` | `Date \\| string` | **Required.** Publication date |\n| `link` | `string` | **Required.** Full URL, root-relative path, or bare path — relative forms are joined onto `siteUrl` |\n| `description` | `string` | Short summary |\n| `guid` | `string` | Stable item identity (UUID, URN, …). Defaults to `link`, which is then marked `isPermaLink=\"true\"` |\n| `guidIsPermaLink` | `boolean` | Overrides whether the `guid` is announced as a resolvable URL |\n| `author` | `string` | Author name or email |\n| `categories` | `string[]` | Category tags |\n| `customData` | `string` | Raw XML injected inside `<item>` (e.g. for custom namespaced elements) |\n\nAn unparseable `pubDate` is omitted rather than rendered as `Invalid Date`, which would make the feed unreadable for every validator and reader.\n\n### RSS API route (`/rss` sub-path)\n\nFor a live feed served at a URL — useful in development or for SSR builds — use `createRssRoute` from the `/rss` sub-path. This helper runs inside Astro's SSR context, so `getCollection()` is available:\n\n```ts\n// src/pages/rss.xml.ts\nimport { createRssRoute } from '@casoon/astro-site-files/rss'\nimport { getCollection } from 'astro:content'\n\nexport const GET = createRssRoute({\n  title: 'My Blog',\n  description: 'Latest posts',\n  language: 'de-DE',\n  getItems: async (siteUrl) => {\n    const posts = await getCollection('blog', ({ data }) => !data.draft)\n    return posts\n      .sort((a, b) => b.data.date.getTime() - a.data.date.getTime())\n      .map(p => ({\n        title: p.data.title,\n        pubDate: p.data.date,\n        link: `${siteUrl}/blog/${p.id}/`,\n        description: p.data.description,\n      }))\n  },\n})\n```\n\nBoth approaches can coexist: the build-time `rss` option for static deploys, the API route for development previewing.\n\n## security.txt\n\nGenerated at `/.well-known/security.txt` per [RFC 9116](https://www.rfc-editor.org/rfc/rfc9116). The `contact` field is required by the specification.\n\n```ts\nsiteFiles({\n  security: {\n    contact: 'mailto:info@casoon.de',\n    policy: 'https://www.casoon.de/security-policy',\n    acknowledgments: 'https://www.casoon.de/hall-of-fame',\n    preferredLanguages: ['en', 'de'],\n    expires: '2027-01-01T00:00:00.000Z',\n    hiring: 'https://www.casoon.de/jobs'\n  }\n})\n```\n\n**Option reference:**\n\n| Option | Type | Description |\n|---|---|---|\n| `contact` | `string \\| string[]` | **Required.** `mailto:` or `https:` URI for reporting vulnerabilities |\n| `policy` | `string` | URL of the security policy |\n| `acknowledgments` | `string` | URL of the acknowledgments or hall-of-fame page |\n| `preferredLanguages` | `string[]` | BCP 47 language tags, e.g. `['en', 'de']` |\n| `expires` | `string \\| Date` | ISO 8601 expiry date — when to renew the file |\n| `encryption` | `string` | URL of the PGP public key |\n| `canonical` | `string` | Canonical URL of this `security.txt` file |\n| `hiring` | `string` | URL of a security-focused jobs page |\n\n**Disable:** Omit the option or set `security: false`\n\n**Generated output:**\n\n```\nContact: mailto:info@casoon.de\nExpires: 2027-01-01T00:00:00.000Z\nAcknowledgments: https://www.casoon.de/hall-of-fame\nPreferred-Languages: en, de\nPolicy: https://www.casoon.de/security-policy\nHiring: https://www.casoon.de/jobs\n```\n\n## humans.txt\n\nFollows the [humanstxt.org](https://humanstxt.org) convention.\n\n```ts\nsiteFiles({\n  humans: {\n    team: [\n      { name: 'Alice', role: 'Development', location: 'Berlin' },\n      { name: 'Bob', role: 'Design', twitter: '@bob' }\n    ],\n    thanks: ['Open Source Community', 'Our early users'],\n    technology: ['Astro', 'TypeScript', 'Tailwind CSS'],\n    note: 'Built with care.'\n  }\n})\n```\n\n**Option reference:**\n\n| Option | Type | Description |\n|---|---|---|\n| `team` | `TeamMember[]` | List of team members |\n| `thanks` | `string[]` | Acknowledgment entries |\n| `technology` | `string[]` | Technologies used — rendered as a comma-separated list |\n| `note` | `string` | Free-form note |\n| `lastUpdate` | `string \\| Date` | Defaults to the build date |\n\nEach entry in `team`:\n\n| Field | Type | Description |\n|---|---|---|\n| `name` | `string` | **Required.** Full name |\n| `role` | `string` | Job title or role |\n| `twitter` | `string` | Twitter / X handle |\n| `location` | `string` | City or country |\n| `email` | `string` | Contact email |\n\n**Disable:** Omit the option or set `humans: false`\n\n**Generated output:**\n\n```\n/* TEAM */\n    Name: Alice\n    Role: Development\n    Location: Berlin\n\n/* SITE LAST UPDATED */\n    2026-05-06\n\n/* TECHNOLOGY COLOPHON */\n    Astro, TypeScript, Tailwind CSS\n```\n\n## Build-time audit hints\n\nThe integration emits build-time hints when configuration looks incomplete or incorrect. Each hint has a rule ID, a level (`info` / `warn`), and a help message.\n\n**All rule IDs:**\n\n| Rule ID | Level | Triggered when |\n|---|---|---|\n| `robots/legal-pages-blocked` | warn | A legal page (`/privacy`, `/terms`, `/impressum`, …) is in `disallow` |\n| `llms/no-description` | info | `llms` has no `description` |\n| `llms/no-sections` | info | `llms` has no `sections` or `sources` |\n| `llms/sections-without-links` | info | Sections exist but none have `links` (and no `sources` configured) |\n| `security/no-expires` | warn | `security` has no `expires` date (required by RFC 9116) |\n| `security/invalid-expires` | error | `security.expires` is not a parseable date |\n| `security/expired` | error | `security.expires` is in the past — scanners discard the whole file |\n| `security/contact-not-a-uri` | error | A `contact` value has no URI scheme (`mailto:`, `https:`, `tel:`) |\n| `security/no-policy` | info | `security` has no `policy` URL |\n| `humans/no-team` | info | `humans` has no `team` entries |\n| `humans/no-technology` | info | `humans` has no `technology` entries |\n| `sitemap/no-site-url` | warn | No site URL is configured — `<loc>` entries will be relative |\n| `sitemap/empty-sitemap` | warn | Sitemap has no entries after all sources are resolved |\n| `sitemap/duplicate-urls` | warn/error | Duplicate URLs detected before deduplication (last wins) |\n| `sitemap/invalid-priority` | warn | One or more entries have `priority` outside `[0, 1]` |\n\n**Disable all hints:**\n\n```ts\nsiteFiles({ audit: false })\n```\n\n**Suppress specific rules:**\n\n```ts\nsiteFiles({\n  audit: {\n    disable: [\n      'llms/no-description',\n      'security/no-expires',\n    ],\n  },\n})\n```\n\n**`audit` option reference:**\n\n| Option | Type | Description |\n|---|---|---|\n| `enabled` | `boolean` | Set to `false` to silence all hints |\n| `disable` | `string[]` | Rule IDs to suppress individually |\n\nPassing `audit: false` is equivalent to `audit: { enabled: false }`.\n\n## Option defaults\n\n| Option | Default behavior |\n|---|---|\n| `robots` | Enabled — generates `robots.txt` that allows all crawlers by default |\n| `llms` | Disabled — requires `{ title }` |\n| `sitemap` | Enabled — built-in sitemap generation from Astro's build output |\n| `rss` | Disabled — requires `{ title, description, getItems }`. Written independently of `sitemap` |\n| `security` | Disabled — requires `{ contact }` |\n| `humans` | Disabled — generates when any option is provided |\n| `audit` | Enabled — emits build-time hints for all generated files |\n\n## Programmatic usage\n\nThe renderer functions are exported for use outside of the Astro integration:\n\n```ts\nimport {\n  renderRobotsTxt,\n  renderLlmsTxt,\n  renderSecurityTxt,\n  renderHumansTxt,\n  renderSitemapXml,\n  renderSitemapIndex,\n  renderRssFeed,\n  resolveEntry,\n  deduplicateEntries,\n  auditSitemap,\n  auditRobots,\n  auditLlms,\n  auditSecurity,\n  auditHumans,\n  filterIssues,\n  defaultRegistry,\n  REGISTRY_VERSION,\n} from '@casoon/astro-site-files'\nimport type {\n  AuditOptions,\n  AuditIssue,\n  RssConfig,\n  RssItem,\n  BotAction,\n  BotCategory,\n  RegistryBot,\n  Preset,\n} from '@casoon/astro-site-files'\n\n// With preset\nconst robots = renderRobotsTxt({ preset: 'seoOnly' }, 'https://example.com')\n\n// With manual overrides on top of a preset\nconst robots2 = renderRobotsTxt(\n  { preset: 'blockTraining', bots: { PerplexityBot: 'disallow' }, disallow: ['/admin'] },\n  'https://example.com',\n)\n\n// Without preset (manual)\nconst robots3 = renderRobotsTxt({ disallow: ['/admin'] }, 'https://example.com')\nconst llms = renderLlmsTxt({ title: 'My Site', description: 'A site.' })\nconst security = renderSecurityTxt({ contact: 'mailto:info@casoon.de' })\nconst humans = renderHumansTxt({ team: [{ name: 'Alice' }], technology: ['Astro'] })\n\nconst entries = [{ loc: '/blog/post/' }].map(e => resolveEntry(e, {}, 'https://example.com'))\nconst xml = renderSitemapXml(deduplicateEntries(entries))\n\nconst rss = renderRssFeed(\n  { title: 'My Blog', description: 'Latest posts', language: 'en' },\n  'https://example.com',\n  [{ title: 'Hello', pubDate: new Date(), link: '/blog/hello/' }],\n)\n```\n\n`defaultRegistry` exposes the full built-in bot list. `REGISTRY_VERSION` is an ISO date string of the last registry update — useful for debugging or displaying in tooling.\n\nThe `createRssRoute` helper is available from the `/rss` sub-path (see [RSS API route](#rss-api-route-rss-sub-path) above):\n\n```ts\nimport { createRssRoute } from '@casoon/astro-site-files/rss'\nimport type { CreateRssRouteOptions } from '@casoon/astro-site-files/rss'\n```\n\n---\n\n> This package covers static file generation. Actual crawl enforcement depends on whether bots respect these files — many do not.\n","readmeFilename":"README.md"}