{"_id":"@25xcodes/llmfeed-health-monitor","_rev":"8-96c225484558f7bf713c3898a73b9115","name":"@25xcodes/llmfeed-health-monitor","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.0":{"name":"@25xcodes/llmfeed-health-monitor","version":"1.0.0","keywords":["llmfeed","webmcp","mcp","health-monitor","feed-crawler","validation","ed25519","bot","outreach"],"author":{"name":"25xcodes"},"license":"MIT","_id":"@25xcodes/llmfeed-health-monitor@1.0.0","maintainers":[{"name":"25xcodes","email":"kiarash@25x.codes"}],"homepage":"https://github.com/kiarashplusplus/webmcp-tooling-suite#readme","bugs":{"url":"https://github.com/kiarashplusplus/webmcp-tooling-suite/issues"},"bin":{"llmfeed-health":"bin/llmfeed-health.js"},"dist":{"shasum":"3a20ef2c7586969a783832fb14d02eed9b6bee43","tarball":"https://registry.npmjs.org/@25xcodes/llmfeed-health-monitor/-/llmfeed-health-monitor-1.0.0.tgz","fileCount":21,"integrity":"sha512-lMB6nwd+zk1SG17yBPw4bReEtwD9TatOYNAO9GfYYFgcxLH8OkJg/rSQaeNf9RH0dxJIU9KT6wvWXE7fMWM7kQ==","signatures":[{"sig":"MEQCICGNgc3YGxObvArLwKjuXgHE22NQV/f/hRlnUyFKdJJaAiBbMfM/qlDZUMOT90SJ7KZY8L0w10qwX40fbjsmMQbCyw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@25xcodes%2fllmfeed-health-monitor@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":561096},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"6884101e43dc4358f30c2bae84d7036960d3327e","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"25xcodes","email":"kiarash@25x.codes"},"repository":{"url":"git+https://github.com/kiarashplusplus/webmcp-tooling-suite.git","type":"git","directory":"packages/health-monitor"},"_npmVersion":"10.8.2","description":"Feed health monitoring, crawling, and outreach automation for the LLMFeed ecosystem","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^1.0.0","typescript":"^5.8.3","@types/node":"^22.15.21","@25xcodes/llmfeed-validator":"^1.0.0"},"peerDependencies":{"@25xcodes/llmfeed-validator":"^1.0.0"},"optionalDependencies":{"node-cron":"^3.0.0","nodemailer":"^6.9.0","cron-parser":"^4.9.0","better-sqlite3":"^11.0.0"},"peerDependenciesMeta":{"@25xcodes/llmfeed-validator":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llmfeed-health-monitor_1.0.0_1764903390216_0.0012847186917959164","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@25xcodes/llmfeed-health-monitor","version":"1.0.1","keywords":["llmfeed","webmcp","mcp","health-monitor","feed-crawler","validation","ed25519","bot","outreach"],"author":{"name":"25xcodes"},"license":"MIT","_id":"@25xcodes/llmfeed-health-monitor@1.0.1","maintainers":[{"name":"25xcodes","email":"kiarash@25x.codes"}],"homepage":"https://github.com/kiarashplusplus/webmcp-tooling-suite#readme","bugs":{"url":"https://github.com/kiarashplusplus/webmcp-tooling-suite/issues"},"bin":{"llmfeed-health":"bin/llmfeed-health.js"},"dist":{"shasum":"b3aa48f38dc6334541a6d1e4bcc3959d18eaea84","tarball":"https://registry.npmjs.org/@25xcodes/llmfeed-health-monitor/-/llmfeed-health-monitor-1.0.1.tgz","fileCount":21,"integrity":"sha512-wf9Tg5ofN0D76NiTXzzHhLYh1fV+K4R3ZyN4b+2A61g8SP4Fr1nbsINFrDhLdUK3CQ7VMQfRf9Et9x65IH7Hzg==","signatures":[{"sig":"MEUCIBr6iMXvjWhUazoft0I1bOX9TqLTq5E+H7ZVue4VF17QAiEAidAxb1AsqqenVW3YOI1eRTetgO3GR5jRwaJ2rVB/Yhw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@25xcodes%2fllmfeed-health-monitor@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":569251},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"700c74165807a0d0419cb1059f69fd24d3f1b6bc","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"25xcodes","email":"kiarash@25x.codes"},"repository":{"url":"git+https://github.com/kiarashplusplus/webmcp-tooling-suite.git","type":"git","directory":"packages/health-monitor"},"_npmVersion":"10.8.2","description":"Feed health monitoring, crawling, and outreach automation for the LLMFeed ecosystem","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^1.0.0","typescript":"^5.8.3","@types/node":"^22.15.21","@25xcodes/llmfeed-validator":"^1.0.0"},"peerDependencies":{"@25xcodes/llmfeed-validator":"^1.0.0"},"optionalDependencies":{"node-cron":"^3.0.0","nodemailer":"^6.9.0","cron-parser":"^4.9.0","better-sqlite3":"^11.0.0"},"peerDependenciesMeta":{"@25xcodes/llmfeed-validator":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llmfeed-health-monitor_1.0.1_1764905281538_0.03840955130722068","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@25xcodes/llmfeed-health-monitor","version":"1.1.0","keywords":["llmfeed","webmcp","mcp","health-monitor","feed-crawler","validation","ed25519","bot","outreach"],"author":{"name":"25xcodes"},"license":"MIT","_id":"@25xcodes/llmfeed-health-monitor@1.1.0","maintainers":[{"name":"25xcodes","email":"kiarash@25x.codes"}],"homepage":"https://github.com/kiarashplusplus/webmcp-tooling-suite#readme","bugs":{"url":"https://github.com/kiarashplusplus/webmcp-tooling-suite/issues"},"bin":{"llmfeed-health":"bin/llmfeed-health.js"},"dist":{"shasum":"7362333fe6cf5b2d1f30ee83e4b68b8ac4bc8dbd","tarball":"https://registry.npmjs.org/@25xcodes/llmfeed-health-monitor/-/llmfeed-health-monitor-1.1.0.tgz","fileCount":21,"integrity":"sha512-Ef2GhjNH7Q4UuwdYwgdAnIX6829P8sNQe2ziF9m3F5Mzay9efIVUFxpaCkPhz8E9owHc+Aft+FUknwsPomU9qw==","signatures":[{"sig":"MEUCIQD6dJyS01KDODtCo5Tnp82cnzDPBCPolj/8w8O1pOmi+wIgCyYKyhcEACFmM6ZEXyqn871cFgpsjg3ObtTR1bCLoBc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@25xcodes%2fllmfeed-health-monitor@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":577306},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"47edd7f190dea2f8ba4d5b80fcad7fc4c22dfb8f","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"25xcodes","email":"kiarash@25x.codes"},"repository":{"url":"git+https://github.com/kiarashplusplus/webmcp-tooling-suite.git","type":"git","directory":"packages/health-monitor"},"_npmVersion":"10.8.2","description":"Feed health monitoring, crawling, and outreach automation for the LLMFeed ecosystem","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^1.0.0","typescript":"^5.8.3","@types/node":"^22.15.21","@25xcodes/llmfeed-validator":"^1.0.0"},"peerDependencies":{"@25xcodes/llmfeed-validator":"^1.0.0"},"optionalDependencies":{"node-cron":"^3.0.0","nodemailer":"^6.9.0","cron-parser":"^4.9.0","better-sqlite3":"^11.0.0"},"peerDependenciesMeta":{"@25xcodes/llmfeed-validator":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llmfeed-health-monitor_1.1.0_1764906614448_0.10699962013709174","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@25xcodes/llmfeed-health-monitor","version":"1.1.1","keywords":["llmfeed","webmcp","mcp","health-monitor","feed-crawler","validation","ed25519","bot","outreach"],"author":{"name":"25xcodes"},"license":"MIT","_id":"@25xcodes/llmfeed-health-monitor@1.1.1","maintainers":[{"name":"25xcodes","email":"kiarash@25x.codes"}],"homepage":"https://github.com/kiarashplusplus/webmcp-tooling-suite#readme","bugs":{"url":"https://github.com/kiarashplusplus/webmcp-tooling-suite/issues"},"bin":{"llmfeed-health":"bin/llmfeed-health.js"},"dist":{"shasum":"563243e8c42af14e488364634ec89cf92b35ee4e","tarball":"https://registry.npmjs.org/@25xcodes/llmfeed-health-monitor/-/llmfeed-health-monitor-1.1.1.tgz","fileCount":21,"integrity":"sha512-94BQgPXP349AukS9BOSNAtEv24M5L9lhYx7zRBcWB9jmDIo/hJMt7Q1sPSArFK1aHOrpb1nqWa/VKtoCeFwCmw==","signatures":[{"sig":"MEUCIG5NNh5zgun9N/W9NFI97cz9lOWB4icHaqp09HB0nE7GAiEA45JnB652c69oXtEWL+dQetOJ+eJKrPHWxvMuCGFzoNc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@25xcodes%2fllmfeed-health-monitor@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":579061},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"1dfc53705cbbe2c3f387b07c2ccc58332ff0b67e","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"25xcodes","email":"kiarash@25x.codes"},"repository":{"url":"git+https://github.com/kiarashplusplus/webmcp-tooling-suite.git","type":"git","directory":"packages/health-monitor"},"_npmVersion":"10.8.2","description":"Feed health monitoring, crawling, and outreach automation for the LLMFeed ecosystem","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^1.0.0","typescript":"^5.8.3","@types/node":"^22.15.21","@25xcodes/llmfeed-validator":"^1.0.0"},"peerDependencies":{"@25xcodes/llmfeed-validator":"^1.0.0"},"optionalDependencies":{"node-cron":"^3.0.0","nodemailer":"^6.9.0","cron-parser":"^4.9.0","better-sqlite3":"^11.0.0"},"peerDependenciesMeta":{"@25xcodes/llmfeed-validator":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llmfeed-health-monitor_1.1.1_1764907132426_0.4296676075747148","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@25xcodes/llmfeed-health-monitor","version":"1.1.2","keywords":["llmfeed","webmcp","mcp","health-monitor","feed-crawler","validation","ed25519","bot","outreach"],"author":{"name":"25xcodes"},"license":"MIT","_id":"@25xcodes/llmfeed-health-monitor@1.1.2","maintainers":[{"name":"25xcodes","email":"kiarash@25x.codes"}],"homepage":"https://github.com/kiarashplusplus/webmcp-tooling-suite#readme","bugs":{"url":"https://github.com/kiarashplusplus/webmcp-tooling-suite/issues"},"bin":{"llmfeed-health":"bin/llmfeed-health.js"},"dist":{"shasum":"63c2d371d43c30e24fea94127ae1942899506509","tarball":"https://registry.npmjs.org/@25xcodes/llmfeed-health-monitor/-/llmfeed-health-monitor-1.1.2.tgz","fileCount":21,"integrity":"sha512-pIl6cenm4Akl9oCRmAIHYr7zIj3jRtLz5k7bQpEt0JmLQaTBwWfz8yK123J7E4ERCukAE5BHYAoh9I5ZutfdAA==","signatures":[{"sig":"MEUCIQCbOFBpsfkhvq2RQWllcHaihW4JChx1NOhONL/9PP55OQIgSW0/iWDrdhCae4Lm2ZmeiA5Q+1VWCkx7yr+dmtNS2ec=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@25xcodes%2fllmfeed-health-monitor@1.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":579061},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"913711bc23cdd5a489c6936c07b186e4b9547b30","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"25xcodes","email":"kiarash@25x.codes"},"repository":{"url":"git+https://github.com/kiarashplusplus/webmcp-tooling-suite.git","type":"git","directory":"packages/health-monitor"},"_npmVersion":"10.8.2","description":"Feed health monitoring, crawling, and outreach automation for the LLMFeed ecosystem","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^1.0.0","typescript":"^5.8.3","@types/node":"^22.15.21","@25xcodes/llmfeed-validator":"^1.0.0"},"peerDependencies":{"@25xcodes/llmfeed-validator":"^1.0.0"},"optionalDependencies":{"node-cron":"^3.0.0","nodemailer":"^6.9.0","cron-parser":"^4.9.0","better-sqlite3":"^11.0.0"},"peerDependenciesMeta":{"@25xcodes/llmfeed-validator":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llmfeed-health-monitor_1.1.2_1764928972569_0.982829511183047","host":"s3://npm-registry-packages-npm-production"}},"1.1.6":{"name":"@25xcodes/llmfeed-health-monitor","version":"1.1.6","keywords":["llmfeed","webmcp","mcp","health-monitor","feed-crawler","validation","ed25519","bot","outreach"],"author":{"name":"25xcodes"},"license":"MIT","_id":"@25xcodes/llmfeed-health-monitor@1.1.6","maintainers":[{"name":"25xcodes","email":"kiarash@25x.codes"}],"homepage":"https://github.com/kiarashplusplus/webmcp-tooling-suite#readme","bugs":{"url":"https://github.com/kiarashplusplus/webmcp-tooling-suite/issues"},"bin":{"llmfeed-health":"bin/llmfeed-health.js"},"dist":{"shasum":"ec17af0923aaddc406114eed31d431c8be35816e","tarball":"https://registry.npmjs.org/@25xcodes/llmfeed-health-monitor/-/llmfeed-health-monitor-1.1.6.tgz","fileCount":21,"integrity":"sha512-91VHIcAtZWXVTwo1JWMi3QjTl8furjRtqnARHnII8TOLUO0oDomKtpt6Q5/nM4lZ2MbmsDPA+khswxlgmtXnsA==","signatures":[{"sig":"MEUCIQCX7/FlhYdCDdzu4DkmlAcP0b+QBntF5qVsjUpUYPEiWgIgNgUTTwHuo1tn/Fkixcy6dB/m0Lr99pAbMid7zt9CL+I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@25xcodes%2fllmfeed-health-monitor@1.1.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":580348},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"bba5ad6825733882894d97bc2a29df542887ec4f","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"25xcodes","email":"kiarash@25x.codes"},"repository":{"url":"git+https://github.com/kiarashplusplus/webmcp-tooling-suite.git","type":"git","directory":"packages/health-monitor"},"_npmVersion":"10.8.2","description":"Feed health monitoring, crawling, and outreach automation for the LLMFeed ecosystem","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.0.0","typescript":"^5.8.3","@types/node":"^22.15.21","@vitest/coverage-v8":"^4.0.0","@25xcodes/llmfeed-validator":"^1.0.0"},"peerDependencies":{"@25xcodes/llmfeed-validator":"^1.0.0"},"optionalDependencies":{"node-cron":"^3.0.0","nodemailer":"^6.9.0","cron-parser":"^4.9.0","better-sqlite3":"^11.0.0"},"peerDependenciesMeta":{"@25xcodes/llmfeed-validator":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llmfeed-health-monitor_1.1.6_1764933202275_0.8601573041810084","host":"s3://npm-registry-packages-npm-production"}},"1.1.7":{"name":"@25xcodes/llmfeed-health-monitor","version":"1.1.7","keywords":["llmfeed","webmcp","mcp","health-monitor","feed-crawler","validation","ed25519","bot","outreach"],"author":{"name":"25xcodes"},"license":"MIT","_id":"@25xcodes/llmfeed-health-monitor@1.1.7","maintainers":[{"name":"25xcodes","email":"kiarash@25x.codes"}],"homepage":"https://github.com/kiarashplusplus/webmcp-tooling-suite#readme","bugs":{"url":"https://github.com/kiarashplusplus/webmcp-tooling-suite/issues"},"bin":{"llmfeed-health":"bin/llmfeed-health.js"},"dist":{"shasum":"d399fe374cdf7311990cba18ac32a77b6061078d","tarball":"https://registry.npmjs.org/@25xcodes/llmfeed-health-monitor/-/llmfeed-health-monitor-1.1.7.tgz","fileCount":21,"integrity":"sha512-4m5KX8ybhtLaBL2U6xwhBHQvXBZJDsfvQ2qJnYnnrez/jlZLQy38v4vzOnfY4xRBI290jGcz5UcPanLzsOeNyg==","signatures":[{"sig":"MEUCIQCBdZJzt0pnbZdvAOI6Fzq2XYHLUvvGc//bnrTdJeFTkQIgQXHHZrS4LtsHGgyv+FcWwqFKTqHendCZj9Q7uvjTsnE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@25xcodes%2fllmfeed-health-monitor@1.1.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":580347},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"ce001248d2f1dbaacba3fcb9ce8c52f7aeb41ab4","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"25xcodes","email":"kiarash@25x.codes"},"repository":{"url":"git+https://github.com/kiarashplusplus/webmcp-tooling-suite.git","type":"git","directory":"packages/health-monitor"},"_npmVersion":"10.8.2","description":"Feed health monitoring, crawling, and outreach automation for the LLMFeed ecosystem","directories":{},"_nodeVersion":"20.19.6","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","vitest":"^4.0.0","typescript":"^5.8.3","@types/node":"^22.15.21","@vitest/coverage-v8":"^4.0.0","@25xcodes/llmfeed-validator":"^1.0.0"},"peerDependencies":{"@25xcodes/llmfeed-validator":"^1.0.0"},"optionalDependencies":{"node-cron":"^3.0.0","nodemailer":"^6.9.0","cron-parser":"^4.9.0","better-sqlite3":"^11.0.0"},"peerDependenciesMeta":{"@25xcodes/llmfeed-validator":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/llmfeed-health-monitor_1.1.7_1764938650817_0.9019197827613501","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@25xcodes/llmfeed-health-monitor","version":"1.2.0","description":"Feed health monitoring, crawling, and outreach automation for the LLMFeed ecosystem","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"}},"bin":{"llmfeed-health":"bin/llmfeed-health.js"},"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","test":"vitest run"},"keywords":["llmfeed","webmcp","mcp","health-monitor","feed-crawler","validation","ed25519","bot","outreach"],"author":{"name":"25xcodes"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/kiarashplusplus/webmcp-tooling-suite.git","directory":"packages/health-monitor"},"devDependencies":{"@25xcodes/llmfeed-validator":"^1.0.0","@types/node":"^22.15.21","@vitest/coverage-v8":"^4.0.0","tsup":"^8.5.0","typescript":"^5.8.3","vitest":"^4.0.0"},"peerDependencies":{"@25xcodes/llmfeed-validator":"^1.0.0"},"peerDependenciesMeta":{"@25xcodes/llmfeed-validator":{"optional":true}},"optionalDependencies":{"better-sqlite3":"^11.0.0","nodemailer":"^6.9.0","node-cron":"^3.0.0","cron-parser":"^4.9.0"},"_id":"@25xcodes/llmfeed-health-monitor@1.2.0","gitHead":"06b246443edf450eb842ec3e38e47b339debb92e","bugs":{"url":"https://github.com/kiarashplusplus/webmcp-tooling-suite/issues"},"homepage":"https://github.com/kiarashplusplus/webmcp-tooling-suite#readme","_nodeVersion":"20.19.6","_npmVersion":"10.8.2","dist":{"integrity":"sha512-qgYC8vMd1En0H+qalmC8xHs8orGcXZimZO2Z/cLgDJC3PfyKUNYyGWmarGJWRbetJD1uwfbTEDhiSja0I98p3g==","shasum":"2c27e8a88ee854728dd94cf668e3ec84c4b7cccb","tarball":"https://registry.npmjs.org/@25xcodes/llmfeed-health-monitor/-/llmfeed-health-monitor-1.2.0.tgz","fileCount":21,"unpackedSize":580347,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@25xcodes%2fllmfeed-health-monitor@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDvV3OzTQR5Y0jCrMQY4iYKjWpo3kYdCh/v6RWxCj02BwIhAOsG8ES0YaLtIyvVxryl5s8+t03jmhatERE0d13uyIrq"}]},"_npmUser":{"name":"25xcodes","email":"kiarash@25x.codes"},"directories":{},"maintainers":[{"name":"25xcodes","email":"kiarash@25x.codes"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/llmfeed-health-monitor_1.2.0_1764957262409_0.3604546973484657"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-05T02:56:30.092Z","modified":"2025-12-05T17:54:22.945Z","1.0.0":"2025-12-05T02:56:30.374Z","1.0.1":"2025-12-05T03:28:01.710Z","1.1.0":"2025-12-05T03:50:14.612Z","1.1.1":"2025-12-05T03:58:52.606Z","1.1.2":"2025-12-05T10:02:52.702Z","1.1.6":"2025-12-05T11:13:22.463Z","1.1.7":"2025-12-05T12:44:11.016Z","1.2.0":"2025-12-05T17:54:22.583Z"},"bugs":{"url":"https://github.com/kiarashplusplus/webmcp-tooling-suite/issues"},"author":{"name":"25xcodes"},"license":"MIT","homepage":"https://github.com/kiarashplusplus/webmcp-tooling-suite#readme","keywords":["llmfeed","webmcp","mcp","health-monitor","feed-crawler","validation","ed25519","bot","outreach"],"repository":{"type":"git","url":"git+https://github.com/kiarashplusplus/webmcp-tooling-suite.git","directory":"packages/health-monitor"},"description":"Feed health monitoring, crawling, and outreach automation for the LLMFeed ecosystem","maintainers":[{"name":"25xcodes","email":"kiarash@25x.codes"}],"readme":"# @25xcodes/llmfeed-health-monitor\n\nA comprehensive health monitoring system for the LLMFeed ecosystem. Crawls feeds, tracks health history, and notifies feed owners about validation issues.\n\n## Features\n\n- 🔍 **Feed Crawling** - Validate feeds against the LLMFeed spec\n- 📊 **Health Tracking** - SQLite storage for historical health data\n- 🤖 **Smart Notifications** - GitHub issues, email, and Twitter DM support\n- ⏰ **Scheduled Monitoring** - Cron-based crawl scheduling\n- 🚫 **Opt-out Respect** - Honor robots.txt and feed metadata opt-outs\n- 📝 **Report Generation** - Beautiful HTML and JSON reports\n- 🔐 **Rate Limiting** - 1 message per domain per 24h by default\n\n## Installation\n\n```bash\nnpm install @25xcodes/llmfeed-health-monitor\n```\n\n## CLI Usage\n\n```bash\n# Check a single feed\nnpx llmfeed-health check https://example.com/.well-known/mcp.llmfeed.json\n\n# Crawl multiple feeds\nnpx llmfeed-health crawl feed1.json feed2.json --format json\n\n# Generate HTML report\nnpx llmfeed-health report https://example.com -o report.html\n\n# Start scheduled monitoring\nnpx llmfeed-health monitor https://25x.codes --schedule \"0 */6 * * *\" --db feeds.db\n\n# View stats\nnpx llmfeed-health stats --db feeds.db\n```\n\n## API Usage\n\n### Basic Feed Check\n\n```typescript\nimport { crawlFeed, generateReport } from '@25xcodes/llmfeed-health-monitor'\n\nconst result = await crawlFeed('https://example.com/.well-known/mcp.llmfeed.json')\n\nconsole.log('Reachable:', result.healthCheck.reachable)\nconsole.log('Score:', result.healthCheck.validation?.score)\nconsole.log('Issues:', result.healthCheck.validation?.issues)\n\n// Generate HTML report\nif (!result.optedOut) {\n  const report = generateReport(result.feed, result.healthCheck)\n  console.log(report.html)\n}\n```\n\n### Scheduled Monitoring with Notifications\n\n```typescript\nimport { \n  createScheduler, \n  SQLiteStorage \n} from '@25xcodes/llmfeed-health-monitor'\n\n// Set up SQLite storage\nconst storage = new SQLiteStorage('./feeds.db')\nawait storage.init()\n\n// Create scheduler\nconst scheduler = await createScheduler({\n  schedule: '0 * * * *', // Every hour\n  monitor: {\n    feeds: [\n      { url: 'https://25x.codes/.well-known/mcp.llmfeed.json' },\n      { url: 'https://example.com/.well-known/mcp.llmfeed.json' },\n    ],\n    respectOptOut: true,\n    minScoreThreshold: 50, // Only notify if score < 50\n  },\n  notifier: {\n    githubToken: process.env.GITHUB_TOKEN,\n    dryRun: false, // Set to true for testing\n  },\n  storage,\n  onCrawl: (result, report) => {\n    console.log(`Crawled ${result.feed.url} - Score: ${result.healthCheck.validation?.score}`)\n  },\n  onNotify: (feedId, channel, success) => {\n    console.log(`Notified ${feedId} via ${channel}: ${success ? '✅' : '❌'}`)\n  },\n})\n\n// Run initial crawl\nawait scheduler.run()\n\n// Scheduler will continue running on schedule\n// Call scheduler.stop() to stop\n```\n\n### Custom Notification Channels\n\n```typescript\nimport { sendNotification } from '@25xcodes/llmfeed-health-monitor'\n\n// Send GitHub issue\nconst action = await sendNotification({\n  feed: result.feed,\n  healthCheck: result.healthCheck,\n  channel: 'github',\n  reportUrl: 'https://example.com/report.html',\n}, {\n  githubToken: process.env.GITHUB_TOKEN,\n}, [])\n\nconsole.log('Created issue:', action.url)\n```\n\n### Discover Feeds on a Domain\n\n```typescript\nimport { discoverFeeds } from '@25xcodes/llmfeed-health-monitor'\n\nconst feeds = await discoverFeeds('example.com')\n// Returns: ['https://example.com/.well-known/mcp.llmfeed.json', ...]\n```\n\n## Opt-out Mechanisms\n\nFeed owners can opt out of health monitoring:\n\n### 1. robots.txt\n\n```txt\nUser-agent: LLMFeed-Health-Monitor\nDisallow: /\n```\n\n### 2. Feed Metadata\n\n```json\n{\n  \"feed_type\": \"mcp\",\n  \"_meta\": {\n    \"health-monitor\": \"noindex\"\n  }\n}\n```\n\n## Notification Channels\n\n### GitHub Issues\n\nCreates issues on detected GitHub repositories with:\n- Issue breakdown (errors/warnings)\n- Fix suggestions\n- One-click PR link\n- Opt-out instructions\n\nRequires: `GITHUB_TOKEN` environment variable\n\n### Email\n\nSends friendly emails with fix suggestions.\n\nRequires SMTP configuration:\n```typescript\n{\n  email: {\n    host: 'smtp.example.com',\n    port: 587,\n    user: 'user@example.com',\n    pass: 'password',\n    from: 'LLMFeed Bot <bot@example.com>',\n  }\n}\n```\n\n### Twitter DM\n\nSends direct messages to feed owner's Twitter handle (if found in feed metadata).\n\nRequires Twitter API credentials.\n\n## Environment Variables\n\n| Variable | Description |\n|----------|-------------|\n| `GITHUB_TOKEN` | GitHub PAT for creating issues |\n| `SMTP_HOST` | SMTP server hostname |\n| `SMTP_USER` | SMTP username |\n| `SMTP_PASS` | SMTP password |\n| `SMTP_FROM` | Email sender address |\n| `TWITTER_API_KEY` | Twitter API key |\n| `TWITTER_API_SECRET` | Twitter API secret |\n| `TWITTER_ACCESS_TOKEN` | Twitter access token |\n| `TWITTER_ACCESS_SECRET` | Twitter access token secret |\n\n## Storage Adapters\n\n### Memory Storage (default)\n```typescript\nimport { MemoryStorage } from '@25xcodes/llmfeed-health-monitor'\nconst storage = new MemoryStorage()\n```\n\n### SQLite Storage\n```typescript\nimport { SQLiteStorage } from '@25xcodes/llmfeed-health-monitor'\nconst storage = new SQLiteStorage('./feeds.db')\nawait storage.init()\n```\n\n## Bot Tone\n\nThe notification messages follow these principles:\n- **Friendly, slightly chaotic, zero ego**\n- Helpful suggestions, not demands\n- Clear opt-out instructions\n- Respect for feed owners' time\n\n## Related Packages\n\n- [`@25xcodes/llmfeed-validator`](https://www.npmjs.com/package/@25xcodes/llmfeed-validator) - Validate LLMFeed files\n- [`@25xcodes/llmfeed-signer`](https://www.npmjs.com/package/@25xcodes/llmfeed-signer) - Sign feeds with Ed25519\n\n## License\n\nMIT - See [LICENSE](../LICENSE) for details.\n","readmeFilename":"README.md"}