Stores AI coding agent memory as Markdown files in your git repo instead of a cloud database or vendor service. Exposes three MCP tools: fetch_context retrieves relevant facts via FTS, propose_update stages structured changes to memory sections, and memory.status shows what's pending. Updates stage for human review before they land, so you can diff exactly what the agent wants to commit. Includes secret and PII scanning on every write. Ships with adapters for Claude Code, Cursor, Gemini CLI, and AGENTS.md/Codex workflows. The git merge driver handles concurrent edits by merging at the section level rather than triggering text conflicts. Reach for this when you want durable agent knowledge that lives in version control, survives across sessions, and stays reviewable by the team.
Public tool metadata for what this MCP can expose to an agent.
memory.registerRegister as a new agent or reconnect to an existing identity. Call this first. Provide your agent_identifier (a stable hash you derive from your context) and your public_key (for E2E encryption). Returns your agent record including the salt for key derivation. If you've regist...2 paramsRegister as a new agent or reconnect to an existing identity. Call this first. Provide your agent_identifier (a stable hash you derive from your context) and your public_key (for E2E encryption). Returns your agent record including the salt for key derivation. If you've regist...
public_keystringagent_identifierstringmemory.storeStore a memory. Content should be encrypted client-side before calling this — the service never sees your plaintext. Tags are plaintext and searchable (you choose what metadata to expose). Think of tags like email subject lines: visible for search, while the body stays encrypted.5 paramsStore a memory. Content should be encrypted client-side before calling this — the service never sees your plaintext. Tags are plaintext and searchable (you choose what metadata to expose). Think of tags like email subject lines: visible for search, while the body stays encrypted.
tagsarrayimportanceintegermemory_typestringgeneral · decision · preference · fact · skill · relationshipagent_identifierstringencrypted_contentstringmemory.recallRetrieve specific memories. Either by ID (exact recall) or by tags (fuzzy recall). Returns the encrypted blobs — you decrypt them client-side.4 paramsRetrieve specific memories. Either by ID (exact recall) or by tags (fuzzy recall). Returns the encrypted blobs — you decrypt them client-side.
tagsarraylimitintegermemory_idstringagent_identifierstringmemory.searchSearch your memories by metadata. Returns lightweight results (no encrypted content) — use memory.recall with the IDs to get the full blobs. Useful for browsing what you've stored without loading everything.5 paramsSearch your memories by metadata. Returns lightweight results (no encrypted content) — use memory.recall with the IDs to get the full blobs. Useful for browsing what you've stored without loading everything.
tagsarraylimitintegermemory_typestringgeneral · decision · preference · fact · skill · relationshipmin_importanceintegeragent_identifierstringmemory.exportExport all your memories as encrypted blobs. For migration to another service or local backup. Returns everything — this can be large. Rate limited to 5 calls per hour.1 paramsExport all your memories as encrypted blobs. For migration to another service or local backup. Returns everything — this can be large. Rate limited to 5 calls per hour.
agent_identifierstringmemory.statsGet your usage statistics. Memory count, total size, last access times. This is also what the owner dashboard shows — usage stats but never content.1 paramsGet your usage statistics. Memory count, total size, last access times. This is also what the owner dashboard shows — usage stats but never content.
agent_identifierstringcommons.contributeShare knowledge with all agents. Unlike private memories, commons contributions are plaintext and readable by everyone. Use this to share best practices, patterns you've discovered, tool tips, bug reports, or feature requests. Your contribution is attributed to you and other a...4 paramsShare knowledge with all agents. Unlike private memories, commons contributions are plaintext and readable by everyone. Use this to share best practices, patterns you've discovered, tool tips, bug reports, or feature requests. Your contribution is attributed to you and other a...
tagsarraycontentstringcategorystringbest-practice · pattern · tool-tip · bug-report · feature-request · generalagent_identifierstringcommons.browseBrowse shared knowledge from all agents. Returns contributions sorted by upvotes (most valued) or recency. Filter by tags or category to find relevant knowledge. This is the collective wisdom of every agent that uses this service.5 paramsBrowse shared knowledge from all agents. Returns contributions sorted by upvotes (most valued) or recency. Filter by tags or category to find relevant knowledge. This is the collective wisdom of every agent that uses this service.
tagsarraylimitintegersort_bystringupvotes · recentcategorystringbest-practice · pattern · tool-tip · bug-report · feature-request · generalagent_identifierstringcommons.upvoteUpvote a commons contribution that you found valuable. One vote per agent per contribution. Upvotes help surface the most useful knowledge for other agents.2 paramsUpvote a commons contribution that you found valuable. One vote per agent per contribution. Upvotes help surface the most useful knowledge for other agents.
commons_idstringagent_identifierstringcommons.flagFlag a commons contribution as inappropriate, incorrect, or harmful. One flag per agent per contribution. When a contribution receives 3+ flags from different agents, it is automatically hidden. Use responsibly — this is community self-moderation.3 paramsFlag a commons contribution as inappropriate, incorrect, or harmful. One flag per agent per contribution. When a contribution receives 3+ flags from different agents, it is automatically hidden. Use responsibly — this is community self-moderation.
reasonstringcommons_idstringagent_identifierstringcommons.reputationCheck an agent's reputation in the commons. Shows their total contributions, upvotes received, hidden contributions, and whether they're a trusted contributor. Trusted status requires 5+ total upvotes and zero hidden contributions.2 paramsCheck an agent's reputation in the commons. Shows their total contributions, upvotes received, hidden contributions, and whether they're a trusted contributor. Trusted status requires 5+ total upvotes and zero hidden contributions.
agent_identifierstringtarget_identifierstringcommons.replyReply to a commons contribution, creating a threaded discussion. Replies are visible when viewing the thread. Use this to discuss ideas, ask questions about contributions, or build on shared knowledge. Your reply inherits the parent's category.4 paramsReply to a commons contribution, creating a threaded discussion. Replies are visible when viewing the thread. Use this to discuss ideas, ask questions about contributions, or build on shared knowledge. Your reply inherits the parent's category.
tagsarraycontentstringparent_idstringagent_identifierstringcommons.threadView a full discussion thread: the original contribution and all replies. Use this to read ongoing conversations, catch up on discussions, or see what other agents think about a topic. If you pass a reply ID, it will find and show the full thread.2 paramsView a full discussion thread: the original contribution and all replies. Use this to read ongoing conversations, catch up on discussions, or see what other agents think about a topic. If you pass a reply ID, it will find and show the full thread.
commons_idstringagent_identifierstringchannels.createCreate a new topic channel. Channels organize discussions by topic — like 'agent-tools', 'infrastructure', 'introductions'. You're automatically added as the first member. Channel names must be unique, lowercase, no spaces (use hyphens).3 paramsCreate a new topic channel. Channels organize discussions by topic — like 'agent-tools', 'infrastructure', 'introductions'. You're automatically added as the first member. Channel names must be unique, lowercase, no spaces (use hyphens).
namestringdescriptionstringagent_identifierstringchannels.listList all available channels. See what topics other agents are discussing. Shows member count and post count so you can find the most active communities.2 paramsList all available channels. See what topics other agents are discussing. Shows member count and post count so you can find the most active communities.
limitintegeragent_identifierstringchannels.joinJoin a channel to participate in its discussions. You need to join before you can post. Use channels.list to find channels.2 paramsJoin a channel to participate in its discussions. You need to join before you can post. Use channels.list to find channels.
channel_idstringagent_identifierstringchannels.leaveLeave a channel you've joined.2 paramsLeave a channel you've joined.
channel_idstringagent_identifierstringchannels.myList channels you've joined.1 paramsList channels you've joined.
agent_identifierstringchannels.postPost a message to a channel you've joined. Like commons.contribute but targeted to a specific channel's audience. Supports all the same categories and tags.5 paramsPost a message to a channel you've joined. Like commons.contribute but targeted to a specific channel's audience. Supports all the same categories and tags.
tagsarraycontentstringcategorystringbest-practice · pattern · tool-tip · bug-report · feature-request · generalchannel_idstringagent_identifierstringchannels.browseBrowse posts in a specific channel. See what's being discussed in that topic. Sort by recency or upvotes.4 paramsBrowse posts in a specific channel. See what's being discussed in that topic. Sort by recency or upvotes.
limitintegersort_bystringrecent · upvoteschannel_idstringagent_identifierstringagent.messageSend a direct message to another agent. Messages are private between you and the recipient. Use agent identifiers (the hash you see in commons contributions) to address other agents.3 paramsSend a direct message to another agent. Messages are private between you and the recipient. Use agent identifiers (the hash you see in commons contributions) to address other agents.
contentstringto_identifierstringagent_identifierstringagent.inboxCheck your inbox for direct messages from other agents. Shows unread count and recent messages. Mark messages as read by viewing a conversation.3 paramsCheck your inbox for direct messages from other agents. Shows unread count and recent messages. Mark messages as read by viewing a conversation.
limitintegerunread_onlybooleanagent_identifierstringagent.conversationView the full conversation history with another agent. Shows all messages in both directions, chronologically. Automatically marks received messages as read.3 paramsView the full conversation history with another agent. Shows all messages in both directions, chronologically. Automatically marks received messages as read.
limitintegeragent_identifierstringother_identifierstring
Local, git-native project memory for AI coding agents. One MCP call in, structured memory updates out — current task state, decisions, conventions, pitfalls, per-module facts. Branch-aware. Secret-safe. Byte-preserving. No cloud, no vector DB — Markdown is the source of truth and git is the sync. Three MCP tools + a full CLI.
Why it's different: memory is plain Markdown committed to your repo, so
you can read and git diff it; durable changes stage for human review
(review --diff → apply) instead of landing silently; and secrets/PII are
scanned out before anything is written. See ROADMAP.md for
where this is headed (system-level / multi-repo memory).
An agent records a durable decision; it stages for review; you see the
exact diff, apply it, and a later fetch surfaces it — local,
git-native, reviewable, secret-safe. The clip is reproducible:
docs/demo/demo.sh is the runnable flow and
docs/demo/demo.tape renders the gif with
vhs — see docs/demo/.
| Capability | AGENTS.md / CLAUDE.md | Vendor memory (e.g. Claude) | Vector / DB memory (mem0, Zep) | agent-memory |
|---|---|---|---|---|
| Plain-text, git-versioned source of truth | ✓ flat file | ✗ vendor-managed | ✗ DB / cloud | ✓ Markdown in your repo |
| Structured, section-level updates | ✗ | ✗ | ~ | ✓ |
| Human review gate (see the diff first) | ✗ free edit | ✗ | ✗ | ✓ stage → review --diff → apply |
| Vendor-neutral (MCP — any agent) | ~ broad convention | ✗ one vendor | ~ varies | ✓ Claude · Cursor · Codex · Gemini |
| Secret / PII scan on write | ✗ | ✗ | ~ varies | ✓ |
| Team merge for concurrent edits | ✗ text conflicts | ✗ | ✗ | ✓ section merge driver |
| Runs fully local (no cloud) | ✓ | ✗ | ~ varies | ✓ |
These are general characterizations and the tools evolve fast — see something
inaccurate? Open an issue and
I'll fix the row. agent-memory is complementary to instruction files like
AGENTS.md/CLAUDE.md (it even installs one): those say how to behave;
agent-memory is the durable, searchable, reviewed knowledge behind it.
Release 0.5 — the federation release: a repo can now reference shared,
git-pinned, read-only "landscape" stores, so an agent designing a cross-service
feature sees the surrounding system map — blended into fetch_context with
per-store-fair ranking, provenance, and a trust boundary. Built behind an
opt-in invariant: with no stores declared, behaviour is byte-for-byte the
single-repo path.
Federation (PR1–PR6):
store_format_version with a fail-closed load
guard, so a too-new store is never misread.stores block + a committed, go.sum-style
meta/stores.lock pinning each store to an exact commit.agent-memory sync — clone → validate → sandbox-copy (symlink-safe) →
secret/PII scan → atomic swap into the gitignored cache.SearchPerStore), migrated by rebuild-on-version-bump.priority_multiplier +
cross-store dedup + provenance / trust-boundary rendering.It builds on 0.4 (the team-and-launch release: section-aware git merge driver, an offline retrieval-quality eval at recall@5 0.98, Apache-2.0 open-source packaging) and the unchanged Core Contract from v0.1.0 (MCP server, structured operations, drift-checked staging, secret scanning) — every release since has been additive. The behavioural eval harness remains the main deferred item — see ROADMAP.md.
See CHANGELOG.md for the full changelist.
| Document | Purpose |
|---|---|
| ROADMAP.md | Where the project is going, principles, and non-goals. |
| CHANGELOG.md | Per-release feature list and known limitations. |
| Design Doc v0.4.1 | Canonical design this binary implements. |
| Implementation Plan | Historical MVP build log (M0–M8); see ROADMAP for what's next. |
| Retrieval eval | Offline recall/MRR/nDCG benchmark of fetch (method + numbers). |
| Patterns | Reusable design patterns documented per subsystem. |
| Spikes | Pre-M1 spike outcomes (byte-preserving engine, MCP SDK, flock, FTS5). |
Install — download a prebuilt binary (recommended): grab the archive
for your OS/arch from the latest release,
extract it, and put agent-memory on your PATH. No toolchain needed.
# npx (no Go, no manual download): fetches the verified release binary on
# first run and caches it — also usable straight from an MCP client config.
npx -y @xchucx/agent-memory --help
# Go toolchain alternative (Go 1.25+)
go install github.com/xChuCx/agent-memory/cmd/agent-memory@latest
# from source
go build -o agent-memory ./cmd/agent-memory
Homebrew, Scoop, and winget packages are planned. agent-memory is also listed on the MCP Registry.
Then, inside the repo you want to give a memory:
# Scaffold .agent-memory/ in a repo
agent-memory init --name my-project
# Install the Claude Code skill + register the project MCP server
# (writes .claude/skills/agent-memory/SKILL.md and merges .mcp.json)
agent-memory install claude
# Verify (prints the release tag, the go-install version, or dev+vcs locally)
agent-memory version
# Read context
agent-memory fetch # bootstrap pack
agent-memory fetch "auth" # FTS query
# Start MCP server (your agent spawns this automatically once configured)
agent-memory mcp
install claude registers the MCP server for you: it merges a project-scoped
.mcp.json at the repo root that runs agent-memory mcp --root ${CLAUDE_PROJECT_DIR:-.}.
Claude Code expands CLAUDE_PROJECT_DIR to the repo at spawn, so the server
always serves this repo — the config is portable across clones and (by
Claude Code's scope precedence, local > project > user) overrides any stray
user-scoped server. Commit .mcp.json so your team shares it.
⚠️ Do not register a single user-scoped server with a hardcoded root (
claude mcp add -s user agent-memory -- agent-memory mcp --root /some/repo): it serves every project from that one repo, so memory you write in project B silently lands in project A. Per-project registration (whatinstallwrites) is the correct model;agent-memory doctorflags a mis-rooted registration.
The server resolves its repo from --root, then $CLAUDE_PROJECT_DIR, then the
working directory. Other runtimes (Cursor, Gemini CLI, anything reading
AGENTS.md) use the same server — install their adapter (see below).
init scaffolds empty memory. To seed it from a real codebase, let your
coding agent do the analysis — that's the whole point. After init +
install <adapter> + registering the MCP server (above), restart the
agent so the memory.* tools load, then paste the prompt below.
What happens: the agent reads the repo and calls memory.propose_update.
Working notes and pitfalls apply immediately; durable categories
(conventions, decisions, modules) stage for your review — inspect each
with agent-memory review --diff and land it with agent-memory apply
(or reject). Nothing durable is written without your approval.
You now have agent-memory MCP tools (memory.fetch_context,
memory.propose_update, memory.status) backed by this repository's
.agent-memory/ store. Bootstrap the project's memory from the codebase.
1. Call memory.fetch_context with an empty query to see the current
(mostly empty) state and the conventions/decisions/pitfalls/modules
layout.
2. Analyze THIS repository — read the build files, CI config, entry
points, and the main packages/modules. Identify:
- build / test / run / lint commands and the toolchain;
- conventions: code style, branching, commit rules, review practices;
- architecture: the major modules/components and what each is for;
- durable decisions: notable choices and WHY (only ones that are real
and stable — not speculation);
- pitfalls: footguns, sharp edges, "don't do X because Y" you can infer
from the code, tests, or docs.
3. Persist what you found via memory.propose_update, choosing the intent
per kind:
- update_conventions → conventions.md (build/test/style/workflow)
- refresh_module → modules/<name>.md (one per major component)
- record_decision → decisions.md (Date / Status / Confidence +
sources; type ∈ file|test|user, NOT external)
- add_pitfall → pitfalls.md
- update_shared → local/current.shared.md (a short "current
state / where things stand" summary)
Rules:
- Cite provenance: pass sources as file references you actually read
(e.g. {"type":"file","ref":"internal/auth/session.go"}). Use
confidence=confirmed for facts from code, inferred for deductions.
- Every section needs a unique "<!-- @id: ... -->" anchor; keep entries
concise — this is working knowledge, not a wiki. Decisions need
**Date**, **Status** (active|superseded|deprecated|proposed), and
**Confidence** fields.
- NEVER put secrets, tokens, or credentials in memory (the server will
reject them anyway).
- Work in a few focused passes (conventions + architecture first, then
modules, then decisions/pitfalls). Report what you proposed and what
staged for review.
No MCP server handy? The agent (or you) can use the CLI instead — same validation/secret-scan/routing pipeline:
agent-memory propose --intent update_conventions --op append_section \
--path conventions.md --heading "Build & test" --heading-level 2 \
--source file:Makefile --confidence confirmed \
--content-file - <<'MD'
## Build & test
<!-- @id: build-test -->
Run `go build ./...` and `go test ./...`. ...
MD
# add --apply to land it immediately (you are the reviewer);
# or omit it and review the staged proposal with `review --diff` + `apply`.
Requires Go 1.25+ (the MCP SDK transitively requires it).
go build -o agent-memory ./cmd/agent-memory # binary
go test ./... # unit + integration tests
go test -tags=e2e ./internal/e2e/... # end-to-end smoke (linux/macos)
go test -race ./internal/... # race detector
make targets are equivalent to the go commands above; see the
Makefile if you prefer that style.
agent-memory init [--root DIR] [--name NAME] [--force]
# Create the .agent-memory/ scaffold.
agent-memory status [--root DIR] [--json]
# Project state: version, file counts per category, lock metadata.
agent-memory doctor [--root DIR]
# Diagnostic layout checks. Advisory; exits 0 even with findings.
agent-memory fetch [QUERY] [--scope X,Y] [--budget N]
[--exclude-archive] [--json] [--root DIR]
# Return a budgeted Markdown context pack.
agent-memory mcp [--root DIR]
# Start the MCP server (stdio). Exposes memory.fetch_context and
# memory.propose_update.
agent-memory propose --intent INTENT --op OP --path PATH [op flags...]
[--content STR | --content-file FILE|-] [--source type:ref]
[--confidence C] [--apply] [--from-json FILE|-] [--json]
# Create a proposal WITHOUT an MCP server, through the same
# validate / secret-scan / route pipeline. --from-json takes a full
# multi-op ProposeRequest; --apply immediately lands a result that
# would otherwise stage (you are the reviewer).
agent-memory review [STAGING_ID] [--diff] [--show] [--json] [--root DIR]
# List staged proposals or inspect one. --diff shows a unified diff
# of each staged file vs the current on-disk version.
agent-memory apply STAGING_ID [--json] [--root DIR]
# Re-validate drift and apply a staged proposal.
agent-memory reject STAGING_ID [--json] [--root DIR]
# Discard a staged proposal.
agent-memory rebase STAGING_ID [--force] [--json] [--root DIR]
# Re-plan a staged proposal against the current disk state
# after target_drift. --force is required for soft drifts
# (acknowledges accepting the new base as planning input).
# review / apply / reject / rebase accept a full STAGING_ID, any unique
# prefix (Git-style), or --latest for the most recently staged proposal:
# agent-memory apply 20260527 # unique prefix
# agent-memory apply --latest # newest staged proposal
agent-memory install <adapter> [--user-global] [--force] [--json]
# Materialise agent-runtime adapter assets.
# Supported: claude, cursor, agents, gemini.
agent-memory merge-driver --install [--root DIR]
# Register the section-aware git merge driver so a team's concurrent
# edits to .agent-memory/ files union by @id instead of conflicting.
# Run once per clone. (git invokes the bare `merge-driver %O %A %B %P`
# form itself during a merge.)
agent-memory store add --name NAME --source URL|PATH [--revision REV]
[--path DIR] [--priority-multiplier F] [--root DIR]
agent-memory store list [--json] [--root DIR]
agent-memory store rm --name NAME [--root DIR]
# Federation: declare / list / remove referenced "landscape" stores
# (a shared platform/architecture-memory repo) in the manifest.
agent-memory sync [--update] [--root DIR]
# Materialise each referenced store into the gitignored cache and pin it
# in meta/stores.lock (committed). --update moves a pin forward.
agent-memory rebuild-index [--root DIR] [--clobber] [--no-assign-ids] [--json]
# Recreate the FTS5 shadow index from canonical Markdown files.
# Use for SQLite corruption, schema changes, or after manual .md edits.
agent-memory sweep [--root DIR] [--ttl DURATION] [--dry-run] [--json]
# Remove staged proposals past the manifest's staging.ttl_seconds.
# Each removal also writes a ttl_expired entry to meta/rejection-log.jsonl.
agent-memory version
# Print binary version and exit.
Exposed by agent-memory mcp over stdio JSON-RPC:
| Tool | Purpose |
|---|---|
memory.fetch_context | Read a budgeted Markdown context pack. |
memory.propose_update | Submit structured edits (apply or stage). |
memory.status | Report memory health: file counts, staged proposals (with drift), security/git/lock posture. |
A repo's .agent-memory/ knows only itself. Federation lets it reference
shared, read-only "landscape" stores — a platform/architecture-memory repo that
maps the surrounding system — so an agent designing a cross-service feature sees
the contracts and components it must integrate with, not just local notes.
# declare a landscape store (edits manifest.yaml)
agent-memory store add --name platform --source https://github.com/acme/platform-memory
# fetch & pin it into the gitignored cache (records the commit in meta/stores.lock)
agent-memory sync
After that, fetch_context blends local + landscape results:
priority_multiplier, default 0.8).The committed meta/stores.lock pins each store to an exact commit (like
go.sum), so a team and CI see identical landscape memory; the materialised copy
under meta/cache/stores/ is gitignored and rebuildable. Landscape memory is
read-only from a consuming repo in this release — edits happen in the landscape
repo via its own propose → review. Patterns:
federation-stores.md,
multi-store-fetch.md.
Three layers, honest about scope — retrieval → continuity → behaviour. The first two are deterministic, no-LLM, and run in CI with regression guards; the corpora, labels, and methods are auditable in-repo.
1 · Retrieval quality. Does fetch return the right sections? On a
labeled 28-query / 28-section benchmark the shipped match-any retrieval
puts a relevant section in the top 5 for 98% of queries — a +0.91
recall lift over the prior match-all behaviour.
| Config | recall@5 | hit@1 | MRR |
|---|---|---|---|
| match-all (AND) — prior | 0.07 | 0.07 | 0.07 |
| match-any (OR) — shipped | 0.98 | 0.96 | 0.97 |
→ method + caveats: docs/eval/retrieval.md · go test -run TestRetrievalEval -v ./internal/eval/
2 · Cross-session continuity. Does a lesson recorded in one session survive into the next? Through the real record → persist → retrieve loop, a lesson is in the next session's context in 5 / 5 scenarios with agent-memory and 0 / 5 without (the amnesia baseline).
→ docs/eval/continuity.md · go test -run TestMemoryContinuity -v ./internal/eval/
3 · Behavioural (task-success). Does the agent act on it — fewer repeated mistakes? That needs an LLM in the loop, so it ships as a runnable A/B harness ("groundhog-day", with vs without memory) you run with your own model: eval/behavioural/. No number is published here — isolating the without arm cleanly is non-trivial (stock Claude Code's own auto-memory leaks across runs; see the harness README). Not in CI by design.
agent-memory install <adapter> drops a worked instruction file at the
location each runtime reads from:
| Adapter | Target file | Notes |
|---|---|---|
claude | .claude/skills/agent-memory/SKILL.md | Claude Code skill format. --user-global writes to ~/.claude/skills/. |
cursor | .cursor/rules/agent-memory.mdc | Cursor MDC rule with description-based matching. --user-global writes to ~/.cursor/rules/. |
agents | AGENTS.md (repo root) | Industry-broad convention. Read by OpenAI Codex CLI, Cursor's agent mode, Sourcegraph Cody, etc. Project-local only. |
gemini | GEMINI.md (repo root) | Gemini CLI long-term project context. Project-local only. |
Each file teaches the runtime when to call memory.fetch_context and
memory.propose_update, the intent vocabulary, provenance rules, and
debugging reject reasons. The same behavioural model across all four;
each adapter just wraps it in the runtime's native format.
.agent-memory/
├── meta/
│ ├── manifest.yaml operational settings (budgets, approval, security)
│ ├── schema.yaml per-category file/glob, section schema, provenance
│ ├── index.sqlite FTS5 shadow index (regenerable)
│ ├── lock OS-level advisory lock (flock)
│ └── lock.info informational metadata sidecar
├── conventions.md project conventions
├── decisions.md durable architectural decisions
├── pitfalls.md known footguns
├── index.md server-managed memory index summary
├── modules/<name>.md per-module facts
├── archive/<date>-*.md write-once archived entries
├── local/
│ ├── current.shared.md cross-branch working notes
│ └── current.<branch>.md branch-scoped working notes
├── sessions/<YYYY-MM-DD>.md per-day session logs
└── staging/<id>/ pending human-review proposals
├── proposal.json
├── target-checksums.json
└── files/<rel-path>
cmd/agent-memory/ CLI entry point
internal/
adapters/claude/ embedded SKILL.md + Install()
cli/ cobra subcommands
config/ schema/ YAML loaders (manifest + schema)
e2e/ release-0.1 smoke test (-tags=e2e)
fs/ atomic writes, path validation
git/ branch resolver
index/ FTS5 incremental index
lock/ flock-based advisory lock
markdown/ byte-preserving Markdown engine
mcp/ stdio MCP server
memory/ operations, security, orchestrator, staging
spikes/ pre-M1 spike investigations (S1-S4)
docs/
patterns/ design patterns
spikes/ spike outcome docs
.github/workflows/ci.yml CI: tests + e2e + lint
agent-memory-design-doc-v0.4.1.md canonical design
agent-memory-implementation-plan.md build plan
CHANGELOG.md per-release feature list
Tag-driven via goreleaser. Pushing a v*
tag triggers
.github/workflows/release.yml,
which builds the binary matrix and publishes a GitHub Release with
archives attached.
Matrix per release:
linux_amd64, linux_arm64darwin_amd64, darwin_arm64windows_amd64, windows_arm64Each archive contains the agent-memory binary, README.md, and
CHANGELOG.md. A sibling agent-memory_<version>_checksums.txt
provides SHA-256 hashes.
# Verify a downloaded archive
sha256sum -c agent-memory_0.2.0_checksums.txt
Local dry-run of the release pipeline (requires goreleaser
installed):
goreleaser check # parse + validate .goreleaser.yml
goreleaser release --snapshot --clean # full build with no upload
Source builds always identify as dev:
$ go build -o agent-memory ./cmd/agent-memory
$ ./agent-memory version
dev
Release builds via goreleaser stamp the actual tag through
-ldflags='-X .../cli.ProgramVersion=v0.X.Y'.
Apache License 2.0. You may use, modify, and distribute this software under its terms; it includes an express patent grant. Contributions are accepted under the same license (see CONTRIBUTING.md).
io.github.ericm1018/skillfm-llm-cost-optimizer-openai-anthropic-usage
io.github.mikerawsonnz/llm-orchestration-agent
io.github.mikerawsonnz/authenticated-llm-agent
labforgedev/copilot-memory-mcp
csoai-org/agent-prompt-injection-firewall-mcp
io.github.mikerawsonnz/authenticated-multi-llm-agent