{"_id":"@ai-relay/project-memory","_rev":"16-16ebe92c7bbff6b67f0fc0a59c899520","name":"@ai-relay/project-memory","dist-tags":{"latest":"0.0.4","beta":"0.0.4-beta.6"},"versions":{"0.0.2":{"name":"@ai-relay/project-memory","version":"0.0.2","keywords":["ai","agent-memory","mcp","neo4j","developer-tools","repository-memory","code-context","cursor"],"author":{"name":"Vinayak Tupe"},"license":"SEE LICENSE IN LICENSE","_id":"@ai-relay/project-memory@0.0.2","maintainers":[{"name":"vinayak.tupe","email":"vinayaktupe1999@gmail.com"}],"homepage":"https://github.com/vinayaktupe/project-memory#readme","bugs":{"url":"https://github.com/vinayaktupe/project-memory/issues"},"bin":{"project-memory":"dist/cli/index.js"},"dist":{"shasum":"7bde836a9ba7cf899443f2b7085680d6084ab846","tarball":"https://registry.npmjs.org/@ai-relay/project-memory/-/project-memory-0.0.2.tgz","fileCount":104,"integrity":"sha512-ahrjtdNq5joc8iy80rpi28SGNgdbyZM7EQ1qtx947XnnOGcG2VSdP851ExzcwwWgC4XfumRZ8uCbFK7NFGYOMQ==","signatures":[{"sig":"MEQCIESwOAdX6erK2vGO0B2OPC7RPcRRFdgYTZm5zgODXYqrAiBGruQJ0zIRM5mJLs7RnDMP3RV+lZup8K2p+fC9wcOT+Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":258897},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./schema":"./schema/project-memory.schema.json"},"gitHead":"a5a55a7aec5e121573fc49842dce4da1a2e20217","scripts":{"dev":"tsx src/cli/index.ts","test":"node --import tsx --test tests/*.test.ts","build":"npm run clean && tsc","clean":"node scripts/clean.mjs","verify":"npm test && npm run typecheck && npm run build","typecheck":"tsc --noEmit","pack:check":"npm run build && node scripts/pack-check.mjs","package:smoke":"node scripts/package-smoke.mjs","prepublishOnly":"npm run verify && npm run pack:check","sync:package-identity":"node scripts/package-identity.mjs"},"_npmUser":{"name":"vinayak.tupe","email":"vinayaktupe1999@gmail.com"},"repository":{"url":"git+https://github.com/vinayaktupe/project-memory.git","type":"git"},"_npmVersion":"11.12.1","description":"Configuration-driven persistent repository memory for AI coding agents, with Neo4j storage and read-only MCP access.","directories":{},"_nodeVersion":"24.14.1","dependencies":{"zod":"^4.1.5","jiti":"^2.7.0","fast-glob":"^3.3.3","neo4j-driver":"^6.0.0","@modelcontextprotocol/server":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.5","typescript":"^5.9.2","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project-memory_0.0.2_1788188629343_0.49113428694221795","host":"s3://npm-registry-packages-npm-production"}},"0.0.3-beta.1":{"name":"@ai-relay/project-memory","version":"0.0.3-beta.1","keywords":["ai","agent-memory","mcp","neo4j","developer-tools","repository-memory","code-context","cursor"],"author":{"name":"Vinayak Tupe"},"license":"SEE LICENSE IN LICENSE","_id":"@ai-relay/project-memory@0.0.3-beta.1","maintainers":[{"name":"vinayak.tupe","email":"vinayaktupe1999@gmail.com"}],"homepage":"https://github.com/vinayaktupe/project-memory#readme","bugs":{"url":"https://github.com/vinayaktupe/project-memory/issues"},"bin":{"project-memory":"dist/cli/index.js"},"dist":{"shasum":"0fdf626a7d0b68ec027e28d9b27b4db07195dcf6","tarball":"https://registry.npmjs.org/@ai-relay/project-memory/-/project-memory-0.0.3-beta.1.tgz","fileCount":104,"integrity":"sha512-lI5NZbtDbt4cOFZr+e7NKIdVqXl7Ku9c7hsvKlJGpRolW4Ag78J5A0JXQuijartfVYDgBIO17/8NV/q8FIpODQ==","signatures":[{"sig":"MEUCIHLT2WLiAI9X0SRiCCMv3X8QBrqzcC+U2d68b58KZdxmAiEAvCX1J5vv33K/QOXd+2KsQvcc/wQRY98/jxbO31Fq8VQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":258215},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./schema":"./schema/project-memory.schema.json"},"gitHead":"9c232dbcf91da22e25f2887ac97a634887fb6c64","scripts":{"dev":"tsx src/cli/index.ts","test":"node --import tsx --test tests/*.test.ts","build":"npm run clean && tsc","clean":"node scripts/clean.mjs","verify":"npm test && npm run typecheck && npm run build","typecheck":"tsc --noEmit","pack:check":"npm run build && node scripts/pack-check.mjs","package:smoke":"node scripts/package-smoke.mjs","prepublishOnly":"npm run verify && npm run pack:check","sync:package-identity":"node scripts/package-identity.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:629d177e-612d-44ca-8e52-670c14eb8c02"}},"repository":{"url":"git+https://github.com/vinayaktupe/project-memory.git","type":"git"},"_npmVersion":"11.17.0","description":"Configuration-driven persistent repository memory for AI coding agents, with Neo4j storage and read-only MCP access.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.1.5","jiti":"^2.7.0","fast-glob":"^3.3.3","neo4j-driver":"^6.0.0","@modelcontextprotocol/server":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsx":"^4.20.5","typescript":"^5.9.2","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project-memory_0.0.3-beta.1_1788190409215_0.04614133632755513","host":"s3://npm-registry-packages-npm-production"}},"0.0.3-beta.2":{"name":"@ai-relay/project-memory","version":"0.0.3-beta.2","keywords":["ai","agent-memory","mcp","neo4j","developer-tools","repository-memory","code-context","cursor"],"author":{"name":"Vinayak Tupe"},"license":"SEE LICENSE IN LICENSE","_id":"@ai-relay/project-memory@0.0.3-beta.2","maintainers":[{"name":"vinayak.tupe","email":"vinayaktupe1999@gmail.com"}],"homepage":"https://github.com/vinayaktupe/project-memory#readme","bugs":{"url":"https://github.com/vinayaktupe/project-memory/issues"},"bin":{"project-memory":"dist/cli/index.js"},"dist":{"shasum":"a91bec2373c34e6b00688f25a45eb75a15cb4fd0","tarball":"https://registry.npmjs.org/@ai-relay/project-memory/-/project-memory-0.0.3-beta.2.tgz","fileCount":104,"integrity":"sha512-RMyEJhkN/mS3vD2ZmA0tab0DXGr3oOhW5vyqnTQ3bsz0DutRj0Wldd9tmbrKt4Dt0kpc1fg1l9Mmgbw0HgGDGw==","signatures":[{"sig":"MEYCIQCbYNL6od/uyBelIYHtppqrQwAEpbl94rzaxJL5QdqhRAIhAJYh/wuZu45Kt7RZIuwUf71ag4Zh0F/vAMV8iNh8B6iU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":258215},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./schema":"./schema/project-memory.schema.json"},"gitHead":"b6a080a3f5d99b6c705ac0226595e14137ccf6e9","scripts":{"dev":"tsx src/cli/index.ts","test":"node --import tsx --test tests/*.test.ts","build":"npm run clean && tsc","clean":"node scripts/clean.mjs","verify":"npm test && npm run typecheck && npm run build","typecheck":"tsc --noEmit","pack:check":"npm run build && node scripts/pack-check.mjs","package:smoke":"node scripts/package-smoke.mjs","prepublishOnly":"npm run verify && npm run pack:check","sync:package-identity":"node scripts/package-identity.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:629d177e-612d-44ca-8e52-670c14eb8c02"}},"repository":{"url":"git+https://github.com/vinayaktupe/project-memory.git","type":"git"},"_npmVersion":"11.17.0","description":"Configuration-driven persistent repository memory for AI coding agents, with Neo4j storage and read-only MCP access.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.1.5","jiti":"^2.7.0","fast-glob":"^3.3.3","neo4j-driver":"^6.0.0","@modelcontextprotocol/server":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsx":"^4.20.5","typescript":"^5.9.2","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project-memory_0.0.3-beta.2_1788190917949_0.9392557999566196","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@ai-relay/project-memory","version":"0.0.3","keywords":["ai","agent-memory","mcp","neo4j","developer-tools","repository-memory","code-context","cursor"],"author":{"name":"Vinayak Tupe"},"license":"SEE LICENSE IN LICENSE","_id":"@ai-relay/project-memory@0.0.3","maintainers":[{"name":"vinayak.tupe","email":"vinayaktupe1999@gmail.com"}],"homepage":"https://github.com/vinayaktupe/project-memory#readme","bugs":{"url":"https://github.com/vinayaktupe/project-memory/issues"},"bin":{"project-memory":"dist/cli/index.js"},"dist":{"shasum":"c9dbe94b45730c79032aaf783b330cb300c33a4b","tarball":"https://registry.npmjs.org/@ai-relay/project-memory/-/project-memory-0.0.3.tgz","fileCount":104,"integrity":"sha512-LWBRWbv1tpD4QK0+OiZxekSbmbrbv8/YnSPP/OI0MRXHurBzt6hffJ3OnwG0rr3o3X2DNWMppldzwB7snXDzhw==","signatures":[{"sig":"MEQCIESjpluC9FUEbfWtZWgJuxbMMjNn3Mvj1AjW5V391K6hAiARP9uzeppsP6UYL89yxiRz91xPmWq8a9m35GSlkiQfFA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":258208},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./schema":"./schema/project-memory.schema.json"},"gitHead":"0a0f353ec6b178f79c794cce68c0777129101103","scripts":{"dev":"tsx src/cli/index.ts","test":"node --import tsx --test tests/*.test.ts","build":"npm run clean && tsc","clean":"node scripts/clean.mjs","verify":"npm test && npm run typecheck && npm run build","typecheck":"tsc --noEmit","pack:check":"npm run build && node scripts/pack-check.mjs","package:smoke":"node scripts/package-smoke.mjs","prepublishOnly":"npm run verify && npm run pack:check","sync:package-identity":"node scripts/package-identity.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:629d177e-612d-44ca-8e52-670c14eb8c02"}},"repository":{"url":"git+https://github.com/vinayaktupe/project-memory.git","type":"git"},"_npmVersion":"11.17.0","description":"Configuration-driven persistent repository memory for AI coding agents, with Neo4j storage and read-only MCP access.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.1.5","jiti":"^2.7.0","fast-glob":"^3.3.3","neo4j-driver":"^6.0.0","@modelcontextprotocol/server":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.20.5","typescript":"^5.9.2","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project-memory_0.0.3_1788191089753_0.5558128362603716","host":"s3://npm-registry-packages-npm-production"}},"0.0.4-beta.1":{"name":"@ai-relay/project-memory","version":"0.0.4-beta.1","keywords":["ai","agent-memory","mcp","neo4j","developer-tools","repository-memory","code-context","cursor"],"author":{"name":"Vinayak Tupe"},"license":"SEE LICENSE IN LICENSE","_id":"@ai-relay/project-memory@0.0.4-beta.1","maintainers":[{"name":"vinayak.tupe","email":"vinayaktupe1999@gmail.com"}],"homepage":"https://github.com/vinayaktupe/project-memory#readme","bugs":{"url":"https://github.com/vinayaktupe/project-memory/issues"},"bin":{"project-memory":"dist/cli/index.js"},"dist":{"shasum":"be863b37eabdbaf14b969442b64139388f7622ee","tarball":"https://registry.npmjs.org/@ai-relay/project-memory/-/project-memory-0.0.4-beta.1.tgz","fileCount":124,"integrity":"sha512-hF5yyHpxz3fm7dSuOwmbJG3o4d4adWjoEwK8WLrHuI6TVsur59/4s4ds7RUpjmrPMtUnnpmCPbUYNZbfdxMgpA==","signatures":[{"sig":"MEQCIAxqNXbkJrYMJ+u+55HjLS0/AMk1itSjCnpfJTBZLimTAiB7wbgzwyU2Bbpp5dg0jFZWZZLjrmOJqrOOJEMo8T8Rdg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":348745},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./schema":"./schema/project-memory.schema.json"},"gitHead":"593f32420cf176b948536e11f63c5482f8bc60e4","scripts":{"dev":"tsx src/cli/index.ts","test":"node --import tsx --test tests/*.test.ts","build":"npm run clean && tsc","clean":"node scripts/clean.mjs","verify":"npm test && npm run typecheck && npm run build","typecheck":"tsc --noEmit","pack:check":"npm run build && node scripts/pack-check.mjs","package:smoke":"node scripts/package-smoke.mjs","prepublishOnly":"npm run verify && npm run pack:check","sync:package-identity":"node scripts/package-identity.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:629d177e-612d-44ca-8e52-670c14eb8c02"}},"repository":{"url":"git+https://github.com/vinayaktupe/project-memory.git","type":"git"},"_npmVersion":"11.17.0","description":"Configuration-driven persistent repository memory for AI coding agents, with Neo4j storage and read-only MCP access.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"^4.1.5","jiti":"^2.7.0","fast-glob":"^3.3.3","typescript":"^5.9.2","neo4j-driver":"^6.0.0","@modelcontextprotocol/server":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsx":"^4.20.5","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project-memory_0.0.4-beta.1_1788329022918_0.3222778942535143","host":"s3://npm-registry-packages-npm-production"}},"0.0.4-beta.2":{"name":"@ai-relay/project-memory","version":"0.0.4-beta.2","keywords":["ai","agent-memory","mcp","neo4j","developer-tools","repository-memory","code-context","cursor"],"author":{"name":"Vinayak Tupe"},"license":"SEE LICENSE IN LICENSE","_id":"@ai-relay/project-memory@0.0.4-beta.2","maintainers":[{"name":"vinayak.tupe","email":"vinayaktupe1999@gmail.com"}],"homepage":"https://github.com/vinayaktupe/project-memory#readme","bugs":{"url":"https://github.com/vinayaktupe/project-memory/issues"},"bin":{"project-memory":"dist/cli/index.js"},"dist":{"shasum":"672660e3637480fdc8a9ce8d8374e2185b20b6f7","tarball":"https://registry.npmjs.org/@ai-relay/project-memory/-/project-memory-0.0.4-beta.2.tgz","fileCount":124,"integrity":"sha512-G3kpKGlbC5ZriHw6yL5nOAuYPrkuQzvz+l0XNXrCIDRXZOWiGVbstjTtPTaHG3+dHFIdiv9rNw0dAdCl1T+TBg==","signatures":[{"sig":"MEYCIQD/HhesAsUzYkgcB97gutECph9C3HK1M17RyuR/lviupwIhANi2S+xW3c+DqlyVrcS8pmc9uID7ytLzQz7uPu6eIFk4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":349493},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./schema":"./schema/project-memory.schema.json"},"gitHead":"06e72c6ba359ccffeb7e27630c3e31bd7587dee6","scripts":{"dev":"tsx src/cli/index.ts","test":"node --import tsx --test tests/*.test.ts","build":"npm run clean && tsc","clean":"node scripts/clean.mjs","verify":"npm test && npm run typecheck && npm run build","typecheck":"tsc --noEmit","pack:check":"npm run build && node scripts/pack-check.mjs","package:smoke":"node scripts/package-smoke.mjs","prepublishOnly":"npm run verify && npm run pack:check","sync:package-identity":"node scripts/package-identity.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:629d177e-612d-44ca-8e52-670c14eb8c02"}},"repository":{"url":"git+https://github.com/vinayaktupe/project-memory.git","type":"git"},"_npmVersion":"11.19.0","description":"Configuration-driven persistent repository memory for AI coding agents, with Neo4j storage and read-only MCP access.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.5.4","jiti":"^2.7.0","fast-glob":"^3.3.3","typescript":"^5.9.2","neo4j-driver":"^6.0.0","@modelcontextprotocol/server":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsx":"^4.23.13","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project-memory_0.0.4-beta.2_1788711012093_0.14586326877564582","host":"s3://npm-registry-packages-npm-production"}},"0.0.4-beta.3":{"name":"@ai-relay/project-memory","version":"0.0.4-beta.3","keywords":["ai","agent-memory","mcp","neo4j","developer-tools","repository-memory","code-context","cursor"],"author":{"name":"Vinayak Tupe"},"license":"SEE LICENSE IN LICENSE","_id":"@ai-relay/project-memory@0.0.4-beta.3","maintainers":[{"name":"vinayak.tupe","email":"vinayaktupe1999@gmail.com"}],"homepage":"https://github.com/vinayaktupe/project-memory#readme","bugs":{"url":"https://github.com/vinayaktupe/project-memory/issues"},"bin":{"project-memory":"dist/cli/index.js"},"dist":{"shasum":"f8cfe89c7a446f009eb0d5fe76fa27048efef18d","tarball":"https://registry.npmjs.org/@ai-relay/project-memory/-/project-memory-0.0.4-beta.3.tgz","fileCount":124,"integrity":"sha512-GlYp1PmskdelTlWvZkx4a37/EPpHnkzk2yKWGJFLemRPee6ouY4MjhkxzwEuRmp7dBXr9svXKj4tsJ7KpTMxAQ==","signatures":[{"sig":"MEUCIB5DyO31idGNT3PiaPhgobgvA9R0IvkOYsFHQNgLuOnXAiEAlC+T2Vsurwv3gljH+qkc9qzvTOpRiiJpyYdU9kLxESM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDtpVLwGM3ie87OCBDLvHeX13VpnomxpUPPj9yLwNPGCAIhALG1URfOcLqSscMR5jhZLJ/jb7VmOaNrCwLQ8cs1WQ2W","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":374684},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./schema":"./schema/project-memory.schema.json"},"gitHead":"e30d9707c872eb0053dcb215373b320b594ebc55","scripts":{"dev":"tsx src/cli/index.ts","test":"node --import tsx --test tests/*.test.ts","build":"npm run clean && tsc","clean":"node scripts/clean.mjs","verify":"npm test && npm run typecheck && npm run build","typecheck":"tsc --noEmit","pack:check":"npm run build && node scripts/pack-check.mjs","package:smoke":"node scripts/package-smoke.mjs","prepublishOnly":"npm run verify && npm run pack:check","sync:package-identity":"node scripts/package-identity.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:629d177e-612d-44ca-8e52-670c14eb8c02"}},"repository":{"url":"git+https://github.com/vinayaktupe/project-memory.git","type":"git"},"_npmVersion":"11.19.0","description":"Configuration-driven persistent repository memory for AI coding agents, with Neo4j storage and read-only MCP access.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.5.4","jiti":"^2.7.0","fast-glob":"^3.3.3","typescript":"^5.9.2","neo4j-driver":"^6.0.0","@modelcontextprotocol/server":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsx":"^4.23.13","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project-memory_0.0.4-beta.3_1789571154461_0.5163848837646414","host":"s3://npm-registry-packages-npm-production"}},"0.0.4-beta.4":{"name":"@ai-relay/project-memory","version":"0.0.4-beta.4","keywords":["ai","agent-memory","mcp","neo4j","developer-tools","repository-memory","code-context","cursor"],"author":{"name":"Vinayak Tupe"},"license":"SEE LICENSE IN LICENSE","_id":"@ai-relay/project-memory@0.0.4-beta.4","maintainers":[{"name":"vinayak.tupe","email":"vinayaktupe1999@gmail.com"}],"homepage":"https://github.com/vinayaktupe/project-memory#readme","bugs":{"url":"https://github.com/vinayaktupe/project-memory/issues"},"bin":{"project-memory":"dist/cli/index.js"},"dist":{"shasum":"36e0dbce727d34618cf33fa0c52caa3bae9bd04a","tarball":"https://registry.npmjs.org/@ai-relay/project-memory/-/project-memory-0.0.4-beta.4.tgz","fileCount":136,"integrity":"sha512-CdIQ+AOX7Thr7+Fq1o3VvqKIXi4HMtS3RTp+VDzTbnIgO5nEFQA/+7O8ucXyQo3+sEX+R0z3QTsIWE8PZmI7qw==","signatures":[{"sig":"MEUCIQDO0UP0YrNWTuTh2cm25MLDnR0hplPSmUwDaJtgnQPXpwIgdPL1xG4lcDN1Sw3UrndNcEA8946rfzZZlEiYk/rANw0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDn9F20jR8Khlse+AvDDRA1HH79H9Bc0fNA79wVXK5dNAiBVwMzqNrQaoO4N7cgK4+898BlvWvSHF8HD0acsu0v8zA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":427574},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./schema":"./schema/project-memory.schema.json"},"gitHead":"86801147d45aef93fe86d9bc146eecba1594a65c","scripts":{"dev":"tsx src/cli/index.ts","test":"node --import tsx --test tests/*.test.ts","build":"npm run clean && tsc","clean":"node scripts/clean.mjs","verify":"npm test && npm run typecheck && npm run build","typecheck":"tsc --noEmit","pack:check":"npm run build && node scripts/pack-check.mjs","package:smoke":"node scripts/package-smoke.mjs","prepublishOnly":"npm run verify && npm run pack:check","sync:package-identity":"node scripts/package-identity.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:629d177e-612d-44ca-8e52-670c14eb8c02"}},"repository":{"url":"git+https://github.com/vinayaktupe/project-memory.git","type":"git"},"_npmVersion":"11.19.0","description":"Configuration-driven persistent repository memory for AI coding agents, with Neo4j storage and read-only MCP access.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.5.4","jiti":"^2.7.0","fast-glob":"^3.3.3","typescript":"^5.9.2","neo4j-driver":"^6.0.0","@modelcontextprotocol/server":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsx":"^4.23.13","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project-memory_0.0.4-beta.4_1789630207994_0.6907159302888837","host":"s3://npm-registry-packages-npm-production"}},"0.0.4-beta.5":{"name":"@ai-relay/project-memory","version":"0.0.4-beta.5","keywords":["ai","agent-memory","mcp","neo4j","developer-tools","repository-memory","code-context","cursor"],"author":{"name":"Vinayak Tupe"},"license":"SEE LICENSE IN LICENSE","_id":"@ai-relay/project-memory@0.0.4-beta.5","maintainers":[{"name":"vinayak.tupe","email":"vinayaktupe1999@gmail.com"}],"homepage":"https://github.com/vinayaktupe/project-memory#readme","bugs":{"url":"https://github.com/vinayaktupe/project-memory/issues"},"bin":{"project-memory":"dist/cli/index.js"},"dist":{"shasum":"d7cdf32322785736b8c813045ffed574fb887994","tarball":"https://registry.npmjs.org/@ai-relay/project-memory/-/project-memory-0.0.4-beta.5.tgz","fileCount":152,"integrity":"sha512-m4iusYDRwZRCi7QrQOIXMFq5+xH2qk20HLh4ocuSLdXOIeEgqIwFX8M+aWKdZwHgYusYp2lQtV9o+GHFDVxUNQ==","signatures":[{"sig":"MEUCIBBh4Jljd+HhlfyDlLVf5UYs2Ct3Tgq9+oyolj2YagGbAiEAlMXusG238ERgd8OEBDjqe2q/G3Hy+vUSFl4SlMc2Z7I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDpCs+TH6Pa8N56ZGRP1fgn0lbWDgbLGcf6eGh7YOYLtwIgaNALf2stWBaq2T1ciMakLmH4hj78H9Z1KM5FNxY2AVc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":482219},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./schema":"./schema/project-memory.schema.json"},"gitHead":"cbda58200e54ac24017f7c22b5b174e918d5220d","scripts":{"dev":"tsx src/cli/index.ts","test":"node --import tsx --test tests/*.test.ts","build":"npm run clean && tsc","clean":"node scripts/clean.mjs","verify":"npm test && npm run typecheck && npm run build","typecheck":"tsc --noEmit","pack:check":"npm run build && node scripts/pack-check.mjs","package:smoke":"node scripts/package-smoke.mjs","prepublishOnly":"npm run verify && npm run pack:check","sync:package-identity":"node scripts/package-identity.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:629d177e-612d-44ca-8e52-670c14eb8c02"}},"repository":{"url":"git+https://github.com/vinayaktupe/project-memory.git","type":"git"},"_npmVersion":"11.19.0","description":"Configuration-driven persistent repository memory for AI coding agents, with Neo4j storage and read-only MCP access.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.5.4","jiti":"^2.7.0","fast-glob":"^3.3.3","typescript":"^5.9.2","neo4j-driver":"^6.0.0","@modelcontextprotocol/server":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsx":"^4.23.13","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project-memory_0.0.4-beta.5_1789633994371_0.700484436092258","host":"s3://npm-registry-packages-npm-production"}},"0.0.4-beta.6":{"name":"@ai-relay/project-memory","version":"0.0.4-beta.6","keywords":["ai","agent-memory","mcp","neo4j","developer-tools","repository-memory","code-context","cursor"],"author":{"name":"Vinayak Tupe"},"license":"SEE LICENSE IN LICENSE","_id":"@ai-relay/project-memory@0.0.4-beta.6","maintainers":[{"name":"vinayak.tupe","email":"vinayaktupe1999@gmail.com"}],"homepage":"https://github.com/vinayaktupe/project-memory#readme","bugs":{"url":"https://github.com/vinayaktupe/project-memory/issues"},"bin":{"project-memory":"dist/cli/index.js"},"dist":{"shasum":"3c3aab974e430781ce3adbebe6201275b1ff0b65","tarball":"https://registry.npmjs.org/@ai-relay/project-memory/-/project-memory-0.0.4-beta.6.tgz","fileCount":156,"integrity":"sha512-IQ1R/UxpQ0+qIla7A8PTF6w11iOvLR9ahRWVFAcXr7w28IERv5ImQkDrhUEdJ3M0f+5YMmeUXf3uWiBVAY/XrQ==","signatures":[{"sig":"MEYCIQD2yl/ANlRlAwJ40bioDcs9rb98PHB9zJB4hFc2qMlm/wIhALFWK86jSYV9j533Z37qBIO9mO8Zc+kiScNS1VgHd/Np","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDGt3eTp/A1nPGz7cadspe3LKem8ka7d+ttvu/z3Bs+hwIhAJXHMMYbb6PfBElgkPbH8UobUaCmCjeDffbknj9fKaQv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":487687},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./schema":"./schema/project-memory.schema.json"},"gitHead":"2531066618563b7095e4c586371c2f651ef16cbc","scripts":{"dev":"tsx src/cli/index.ts","test":"node --import tsx --test tests/*.test.ts","build":"npm run clean && tsc","clean":"node scripts/clean.mjs","verify":"npm test && npm run typecheck && npm run build","typecheck":"tsc --noEmit","pack:check":"npm run build && node scripts/pack-check.mjs","package:smoke":"node scripts/package-smoke.mjs","prepublishOnly":"npm run verify && npm run pack:check","sync:package-identity":"node scripts/package-identity.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:629d177e-612d-44ca-8e52-670c14eb8c02"}},"repository":{"url":"git+https://github.com/vinayaktupe/project-memory.git","type":"git"},"_npmVersion":"11.19.0","description":"Configuration-driven persistent repository memory for AI coding agents, with Neo4j storage and read-only MCP access.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.5.4","jiti":"^2.7.0","fast-glob":"^3.3.3","typescript":"^5.9.2","neo4j-driver":"^6.0.0","@modelcontextprotocol/server":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"tsx":"^4.23.13","@types/node":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/project-memory_0.0.4-beta.6_1789635328977_0.5603107413621096","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"_id":"@ai-relay/project-memory@0.0.4","bin":{"project-memory":"dist/cli/index.js"},"bugs":{"url":"https://github.com/vinayaktupe/project-memory/issues"},"dist":{"shasum":"e8ff0116b2ff3c2abac15e421715487579cbccc2","tarball":"https://registry.npmjs.org/@ai-relay/project-memory/-/project-memory-0.0.4.tgz","fileCount":156,"integrity":"sha512-AShWDN8GvD5N31fncdp7tP4IdLuG84Qt9bXUe601JhqghNpRTb0XLyS16K+kPxSh4XqIvD5MocXrSuSq7WEHAw==","signatures":[{"sig":"MEUCIC8lJ1+CP3ygsJM5kI1f32FFSIbvApodlehwEPSouAr9AiEAp0DTjRA9eRtUE2SUevhy921fCUE3OZhWfKICV4oqf4Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIF+gwlwh+SJwEyRJDDSUzQBZqY0rjGCwXu8lDSTqed11AiAXkkuMEzcamxMznyFx17i9ooLbC3lfycRDQ3hkJUo5HA=="}],"unpackedSize":489262},"name":"@ai-relay/project-memory","type":"module","author":{"name":"Vinayak Tupe"},"engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./schema":"./schema/project-memory.schema.json"},"gitHead":"09a03127760eda5c4373aaf142420a213e7439cc","license":"SEE LICENSE IN LICENSE","scripts":{"dev":"tsx src/cli/index.ts","test":"node --import tsx --test tests/*.test.ts","build":"npm run clean && tsc","clean":"node scripts/clean.mjs","verify":"npm test && npm run typecheck && npm run build","typecheck":"tsc --noEmit","pack:check":"npm run build && node scripts/pack-check.mjs","package:smoke":"node scripts/package-smoke.mjs","prepublishOnly":"npm run verify && npm run pack:check","sync:package-identity":"node scripts/package-identity.mjs"},"version":"0.0.4","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:629d177e-612d-44ca-8e52-670c14eb8c02"}},"homepage":"https://github.com/vinayaktupe/project-memory#readme","keywords":["ai","agent-memory","mcp","neo4j","developer-tools","repository-memory","code-context","cursor"],"repository":{"url":"git+https://github.com/vinayaktupe/project-memory.git","type":"git"},"_npmVersion":"11.19.0","description":"Configuration-driven persistent repository memory for AI coding agents, with Neo4j storage and read-only MCP access.","directories":{},"maintainers":[{"name":"vinayak.tupe","email":"vinayaktupe1999@gmail.com"}],"_nodeVersion":"24.20.0","dependencies":{"zod":"^4.5.4","jiti":"^2.7.0","fast-glob":"^3.3.3","typescript":"^5.9.2","neo4j-driver":"^6.0.0","@modelcontextprotocol/server":"^2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.23.13","@types/node":"^24.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/project-memory_0.0.4_1789636981927_0.9099059907844562"}}},"time":{"created":"2026-08-31T15:03:49.141Z","modified":"2026-09-17T09:23:03.636Z","0.2.8":"2026-08-31T14:26:24.597Z","0.0.1":"2026-08-31T14:28:35.898Z","0.0.2":"2026-08-31T15:03:49.480Z","0.0.3-beta.1":"2026-08-31T15:33:29.363Z","0.0.3-beta.2":"2026-08-31T15:41:58.100Z","0.0.3":"2026-08-31T15:44:49.893Z","0.0.4-beta.1":"2026-09-02T06:03:43.052Z","0.0.4-beta.2":"2026-09-06T16:10:12.220Z","0.0.4-beta.3":"2026-09-16T15:05:54.600Z","0.0.4-beta.4":"2026-09-17T07:30:08.083Z","0.0.4-beta.5":"2026-09-17T08:33:14.455Z","0.0.4-beta.6":"2026-09-17T08:55:29.072Z","0.0.4":"2026-09-17T09:23:02.027Z"},"bugs":{"url":"https://github.com/vinayaktupe/project-memory/issues"},"author":{"name":"Vinayak Tupe"},"license":"SEE LICENSE IN LICENSE","homepage":"https://github.com/vinayaktupe/project-memory#readme","keywords":["ai","agent-memory","mcp","neo4j","developer-tools","repository-memory","code-context","cursor"],"repository":{"url":"git+https://github.com/vinayaktupe/project-memory.git","type":"git"},"description":"Configuration-driven persistent repository memory for AI coding agents, with Neo4j storage and read-only MCP access.","maintainers":[{"name":"vinayak.tupe","email":"vinayaktupe1999@gmail.com"}],"readme":"# Project Memory\n\nPersistent, configuration-driven project memory for AI coding agents.\n\nProject Memory turns the files you choose in a repository into a deterministic, queryable memory graph. It keeps Git/repository files as the source of truth and stores derived memory in Neo4j. A read-only MCP server lets compatible AI coding agents retrieve project context without giving the agent write access to the memory store.\n\nProject Memory is language-agnostic: the repository can be JavaScript, TypeScript, Python, .NET, Java, Go, Rust, or another technology stack. The Project Memory CLI runs on Node.js and operates on the repository filesystem, Git, configured parsers, Neo4j, and MCP.\n\n## Why Project Memory?\n\nUseful project knowledge is often scattered across README files, architecture documentation, design notes, technology choices, references, and relationships between them.\n\nProject Memory provides a durable layer between the repository and the AI agent:\n\n```text\nRepository files\n      │\n      ▼\nConfigured extraction\n      │\n      ▼\nSemantic memory graph\n      │\n      ▼\nNeo4j\n      │\n      ▼\nRead-only MCP\n      │\n      ▼\nAI coding agent\n```\n\nThe graph is derived from the repository. Git/repository files remain the source of truth.\n\n## Requirements\n\n- Node.js 20+\n- Neo4j 5+ for persistent memory storage\n- Git (optional, for hook integration)\n\nNeo4j is not installed, provisioned, or hosted by Project Memory. You provide a local or remote Neo4j instance (see [Neo4j](#neo4j)).\n\n## Installation\n\nInstall the CLI once on your machine:\n\n```bash\nnpm install -g @ai-relay/project-memory\n```\n\nConfirm it is available:\n\n```bash\nproject-memory help\n```\n\nProject Memory is a **repository-level CLI**, not a library dependency of your application. After global installation, run `project-memory` from any project directory.\n\n## Quick start\n\nUse these steps in **each repository** you want to index.\n\n### 1. Install the CLI (once per machine)\n\nFollow [Installation](#installation). Skip this step if `project-memory help` already works.\n\n### 2. Provide Neo4j connection settings\n\nSet environment variables (for example in your shell profile or a local `.env` file that you do not commit):\n\n```text\nPROJECT_MEMORY_NEO4J_URI=bolt://localhost:7687\nPROJECT_MEMORY_NEO4J_USERNAME=neo4j\nPROJECT_MEMORY_NEO4J_PASSWORD=your-password\nPROJECT_MEMORY_NEO4J_DATABASE=neo4j\n```\n\n`PROJECT_MEMORY_NEO4J_DATABASE` is optional and defaults to `neo4j`.\n\nFor a local database, you can start Neo4j with the example in `examples/neo4j/docker-compose.yml`.\n\n### 3. Initialize the repository\n\nFrom the repository root:\n\n```bash\ncd /path/to/your-repo\nproject-memory init\n```\n\nUse `project-memory init --js` for a JavaScript config file. Use `project-memory init --no-hooks` if you do not want Git hooks installed yet.\n\nTo generate IDE MCP config in the same step, add `--mcp` and `--ide=<id>` (for example `project-memory init --mcp --ide=cursor`). See [Connect your IDE](#8-connect-your-ide-optional) and [IDE MCP setup](#ide-mcp-setup).\n\nThis creates `project-memory.config.ts` or `project-memory.config.js` with a starter `sources` entry (typically `README.md` and `docs/**/*.md`).\n\n### 4. Adjust configuration (recommended)\n\nEdit `project-memory.config.*` and add the files you want indexed. Built-in parsers include `markdown`, `typescript`, `javascript`, `tsx`, `jsx`, `react`, `csharp`, `dotnet`, `json`, `cjs`, and `mjs`, or use `parser: \"auto\"` to match by file extension.\n\n### 5. Verify setup\n\n```bash\nproject-memory doctor\n```\n\nFix any reported configuration, Neo4j, or hook issues before syncing.\n\n### 6. Build the memory graph\n\n```bash\nproject-memory sync\n```\n\nWhile sync runs, progress is written to **stderr** (discovered file count, per-file status, and a completion summary). The final `discovered=… synced=…` line is printed on stdout when sync finishes.\n\n### 7. Inspect results\n\n```bash\nproject-memory status\n```\n\n### 8. Connect your IDE (optional)\n\nAfter `sync`, connect a supported editor or agent client so it can call Project Memory over MCP.\n\n**Option A — during init**\n\n```bash\nproject-memory init --mcp --ide=cursor\n```\n\nThis writes `mcp.ide` into `project-memory.config.*` and creates or updates that IDE’s MCP config file in the repository.\n\n**Option B — after init**\n\nSet the IDE in config:\n\n```ts\nmcp: {\n  enabled: true,\n  ide: \"cursor\", // cursor | vscode | windsurf | claude-code | claude-desktop | zed | continue\n},\n```\n\nThen apply it:\n\n```bash\nproject-memory mcp setup\n```\n\n**Interactive choice**\n\n```bash\nproject-memory init --mcp\n```\n\nWithout `--ide`, init prompts for an IDE when stdin is a TTY.\n\nRestart your IDE (or reload MCP) after setup. Details: [IDE MCP setup](#ide-mcp-setup).\n\n## Configuration\n\nProject Memory is configuration-driven. The configuration is the primary extension point for a consumer repository.\n\nSupported configuration files are discovered in this order:\n\n```text\n\nproject-memory.config.ts\n\nproject-memory.config.mts\n\nproject-memory.config.cts\n\nproject-memory.config.js\n\nproject-memory.config.mjs\n\nproject-memory.config.cjs\n\n```\n\nUnsupported configuration properties are rejected at load time.\n\n### TypeScript configuration\n\n```ts\n\nexport default {\n\n    namespace: 'my-project',\n\n    project: {\n\n        name: 'my-project',\n\n    },\n\n    sources: [\n\n        {\n\n            include: ['README.md', 'docs/\\*\\*/\\*.md', 'architecture/\\*\\*/\\*.md'],\n\n            exclude: ['node\\_modules/\\*\\*', 'dist/\\*\\*', 'build/\\*\\*', 'coverage/\\*\\*'],\n\n            parser: 'markdown',\n\n        },\n\n    ],\n\n    storage: {\n\n        provider: 'neo4j',\n\n        connection: {\n\n            uri: process.env.PROJECT_MEMORY_NEO4J_URI!,\n\n            username: process.env.PROJECT_MEMORY_NEO4J_USERNAME!,\n\n            password: process.env.PROJECT_MEMORY_NEO4J_PASSWORD!,\n\n            database: process.env.PROJECT_MEMORY_NEO4J_DATABASE ?? 'neo4j',\n\n        },\n\n    },\n\n    retrieval: {\n\n        maxResults: 10,\n\n        maxContextTokens: 4000,\n\n        includeSource: true,\n\n        includeRelationships: true,\n\n        includeConfidence: true,\n\n    },\n\n    mcp: {\n\n        enabled: true,\n\n        ide: 'cursor',\n\n    },\n\n    maintenance: {\n\n        prune: {\n\n            enabled: true,\n\n        },\n\n    },\n\n    hooks: {\n\n        preCommit: {\n\n            enabled: true,\n\n            action: 'validate',\n\n        },\n\n        postCommit: {\n\n            enabled: true,\n\n            action: 'sync',\n\n        },\n\n    },\n\n});\n\n```\n\n### JavaScript configuration\n\nJavaScript projects can use:\n\n```bash\n\nproject-memory init --js\n\n```\n\nThe generated JavaScript configuration is editor-friendly and uses type checking so unsupported configuration properties and invalid values can be surfaced while editing.\n\nA JavaScript configuration has the same runtime behavior as a TypeScript configuration.\n\n## Language examples\n\nProject Memory operates at the repository level, so the application language does not need to be JavaScript or TypeScript.\n\n### JavaScript\n\nExample repository:\n\n```text\n\nmy-node-app/\n├── src/\n├── docs/\n├── README.md\n├── package.json\n└── project-memory.config.js\n```\n\nExample configuration:\n\n```js\n// @ts-check\n\n/** @type {import(\"@ai-relay/project-memory\").ProjectMemoryConfig} */\nexport default {\n\tnamespace: 'my-node-app',\n\n\tsources: [\n\t\t{\n\t\t\tinclude: ['README.md', 'docs/**/*.md'],\n\t\t\texclude: ['node_modules/**', 'dist/**'],\n\t\t\tparser: 'markdown',\n\t\t},\n\t],\n\n\tstorage: {\n\t\tprovider: 'neo4j',\n\t\tconnection: {\n\t\t\turi: process.env.PROJECT_MEMORY_NEO4J_URI,\n\t\t\tusername: process.env.PROJECT_MEMORY_NEO4J_USERNAME,\n\t\t\tpassword: process.env.PROJECT_MEMORY_NEO4J_PASSWORD,\n\t\t\tdatabase: process.env.PROJECT_MEMORY_NEO4J_DATABASE ?? 'neo4j',\n\t\t},\n\t},\n};\n```\n\nThen run:\n\n```bash\nproject-memory doctor\nproject-memory sync\n```\n\n### TypeScript\n\nExample repository:\n\n```text\n\nmy-ts-app/\n\n├── src/\n\n├── docs/\n\n├── README.md\n\n├── package.json\n\n├── tsconfig.json\n\n└── project-memory.config.ts\n\n```\n\nInitialize:\n\n```bash\n\nproject-memory init\n\n```\n\nThen configure the source patterns and synchronize:\n\n```bash\n\nproject-memory doctor\n\nproject-memory sync\n\n```\n\n### Python\n\nProject Memory does not need to be added to the Python virtual environment.\n\nExample repository:\n\n```text\nmy-python-service/\n├── src/\n├── tests/\n├── docs/\n├── README.md\n├── pyproject.toml\n└── project-memory.config.js\n```\n\nFrom the repository root (with the CLI already installed globally):\n\n```bash\ncd my-python-service\nproject-memory init --js\n```\n\nExample source configuration can include Python files if a parser is later configured to process them; Markdown is supported by the current built-in parser:\n\n```js\n// @ts-check\n\n/** @type {import(\"@ai-relay/project-memory\").ProjectMemoryConfig} */\nexport default {\n\tnamespace: 'my-python-service',\n\n\tsources: [\n\t\t{\n\t\t\tinclude: ['README.md', 'docs/**/*.md'],\n\t\t\texclude: ['.venv/**', '__pycache__/**', 'build/**', 'dist/**'],\n\t\t\tparser: 'markdown',\n\t\t},\n\t],\n\n\tstorage: {\n\t\tprovider: 'neo4j',\n\t\tconnection: {\n\t\t\turi: process.env.PROJECT_MEMORY_NEO4J_URI,\n\t\t\tusername: process.env.PROJECT_MEMORY_NEO4J_USERNAME,\n\t\t\tpassword: process.env.PROJECT_MEMORY_NEO4J_PASSWORD,\n\t\t\tdatabase: process.env.PROJECT_MEMORY_NEO4J_DATABASE ?? 'neo4j',\n\t\t},\n\t},\n};\n```\n\nThen:\n\n```bash\n\nproject-memory doctor\n\nproject-memory sync\n\n```\n\n### .NET\n\nProject Memory does not require the .NET project to reference a Node package.\n\nExample repository:\n\n```text\nMyDotNetService/\n├── src/\n├── tests/\n├── docs/\n├── README.md\n├── MyDotNetService.sln\n└── project-memory.config.js\n```\n\nFrom the repository root:\n\n```bash\ncd MyDotNetService\nproject-memory init --js\n```\n\nExample configuration:\n\n```js\n// @ts-check\n\n/** @type {import(\"@ai-relay/project-memory\").ProjectMemoryConfig} */\nexport default {\n\tnamespace: 'my-dotnet-service',\n\n\tsources: [\n\t\t{\n\t\t\tinclude: ['README.md', 'docs/**/*.md'],\n\t\t\texclude: ['bin/**', 'obj/**', '.vs/**'],\n\t\t\tparser: 'markdown',\n\t\t},\n\t],\n\n\tstorage: {\n\t\tprovider: 'neo4j',\n\t\tconnection: {\n\t\t\turi: process.env.PROJECT_MEMORY_NEO4J_URI,\n\t\t\tusername: process.env.PROJECT_MEMORY_NEO4J_USERNAME,\n\t\t\tpassword: process.env.PROJECT_MEMORY_NEO4J_PASSWORD,\n\t\t\tdatabase: process.env.PROJECT_MEMORY_NEO4J_DATABASE ?? 'neo4j',\n\t\t},\n\t},\n};\n```\n\nThen:\n\n```bash\n\nproject-memory sync\n\n```\n\n## CLI\n\n```bash\n\nproject-memory init\n\nproject-memory init --js\n\nproject-memory init --no-hooks\n\nproject-memory init --mcp --ide=cursor\n\nproject-memory sync\n\nproject-memory status\n\nproject-memory doctor\n\nproject-memory prune\n\nproject-memory prune --yes\n\nproject-memory reset --yes\n\nproject-memory mcp\n\nproject-memory mcp setup\n\nproject-memory hooks install\n\nproject-memory hooks status\n\nproject-memory hooks uninstall\n\n```\n\nRun these from the repository that contains `project-memory.config.*`.\n\n## Synchronization behavior\n\nProject Memory tracks source content using hashes and tracks the parser version used to create the graph.\n\nAn unchanged source is skipped only when:\n\n- its content hash is unchanged\n- its parser version is unchanged\n- its graph ownership data is valid\n\nA changed source is reprocessed.\n\nA deleted source is removed from the derived memory graph.\n\nAn unexpected zero-file discovery does not silently wipe an existing indexed graph.\n\nTypical incremental behavior:\n\n```text\nFirst sync:\n3 discovered → 3 synced\n\nAfter changing one source:\n3 discovered → 1 changed → 1 synced → 2 skipped\n\nNext sync:\n3 discovered → 0 changed → 0 synced → 3 skipped\n\nAfter deleting one source:\n2 discovered → 0 changed → 0 synced → 2 skipped → 1 removed\n```\n\n## Git hooks\n\nProject Memory installs hooks in a **`githooks/`** directory at the repository root (not inside `.git/hooks`). Installation sets:\n\n```text\ngit config core.hooksPath githooks\n```\n\nHook scripts are plain shell files you can open, review, and customize, for example:\n\n```text\ngithooks/pre-commit\ngithooks/post-commit\n```\n\nProject Memory updates only the marked section in each file and leaves your other lines untouched.\n\nConfigure which hooks run:\n\n```ts\nhooks: {\n  preCommit: {\n    enabled: true,\n    action: \"validate\",\n  },\n  postCommit: {\n    enabled: true,\n    action: \"sync\",\n  },\n}\n```\n\nManage installation:\n\n```bash\nproject-memory hooks install\nproject-memory hooks status\nproject-memory hooks uninstall\n```\n\n`project-memory init` runs `hooks install` when Git is available and hooks are enabled in the generated config.\n\nThe post-commit synchronization is best-effort. A temporary Neo4j outage must not invalidate an already-created Git commit.\n\n## MCP\n\nProject Memory exposes persistent project memory through a read-only MCP server.\n\nStart it from the repository root (after `sync`):\n\n```bash\nproject-memory mcp\n```\n\nThe MCP surface currently provides:\n\n| Tool             | Purpose                                      |\n| ---------------- | -------------------------------------------- |\n| `memory_search`  | Navigation: `hits[]` with id, path, ≤120-char `summary` (no full content) |\n| `memory_get`     | **Only tool with full `content`** — `id` or `ids` (max 25) |\n| `memory_related` | Navigation: anchor + neighbor ids/paths/relationship types |\n| `memory_context` | Ranked navigation for a query (+ compact neighbors per hit) |\n| `memory_sources` | List indexed repository sources              |\n| `memory_status`  | Return memory graph status                   |\n\nMCP access is read-only. The server exposes project memory to an agent without exposing storage mutation operations through MCP.\n\n**Agent contract:** navigation tools return ids, paths, and short `summary` lines only. **`memory_get`** returns full stored `content`; **the live file at `sourcePath` in Git** is authoritative for edits and precise claims.\n\n**Practical workflow:** `memory_search` with exact symbols or distinctive phrases → `memory_get` on promising ids → read the source file in the repo. The index excels at targeted navigation; broad paraphrase-style questions are a weak fit for lexical v1 retrieval (see [docs/mcp.md](docs/mcp.md)).\n\n### LLM context deduplication (optional)\n\n`memory_context` always applies fast **lexical** deduplication first. You can opt in to a **query-time SLM/LM** pass that drops paraphrased duplicates and can merge overlapping snippets before the context token budget is applied. The graph in Neo4j is not modified; only the packed MCP response changes.\n\n**1. Run an OpenAI-compatible chat endpoint**\n\nUse any server that implements `POST /v1/chat/completions` with JSON message responses.\n\nLocal example with [Ollama](https://ollama.com):\n\n```bash\nollama pull phi4-mini\nollama serve\n```\n\nDefault API base: `http://localhost:11434/v1`. For Azure OpenAI, a vLLM instance, or another host, use that service’s chat base URL (often ending in `/v1`).\n\n**2. Set credentials in the environment (not in the config file)**\n\n```bash\nexport PROJECT_MEMORY_CONTEXT_LLM_BASE_URL=\"http://localhost:11434/v1\"\nexport PROJECT_MEMORY_CONTEXT_LLM_MODEL=\"phi4-mini\"\n# Optional, when the endpoint requires a key:\nexport PROJECT_MEMORY_CONTEXT_LLM_API_KEY=\"your-api-key\"\n```\n\nOn Windows (PowerShell): `$env:PROJECT_MEMORY_CONTEXT_LLM_BASE_URL = \"http://localhost:11434/v1\"` (and the same for the other variables).\n\n**3. Enable LLM dedup in `project-memory.config.*`**\n\nAdd `retrieval.contextLlm` (unsupported keys are rejected—match the schema in `schema/project-memory.schema.json`):\n\n```ts\nretrieval: {\n  maxResults: 10,\n  maxContextTokens: 4000,\n  includeSource: true,\n  includeRelationships: true,\n  includeConfidence: true,\n  contextLlm: {\n    enabled: true,\n    model: \"phi4-mini\",\n    baseUrl: \"http://localhost:11434/v1\",\n    apiKeyEnv: \"PROJECT_MEMORY_CONTEXT_LLM_API_KEY\",\n    maxCandidates: 20,\n    timeoutMs: 30000,\n    temperature: 0,\n  },\n},\n```\n\n`model` and `baseUrl` can be omitted when the matching `PROJECT_MEMORY_CONTEXT_LLM_*` env vars are set. `apiKeyEnv` names which env var holds the API key (default `PROJECT_MEMORY_CONTEXT_LLM_API_KEY`).\n\n**4. Sync memory and use MCP**\n\n```bash\nproject-memory sync\n```\n\nStart or reload MCP in your IDE (`project-memory mcp` is what the IDE config runs). Call the **`memory_context`** tool with your query. The response may include:\n\n```json\n\"deduplication\": {\n  \"mode\": \"llm\",\n  \"llmApplied\": true,\n  \"droppedIds\": [\"…\"]\n}\n```\n\nTo force LLM dedup on a single call when config has it disabled, pass `llmDedup: true` on the `memory_context` tool (config must still provide `model` / `baseUrl` or env).\n\n**5. If the model is unavailable**\n\nLexical dedup and context packing still run. Check MCP host **stderr** for lines like `[project-memory] context LLM dedup skipped: …`, and look for `deduplication.llmFallbackReason` on the JSON result. No API keys or repo secrets are written into the graph.\n\nMore detail: [docs/configuration.md](docs/configuration.md) and [docs/mcp.md](docs/mcp.md).\n\n### IDE MCP setup\n\nProject Memory can write MCP client configuration for common IDEs. The target IDE is stored in **`mcp.ide`** in `project-memory.config.*`.\n\n| `mcp.ide` value   | File created or updated in the repo      |\n| ----------------- | ---------------------------------------- |\n| `cursor`          | `.cursor/mcp.json`                       |\n| `vscode`          | `.vscode/mcp.json`                       |\n| `windsurf`        | `.windsurf/mcp.json`                     |\n| `claude-code`     | `.mcp.json`                              |\n| `continue`        | `.continue/mcpServers/<name>.json`       |\n| `zed`             | `.zed/settings.json` (`context_servers`) |\n| `claude-desktop`  | `mcp/claude-desktop.config.json` (snippet to merge into your user-level Claude Desktop config) |\n\nCommands:\n\n```bash\nproject-memory init --mcp --ide=cursor   # config + IDE file during init\nproject-memory mcp setup                 # (re)apply from mcp.ide in config\n```\n\nEach setup adds a server entry (default name `project-memory`) that runs the globally installed CLI:\n\n```json\n{\n  \"command\": \"project-memory\",\n  \"args\": [\"mcp\"]\n}\n```\n\nOptional: set `mcp.name` in config to use a different server key in the IDE JSON.\n\n**If an MCP file already exists**\n\n- Project Memory **merges** into the existing JSON: other servers are left unchanged. Cursor/Claude-style files use `mcpServers`; VS Code uses `servers`; Zed uses `context_servers`.\n- Only the Project Memory server entry is added or updated (same name as `mcp.name` or `project-memory`).\n- Re-running `project-memory mcp setup` refreshes that entry; it does not remove your other MCP servers.\n- If the file is missing or not valid JSON, setup starts from a minimal document and may not preserve non-JSON content—prefer valid JSON before running setup.\n\n**Claude Desktop** does not use a project-local MCP path; copy the generated snippet from `mcp/claude-desktop.config.json` into your Claude Desktop user config and restart the app.\n\n**Manual MCP entry**\n\nIf you configure the client yourself, use the same command and args as above and set the client’s working directory to the repository root (where `project-memory.config.*` lives). On Windows/macOS/Linux, resolve the CLI with `where project-memory` or `which project-memory` if the client needs an absolute path.\n\nThe MCP server reads configuration from that repository, connects to Neo4j using your environment variables, and exposes read-only memory tools on stdio.\n\n## Neo4j\n\nProject Memory expects you to provide your own Neo4j instance.\n\nFor local development, an example Docker Compose file is included at:\n\n```text\n\nexamples/neo4j/docker-compose.yml\n\n```\n\nProject Memory does not provision, manage, or host Neo4j.\n\n## Safety and data ownership\n\nProject Memory treats repository files as authoritative and Neo4j as derived memory.\n\nThis design provides several safety properties:\n\n- deterministic identities make reprocessing predictable\n- source ownership prevents cross-source graph contamination\n- invalid graph metadata forces source rebuilding\n- deleted sources are reconciled\n- unexpected zero-source discovery is treated as a safety condition\n- pruning can be previewed before applying changes\n\nBefore destructive maintenance:\n\n```bash\n\nproject-memory prune\n\n```\n\nApply the preview only when it is correct:\n\n```bash\n\nproject-memory prune --yes\n\n```\n\nTo remove the complete memory graph for the configured namespace:\n\n```bash\n\nproject-memory reset --yes\n\n```\n\nUse `reset` deliberately.\n\n## Repository validation\n\nRepository validation parses configured sources and validates source ownership before graph writes.\n\nIt is also used by the Git pre-commit workflow to validate memory-relevant staged files.\n\nNeo4j-dependent commands and local-only configuration commands have different requirements:\n\n```text\nLocal/config-only:\n  init\n  hooks install\n  hooks status\n  hooks uninstall\n  mcp setup\n\nStorage-dependent:\n  sync\n  status\n  doctor\n  prune\n  reset\n  mcp          # start MCP server (not mcp setup)\n```\n\nThis means a developer can initialize Project Memory and install hooks before database credentials have been configured.\n\n## Examples\n\nThe repository includes:\n\n```text\nexamples/\n├── minimal/\n│   └── project-memory.config.ts\n└── neo4j/\n    └── docker-compose.yml\n```\n","readmeFilename":"README.md"}