{"_id":"@arihantdeva/heimdall","_rev":"19-d71dfb206808672110c79ff53d1db1c2","name":"@arihantdeva/heimdall","dist-tags":{"latest":"0.12.4"},"versions":{"0.2.0":{"name":"@arihantdeva/heimdall","version":"0.2.0","license":"MIT","_id":"@arihantdeva/heimdall@0.2.0","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"8d34db22c56997df687fbe28354056437c406201","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.2.0.tgz","fileCount":127,"integrity":"sha512-PSQvkaSosvUYh69XCPMj8vk8myY0lnVqm7K63NhdsDDYoDOfEf7a2zvE//Me+ycD5HeXfzY2EjR4VdaZmnhLpA==","signatures":[{"sig":"MEUCIQCPMAoZAo5MLgoMRirfp1n4g7AOMEbYjmLV8iJ48Q3GvQIgVIxecTI3TUmIj7JEw3/LXv4SxFECQhQmQ1Blyh5wN14=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1087318},"type":"module","engines":{"node":">=22.5"},"gitHead":"34618fb31040a93eaa880eb49eafc3b03aeeaf72","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents (orchestration over Graft-style semantic memory backends)","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.2.0_1787467356704_0.7601539280413794","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@arihantdeva/heimdall","version":"0.2.1","license":"MIT","_id":"@arihantdeva/heimdall@0.2.1","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"2175aae3c5bcd0a8b67989265fc05a976436253b","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.2.1.tgz","fileCount":132,"integrity":"sha512-stdNSxRfuh7slRBcLzvO6eZVLfCozxP82wrTdMXB5b6FhaE4HDwOsyPL2GoCWcnqmbYmJKhuyLEZzrIlClFmxg==","signatures":[{"sig":"MEUCIGCXmwQQMNFPPlqA2/XFwWbGswiby4CL6vnSxEtV7vlEAiEA7gGVsrHGVj9rk1xIPOnOqiqvecdRnwllAbsOVtAxB5k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1105391},"type":"module","engines":{"node":">=22.5"},"gitHead":"fcbb3779d74a8f28b58e59048106c1fc35a9db8e","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents (orchestration over Graft-style semantic memory backends)","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.2.1_1787529934050_0.9119879065872261","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@arihantdeva/heimdall","version":"0.3.0","license":"MIT","_id":"@arihantdeva/heimdall@0.3.0","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"f7aa46b4f7f10f92927169e26ba7e22e621bba1f","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.3.0.tgz","fileCount":132,"integrity":"sha512-tg4tFHuoozPdwDJb1f1lniAMmcParTW1VKohzrIfdQ8BfAXR9iSr4WQwCGbXdruENjGU9dDkTzZn2Mn6WgwnCg==","signatures":[{"sig":"MEUCIQCOnV1C9SJZ2Ck02OeJtn7ij0j7oUyOvg+HzILHq3rmnAIgEcEfv96aB83NAO8ot7/pJ7p/s1OV1hZljxXwChHSN1Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1106350},"type":"module","engines":{"node":">=22.5"},"gitHead":"fd9f2b25189cc35708874e2eb79a5a2f77b626f6","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents (orchestration over Graft-style semantic memory backends)","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.3.0_1787546540299_0.36852018929506225","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@arihantdeva/heimdall","version":"0.4.0","license":"MIT","_id":"@arihantdeva/heimdall@0.4.0","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"17965ef36b606a1913e8610fa694c5d427e87a72","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.4.0.tgz","fileCount":133,"integrity":"sha512-FiDhE88Nd33AUSE1TAaJ+36PSf6IxTCK1tGbLgaUJiCpkmxhrlGcBXJr6+ZMcpYOisE+85eIr6zwOeXYQdRBDA==","signatures":[{"sig":"MEUCIQDwPsuwfFoz6TsIG76dc/6sjzbaxo2dB3CE3aHlrX0ueAIgDw/3AKnsOzCImx8ahwWUqlkPJNWmhqzSmh2dgRF10QU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1113188},"type":"module","engines":{"node":">=22.5"},"gitHead":"147bf1f3c645ad738a295d59da7a3075504871c3","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents (orchestration over Graft-style semantic memory backends)","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.4.0_1787549684770_0.9874410407027732","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@arihantdeva/heimdall","version":"0.5.0","license":"MIT","_id":"@arihantdeva/heimdall@0.5.0","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"de3d7dbc025cf242a4e84c218597f160725b45ce","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.5.0.tgz","fileCount":133,"integrity":"sha512-VANRoMbDNHjWpvkYuzJrYcvZ1Lriu1DZXMy1UL1r1UjHeMVJZGZEKxQ+R3hMFtiCqpt9zqHJSRPu8NubIbPidA==","signatures":[{"sig":"MEUCIQDjN0aamF40W2LdCXfJ220S0oVpI16hUEQo/JFIoSBMHAIgEYyJtoWlCssT95zSih3WlY4lsDpkGBkg3OzukUrSeV8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1115125},"type":"module","engines":{"node":">=22.5"},"gitHead":"1f660b8f1759d5325196e112a15adb425c51c276","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents (orchestration over Graft-style semantic memory backends)","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.5.0_1787550542648_0.5445705635665969","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@arihantdeva/heimdall","version":"0.5.1","keywords":["ai","agent","memory","knowledge","rag","code-graph","semantic-search","embeddings","local-first","cross-repo"],"license":"MIT","_id":"@arihantdeva/heimdall@0.5.1","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"homepage":"https://github.com/ArihantDeva/heimdall","bugs":{"url":"https://github.com/ArihantDeva/heimdall/issues"},"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"eeebc0d440713b25159c686a1a1d3c6a0c35f322","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.5.1.tgz","fileCount":133,"integrity":"sha512-+UDAk370LSEM5pgM/084qlqJCPmdSh1TnHNJWmmzEOSAm34DaLNIz49sUQUmBtT927Q3CykJln1dfJbIcOe1+A==","signatures":[{"sig":"MEYCIQCxBvXhrKvAKj8qqPz0jYwbyI23qXWedf3M2W+lrQTBywIhAL+QqGLJASlNXXfOkskg/rKAw7/qk2zoWvsddzpr6hnQ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1115286},"type":"module","engines":{"node":">=22.5"},"gitHead":"9e2e3fef4546a34f20df7cac87acc47a80519c90","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"repository":{"url":"git+https://github.com/ArihantDeva/heimdall.git","type":"git"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents: cross-repo memory with trust verdicts, zero-token CPU-only indexing, hybrid retrieval","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.5.1_1787591596104_0.3409563989639415","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"@arihantdeva/heimdall","version":"0.5.2","keywords":["ai","agent","memory","knowledge","rag","code-graph","semantic-search","embeddings","local-first","cross-repo"],"license":"MIT","_id":"@arihantdeva/heimdall@0.5.2","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"homepage":"https://github.com/ArihantDeva/heimdall","bugs":{"url":"https://github.com/ArihantDeva/heimdall/issues"},"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"f32228fdb283c42e6c39ae57f89aa536caea4b92","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.5.2.tgz","fileCount":134,"integrity":"sha512-IR/ekEF+n4j6uUPyie9hWqDK1RnPA+MFy4yJLG6LJS2QJ3SbxXsXeF2PNr0eRfQOGXrPhtXsVOuGjSv+u0NGKw==","signatures":[{"sig":"MEYCIQDe9Ge09bOLu++NVVIRM+Q8APs9Ddzvlyihs9RZPvgmfwIhAI7XZKZXog1xhmh/gannjg72GY/aKvq6ByiMQxPBdloU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1116087},"type":"module","engines":{"node":">=22.5"},"gitHead":"22d7844f86a7be5d67a4506de4ebd6f1db6e9a27","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"repository":{"url":"git+https://github.com/ArihantDeva/heimdall.git","type":"git"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents: cross-repo memory with trust verdicts, zero-token CPU-only indexing, hybrid retrieval","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.5.2_1787595610991_0.808595010261935","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@arihantdeva/heimdall","version":"0.6.0","keywords":["ai","agent","memory","knowledge","rag","code-graph","semantic-search","embeddings","local-first","cross-repo"],"license":"MIT","_id":"@arihantdeva/heimdall@0.6.0","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"homepage":"https://github.com/ArihantDeva/heimdall","bugs":{"url":"https://github.com/ArihantDeva/heimdall/issues"},"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"1bd72f5c5dbe88adb9ab566061ef054be850fdcb","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.6.0.tgz","fileCount":43,"integrity":"sha512-7wiKBwRl1hk0o+6PyH/KUO6kuTCL0ysj6Fxhrb1Jef60B6D21JbrGjA51tMKNSrIPMsaSpvzyz0H0zh6qmVGhw==","signatures":[{"sig":"MEUCIEfhKuZEPKYSYsgQEZRYf41h4YHv89/H2hwZzO7O5eecAiEA9VnmefZxOaelBpivCCw/NMKrlLoSLJoZU0kO0mOlnX0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":202370},"type":"module","engines":{"node":">=22.5"},"gitHead":"52a1a728ea6aa70b6ee6ae6b92141da2aeac0704","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit","postinstall":"node bin/postinstall.mjs"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"repository":{"url":"git+https://github.com/ArihantDeva/heimdall.git","type":"git"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents: cross-repo memory with trust verdicts, zero-token CPU-only indexing, hybrid retrieval","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.6.0_1787606944544_0.8136894891496249","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@arihantdeva/heimdall","version":"0.6.1","keywords":["ai","agent","memory","knowledge","rag","code-graph","semantic-search","embeddings","local-first","cross-repo"],"license":"MIT","_id":"@arihantdeva/heimdall@0.6.1","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"homepage":"https://github.com/ArihantDeva/heimdall","bugs":{"url":"https://github.com/ArihantDeva/heimdall/issues"},"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"6bdf173932149e6f8bf5cc24d0af039b234a115f","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.6.1.tgz","fileCount":44,"integrity":"sha512-DuDbGQkaP6md+Djy8ysLoOEVdLMrriFddCxOXKuF955J+xp6q1wy1xl2p472LAMaCMyCo1PVjpiso9zPhuG9YQ==","signatures":[{"sig":"MEQCIAplNLU1Fm3w4r2NKOGxMFQZskcqGAdv/YX1zOJlGFi+AiAswU4tOp7ZFWxm3XxbVRks3obF2y7IjJ21H0Gkfp4QMw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":209248},"type":"module","engines":{"node":">=22.5"},"gitHead":"a9c536267a93ec9a33dab9571c1f1cebe88f72a4","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit","postinstall":"node bin/postinstall.mjs"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"repository":{"url":"git+https://github.com/ArihantDeva/heimdall.git","type":"git"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents: cross-repo memory with trust verdicts, zero-token CPU-only indexing, hybrid retrieval","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.6.1_1787643535474_0.32333797083142435","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@arihantdeva/heimdall","version":"0.6.2","keywords":["ai","agent","memory","knowledge","rag","code-graph","semantic-search","embeddings","local-first","cross-repo"],"license":"MIT","_id":"@arihantdeva/heimdall@0.6.2","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"homepage":"https://github.com/ArihantDeva/heimdall","bugs":{"url":"https://github.com/ArihantDeva/heimdall/issues"},"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"6fdd541d52d1dcbf0edda6c8983e040bdb8093de","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.6.2.tgz","fileCount":44,"integrity":"sha512-qyEhB+e1b+IDO23vhvbHQFcQlCUj+8fMnCmMAb8MNO6fERp7zDMF10vBXGqwLl4/qDVetLuaEwzq/lEDvNaXfg==","signatures":[{"sig":"MEQCIFCV+Lva8QKKHS/ZjqwkyDsVK2rluVfsrRWArT78OeQjAiAwvitJFg8m8P03nQodAWivgXTHUHdLWNVHW+qGDSedUQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":215094},"type":"module","engines":{"node":">=22.5"},"scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit","postinstall":"node bin/postinstall.mjs"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"repository":{"url":"git+https://github.com/ArihantDeva/heimdall.git","type":"git"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents: cross-repo memory with trust verdicts, zero-token CPU-only indexing, hybrid retrieval","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.6.2_1787663245727_0.9491283108911954","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@arihantdeva/heimdall","version":"0.7.0","keywords":["ai","agent","memory","knowledge","rag","code-graph","semantic-search","embeddings","local-first","cross-repo"],"license":"MIT","_id":"@arihantdeva/heimdall@0.7.0","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"homepage":"https://github.com/ArihantDeva/heimdall","bugs":{"url":"https://github.com/ArihantDeva/heimdall/issues"},"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"0f86ddca7cf05105aa268c7587e49c2f420151e6","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.7.0.tgz","fileCount":45,"integrity":"sha512-MmCh1bCJwz+fzEbEnXhvcrRSLnKR4ERXINzTy8FQkyTZLE3uHosVOR1VBbN42ca5MZCJuRwxuOWmIGmjx91F0A==","signatures":[{"sig":"MEUCICBku/vRllyLWCT+AZa5mcAlXd41cSiSBa2oj7+GI96aAiEA0RGzUvnQ+rfqyHA+RiiJfLN9JKU5wsm//Whzk6llCu4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":234290},"type":"module","engines":{"node":">=22.5"},"gitHead":"5a1b610800c542c104a893a6640ddd65fd31b797","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit","postinstall":"node bin/postinstall.mjs"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"repository":{"url":"git+https://github.com/ArihantDeva/heimdall.git","type":"git"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents: cross-repo memory with trust verdicts, zero-token CPU-only indexing, hybrid retrieval","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.7.0_1787694281636_0.4323331445602723","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@arihantdeva/heimdall","version":"0.9.0","keywords":["ai","agent","memory","knowledge","rag","code-graph","semantic-search","embeddings","local-first","cross-repo"],"license":"MIT","_id":"@arihantdeva/heimdall@0.9.0","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"homepage":"https://github.com/ArihantDeva/heimdall","bugs":{"url":"https://github.com/ArihantDeva/heimdall/issues"},"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"e5b3d579ba378ebb06358018bb00a014f9ab545d","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.9.0.tgz","fileCount":183,"integrity":"sha512-vmkJ3mu62BLzAv18PTG3+5STnbYTEMwE+qzoRFcQaaJqdMFjJORvpS2hwA8wu5b/com5rBbum+1x8/nmJEWGaw==","signatures":[{"sig":"MEUCIQCI4HkUtT46NL85P3xEPaAJFCmewq3PIcXKUhpRvmmHxAIgFx6in2g3tDZGFI6mKgkvfIHwZjo+hnlQ9OpE2j/5BIw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3088695},"type":"module","engines":{"node":">=22.5"},"gitHead":"2be0fd09a9794cff7ba7af8b75d5cb83fceedbc8","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit","postinstall":"node bin/postinstall.mjs"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"repository":{"url":"git+https://github.com/ArihantDeva/heimdall.git","type":"git"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents: cross-repo memory with trust verdicts, zero-token CPU-only indexing, hybrid retrieval","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.9.0_1788708738931_0.2148745587566836","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@arihantdeva/heimdall","version":"0.10.0","keywords":["ai","agent","memory","knowledge","rag","code-graph","semantic-search","embeddings","local-first","cross-repo"],"license":"MIT","_id":"@arihantdeva/heimdall@0.10.0","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"homepage":"https://github.com/ArihantDeva/heimdall","bugs":{"url":"https://github.com/ArihantDeva/heimdall/issues"},"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"da25bba22e95cc965575c3dd1ce6a48442321cad","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.10.0.tgz","fileCount":183,"integrity":"sha512-z9WlKO88bw22NkoftM56qdi4EYc6GS4u35HpqjNxVLhaqywNat072f87ZifqcgjJ9VxIDpYYGZz58HQwoOJd9Q==","signatures":[{"sig":"MEYCIQDxhHzj7bFZWaV3XbFhBs8JsILP3Wsyss4f7xQE6MMxSgIhAM30cT8KpK6pTJomzyiNAEQyBAlqLrF/JpscF8oZaQiI","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3093570},"type":"module","engines":{"node":">=22.5"},"gitHead":"b2e47fa2998867bdc9713dd1561d15da1d0adbb9","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit","postinstall":"node bin/postinstall.mjs"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"repository":{"url":"git+https://github.com/ArihantDeva/heimdall.git","type":"git"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents: cross-repo memory with trust verdicts, zero-token CPU-only indexing, hybrid retrieval","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.10.0_1789084937911_0.3198058271380684","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@arihantdeva/heimdall","version":"0.11.0","keywords":["ai","agent","memory","knowledge","rag","code-graph","semantic-search","embeddings","local-first","cross-repo"],"license":"MIT","_id":"@arihantdeva/heimdall@0.11.0","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"homepage":"https://github.com/ArihantDeva/heimdall","bugs":{"url":"https://github.com/ArihantDeva/heimdall/issues"},"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"06eb6f0bd32022cb0fde02af7e45f39e1c55f334","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.11.0.tgz","fileCount":201,"integrity":"sha512-enHm5bNPJ01CZIiWU2ZdOBhYS/LQue2pbnktc6KJS+gL/9jUM06REB7g+a2+ScUSOtR5Y9s2Zmn2Yui+enembw==","signatures":[{"sig":"MEYCIQCipbQfXbI+T8/D0JvJyg9vY35sXYc6d/YvAwqqc2tkDwIhAMsi6LkzRno5gX+QLCC11C58vKYYr1PYZks8QOOWhD6c","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDMYTaAylQ71eU1wXJsAcrxcFRw46swJyJtW99+ZgULXAIhAIA7ZqCmn3WIvxsRIXvvWdfsd44wQGiwG8BNxiBJmHIz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3387381},"type":"module","engines":{"node":">=22.5"},"scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit","postinstall":"node bin/postinstall.mjs"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"repository":{"url":"git+https://github.com/ArihantDeva/heimdall.git","type":"git"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents: cross-repo memory with trust verdicts, zero-token CPU-only indexing, hybrid retrieval","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.11.0_1789589153550_0.9931893962345992","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@arihantdeva/heimdall","version":"0.12.0","keywords":["pi-package","ai","agent","memory","knowledge","rag","code-graph","semantic-search","embeddings","local-first","cross-repo"],"license":"MIT","_id":"@arihantdeva/heimdall@0.12.0","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"homepage":"https://github.com/ArihantDeva/heimdall","bugs":{"url":"https://github.com/ArihantDeva/heimdall/issues"},"pi":{"extensions":["./extensions"]},"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"bafb3ad2e9537c7bc048a88642126603fc074ff7","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.12.0.tgz","fileCount":201,"integrity":"sha512-fK5MDDN87M8cfzukgCSHGM9FjN/QySarZc+JyQwK07fQL41jVVzGYTrhcayqz0Krhq3xR1A3c/pCr6Hg3ezOwA==","signatures":[{"sig":"MEYCIQCDeZV9GGJM9wYPzjBwRcE5zx8Z/tCO9UJyXacjEiEGmAIhALlBns3tXmUBfb/7j9QOh22/cTbJRu328qv912HQK4+7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBUQLDhofLEgMhP7mWPCUwVXKu4dndObehlhUYaSjcuNAiAXPJ5+kosXrg0YgqgGAZ8TurygU0eOv65/WEbYFYo04A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3388938},"type":"module","engines":{"node":">=22.5"},"gitHead":"fa56856ca370a5be68c08b42383a38511370a8ea","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit","postinstall":"node bin/postinstall.mjs"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"repository":{"url":"git+https://github.com/ArihantDeva/heimdall.git","type":"git"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents: cross-repo memory with trust verdicts, zero-token CPU-only indexing, hybrid retrieval","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.12.0_1789771564084_0.6310274352135767","host":"s3://npm-registry-packages-npm-production"}},"0.12.1":{"name":"@arihantdeva/heimdall","version":"0.12.1","keywords":["pi-package","ai","agent","memory","knowledge","rag","code-graph","semantic-search","embeddings","local-first","cross-repo"],"license":"MIT","_id":"@arihantdeva/heimdall@0.12.1","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"homepage":"https://github.com/ArihantDeva/heimdall","bugs":{"url":"https://github.com/ArihantDeva/heimdall/issues"},"pi":{"extensions":["./extensions"]},"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"6841108d8757a6659998654ba1b7ee80f0decef3","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.12.1.tgz","fileCount":203,"integrity":"sha512-rWaiKkPnO9yD3MNyI+Esbtqt3SdTgD7ysOV/e1JhdkRWwOYFKNrEUW6S3KiOtSm6koNoU6AeBRf22Ec3wmuI2A==","signatures":[{"sig":"MEQCICYPTxCD15ujY7aqFWzfJ2Lmc4ubuwGqaN2pCiFBMytyAiBReR0cqhW6xcnmE4iBp6TbshSb5c55ahATQQojan7X9w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDWzl7oYETq9qrziV7/EvcB3ymjma+RWvghe5p2rLd8PgIhAMbnvuM6mu3idIVdXYjLjyc7F3eKU2+Soqf/LUgQvcHi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3893970},"type":"module","image":"https://raw.githubusercontent.com/ArihantDeva/heimdall/main/docs/assets/demo.png","video":"https://raw.githubusercontent.com/ArihantDeva/heimdall/main/docs/assets/demo.mp4","engines":{"node":">=22.5"},"gitHead":"fdbddbcdbf3c6f35521f06b3469c45159ef14a16","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit","postinstall":"node bin/postinstall.mjs"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"repository":{"url":"git+https://github.com/ArihantDeva/heimdall.git","type":"git"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents: cross-repo memory with trust verdicts, zero-token CPU-only indexing, hybrid retrieval","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.12.1_1789773179640_0.6289830985768734","host":"s3://npm-registry-packages-npm-production"}},"0.12.2":{"name":"@arihantdeva/heimdall","version":"0.12.2","keywords":["pi-package","ai","agent","memory","knowledge","rag","code-graph","semantic-search","embeddings","local-first","cross-repo"],"license":"MIT","_id":"@arihantdeva/heimdall@0.12.2","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"homepage":"https://github.com/ArihantDeva/heimdall","bugs":{"url":"https://github.com/ArihantDeva/heimdall/issues"},"pi":{"image":"https://raw.githubusercontent.com/ArihantDeva/heimdall/main/docs/assets/demo.png","video":"https://raw.githubusercontent.com/ArihantDeva/heimdall/main/docs/assets/demo.mp4","extensions":["./extensions"]},"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"792cfe81d68afe927e9906390c2c9a213c063272","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.12.2.tgz","fileCount":203,"integrity":"sha512-x261fXN32Ui2CsCxApaD5yDYqL/7vRzq/aXKfYrdKGCfluEc6hf8LB91fJYA2rNWjAqsmOONl8QOoyxYXD7rzQ==","signatures":[{"sig":"MEYCIQCk+lKTXibWrx+3pPYa04C+M+7lhOE+xYECYg2YhIw6FAIhAJPH+7S1pxbmyaQ6KvNsLc/SxsskAiIaBPOa9YelLksn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGDSTqjnUea/6oDXoBGlZlOHWiqZAT/AkByTOVf7qtuLAiB3snQiw/olTa9jOJa8w4zc5+pq57HmiFNwYdYIXbOSDw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3893974},"type":"module","engines":{"node":">=22.5"},"gitHead":"56af9a23f20bb6b0c1ecdaa573794f5213265580","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit","postinstall":"node bin/postinstall.mjs"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"repository":{"url":"git+https://github.com/ArihantDeva/heimdall.git","type":"git"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents: cross-repo memory with trust verdicts, zero-token CPU-only indexing, hybrid retrieval","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.12.2_1789776802648_0.32544529159446145","host":"s3://npm-registry-packages-npm-production"}},"0.12.3":{"name":"@arihantdeva/heimdall","version":"0.12.3","keywords":["pi-package","ai","agent","memory","knowledge","rag","code-graph","semantic-search","embeddings","local-first","cross-repo"],"license":"MIT","_id":"@arihantdeva/heimdall@0.12.3","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"homepage":"https://github.com/ArihantDeva/heimdall","bugs":{"url":"https://github.com/ArihantDeva/heimdall/issues"},"pi":{"image":"https://raw.githubusercontent.com/ArihantDeva/heimdall/main/docs/assets/demo.png","video":"https://raw.githubusercontent.com/ArihantDeva/heimdall/main/docs/assets/demo.mp4","extensions":["./extensions"]},"bin":{"heimdall":"bin/heimdall.js"},"dist":{"shasum":"4d361e5903f2cd5eb18b8d0d15459f7d9867f254","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.12.3.tgz","fileCount":203,"integrity":"sha512-InU22/8ImMyYuyqKHI4wTqecsrOq3frmal9nSZ6fxfKSXjqRdjqNyfkLeKrCXP6kgq2zmRRjQfLNWZa3LYv/0Q==","signatures":[{"sig":"MEUCID6q8bqggkICKKtfd2g9/KjtWLzKXVQ1uLnGboY9wFqlAiEAvPk/byZJGyrxBNOqPM2DkNVj4oORwGagnEDAT0z2/M8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGc8shBaaqgRo7Ryfl7MLO/HE/GbDSFA5KUGQK7B8/HHAiEA9A5KntpH370D1y6kECZ8O1zakOD8PUNtdWjDGb3zn18=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":3893974},"type":"module","engines":{"node":">=22.5"},"gitHead":"eeff4077688f2bb806b97a8b63e920a59558cc34","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit","postinstall":"node bin/postinstall.mjs"},"_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"repository":{"url":"git+https://github.com/ArihantDeva/heimdall.git","type":"git"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents: cross-repo memory with trust verdicts, zero-token CPU-only indexing, hybrid retrieval","directories":{},"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"tmp":"tmp/heimdall_0.12.3_1789850208960_0.394641604462624","host":"s3://npm-registry-packages-npm-production"}},"0.12.4":{"pi":{"image":"https://raw.githubusercontent.com/ArihantDeva/heimdall/main/docs/assets/demo.png","video":"https://raw.githubusercontent.com/ArihantDeva/heimdall/main/docs/assets/demo.mp4","extensions":["./extensions"]},"_id":"@arihantdeva/heimdall@0.12.4","bin":{"heimdall":"bin/heimdall.js"},"bugs":{"url":"https://github.com/ArihantDeva/heimdall/issues"},"dist":{"shasum":"9c82646d2c66ef0aa9a374634237803c903e46d9","tarball":"https://registry.npmjs.org/@arihantdeva/heimdall/-/heimdall-0.12.4.tgz","fileCount":203,"integrity":"sha512-nmaWoKoQEgkc4/29Gg51hJ5fSmx/agyfWmqoqzcslMaLTyD0OZ3KUdDdpdrYULjUADHUMHHGIXctaM0KsagLVw==","signatures":[{"sig":"MEUCIQCONMld/efdXFhpT0ejy4cDWvJIxzwCTyaw4u6brLAJCQIgVS5fR0qD88LJ06n9js+BJQoLsLIoCz+bnSpVv0ntrPs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFD81UgcQkkQgikrBKKGkUrgeUHHuCEKs40nULYLInnYAiEAgQlaZaiKW06GXnIDhgkGzh7mkmPbso+MJ+Y3q/TdOeI="}],"unpackedSize":3895534},"name":"@arihantdeva/heimdall","type":"module","engines":{"node":">=22.5"},"gitHead":"aa511e496de4b806c362d09cef368ad0d0c8c89e","license":"MIT","scripts":{"test":"node --test \"tests/**/*.test.mjs\"","typecheck":"tsc --noEmit","postinstall":"node bin/postinstall.mjs"},"version":"0.12.4","_npmUser":{"name":"arihantdeva","email":"arihantdeva@gmail.com"},"homepage":"https://github.com/ArihantDeva/heimdall","keywords":["pi-package","ai","agent","memory","knowledge","rag","code-graph","semantic-search","embeddings","local-first","cross-repo"],"repository":{"url":"git+https://github.com/ArihantDeva/heimdall.git","type":"git"},"_npmVersion":"11.18.0","description":"Verified, self-healing knowledge layer for AI coding agents: cross-repo memory with trust verdicts, zero-token CPU-only indexing, hybrid retrieval","directories":{},"maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"_nodeVersion":"26.6.0","_hasShrinkwrap":false,"devDependencies":{"typebox":"^1.3.0","typescript":"^5.6.0","@types/node":"^22.0.0"},"peerDependencies":{"typebox":"*","@earendil-works/pi-coding-agent":"*"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/heimdall_0.12.4_1789851075776_0.4178574411136682"}}},"time":{"created":"2026-08-23T06:42:36.539Z","modified":"2026-09-19T20:51:16.047Z","0.2.0":"2026-08-23T06:42:36.864Z","0.2.1":"2026-08-24T00:05:34.287Z","0.3.0":"2026-08-24T04:42:20.448Z","0.4.0":"2026-08-24T05:34:44.910Z","0.5.0":"2026-08-24T05:49:02.805Z","0.5.1":"2026-08-24T17:13:16.384Z","0.5.2":"2026-08-24T18:20:11.163Z","0.6.0":"2026-08-24T21:29:04.728Z","0.6.1":"2026-08-25T07:38:55.620Z","0.6.2":"2026-08-25T13:07:25.884Z","0.7.0":"2026-08-25T21:44:41.789Z","0.9.0":"2026-09-06T15:32:19.086Z","0.10.0":"2026-09-11T00:02:18.069Z","0.11.0":"2026-09-16T20:05:53.663Z","0.12.0":"2026-09-18T22:46:04.180Z","0.12.1":"2026-09-18T23:12:59.770Z","0.12.2":"2026-09-19T00:13:22.800Z","0.12.3":"2026-09-19T20:36:49.086Z","0.12.4":"2026-09-19T20:51:15.876Z"},"bugs":{"url":"https://github.com/ArihantDeva/heimdall/issues"},"license":"MIT","homepage":"https://github.com/ArihantDeva/heimdall","keywords":["pi-package","ai","agent","memory","knowledge","rag","code-graph","semantic-search","embeddings","local-first","cross-repo"],"repository":{"url":"git+https://github.com/ArihantDeva/heimdall.git","type":"git"},"description":"Verified, self-healing knowledge layer for AI coding agents: cross-repo memory with trust verdicts, zero-token CPU-only indexing, hybrid retrieval","maintainers":[{"name":"arihantdeva","email":"arihantdeva@gmail.com"}],"readme":"# Heimdall\n\n<p align=\"center\">\n  <a href=\"https://www.npmjs.com/package/@arihantdeva/heimdall\"><img alt=\"npm\" src=\"https://img.shields.io/npm/v/%40arihantdeva%2Fheimdall\"></a>\n  <a href=\"https://github.com/ArihantDeva/heimdall/actions/workflows/ci.yml\"><img alt=\"CI\" src=\"https://img.shields.io/github/actions/workflow/status/ArihantDeva/heimdall/ci.yml?branch=main\"></a>\n  <a href=\"https://github.com/ArihantDeva/heimdall/stargazers\"><img alt=\"GitHub stars\" src=\"https://img.shields.io/github/stars/ArihantDeva/heimdall?style=social\"></a>\n  <img alt=\"license\" src=\"https://img.shields.io/badge/license-MIT-blue\">\n</p>\n\n**Your agent keeps rebuilding work you already did. Heimdall makes it stop.**\n\n<p align=\"center\">\n  <a href=\"https://raw.githubusercontent.com/ArihantDeva/heimdall/main/docs/assets/demo.mp4\"><img alt=\"Heimdall demo\" src=\"https://raw.githubusercontent.com/ArihantDeva/heimdall/main/docs/assets/demo.png\" width=\"720\"></a>\n</p>\n\nHeimdall gives AI coding agents **persistent memory across every repository and project you work on** so the question *\"did I already solve this in another project?\"* gets answered by one verified search instead of twenty minutes of grep, `find`, and `ls` loops.\n\n## The problem it solves\n\n**1. Memory that doesn't live in one repository.** Every other memory tool is per-project. But your work isn't: the optimized functions you built in one project could be useful somewhere else. Heimdall indexes *everything you touch* into one semantic graph, so knowledge follows you across repositories, languages, and months.\n\n**2. Orientation time, cut to seconds.** A fresh agent session burns dozens of bash commands just figuring out the lay of the land — `ls`, `grep`, re-reading files it read last week. Heimdall injects the relevant prior work into the session's first prompt and backs a single `kb_search` call: ranked, scoped, verified. Fewer commands, fewer tokens, faster first useful action.\n\n**3. Zero token spend.** Memory maintenance is a local daemon: file watching, tree-sitter AST parsing, sqlite. Indexing a file costs **CPU only — never an LLM call**. Retrieval is hybrid ranked search (lexical + semantic + graph walk) over locally-computed embeddings. Your context window stays for your actual work. You can also use your GPU for up to 3.4x speeds.\n\n**4. Retrieval you can act on.** Semantic memory tools return plausible matches, but Heimdall also verifies it at runtime.\n\n- `STRONG` — the anchor is intact **and** the indexed text answers the query: the file is still a regular file whose size and mtime match its index card, and the query's tokens appear in the content that was indexed. Nothing is read at query time\n- `WEAK` — plausible but unverified; the printed reason says which part failed (changed since indexing, no index card, tokens covering too little of the indexed text, or a path that is no longer a regular file)\n- `REBUILT` — file moved; Heimdall found it and re-anchored automatically\n- `STALE` / `REMOVED` — dead path, logged and pruned so it stops ranking\n\nAn agent acting on a dead path is worse than no answer. Ranked retrieval is trustworthy enough to act on. Gives the real picture, instead of the best guess.\n\n## How a session changes\n\nWithout Heimdall:\n\n```\n$ grep -r \"portfolio optimization\" .            # wrong repo, 40s\n$ find ~/work -name \"*.py\" | xargs grep -l optimizer   # 2 min\n$ ls ~/work/... ; cat notes.md ; ...         # 15 commands later\n```\n\nWith Heimdall:\n\n```\n$ kb_search \"portfolio optimization jam optimizer\"\n   1. [STRONG] portfolio optimizer — ~/work/quant-bot/src — EV-optimizer entry point\n   2. [STRONG] excel report builder — ~/work/reports/excel — 276-session tracking table\n```\n\nOne call. Verified paths. Straight to work.\n\n## How it compares\n\nArchitecture-level comparison of shipped defaults — not benchmark claims. \"LLM extraction\" etc. describe each project's default pipeline as documented; self-hosted or configured-differently deployments vary.\n\n| | **Heimdall** | mem0 | Zep (Graphiti) | Letta (MemGPT) | LangMem / LangChain Memory | Vector-DB RAG | Claude Memory | cAST / grep |\n|---|---|---|---|---|---|---|---|---|\n| Scope | **All your repos, one graph** | per-app/per-user memories | per-user/session graph | per-agent | per-app/thread | per-corpus/index | per-conversation/account | per-repo |\n| Runs on CPU only | **yes** | LLM+embeddings in the loop | LLM extraction for entities/edges | LLM-in-the-loop memory management | LLM extraction + embeddings | embeddings (GPU-friendly) | cloud | yes |\n| Token cost of indexing | **zero** (tree-sitter + local embeddings) | LLM extraction per memory op | LLM calls per episode | LLM calls throughout | LLM extraction per write | embedding tokens only | LLM summarization | zero but manual |\n| Trust verdicts on results | **STRONG / WEAK / REBUILT / STALE** | none | none | none | none | similarity score only | none | none |\n| Self-healing (moved files re-anchored) | **yes** | no | no | no | no | no (stale chunks rank) | no | no |\n| Convergent state (idempotent re-index) | **yes** (level-triggered reconciler) | append-oriented | event-sourced episodes | conversation-scoped | append-oriented | re-ingest to update | opaque | n/a |\n| Reads private source locally | **yes, never leaves disk** | sent to extraction LLM | sent to extraction LLM | stays local w/ local models | sent to extraction LLM | local if self-hosted | cloud | yes |\n| Harness integrations | pi, Claude Code, Codex, Cursor, Windsurf | SDK/API | SDK/API + Graphiti | SDK/API | LangChain-native | DIY per stack | Claude products | editor plugins |\n\n### Where Heimdall beats mem0 and common RAG\n\nBy design, not by benchmark — these follow from the architecture:\n\n1. **Zero-LLM indexing instead of extraction pipelines.** mem0, Zep, Letta, and LangMem all use LLMs to write facts: every remembered fact costs extraction tokens, adds latency, and means your code/notes are processed by a cloud provider unless you wire your own. Heimdall's ingest is tree-sitter plus local CPU embeddings. It cannot leak data, nor does it cost anything.\n\n2. **Verified hits vs plausible hits.** RAG returns nearest neighbors with a similarity score; nothing checks that the chunk still exists, let alone that it answers the question. Heimdall re-verifies every result against the live filesystem at query time and labels it STRONG/WEAK/REBUILT/STALE. STRONG requires an index card that still agrees with the file on disk — its recorded size and mtime match what `stat` reports now, compared exactly (the value round-trips through SQLite unchanged, so there is no tolerance and no window) — and query coverage in the hit's own text, with the path excluded so a filename cannot stand in for content. The whole check is two stats per hit: it never opens, let alone reads, the file it judges. A hit with no card to check against is WEAK and says so; it does not get to claim verification it never performed. Agents can act on STRONG without a confirmation round-trip. One boundary is real and documented rather than claimed away: a same-size rewrite that also restores mtime is invisible to any stat, and closing that requires reading content — which is what `heimdall verify --deep` is for.\n\n3. **Self-healing vs stale corpora.** In vector-RAG, a moved file leaves orphaned chunks ranking forever until someone re-runs ingestion. Heimdall's level-triggered reconciler converges: moved files re-anchor automatically (REBUILT), deletions retract exactly their own nodes, and re-indexing twice is identical to once.\n\n4. **Cross-repo scope without a corpus pipeline.** Classic RAG needs you to define, chunk, and refresh a corpus per app. Heimdall watches working trees continuously — new repos join the graph on their own, and personal context (prompt logs, notes, now even email via `heimdall ingest-email`) lands in the same graph your code lives in.\n\n5. **What they win back.** Fair's fair: mem0/Zep/Letta excel at conversational fact curation across chat products, multi-user serving, and hosted APIs; LLM extraction summarizes messy prose better than regexes. Heimdall is making the opposite bet, that a single developer's machine-wide workspace where the unit of memory is verified file-level knowledge, not chat utterances. \n\nHeimdall is the only one built for the real indie developer workflow: many repos, many months, one agent session at a time, on hardware you already own. Best for people with tons of side projects.\n\n## FAQ\n\n**Does my code leave my machine?** No. Indexing is tree-sitter parsing + local embeddings on CPU. Search runs against your local daemon. Nothing phones home.\n\n**Do I need a GPU?** No. The embedding model (bge-m3) runs on Apple Silicon / any modern CPU.\n\n**How is this different from grep?** Grep finds strings you already know exist. Heimdall answers \"have I solved anything like this before?\" across every project you've touched, ranked and verified against what's actually on disk right now.\n\n**What if a file moves or gets deleted?** The reconciler notices on its next pass. Moved files are re-homed automatically (REBUILT verdict); deletions retract exactly their own nodes. A stale path never ranks again.\n\n**Does it work with my agent?** One command wires it into pi, Claude Code, Codex, Cursor, or Windsurf. Anything that can run a CLI can use `search`/`insert` directly.\n\n**Is it production-ready?** It runs daily on this author's machine across ~12,800 live nodes with a 166-test suite guarding the concurrency invariants. v0.2.0. LongMemEval benchmark harness is in `bench/` (in progress).\n\n## Roadmap\n\n- [x] v0.1 — packaged CLI, five harness adapters, trust verdicts\n- [x] v0.2 — single-writer reconciler, depth-ladder indexing (symbols + call edges)\n- [ ] LongMemEval-S score ≥ 0.90 published from `bench/` (baseline S 0.740 reproduced)\n- [ ] LongMemEval-M full reader/judge run published (S subset is token-free recall only — not end-to-end)\n- [x] 0.9.0 — graft backend auto-builds on `npm i -g` (postinstall) and `heimdall setup`; no separate `init --backend` flag\n- [ ] Linux daemon packaging\n- [ ] MCP server mode\n\n## Contributing\n\nPRs welcome — see [CONTRIBUTING.md](CONTRIBUTING.md). The concurrency invariants are tested; break them and the suite goes red before you do.\n\n## Quickstart\n\n```bash\nnpm i -g @arihantdeva/heimdall\nheimdall init --harness claude-code   # or pi | codex | cursor | opencode | all\n```\n\nThat's it for install + harness wiring (`init`, `insert` work immediately).\n\n`npm i -g` auto-builds the graft backend during install when prerequisites\nare present\n(macOS — Xcode Command Line Tools + `brew install cmake pkg-config libyaml sqlite`;\nDebian/Ubuntu — `apt install cmake pkg-config build-essential git libsqlite3-dev libyaml-dev`;\nFedora/Amazon Linux — `dnf install gcc gcc-c++ make cmake git pkgconf-pkg-config sqlite-devel libyaml-devel`;\n`git` required — llama.cpp is cloned at first build);\nfirst build takes a few minutes (log: `~/.heimdall/bootstrap.log`). If\nprerequisites are missing, SETUP NEEDED prints and the install still\nsucceeds — run `heimdall setup` to build later. Opt out:\n`HEIMDALL_NO_BUILD=1 npm i -g @arihantdeva/heimdall`. Defaults: model\n`bge-m3`, accel auto (Metal on Apple Silicon, CUDA when `nvidia-smi`\npresent, else CPU), threads = physical cores, 2 instances.\n\n`heimdall setup` also builds/installs `graftd` when none is working,\ndownloads the model if needed, generates `~/.graft/config.yaml`, and\ninstalls the launchd daemon:\n\n```bash\nheimdall setup                         # detect + config + model + daemon\nheimdall setup --model bge-small-en-v1.5   # smaller model (~36MB, low RAM)\nheimdall setup --detect-only           # just print the hardware profile\nheimdall doctor                        # should print HEALTHY\nheimdall search \"excel tracker portfolio optimization\"\n```\n\nFull flags + hardware matrix + model catalog: [docs/setup.md](docs/setup.md).\nPrefer hand-rolling? Copy\n`config/heimdall.yaml.example` to `~/.graft/config.yaml` and edit\n(`/PATH/TO/` placeholders). On macOS the backend runs as the launchd job\n`com.graft.daemon` (setup writes the plist; template:\n`launchd/com.heimdall.backend.plist.example`).\n\n### Alternative backend: Mnemosyne\n\nRanked search also supports [mnemosyne-oss](https://github.com/mnemosyne-oss/mnemosyne) (SQLite-backed agent memory) as the retrieval backend. Graft remains the zero-config default; select mnemosyne per-invocation or persistently:\n\n```bash\npip install mnemosyne-memory            # or: uv pip install mnemosyne-memory\nHEIMDALL_BACKEND=mnemosyne heimdall search \"preferences\"        # one-off\n# persistent:\npython3 -c 'import json,pathlib; p=pathlib.Path.home()/\".heimdall/config.json\"; c=json.loads(p.read_text()) if p.exists() else {}; c[\"backend\"]=\"mnemosyne\"; p.write_text(json.dumps(c,indent=2))'\nheimdall search \"preferences\"\n```\n\nResolution order: `$HEIMDALL_BACKEND` > `~/.heimdall/config.json` `backend` key > `graft`. Pin a non-PATH binary with `MNEMOSYNE=/path/to/mnemosyne`. Mnemosyne results flow through the same ranked/verified output as graft hits.\n\n## Demo\n\n![Heimdall demo](assets/demo.gif)\n\nReal session output (abridged):\n\n```\n$ kb_search \"portfolio optimization jam optimizer\"\n== retrieve (hybrid ranked): portfolio optimization jam optimizer\n   1. [STRONG] cov83%  portfolio optimizer — ~/work/quant-bot/src\n      EV-optimizer entry point, edited 2026-08-14\n   2. [WEAK]   excel report builder — ~/work/reports/excel\n```\n\nEvery hit carries a trust verdict computed against the live filesystem — not a cached embedding score. Nothing is STRONG unless an index card says the file is unchanged (`~/.heimdall/global.db`: recorded size and mtime still match what `stat` reports, compared exactly — the value round-trips bit-for-bit through SQLite, so this is deterministic, not a tolerance), and either the query tokens overlap the hit's text or the semantic layer matched it on top of that verified identity. A similarity score alone never makes a hit STRONG. A hit that cannot meet the bar says which part failed, on its own line: `file changed since it was indexed`, `no index card for this path — content not verified`, `indexed content intact, but query tokens cover only 20% of it`, `anchor is gone from disk`, `path is no longer a regular file`. The ceiling is honest and specific: a same-size rewrite that also restores mtime leaves metadata *byte-identical* while content differs, so no stat-based check can see it — and the card's `sha1` cannot close it for free, because it hashes `read_preview(path)`, i.e. content that must be read. That boundary is owned by `heimdall verify --deep`, which re-hashes the file and reports the drift, so the exposure lasts until that audit runs.\n\n## Design history\n\nv0.1.0 hooks inferred graph mutations by regex-parsing bash commands and writing the graph from every hook process. It collapsed: writes it didn't recognize were invisible, concurrent hook processes raced delete+insert, and a misparse wrote wrong data as fact. v0.2.0 replaced all of it with a **single-writer, level-triggered reconciler**: nothing ever tells the graph *what* changed, only *that a path might have*. The reconciler reads the file from disk and makes the graph match.\n\nThe trust verdict layer came from the same lesson one level up: even a perfect graph lies if its anchors rot (directories get reorganized aggressively). So search results are re-verified against the filesystem at query time, with self-healing (rehome) for moved files.\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=ArihantDeva/heimdall&type=Date)](https://star-history.com/#ArihantDeva/heimdall&Date)\n\nIf Heimdall saved you a rebuild, a star helps other agents' humans find it.\n\n\n## Architecture / how it works\n\n```\n                 ┌─────────────────────────── harness integrations ───────────────────────────┐\n                 │  Pi: extensions/kb-*.ts          Claude Code: PostToolUse hook             │\n                 │  (kb-tools, kb-autosync, kb-orient, kb-search-guard)   Codex/Cursor/Windsurf │\n                 └───────────────┬──────────────────────────────┬─────────────────────────────┘\n                                 │ only ever appends hints      │\n                                 ▼                              ▼\n                     ~/.heimdall/hints.jsonl        heimdall CLI (bin/heimdall.js)\n                                 │                     init / insert / hint / verify / depth\n                                 ▼                                    │\n   ┌───────────────────────── THE SINGLE WRITER (holds O_EXCL lock) ───┘\n   │  bin/heimdall-reconciler.mjs  (daemon: fs watch + hint ingest + drain loop + audit timer)\n   │        │ drain()  reads hint queue → reconcilePath() per path\n   │        ▼\n   │  bin/lib/reconcile.mjs  — level-triggered convergence\n   │        reads file from disk → desiredState() → compares hash/depth\n   │        → sink projection (graft insert/delete) BEFORE journal commit\n   │        → journal.commit() in one transaction, generation-guarded (ABA)\n   │        ▼\n   │  bin/lib/journal.mjs  — AUTHORITATIVE index (~/.heimdall/journal.db, node:sqlite, WAL)\n   │        paths (hash/size/mtime/depth/generation/state) · owned_nodes · owned_edges\n   │        pending_edges (order-independent cross-file edges) · queue (dedup)\n   │        ▼\n   └──────────►  bin/lib/sink.mjs  — projection target (pluggable backend)\n                 GraftSink (graft CLI) | MemorySink (tests, --dry-run)\n                 ▼\n        ~/.graft daemon (vendor/graft, built from source) — sqlite + bge-m3 embeddings + graph edges\n\n   SEARCH PATH (read side, no lock):\n   kb-search.sh → graft ask per repo (per-repo code graphs, --json) + embed-index.py query (global semantic)\n                → merged, deduped → verdict pass in-process (STRONG / WEAK / NOPATH)\n                → optional graft explore (graph walk of related work) → printed, ranked\n```\n\n**Core invariants** (each has a test):\n\n- **Level-triggered, not event-driven.** Hooks/watchers/scripts can only say \"look at this path\". They are never believed about *what* happened. A missed, duplicated, or flatly wrong hint costs one `stat` — nothing more. This is what makes 40 concurrent agents editing one file harmless: they produce N cheap appends that collapse to one queue row (primary-key dedup).\n- **Single writer by construction.** Every graph/journal mutation passes through `Lock` — an `O_EXCL` create with stale-PID liveness reclamation (Node has no portable flock). Two writers cannot exist, so the old delete-then-insert race (file briefly vanished from the graph) is unrepresentable. The daemon holds the lock for its lifetime; one-shot `heimdall reconcile` takes it too and serializes against the daemon.\n- **Exact ownership.** Every node and edge belongs to exactly one path. A commit deletes and re-inserts all of that path's rows in one transaction — a deleted symbol cannot survive as a ghost, and one path's retraction never touches another's rows.\n- **Content hash is the oracle.** Desired state = pure function of (bytes, depth). Reconciling twice is byte-identical to reconciling once. The `generation` counter is the ABA guard: a commit whose generation moved since the reconcile started is rejected (action `stale`) and the path re-queued, so a late reconcile can never resurrect a node a newer one deleted.\n- **Order independence.** A cross-file edge to a not-yet-indexed symbol parks as a pending edge, owned by the source file, and resolves in both directions once the target file reconciles. The final graph does not depend on which file was reconciled first.\n- **Audit as backstop.** `heimdall verify` compares the journal against the filesystem (stat-only: size/mtime, plus a depth-upgrade check) and exits 1 on drift; `--deep` re-hashes everything and catches even a same-size/same-mtime rewrite. This is the accuracy claim as a CI-able command. The daemon runs the same audit on a timer (default 15 min) and re-queues drift.\n- **Journal before sink, sink before commit.** Sink writes happen BEFORE the journal commit: a crash in between leaves the path dirty, so it is redone — safe because reconcile is idempotent. The reverse order could mark a path clean that was never projected, which is the one failure the audit cannot detect later.\n- **The honest guarantee is bounded-staleness convergence**, not instantaneous correctness: between an edit and the next reconcile pass the graph is behind. It is never *wrong* in a way that survives a pass.\n\n## Depth levels\n\nNodes are indexed at a depth. The default and the recommendation is **maximum** — the graph knows not just that a file exists but which functions and classes live in it, at which lines, and what calls what.\n\n| Depth | Node knows |\n|---|---|\n| `path` (L0) | the file exists |\n| `file` (L1) | + language, size, description |\n| `symbol` (L2) | + one node per top-level definition, with `file:line` and signature |\n| `graph` (L3) | + imports / calls / inherits / uses edges, intra- and cross-file |\n\n`max` resolves to whatever the machine can actually do: L2/L3 need tree-sitter, so a box without it degrades to L1 rather than failing — and the next audit automatically re-indexes at the deeper level once tree-sitter appears (a depth upgrade shows up as drift). Asking for a depth above the machine's capability is honored as far as possible and reported as `clamped`:\n\n```bash\nheimdall depth src/server.ts         # requested vs effective depth for one path\n```\n\nExtraction is tree-sitter AST parsing via a Python bridge, **not an LLM call**: depth costs CPU, never tokens. The bridge (`bin/lib/heimdall_extract.py`) deliberately calls graphify's per-language extractors directly rather than `graphify.extract()`, because the latter writes a `graphify-out/cache/` directory next to the files it reads (Heimdall indexes the whole home tree) and adds a second cache with its own invalidation rules that could disagree with reality.\n\n## Components (map)\n\n| Component | File | Job |\n|---|---|---|\n| **CLI** | `bin/heimdall.js` + `bin/lib/cli-main.mjs` | `init` / `search` / `insert` / `doctor` / `daemon` / `reconcile` / `verify` / `depth` / `hint` — thin wrappers over the bin/ scripts, never a rewrite |\n| **Reconciler daemon** | `bin/heimdall-reconciler.mjs` | the single writer: recursive fs watch + hint ingest + drain loop + audit timer, holds the lock for its lifetime |\n| **Reconcile** | `bin/lib/reconcile.mjs` | level-triggered convergence: read disk, make graph match; `audit()` = drift detector |\n| **Journal** | `bin/lib/journal.mjs` | authoritative index: ownership, hashes, generations, dedup queue, pending edges |\n| **Extraction** | `bin/lib/extract.mjs` + `bin/lib/heimdall_extract.py` | desired state per file: hash + L0-L3 nodes/edges, path-namespaced node ids |\n| **Depth ladder** | `bin/lib/depth.mjs` | levels, capability probe, per-root overrides, config |\n| **Single-writer lock** | `bin/lib/lock.mjs` | `O_EXCL` lock every graph mutation passes through |\n| **Hints** | `bin/lib/hints.mjs` | the one channel a non-writer may use (append-only, atomic, torn-line tolerant) |\n| **Sink** | `bin/lib/sink.mjs` | projection targets: `GraftSink` (CLI) and `MemorySink` (tests/dry-run) |\n| **Ranked search** | `bin/kb-search.sh` | top-k hybrid (per-repo `graft ask` + global semantic) merged + verdict pass in-process, `--scope` filter |\n| **Trust verification** | `bin/kb-search.sh` verdict pass | both backends compute verdicts in-process: STRONG requires card-to-file identity (size + mtime vs `~/.heimdall/global.db`) plus query coverage in the hit's text; two stats per hit, no file reads |\n| **Stale pruning** | `bin/kb-stale-scan.py`, `bin/kb-rehome.sh` | full-graph sweep: deterministic rehome or log+delete |\n| **Health & telemetry** | `bin/kb-health.sh`, `bin/telemetry.sh` | daemon health, index freshness, usage stats (kb_* calls/24h, hit rate, est. time saved) |\n| **Bootstrap** | `bin/sync-edits.sh`, `bin/seed-graft.sh` | replay session edit logs → hints; seed inventory TSV into Graft |\n| **Full rebuild** | `bin/kb-rebuild.sh` | backup → wipe → parallel restore → re-seed → prune → verify |\n| **Pi extension: tools** | `extensions/kb-tools.ts` | exposes `kb_search` / `kb_insert` / `kb_sync` as agent tools |\n| **Pi extension: autosync** | `extensions/kb-autosync.ts` | hook that appends path hints — never writes the graph |\n| **Pi extension: orient** | `extensions/kb-orient.ts` | injects prior-work hits into the first user prompt of a session (2.5s cap, silent degrade) |\n| **Pi extension: guard** | `extensions/kb-search-guard.ts` + `extensions/lib/kb-guard-core.mjs` | warns after 3 consecutive grep-style actions without kb_search; agent can self-suspend via the `kb_guard_pause` tool for 1–20 turns (enforcement resumes clean-slate on expiry) |\n| **Email ingestion** | `bin/lib/ingest-email.mjs` | mailbox → graft-style cards (read-only via cli-email `list`/`show`), idempotent; retrieval rides the semantic layer |\n| **Backends** | `vendor/graft/` (Apache 2.0), `vendor/graphify/` (MIT) | Graft = semantic-memory daemon; graphify = code-graph extractors |\n\n**Backends are pluggable.** Any store speaking the graft CLI contract works; Graft is the vendored reference. See `docs/heimdall_compare.dot/png` for the graphify vs Graft vs Heimdall positioning (graphify answers *codebase* questions, Graft persists *notes/facts* across projects, Heimdall ties them together with trust verdicts and self-healing).\n\n## Fact layer (experimental)\n\nThe `heimdall insert` fact cards and the runtime extractor (`bin/lib/facts.mjs`) are **experimental**:\n\n- English-pattern extraction only — non-English utterances yield zero facts (deliberate ceiling, marked in source).\n- Extracted facts can contradict each other; no contradiction resolution yet.\n- The prompt-capture adapter named in the design spec is not part of the published package.\n- Secret filtering and per-source ownership are solid; the *interpretation* layer is what's young.\n\nTreat fact output as leads to verify, not verified memory. The reconciled code-graph layer carries the trust guarantees.\n\n## Harness integration\n\nOne command wires the **full enforcement stack** into any supported harness: memory rules in the agent's instruction file, an MCP server (`kb_search` / `kb_insert` / `kb_sync`), and a guard hook that warns when the agent falls back to `ls`/`grep`/`find` chains instead of searching memory:\n\n```bash\nheimdall init --harness claude-code   # or codex, cursor, pi, opencode, gemini-cli, deepseek\nheimdall init --detect                # list harnesses found on this machine\nheimdall mcp                          # raw stdio MCP server (for anything else)\nHEIMDALL_NO_AUTOINIT=1 npm i -g @arihantdeva/heimdall   # skip auto-setup\n```\n\n`npm i -g` runs a best-effort postinstall that auto-wires every detected harness (never fails the install; opt out with `HEIMDALL_NO_AUTOINIT=1`).\n\n### Pi native package\n\nHeimdall is also a **pi native package** — install it through pi itself and the four\nextensions (`kb_search` / `kb_insert` / `kb_sync` tools, kb-orient, kb-autosync,\nkb-search-guard) load directly from the package, no file copying:\n\n```bash\npi install npm:@arihantdeva/heimdall        # or: pi install git:github.com/ArihantDeva/heimdall\n```\n\n`heimdall init --harness pi` stays for global-install wiring; it detects a\npackage-managed install and wires only the rules block (no duplicate extensions).\n\n| Harness | Command | Rules file | MCP | Guard hook |\n|---|---|---|---|---|\n| **Claude Code** | `init --harness claude-code` | `~/.claude/CLAUDE.md` | ✅ `settings.json` | ✅ PostToolUse hook |\n| **Codex CLI** | `init --harness codex` | `~/AGENTS.md` | ✅ `config.toml` | rules only |\n| **Cursor** | `init --harness cursor` | `.cursor/rules/heimdall.mdc` | ✅ `mcp.json` | rules only |\n| **Pi** | `init --harness pi` | `~/.pi/agent/AGENTS.md` | native tools | ✅ kb-search-guard extension |\n| **OpenCode** | `init --harness opencode` | AGENTS.md plugin dir | ✅ `opencode.json` | ✅ plugin hook |\n| **Gemini CLI** | `init --harness gemini-cli` | `~/.gemini/GEMINI.md` | ✅ `settings.json` | rules only |\n| **DeepSeek** *(experimental)* | `init --harness deepseek` | `~/.deepseek/AGENTS.md` | ✅ `settings.json` | ✅ PostToolUse hook |\n| Anything else | `heimdall mcp` | your rules | ✅ stdio server | — |\n\nEvery adapter merges into existing config files (never clobbers your keys), is idempotent on re-run, and embeds the same canonical rule block — no per-harness rule drift. The DeepSeek adapter is experimental: DeepSeek's published harness config format may differ; verify paths after running init.\n\n## Usage\n\n```bash\nheimdall search \"excel tracker portfolio optimization\"   # ranked + verified knowledge search\nheimdall insert --title \"portfolio optimizer\" \\\n  --body \"~/work/quant-bot/src — EV-optimizer entry point\" \\\n  --keywords portfolio,optimize                              # record reusable work\nheimdall init --harness claude-code                      # wire into your harness (idempotent)\nheimdall doctor                                          # daemon + index health\n```\n\nSelf-healing surface:\n\n```bash\nheimdall daemon              # the single writer: watch, reconcile, audit on a timer\nheimdall reconcile           # converge now (one-shot; takes the same lock)\nheimdall reconcile --all     # deep audit + repair everything\nheimdall verify --deep       # read-only drift report; exit 1 if any. CI-safe\nheimdall hint PATH ...       # mark paths dirty — no lock needed, any process\nheimdall hint --stdin        # harness hooks hand tool-call JSON on stdin\n```\n\n### Email ingestion (CPU-only, read-only)\n\nIndex your own mailbox into the knowledge base. Reads mail exclusively\nthrough the local [cli-email](https://github.com/) binary's read-only\nsubcommands (`list`, `show` — never send/mark/move); renders one markdown\ncard per message; retrieval rides the existing semantic layer (CPU bge-m3,\nno GPU, no cloud calls).\n\n```bash\nheimdall ingest-email --accounts a1,a2 --limit 50   # cards → ~/Repos/email-archive/graft/mail/<account>/<uid>.md\n~/.heimdall/venv/bin/python3 bin/embed-index.py build   # embed new cards (CPU-only)\nheimdall search \"subject or sender words\"           # emails now rank like any other knowledge\n```\n\nRe-runs are idempotent (byte-compare per card — unchanged mail is not\nrewritten). Point `--root` at any directory under `~/Repos` to change where\nthe card tree lives.\n\n## Testing\n\n```bash\nnpm test            # full suite (365 tests)\nnpm run typecheck   # extensions typecheck\n```\n\nSuites:\n- `tests/reconcile.test.mjs` — the point. Invariant tests: 40 racing writers converge to one node set; separate OS processes hinting one file collapse to one queue row; reconciling twice is byte-identical; ABA generation guard rejects stale commits; deletion retracts exactly its own nodes; cross-file edges converge regardless of reconcile order; depth clamping; parse-failure degrades to L1; audit catches behind-our-back edits incl. same-size-same-mtime rewrites (`--deep`); git checkout picked up (the old command-regex path could not see it); lock admits exactly one writer + stale-PID reclamation; node-id path namespacing; garbage hints dropped. The L3 end-to-end test self-skips without tree-sitter.\n- `tests/guard.test.mjs` — kb-search-guard contract (warn on 3rd consecutive grep action, reset on kb_search/kb_sync/graft, interleaved reads do NOT reset; agent-callable `suspend(N)`/`tickTurn()` pause: silences all enforcement for N model turns, clamped 1–20, expiry restores clean-slate).\n- `tests/init.test.mjs` + `tests/adapters.test.mjs` — CLI contract and per-harness config-writer smoke tests against temp HOMEs.\n- `tests/kb-verify.test.mjs` — content-aware verdict contract via `selftest:` node ids (no graft daemon needed): content mismatch downgrades STRONG, content match upgrades to STRONG, binary files degrade gracefully, `extract_paths` home-anchor regression (the tilde-form bug).\n- `tests/kb-search-identity.test.mjs` — the STRONG contract end to end: a card that agrees with the file is STRONG, a card whose size no longer matches is WEAK, and a `sys.addaudithook` \"open\" trace proves the verdict pass never opens the files it judges (a `stat` is not an open, so a regression to content-reading verification shows up here).\n- `tests/adapters-mcp-entry.test.mjs` — launches the command+args the adapters actually write into each harness config (codex TOML, `mcp.json`, `opencode.json`) and requires a JSON-RPC `initialize` reply, so a generated config can never again ship an entry point that prints usage and exits.\n- `tests/npm-pack-contents.test.mjs` — packs the working tree and asserts `vendor/graphify/` is in the tarball, then runs one real L2 extraction from the unpacked artifact (not a source checkout) and checks `capability()` refuses to claim graph depth without the bridge.\n\nThe concurrency tests are the point: if the single-writer or idempotency properties ever break, those are the tests that go red.\n\n## Requirements\n\n- Node ≥ 22.5 (the journal uses the built-in `node:sqlite`), `bash`, `python3`\n- macOS today (launchd daemon management); Linux works with a manual daemon\n- tree-sitter-capable python for L2/L3 (`HEIMDALL_PYTHON` env, or `~/.heimdall/venv/bin/python3`, or `python3` in PATH). The probe extracts a real file and requires symbols back, so this reports what the bridge can actually do rather than what imports. Note it is per-python, not per-language: only the grammars you install produce symbol depth, and a language without its binding settles at file depth.\n- Runtime npm deps: **zero** — `typebox`/`typescript`/`@types/node` are dev-only\n- Graft backend for `search`/`doctor` (built from `vendor/graft/`)\n\n## Operations\n\n```bash\nbash bin/kb-health.sh                 # heimdall doctor — daemon up, index fresh\nbash bin/sync-edits.sh                # one-shot: replay session edit logs → hints → reconcile\nbash bin/telemetry.sh view            # last snapshots: nodes/day, sync age, kb_* calls, hit rate\npython3 bin/kb-stale-scan.py          # full-graph stale sweep (rehome or log+delete)\nbash bin/kb-rebuild.sh                # last-resort full rebuild (backup → wipe → restore)\n```\n\n## Status\n\nv0.2.0 — adds the reconciler: a single-writer, level-triggered convergence loop with a content-hash oracle, exact per-path ownership, and a depth ladder that indexes symbols and call edges by line. Published on npm as [`@arihantdeva/heimdall`](https://www.npmjs.com/package/@arihantdeva/heimdall).\n\n## License\n\nMIT. Independent project — not affiliated with Graft or its authors.\n\n### Attribution\n\n- **[Graft](https://github.com/NanoNets/Graft)** (Apache 2.0) — vendored as the default semantic-memory backend (`vendor/graft/`, source + build instructions, not prebuilt).\n- **[graphify](https://github.com/safishamsi/graphify)** v0.3.17 (MIT, © Safi Shamsi) — vendored per-repo code-graph extraction (`vendor/graphify/`), the tree-sitter bridge's extraction engine.\n\n## Runtime state\n\n- `~/.heimdall/` — journal, lock, hint queue, `config.json` (harness selection), adapter install records.\n- `~/.graft/` — backend config (`config.yaml`), sqlite profile DB, `graftd.log`, `.last-sync` (sync-edits watermark).\n\nThese are data, not build artifacts — never `rm`/`mv` over them blindly.\n\n## Development notes / gotchas\n\n- **The bridge must not use `graphify.extract()`** — it writes a cache dir next to indexed files and adds a second invalidation source.\n- **The L3 test self-skips without tree-sitter** — a green suite can silently mean \"L1-only machine\"; check `heimdall depth <file>` output for the effective level.\n","readmeFilename":"README.md"}