totem
Totem stands watch over what a tribe has learned. It does the same for your codebase.
A totem stands watch over what a tribe has learned. Totem does the same for a codebase. It's a Git-aware memory server for coding agents: decisions, invariants, and gotchas persist across sessions, backed by evidence, and flagged the moment the code underneath them changes.
Why
AI coding agents lose engineering context between sessions. They re-discover the same gotchas, re-debate the same decisions, and forget invariants that were already established. totem persists this knowledge locally and serves it back to agents as structured context, ordered by relevance.
Install
Requires Python 3.13+.
npm install @emiliano-go/totem
npx @emiliano-go/totem
The npx command auto-installs or upgrades the Python MCP server, pins its version, and configures enforcement plugins for OpenCode, Claude Code, and Kimi Code. For Kimi Code it also registers a user-level MCP entry (~/.kimi-code/mcp.json) so totem is available in every project.
Supported agents
| Agent | Hook type | Auto-configured? |
|---|---|---|
| OpenCode | tool.execute.before JS plugin |
Yes |
| Claude Code | PreToolUse/PostToolUse hooks (~/.claude/settings.json) |
Yes |
| Kimi Code | [[hooks]] in ~/.kimi-code/config.toml |
Yes |
Features
- 14 memory types with type-specific metadata validation
- 31 MCP tools (16 core + 15 typed wrappers)
- Staleness detection via SHA256 content hashing on evidence
- Conflict detection on overlapping evidence and contradictory claims
- Full-text search via Turso FTS5
- Hybrid memory (project + user databases)
- Context assembly with scored pipeline and token budget
- Agent enforcement blocks reads/grep/bash when memory exists, forces search-first workflow
- Commit gates block all tools until agent registers file reads and writes
- History audit on every create, update, and delete
How it works
Agent reads file for the first time
→ commit-gate blocks → agent registers read → memory stored → done
Agent reads file again (memory exists)
→ blocked → redirected to memory tools
→ searches memory → finds context → done
Agent writes a file
→ commit-gate blocks → agent registers write with reason → change documented → done
Agent reads file but finds nothing in memory
→ allowed to read → commit-gate requires registration → done
Setup
OpenCode
Add to ~/.config/opencode/opencode.json (or let npx @emiliano-go/totem write it):
{
"plugin": ["@emiliano-go/totem"],
"mcp": {
"totem": {
"type": "local",
"command": ["uvx", "totem-mcp==<version>"],
"enabled": true
}
}
}
The installer pins <version> to the npm package version and pre-warms the uvx cache, so agent startups use the cached environment and never hit the network.
Claude Code
claude mcp add totem -- totem-mcp
Kimi Code
MCP server and hooks are auto-configured by npx @emiliano-go/totem: the MCP server goes in user-level ~/.kimi-code/mcp.json (every project), and the hooks go in ~/.kimi-code/config.toml.
Manual setup
If you prefer manual configuration:
# Initialize totem in your project
totem init
# For a different project
totem init --project /path/to/other
Quick start
MCP tools (from your agent)
# Store a decision
memory_create_tool(type="decision", title="Use FTS5 for search",
statement="SQLite FTS5 is sufficient for our search needs",
tags=["search", "sqlite"],
metadata={"rationale": "No external dependency needed"})
# Get full context for a task
engineering_context_tool(tags=["api", "database"],
current_task="Adding JWT refresh endpoint")
# Search memory
memory_search_tool(query="authentication", tags=["auth"])
# Store a command outcome
memory_create_tool(type="gotcha", title="uv pip install -e . works",
statement="Editable install works with uv pip on PEP 668 systems",
tags=["cmd:uv-pip-install", "python"])
CLI
# Create a memory item
totem create --type decision --title "Use FTS5 for search" \
--statement "SQLite FTS5 is sufficient for our search needs" \
--tags "search,sqlite" --metadata '{"rationale": "No external dependency needed"}'
# Search
totem search --query "FTS5" --tags "sqlite"
# Assemble context
totem context --tags "search,sqlite" --current-task "Implementing search" --budget 4096
# Export/import
totem export -o backup.json
totem import backup.json
Memory types
| Type | Purpose | Required metadata |
|---|---|---|
decision |
A choice that was made | rationale (recommended) |
invariant |
A rule that must hold | verificationMethod, condition |
gotcha |
A non-obvious pitfall | (none) |
rejected_idea |
A proposal declined | proposal, reasonRejected |
assumption |
A claim with epistemic status | claimCategory, basis |
open_question |
An unresolved question | question, impact, blocking |
ambiguity |
An ambiguous requirement | question, interpretations, impact |
contract |
Observable behavior | subject |
constraint |
Implementation restriction | constraint |
hypothesis |
Plausible explanation | hypothesis |
observation |
Something seen in code | observation |
bug |
A defect with state machine | symptom, severity, state |
architecture |
Component mapping | component, responsibility |
implementation |
Codebase facts | subject, kind, path |
MCP tools (31)
| Tool | Description |
|---|---|
totem_init_tool |
Initialize totem for a project |
memory_create_tool |
Create a memory item (warns on duplicate title) |
memory_get_tool |
Retrieve by ID with staleness check |
memory_update_tool |
Update any field (provides audit trail) |
memory_delete_tool |
Soft-delete (requires reason) |
memory_list_tool |
Filtered listing with sort and type/tag filters |
memory_recent_tool |
List recently created memories |
memory_tasks_tool |
List in-progress task memories (task:*) |
memory_commands_tool |
List command outcomes (cmd:*) |
memory_search_tool |
FTS5 full-text search with type/tag filters |
resolve_conflict_tool |
Mark conflict as resolved |
engineering_context_tool |
Scored context assembly with task relevance |
memory_export_tool |
Export all memories as JSON |
memory_import_tool |
Import memories from JSON (skips duplicates) |
register_file_read_tool |
Store facts learned from reading a file (auto-hashes) |
register_file_write_tool |
Register file changes with reason (auto-hashes) |
*_create (14) |
Typed wrappers for each memory type |
flag_ambiguity |
Convenience wrapper for ambiguity creation |
CLI commands (14)
| Command | Description |
|---|---|
totem init |
Initialize totem and install agent instructions |
totem create |
Create a new memory item |
totem get <ID> |
Retrieve by ID |
totem update <ID> |
Update an item |
totem delete <ID> |
Soft-delete (requires --reason) |
totem list |
List with filters |
totem recent |
List recently created memories |
totem tasks |
List in-progress task memories |
totem commands |
List command outcomes |
totem resolve <ID> |
Mark conflict as resolved |
totem search |
Full-text search |
totem export |
Export memories as JSON |
totem import <FILE> |
Import memories from JSON |
totem context |
Assemble scored context |
Context assembly
Scoring formula:
score = 0.30*tag_match + 0.20*task_similarity + 0.25*importance
+ 0.15*confidence + 0.10*recency
Invariants, constraints, and ambiguities get a 1.25x multiplier. Potentially stale items get a 0.5x penalty.
Output sections (BLOCKING AMBIGUITIES, CONFLICTS, and STALE WARNINGS are never budget-truncated):
- TASK (if provided)
- BLOCKING AMBIGUITIES
- CONTEXT CONFLICTS
- CRITICAL CONSTRAINTS
- CRITICAL INVARIANTS
- RELEVANT CONTRACTS
- ARCHITECTURE
- DECISIONS
- KNOWN AMBIGUITIES (non-blocking)
- OBSERVATIONS
- GOTCHAS
- KNOWN BUGS
- HYPOTHESES
- CODEBASE FACTS
- OPEN QUESTIONS
- REJECTED IDEAS
- STALE KNOWLEDGE WARNINGS
Workspace scoping
totem auto-detects your project root via git rev-parse --show-toplevel. Override with --project <path> on any CLI command or project parameter on any MCP tool.
Hybrid memory
- Project memories:
.totem/totem.db - User memories:
~/.local/share/totem/totem.db
engineering_context searches both, with project memories taking precedence.
Deployment boundary
Totem is a single-user, local memory layer. It has no tenancy or authorization model, and this is intentional:
- the user DB lives at
~/.local/share/totem/totem.db, owned by the OS user that runs totem (override withTOTEM_USER_DB); - the project DB lives in the project's
.totem/directory, scoped to whoever can read the checkout; - MCP tools run with the full privileges of that user.
Do not expose a totem MCP server to multiple untrusted users on one host, and do not point several OS users at one shared user DB. If you need multi-user isolation, run one totem instance (and one user DB) per user. The boundary is enforced by the filesystem and the OS user, not by totem itself.
Tag conventions
task:<name>: In-progress work. Query withmemory_tasks_tool.cmd:<command>: Command outcomes. Query withmemory_commands_tool.architecture:<module>: Structural facts about a module.outcome:<what>: Measurable results (performance wins, bug fix impact, etc.).
Companion skill
The skills/precision-first/ directory contains a precision-first software engineering methodology designed to pair with totem.
Development
# Run JS tests
cd plugins/totem-enforce && node test-tokenize.js
# Run Python package tests
uv run pytest
# Run Python hook tests
cd plugins/totem-enforce && python3 test-enforce.py
License
MIT
Metadata
Release files for totem-mcp 0.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| totem_mcp-0.6.0.tar.gz | 49.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| totem_mcp-0.6.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 105.1 kB
Release files / totem_mcp-0.6.0.tar.gz
| Download URL | totem_mcp-0.6.0.tar.gz |
|---|---|
| Size | 49.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
224d285237325aecae8ac425646e56c554a1c54a94ab6a78ebf3dfd62278de0e
|
|
BLAKE2b-256 checksum How to use checksums |
805652b41e63673998b7a7c9180587b395f25062fe32045a51cc7c612f04221d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency logRelease files / totem_mcp-0.6.0-py3-none-any.whl
| Download URL | totem_mcp-0.6.0-py3-none-any.whl |
|---|---|
| Size | 56.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
13f2c5040d60cfad3dcf2c99fbb27d75a25cb80fda50e5e3fbe8c1b53c87bb51
|
|
BLAKE2b-256 checksum How to use checksums |
b634790f8d02c0a1e7cae703f1c471e2ebacd172e1195ff9584824f1cb0f43ef
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 7, 2026.
Transparency log