{"_id":"@emiliano-go/totem","_rev":"11-bce6ec71aaebbbb269d78f5c782c06ef","name":"@emiliano-go/totem","dist-tags":{"latest":"0.5.1"},"versions":{"0.2.1":{"name":"@emiliano-go/totem","version":"0.2.1","keywords":["opencode-plugin","opencode","totem","memory","mcp","agent"],"author":{"name":"Emiliano Gandini Outeda","email":"emiliano.gandini@protonmail.com"},"license":"MIT","_id":"@emiliano-go/totem@0.2.1","maintainers":[{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"}],"bin":{"totem":"bin/totem.js"},"dist":{"shasum":"b3268bb7d1133361d1100c9b4369dc115d9cf12b","tarball":"https://registry.npmjs.org/@emiliano-go/totem/-/totem-0.2.1.tgz","fileCount":5,"integrity":"sha512-RCgkEkgCndQB2g6y5VAcDGsu+YQAlC1++vk5PbfKnGeACKOaceMxI+ILboU9I3pXWetJiKmH3UE4pe70VYYq2w==","signatures":[{"sig":"MEQCIHGuxBYrMYHlRUQ+Mjd7fIw3igdnPbnETaodHk/B6YxBAiAL4hOFgxenerWgR3FvidZeYxY2CkG7EYGWI+jNt9K/0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":7507},"main":".opencode/plugins/totem-enforce.js","engines":{"node":">=18"},"gitHead":"722a7cfc08da83caa401a2bb04f6bc9be0efb493","_npmUser":{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"},"_npmVersion":"12.0.2","description":"Persistent memory layer for engineering agents (opencode plugin + MCP server)","directories":{},"_nodeVersion":"26.8.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/totem_0.2.1_1788818228937_0.9432078975707532","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@emiliano-go/totem","version":"0.2.2","keywords":["opencode-plugin","opencode","totem","memory","mcp","agent"],"author":{"name":"Emiliano Gandini Outeda","email":"emiliano.gandini@protonmail.com"},"license":"MIT","_id":"@emiliano-go/totem@0.2.2","maintainers":[{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"}],"bin":{"totem":"bin/totem.js"},"dist":{"shasum":"b6c09fddfc2a2cefa89a93ed1914dc3736142f4a","tarball":"https://registry.npmjs.org/@emiliano-go/totem/-/totem-0.2.2.tgz","fileCount":11,"integrity":"sha512-Pzs9IalgzsyvdRsLVgMKPRVBuueFEEfKggut175l9ug6GFOuY+4OT2aXOl2NsC3aDJuUpdwuKBRAgdh1vvNnIw==","signatures":[{"sig":"MEUCIQDWUo25ajSMRxaLQ/UaNrMh57iSd3b/0FLMA3GwO/CWaQIgD3TpivEKxAgh2eG8m0vnUxw4QxmHIqcFkECyJxQOTqs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21241},"main":".opencode/plugins/totem-enforce.js","engines":{"node":">=18"},"gitHead":"722a7cfc08da83caa401a2bb04f6bc9be0efb493","_npmUser":{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"},"_npmVersion":"12.0.2","description":"Persistent memory layer for engineering agents (opencode plugin + MCP server)","directories":{},"_nodeVersion":"26.8.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/totem_0.2.2_1788821025708_0.23425778123120078","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@emiliano-go/totem","version":"0.3.0","keywords":["opencode-plugin","opencode","totem","memory","mcp","agent"],"author":{"name":"Emiliano Gandini Outeda","email":"emiliano.gandini@protonmail.com"},"license":"MIT","_id":"@emiliano-go/totem@0.3.0","maintainers":[{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"}],"bin":{"totem":"bin/totem.js"},"dist":{"shasum":"92d67ca30c362b2eb9539bb62b9d1a6fd2b4772e","tarball":"https://registry.npmjs.org/@emiliano-go/totem/-/totem-0.3.0.tgz","fileCount":11,"integrity":"sha512-psHeaTusC1qvW9904jkfZdqcS4CptZcDw2Za7re69pepJ4JzZlXUSAupYTfySVYpVofvP4VmVywXUuIcrfxdVw==","signatures":[{"sig":"MEUCIE+o2c64FPkJ7Oc+V1uWy9H98stoOAZqPufv4psuxWSgAiEAqQYOVDHOQc3CbqurgVmbfaHDGVxlsS65HheJxxJ81Nk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24996},"main":".opencode/plugins/totem-enforce.js","engines":{"node":">=18"},"gitHead":"3bc9e03f865e627e724b7044071846a4573c97ee","_npmUser":{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"},"_npmVersion":"12.0.2","description":"Agent enforcement plugin for totem memory system (OpenCode, Claude Code, Kimi Code)","directories":{},"_nodeVersion":"26.8.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/totem_0.3.0_1788846531060_0.28138913465120385","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@emiliano-go/totem","version":"0.4.0","keywords":["opencode-plugin","opencode","totem","memory","mcp","agent"],"author":{"name":"Emiliano Gandini Outeda","email":"emiliano.gandini@protonmail.com"},"license":"MIT","_id":"@emiliano-go/totem@0.4.0","maintainers":[{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"}],"bin":{"totem":"bin/totem.js"},"dist":{"shasum":"50f3a5cad3350be12fe938c1f8d099f6031a7e10","tarball":"https://registry.npmjs.org/@emiliano-go/totem/-/totem-0.4.0.tgz","fileCount":11,"integrity":"sha512-JKurlAADhpTO/2vHjV9J5DoPyW1XdaiMkTV1HSbIiOYKRwNrXs+o4Xvjbx53HSLckNznk5TM5KDEP+/QTORZWA==","signatures":[{"sig":"MEUCIQDyQXG6C1CfvltD9B5femyJdcXNXihmqJpptinxs4du6QIgNxokiwMlRqTp+4buISlROEE3a8Pqus8MI0sduWh9w2k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24996},"main":".opencode/plugins/totem-enforce.js","engines":{"node":">=18"},"gitHead":"0a7b320e8358a8e06629fc36db2b2674aefe63c9","_npmUser":{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"},"_npmVersion":"12.0.2","description":"Agent enforcement plugin for totem memory system (OpenCode, Claude Code, Kimi Code)","directories":{},"_nodeVersion":"26.8.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/totem_0.4.0_1788846973728_0.8005736252947568","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@emiliano-go/totem","version":"0.4.1","keywords":["opencode-plugin","opencode","totem","memory","mcp","agent"],"author":{"name":"Emiliano Gandini Outeda","email":"emiliano.gandini@protonmail.com"},"license":"MIT","_id":"@emiliano-go/totem@0.4.1","maintainers":[{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"}],"bin":{"totem":"bin/totem.js"},"dist":{"shasum":"accc1e7e930c720ea5f921334ec4ef0c17ded153","tarball":"https://registry.npmjs.org/@emiliano-go/totem/-/totem-0.4.1.tgz","fileCount":11,"integrity":"sha512-kbG+6ZqrF2acv2iu7HlEG9IOLJy4x/NNTdkMOen63dRiUL2iRoUUac2s1eqwRbMfk5Newx7/FyzWjQ4zYsw+jg==","signatures":[{"sig":"MEUCIQCuiwbaZwgJ4pdrwSwh4o7MsXxDKPa7Mr0efNi5jj66ZAIgKqHDz9nmCKIfvO4uqfUxUpJKhgkZlPrhhUGbgk1PiBo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26057},"main":".opencode/plugins/totem-enforce.js","engines":{"node":">=18"},"gitHead":"56d2a710ed619aa5acc70980c733c6118a65d478","_npmUser":{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"},"_npmVersion":"12.0.2","description":"Agent enforcement plugin for totem memory system (OpenCode, Claude Code, Kimi Code)","directories":{},"_nodeVersion":"26.8.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/totem_0.4.1_1788848126993_0.2917408013467728","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@emiliano-go/totem","version":"0.4.2","keywords":["opencode-plugin","opencode","totem","memory","mcp","agent"],"author":{"name":"Emiliano Gandini Outeda","email":"emiliano.gandini@protonmail.com"},"license":"MIT","_id":"@emiliano-go/totem@0.4.2","maintainers":[{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"}],"bin":{"totem":"bin/totem.js"},"dist":{"shasum":"45d50a621cb3086b7d6aaff6a953c01d63131d85","tarball":"https://registry.npmjs.org/@emiliano-go/totem/-/totem-0.4.2.tgz","fileCount":11,"integrity":"sha512-kdkAc0UTo5q96D8lGrWWVEjccUVCcAQ5RcqZsD9P1fWfz0nRXDFvqCC2HwXb1uThPFJnPYWhm1Gex4bCrEvFog==","signatures":[{"sig":"MEQCIHUIDpNmys1NSGDDxbVyO0205rwbtXVynutacGS2RQh4AiALZtnzDf6yrJ/gB0kVgxRrT14dHvFhNWdQ1C14GnRIXg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":24917},"main":".opencode/plugins/totem-enforce.js","engines":{"node":">=18"},"gitHead":"b321d348def47404982767f9d47f28ba52d97b1d","_npmUser":{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"},"_npmVersion":"12.0.2","description":"Agent enforcement plugin for totem memory system (OpenCode, Claude Code, Kimi Code)","directories":{},"_nodeVersion":"26.8.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/totem_0.4.2_1788872179940_0.423991240042636","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@emiliano-go/totem","version":"0.4.3","keywords":["opencode-plugin","opencode","totem","memory","mcp","agent"],"author":{"name":"Emiliano Gandini Outeda","email":"emiliano.gandini@protonmail.com"},"license":"MIT","_id":"@emiliano-go/totem@0.4.3","maintainers":[{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"}],"bin":{"totem":"bin/totem.js"},"dist":{"shasum":"e5e9a1395dc42a9a31381521511964678d36d464","tarball":"https://registry.npmjs.org/@emiliano-go/totem/-/totem-0.4.3.tgz","fileCount":11,"integrity":"sha512-yqRqm3lwArXPzjpO5EdLfZo17uAX3ZkHT7Om/hfidKgaLmJYV5s/uiKkWc0pzzYzxYUfIA0aBPxfI+KLQRjOYA==","signatures":[{"sig":"MEUCIQDrkXqE26he0tew/mCce1eKI6h3b5GVlXDJHJbu4W5s7AIgRLcQhaBaN9aFOiC/bgxT9UzchqTm6hfxpSA4rWIw4no=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25564},"main":".opencode/plugins/totem-enforce.js","engines":{"node":">=18"},"gitHead":"8a88570435c6640a3a4b5eb7545c86a8b1ec7919","_npmUser":{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"},"_npmVersion":"12.0.2","description":"Agent enforcement plugin for totem memory system (OpenCode, Claude Code, Kimi Code)","directories":{},"_nodeVersion":"26.8.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/totem_0.4.3_1788872404302_0.6740830389769157","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@emiliano-go/totem","version":"0.4.4","keywords":["opencode-plugin","opencode","totem","memory","mcp","agent"],"author":{"name":"Emiliano Gandini Outeda","email":"emiliano.gandini@protonmail.com"},"license":"MIT","_id":"@emiliano-go/totem@0.4.4","maintainers":[{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"}],"bin":{"totem":"bin/totem.js"},"dist":{"shasum":"adcf7b95a7b7034cbfb33540d84445c3a057ea54","tarball":"https://registry.npmjs.org/@emiliano-go/totem/-/totem-0.4.4.tgz","fileCount":11,"integrity":"sha512-gFVKZqZ2e4HfzljdxdtlcB1qm5bORp7RiWhYo8vN/zdV3dWEbntptYLX87Xkjk+MsRBglLkc5RqXMeLmxILuaA==","signatures":[{"sig":"MEQCIBRUrmJJTlOUAv5ReYrm25Loc0nbUUTtQmGXfars0GqPAiBRRPl0MfY3msv8dqrbP8+awwYmfiYMRihFhSpZZdkBlg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25750},"main":".opencode/plugins/totem-enforce.js","engines":{"node":">=18"},"gitHead":"6a08452db55933fb1e2dfe528d27eb6ed25a25b0","_npmUser":{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"},"_npmVersion":"12.0.2","description":"Agent enforcement plugin for totem memory system (OpenCode, Claude Code, Kimi Code)","directories":{},"_nodeVersion":"26.8.1","dependencies":{"@emiliano-go/totem":"^0.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/totem_0.4.4_1788872600029_0.39736828405811053","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@emiliano-go/totem","version":"0.4.5","keywords":["opencode-plugin","opencode","totem","memory","mcp","agent"],"author":{"name":"Emiliano Gandini Outeda","email":"emiliano.gandini@protonmail.com"},"license":"MIT","_id":"@emiliano-go/totem@0.4.5","maintainers":[{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"}],"bin":{"totem":"bin/totem.js"},"dist":{"shasum":"be5a3eba9139040be7ae485a2230ccfde4aba3de","tarball":"https://registry.npmjs.org/@emiliano-go/totem/-/totem-0.4.5.tgz","fileCount":11,"integrity":"sha512-o8+kWpdVpX6enC86Heq675u0klEZzcQTW+2REn4AkROcXEgbDewvoGUgicdcvLiCJDMEIVIV51efawwWhKFXBw==","signatures":[{"sig":"MEQCIGKBmnpLAfHiIDLroHS9kMsprevt2mSMzw06O+sHWrClAiBqNrPkzsAoQivm+snOOAwNNl7+ADS/fKppFrlNfBTLUA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":26718},"main":".opencode/plugins/totem-enforce.js","engines":{"node":">=18"},"gitHead":"e03186c9e988273bdc7847736743a643877daca7","_npmUser":{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"},"_npmVersion":"12.0.2","description":"Agent enforcement plugin for totem memory system (OpenCode, Claude Code, Kimi Code)","directories":{},"_nodeVersion":"26.7.0","dependencies":{"@emiliano-go/totem":"^0.4.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/totem_0.4.5_1788877695353_0.8618978149909013","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@emiliano-go/totem","version":"0.5.0","keywords":["opencode-plugin","opencode","totem","memory","mcp","agent"],"author":{"name":"Emiliano Gandini Outeda","email":"emiliano.gandini@protonmail.com"},"license":"MIT","_id":"@emiliano-go/totem@0.5.0","maintainers":[{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"}],"bin":{"totem":"bin/totem.js"},"dist":{"shasum":"01de47a301fb4c50a2cd95237402df5175178c28","tarball":"https://registry.npmjs.org/@emiliano-go/totem/-/totem-0.5.0.tgz","fileCount":10,"integrity":"sha512-EGpgcj7aMqotexB/cHvbkY/6EdQkx9Kss/BY/UxVyM2dn9cTIu43+nmqdgDoAEv6IstE7wtQvqSQkDkvWe8VIg==","signatures":[{"sig":"MEQCIEobXAScRASXU6S09qWZyFGwBgLf7rV7rrgRERhfIw3bAiBFi6rO/q2pMUnoLKWVPGp8f5qHEDaseEM7ku0QwFCWNQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":47902},"main":".opencode/plugins/totem-enforce.js","engines":{"node":">=18"},"gitHead":"aa18a71ea7776c0a73ca9d468fbe9384500e8598","_npmUser":{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"},"_npmVersion":"12.0.2","description":"Agent enforcement plugin for totem memory system (OpenCode, Claude Code, Kimi Code)","directories":{},"_nodeVersion":"26.7.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/totem_0.5.0_1788893006644_0.4999649322143451","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@emiliano-go/totem","version":"0.5.1","description":"Agent enforcement plugin for totem memory system (OpenCode, Claude Code, Kimi Code)","keywords":["opencode-plugin","opencode","totem","memory","mcp","agent"],"author":{"name":"Emiliano Gandini Outeda","email":"emiliano.gandini@protonmail.com"},"license":"MIT","main":".opencode/plugins/totem-enforce.js","bin":{"totem":"bin/totem.js"},"engines":{"node":">=18"},"publishConfig":{"access":"public"},"gitHead":"6710a224d7ece6312c0d924ddcdbfa1765d2544d","_id":"@emiliano-go/totem@0.5.1","_nodeVersion":"26.8.1","_npmVersion":"12.0.2","dist":{"integrity":"sha512-Z7vF/dicugWi72qV5P6vIYd8Srm2HbFPnBBMRdXAupAFxXgNWTTqefV+TAtBviZRDq7jibonluuD8HaGRahGrg==","shasum":"af165d0a326007435486a2479788c62ce8a9dde5","tarball":"https://registry.npmjs.org/@emiliano-go/totem/-/totem-0.5.1.tgz","fileCount":10,"unpackedSize":58478,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD9z515v8YeZfG7ur7yLBmTWjIpaqaxKrbTqDsKr09tlwIhAM5bNzbkybCr47zolY/pVcA5yvfEV4058wca6e8PWjd8"}]},"_npmUser":{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"},"directories":{},"maintainers":[{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/totem_0.5.1_1788929013819_0.28165727296323007"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-07T21:57:08.787Z","modified":"2026-09-09T04:43:34.119Z","0.2.1":"2026-09-07T21:57:09.082Z","0.2.2":"2026-09-07T22:43:45.839Z","0.3.0":"2026-09-08T05:48:51.186Z","0.4.0":"2026-09-08T05:56:13.854Z","0.4.1":"2026-09-08T06:15:27.130Z","0.4.2":"2026-09-08T12:56:20.060Z","0.4.3":"2026-09-08T13:00:04.482Z","0.4.4":"2026-09-08T13:03:20.149Z","0.4.5":"2026-09-08T14:28:15.475Z","0.5.0":"2026-09-08T18:43:26.813Z","0.5.1":"2026-09-09T04:43:33.962Z"},"author":{"name":"Emiliano Gandini Outeda","email":"emiliano.gandini@protonmail.com"},"license":"MIT","keywords":["opencode-plugin","opencode","totem","memory","mcp","agent"],"description":"Agent enforcement plugin for totem memory system (OpenCode, Claude Code, Kimi Code)","maintainers":[{"name":"emiliano-go","email":"emiliano.gandini@protonmail.com"}],"readme":"# totem\n\nAgent enforcement plugin for the [totem](https://github.com/emiliano-go/totem) memory system. Forces agents to search totem memory before reading, grepping, or running bash commands. Supports OpenCode, Claude Code, and Kimi Code.\n\n## Install\n\n```bash\nnpm install @emiliano-go/totem\n```\n\nThis installs:\n- Enforcement plugins for OpenCode, Claude Code, and Kimi Code (auto-configured by `npx totem`)\n- The `totem-mcp` Python MCP server (auto-installed or upgraded via pipx/uv/pip, registered as a pinned `uvx totem-mcp==<version>` command pre-warmed at install time)\n\n## How it works\n\nThe plugin enforces a memory-first workflow with three gates:\n\n1. **Memory gate**: intercepts `read`, `grep`, `glob`, and `bash` tool calls (including bash sub-commands like `grep`, `find`, `cat`, `sed`, etc.). When totem has memory related to what you're accessing, the call is blocked and the agent is redirected to search memory first. The retry after checking memory is allowed.\n2. **Read commit-gate**: after a successful file read, all non-totem tools are blocked until the agent calls `register_file_read_tool` with what it learned.\n3. **Write commit-gate**: after `edit`/`write`, all non-totem tools are blocked until the agent calls `register_file_write_tool` documenting the change.\n\n```\n# Without totem: agent reads file directly\nread /path/to/file.py\n\n# With totem: agent is forced to check memory first\nread /path/to/file.py\n  → \"Totem has memory about this. Use engineering_context_tool first.\"\n  → agent searches memory, finds relevant context\n  → agent reads file with full context\n  → agent must call register_file_read_tool before doing anything else\n```\n\nNo stub memories are auto-created; the agent itself is responsible for\nrecording what it learned, which keeps memory quality high.\n\n## Supported agents\n\n| Agent | Hook type | Auto-configured? |\n|-------|-----------|-----------------|\n| OpenCode | `tool.execute.before` JS plugin | Yes (`npx totem`) |\n| Claude Code | `PreToolUse`/`PostToolUse` hooks (`~/.claude/settings.json`) | Yes (`npx totem`) |\n| Kimi Code | `[[hooks]]` in `~/.kimi-code/config.toml` | Yes (`npx totem`) |\n\nKnown limitations:\n\n- OpenCode does not pass MCP tool arguments to `tool.execute.before`, so the commit-gates clear on any `totem_register_file_read/write_tool` call regardless of its path argument.\n- OpenCode `tool.execute.before` does not fire inside task-spawned subagents.\n- Kimi Code does not load `~/.kimi-code/plugins/*/plugin.json`: a plugin-manifest install fails open (hooks never run, nothing is logged). Hooks must be declared as `[[hooks]]` entries in `~/.kimi-code/config.toml` (see `kimi-hooks.toml`).\n\n## Setup\n\n### OpenCode\n\n```bash\nnpx @emiliano-go/totem\n```\n\nOr manually add to `~/.config/opencode/opencode.json`:\n\n```json\n{\n  \"plugin\": [\"@emiliano-go/totem\"],\n  \"mcp\": {\n    \"totem\": {\n      \"type\": \"local\",\n      \"command\": [\"uvx\", \"totem-mcp==<version>\"],\n      \"enabled\": true\n    }\n  }\n}\n```\n\n### Claude Code\n\n```bash\nnpx @emiliano-go/totem\n# Or manually:\nclaude mcp add totem -- uvx totem-mcp\n```\n\n### Kimi Code\n\n```bash\nnpx @emiliano-go/totem\n```\n\nOr manually: copy `hooks/totem-hook.py` to `~/.kimi-code/hooks/` and append the\n`[[hooks]]` blocks from `kimi-hooks.toml` to `~/.kimi-code/config.toml`, then\nrestart the session (or run `/reload`). Hooks load at session start.\n\n## Requirements\n\n- Python 3.13+ (for the MCP server)\n- `uvx` or `pip` (auto-installed by the plugin)\n\n## Development\n\n```bash\n# Run JS tests\nnode test-tokenize.js\n\n# Run Python tests\npython3 test-enforce.py\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}