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 the Python MCP server and configures enforcement plugins for OpenCode, Claude Code, and Kimi Code.
Supported agents
| Agent | Hook type | Auto-configured? |
|---|---|---|
| OpenCode | tool.execute.before JS plugin |
Yes |
| Claude Code | PreToolUse hooks (.claude/settings.json) |
Yes |
| Kimi Code | PreToolUse hooks (~/.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:
{
"plugin": ["@emiliano-go/totem"],
"mcp": {
"totem": {
"type": "local",
"command": ["uvx", "totem-mcp"],
"enabled": true
}
}
}
Claude Code
claude mcp add totem -- uvx totem-mcp
Kimi Code
Hooks are auto-configured by npx @emiliano-go/totem.
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.
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 tests
cd plugins/totem-enforce && python3 test-enforce.py
License
MIT
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file totem_mcp-0.4.0.tar.gz.
File metadata
- Download URL: totem_mcp-0.4.0.tar.gz
- Upload date:
- Size: 32.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
acd1dea96c91d9c282b3affc17a9c905e63defbbae8ea81dc3f92a042f9ace1b
|
|
| MD5 |
d59013bd857584d0fc5c6e3fb811681f
|
|
| BLAKE2b-256 |
2e46203341ed5b2def9f0b7b34dfdaa1a4b04e5c005e9b374314c2f647e8c880
|
Provenance
The following attestation bundles were made for totem_mcp-0.4.0.tar.gz:
Publisher:
publishing.yml on emiliano-go/totem
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
totem_mcp-0.4.0.tar.gz -
Subject digest:
acd1dea96c91d9c282b3affc17a9c905e63defbbae8ea81dc3f92a042f9ace1b - Sigstore transparency entry: 2755198415
- Sigstore integration time:
-
Permalink:
emiliano-go/totem@3bc9e03f865e627e724b7044071846a4573c97ee -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/emiliano-go
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publishing.yml@3bc9e03f865e627e724b7044071846a4573c97ee -
Trigger Event:
release
-
Statement type:
File details
Details for the file totem_mcp-0.4.0-py3-none-any.whl.
File metadata
- Download URL: totem_mcp-0.4.0-py3-none-any.whl
- Upload date:
- Size: 39.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
42ea0a64275d0ccf8b03aea6212cc206d08bf9ce2f12ac0f03de18e57f4a1cfa
|
|
| MD5 |
62f868bfd7f73107fd4f1afe6e93e3cd
|
|
| BLAKE2b-256 |
6d1359842ba65d0b7ebbbe976afac4c33acbccf12724921e007e34f1ebbf2861
|
Provenance
The following attestation bundles were made for totem_mcp-0.4.0-py3-none-any.whl:
Publisher:
publishing.yml on emiliano-go/totem
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
totem_mcp-0.4.0-py3-none-any.whl -
Subject digest:
42ea0a64275d0ccf8b03aea6212cc206d08bf9ce2f12ac0f03de18e57f4a1cfa - Sigstore transparency entry: 2755198420
- Sigstore integration time:
-
Permalink:
emiliano-go/totem@3bc9e03f865e627e724b7044071846a4573c97ee -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/emiliano-go
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publishing.yml@3bc9e03f865e627e724b7044071846a4573c97ee -
Trigger Event:
release
-
Statement type: