agent-mem-vault 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. agent_mem_vault-1.0.0/.gitignore +10 -0
  2. agent_mem_vault-1.0.0/CHANGELOG.md +48 -0
  3. agent_mem_vault-1.0.0/LICENSE +21 -0
  4. agent_mem_vault-1.0.0/PKG-INFO +287 -0
  5. agent_mem_vault-1.0.0/README.md +258 -0
  6. agent_mem_vault-1.0.0/docs/DESIGN.md +210 -0
  7. agent_mem_vault-1.0.0/docs/RELEASING.md +92 -0
  8. agent_mem_vault-1.0.0/docs/assets/banner.svg +50 -0
  9. agent_mem_vault-1.0.0/docs/wiki/Configuration.md +97 -0
  10. agent_mem_vault-1.0.0/docs/wiki/FAQ.md +86 -0
  11. agent_mem_vault-1.0.0/docs/wiki/Getting-Started.md +95 -0
  12. agent_mem_vault-1.0.0/docs/wiki/Home.md +37 -0
  13. agent_mem_vault-1.0.0/docs/wiki/Multi-Agent-Handoffs.md +88 -0
  14. agent_mem_vault-1.0.0/docs/wiki/Obsidian-Integration.md +95 -0
  15. agent_mem_vault-1.0.0/docs/wiki/Record-Format.md +120 -0
  16. agent_mem_vault-1.0.0/docs/wiki/Tools-Reference.md +241 -0
  17. agent_mem_vault-1.0.0/docs/wiki/_Sidebar.md +13 -0
  18. agent_mem_vault-1.0.0/examples/README.md +24 -0
  19. agent_mem_vault-1.0.0/examples/claude-code.mcp.json +11 -0
  20. agent_mem_vault-1.0.0/examples/codex-config.toml +7 -0
  21. agent_mem_vault-1.0.0/examples/config.yaml +16 -0
  22. agent_mem_vault-1.0.0/examples/demo-vault/.obsidian/app.json +3 -0
  23. agent_mem_vault-1.0.0/examples/demo-vault/README.md +10 -0
  24. agent_mem_vault-1.0.0/examples/demo-vault/_dashboards/memory.base +42 -0
  25. agent_mem_vault-1.0.0/examples/demo-vault/project-harbor-api/decision/2026-03-02-cache-order-lookups-in-process-memory-c463660e.md +16 -0
  26. agent_mem_vault-1.0.0/examples/demo-vault/project-harbor-api/decision/2026-03-02-use-sqlite-for-the-first-release-d61740a1.md +22 -0
  27. agent_mem_vault-1.0.0/examples/demo-vault/project-harbor-api/decision/2026-03-06-move-order-storage-to-postgresql-234bc139.md +24 -0
  28. agent_mem_vault-1.0.0/examples/demo-vault/project-harbor-api/decision/2026-03-08-pin-postgresql-16-in-ci-and-production-eb0b3836.md +22 -0
  29. agent_mem_vault-1.0.0/examples/demo-vault/project-harbor-api/handoff/2026-03-09-handoff-to-claude-code-1a7b9a54.md +22 -0
  30. agent_mem_vault-1.0.0/examples/demo-vault/project-harbor-api/handoff/2026-03-09-handoff-to-codex-ae3ba645.md +28 -0
  31. agent_mem_vault-1.0.0/examples/demo-vault/project-harbor-api/handoff/2026-03-10-handoff-to-codex-3ea7ecc4.md +27 -0
  32. agent_mem_vault-1.0.0/examples/demo-vault/project-harbor-api/project-harbor-api.md +30 -0
  33. agent_mem_vault-1.0.0/examples/demo-vault/project-harbor-api/risk/2026-03-08-migration-script-locks-the-orders-table-728f9c30.md +18 -0
  34. agent_mem_vault-1.0.0/examples/demo-vault/project-harbor-api/snapshot/2026-03-10-harbor-api-state-after-the-postgresql-move-9f04bcfc.md +15 -0
  35. agent_mem_vault-1.0.0/examples/demo-vault/project-lantern-mobile/decision/2026-03-04-sync-offline-first-reconcile-on-reconnect-3e957315.md +16 -0
  36. agent_mem_vault-1.0.0/examples/demo-vault/project-lantern-mobile/handoff/2026-03-07-handoff-to-claude-code-8c2411d0.md +21 -0
  37. agent_mem_vault-1.0.0/examples/demo-vault/project-lantern-mobile/note/2026-03-04-release-checklist-for-the-beta-e6bf84b7.md +15 -0
  38. agent_mem_vault-1.0.0/examples/demo-vault/project-lantern-mobile/project-lantern-mobile.md +29 -0
  39. agent_mem_vault-1.0.0/examples/demo-vault/project-lantern-mobile/risk/2026-03-04-push-token-refresh-fails-silently-on-one-android-1915d639.md +16 -0
  40. agent_mem_vault-1.0.0/examples/demo-vault/project-lantern-mobile/snapshot/2026-03-07-lantern-mobile-beta-status-20e9e21f.md +15 -0
  41. agent_mem_vault-1.0.0/pyproject.toml +83 -0
  42. agent_mem_vault-1.0.0/scripts/build_demo_vault.py +232 -0
  43. agent_mem_vault-1.0.0/src/agent_mem_vault/__init__.py +0 -0
  44. agent_mem_vault-1.0.0/src/agent_mem_vault/cli.py +116 -0
  45. agent_mem_vault-1.0.0/src/agent_mem_vault/companion.py +39 -0
  46. agent_mem_vault-1.0.0/src/agent_mem_vault/config.py +97 -0
  47. agent_mem_vault-1.0.0/src/agent_mem_vault/doctor.py +105 -0
  48. agent_mem_vault-1.0.0/src/agent_mem_vault/format.py +51 -0
  49. agent_mem_vault-1.0.0/src/agent_mem_vault/generated.py +66 -0
  50. agent_mem_vault-1.0.0/src/agent_mem_vault/git.py +75 -0
  51. agent_mem_vault-1.0.0/src/agent_mem_vault/hooks.py +113 -0
  52. agent_mem_vault-1.0.0/src/agent_mem_vault/links.py +148 -0
  53. agent_mem_vault-1.0.0/src/agent_mem_vault/records.py +261 -0
  54. agent_mem_vault-1.0.0/src/agent_mem_vault/runtime.py +19 -0
  55. agent_mem_vault-1.0.0/src/agent_mem_vault/sanitize.py +130 -0
  56. agent_mem_vault-1.0.0/src/agent_mem_vault/search.py +39 -0
  57. agent_mem_vault-1.0.0/src/agent_mem_vault/server.py +304 -0
  58. agent_mem_vault-1.0.0/src/agent_mem_vault/store.py +623 -0
  59. agent_mem_vault-1.0.0/src/agent_mem_vault/vault.py +224 -0
  60. agent_mem_vault-1.0.0/tests/conftest.py +57 -0
  61. agent_mem_vault-1.0.0/tests/mcp_session.py +29 -0
  62. agent_mem_vault-1.0.0/tests/test_cli.py +201 -0
  63. agent_mem_vault-1.0.0/tests/test_companion.py +138 -0
  64. agent_mem_vault-1.0.0/tests/test_concurrency.py +81 -0
  65. agent_mem_vault-1.0.0/tests/test_config.py +138 -0
  66. agent_mem_vault-1.0.0/tests/test_demo_vault.py +64 -0
  67. agent_mem_vault-1.0.0/tests/test_format.py +26 -0
  68. agent_mem_vault-1.0.0/tests/test_generated.py +117 -0
  69. agent_mem_vault-1.0.0/tests/test_git.py +122 -0
  70. agent_mem_vault-1.0.0/tests/test_hand_edit.py +133 -0
  71. agent_mem_vault-1.0.0/tests/test_hooks.py +260 -0
  72. agent_mem_vault-1.0.0/tests/test_links.py +99 -0
  73. agent_mem_vault-1.0.0/tests/test_receipts.py +129 -0
  74. agent_mem_vault-1.0.0/tests/test_record_format.py +91 -0
  75. agent_mem_vault-1.0.0/tests/test_records.py +104 -0
  76. agent_mem_vault-1.0.0/tests/test_sanitize.py +85 -0
  77. agent_mem_vault-1.0.0/tests/test_search.py +63 -0
  78. agent_mem_vault-1.0.0/tests/test_server.py +236 -0
  79. agent_mem_vault-1.0.0/tests/test_store.py +489 -0
  80. agent_mem_vault-1.0.0/tests/test_update_memory.py +137 -0
  81. agent_mem_vault-1.0.0/tests/test_vault.py +142 -0
  82. agent_mem_vault-1.0.0/tests/test_visibility.py +125 -0
  83. agent_mem_vault-1.0.0/tests/worker.py +34 -0
  84. agent_mem_vault-1.0.0/uv.lock +897 -0
@@ -0,0 +1,10 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ .venv/
5
+ dist/
6
+ build/
7
+ .pytest_cache/
8
+ .ruff_cache/
9
+ .DS_Store
10
+ .env
@@ -0,0 +1,48 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented here. The format follows
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project uses
5
+ [Semantic Versioning](https://semver.org/).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [1.0.0] - 2026-10-29
10
+
11
+ First stable release.
12
+
13
+ ### Added
14
+
15
+ - MCP server that stores agent memory as one Markdown note per record in an Obsidian vault, with
16
+ YAML frontmatter that Obsidian reads as properties. No database and no persistent index; no
17
+ network calls.
18
+ - Typed records: `decision`, `risk`, `handoff`, `snapshot`, `note`, `assumption`, `task`, and
19
+ optional `receipt`, grouped by namespace (usually `project/<repo>`).
20
+ - Nineteen MCP tools: `save_memory`, `save_context`, `create_snapshot`, `update_memory`,
21
+ `create_handoff`, `read_handoff`, `peek_handoff`, `ack_handoff`, `reopen_handoff`, `list_handoffs`,
22
+ `get_project_brief`, `search_memory`, `list_contexts`, `read_latest_context`, `get_links`,
23
+ `list_issues`, plus `write_receipt`, `get_companion` and `update_companion` behind feature flags.
24
+ - Handoff lifecycle (pending, read, acknowledged, reopened) and `supersedes` chains for decisions
25
+ and handoffs.
26
+ - Stemmed free-text search over title, content and tags.
27
+ - Hand-edit safety: per-record revisions, conflict replies instead of silent overwrites, and
28
+ `list_issues` for notes that cannot be parsed. Writes are serialized with a file lock and replaced
29
+ atomically.
30
+ - Generated hub notes per namespace, named after their folder so Obsidian's graph labels them with the
31
+ project name, and a Bases dashboard (`_dashboards/memory.base`) for pending
32
+ handoffs, open decisions and risks.
33
+ - Record visibility (`private` records stay out of automatic context) and validity (`rejected`
34
+ records stay on file but stop steering agents).
35
+ - Secret redaction on by default.
36
+ - Optional features: receipts, companion cards, client hooks for Claude Code and Codex, and git
37
+ autocommit in the vault repository (never pushes).
38
+ - CLI: `doctor` (with Obsidian CLI unresolved-link parity), `list`, `search`, `handoffs`,
39
+ and `hook`.
40
+ - Demo vault in `examples/demo-vault`, regenerated by `scripts/build_demo_vault.py`, and example
41
+ configuration for Claude Code and Codex.
42
+ - Wiki, contributing guide, code of conduct, security policy, issue and pull request templates,
43
+ and Dependabot configuration.
44
+ - Release pipeline: pushing a `vX.Y.Z` tag builds the sdist and wheel, attaches them to a GitHub
45
+ release, and publishes to PyPI through Trusted Publishing. See `docs/RELEASING.md`.
46
+
47
+ [Unreleased]: https://github.com/kursatdinc/agent-mem-vault/compare/v1.0.0...HEAD
48
+ [1.0.0]: https://github.com/kursatdinc/agent-mem-vault/releases/tag/v1.0.0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Kürşat Dinç
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,287 @@
1
+ Metadata-Version: 2.5
2
+ Name: agent-mem-vault
3
+ Version: 1.0.0
4
+ Summary: MCP server that gives coding agents durable, shared memory stored as notes in an Obsidian vault.
5
+ Project-URL: Homepage, https://github.com/kursatdinc/agent-mem-vault
6
+ Project-URL: Documentation, https://github.com/kursatdinc/agent-mem-vault/wiki
7
+ Project-URL: Issues, https://github.com/kursatdinc/agent-mem-vault/issues
8
+ Project-URL: Changelog, https://github.com/kursatdinc/agent-mem-vault/blob/main/CHANGELOG.md
9
+ Author: Kürşat Dinç
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Keywords: agent-memory,ai-agents,claude-code,codex,knowledge-management,llm,mcp,model-context-protocol,obsidian
13
+ Classifier: Development Status :: 5 - Production/Stable
14
+ Classifier: Environment :: Console
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Operating System :: MacOS
17
+ Classifier: Operating System :: POSIX
18
+ Classifier: Operating System :: POSIX :: Linux
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.12
21
+ Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
23
+ Classifier: Topic :: Software Development
24
+ Requires-Python: >=3.12
25
+ Requires-Dist: mcp<3,>=2.3
26
+ Requires-Dist: pystemmer
27
+ Requires-Dist: pyyaml
28
+ Description-Content-Type: text/markdown
29
+
30
+ <p align="center">
31
+ <img src="https://raw.githubusercontent.com/kursatdinc/agent-mem-vault/main/docs/assets/banner.svg" alt="agent-mem-vault: memory your coding agents share, and you can read, link and fix in Obsidian" width="100%">
32
+ </p>
33
+
34
+ <p align="center">
35
+ <a href="https://github.com/kursatdinc/agent-mem-vault/actions/workflows/ci.yml"><img alt="ci" src="https://github.com/kursatdinc/agent-mem-vault/actions/workflows/ci.yml/badge.svg"></a>
36
+ <a href="https://pypi.org/project/agent-mem-vault/"><img alt="PyPI" src="https://img.shields.io/pypi/v/agent-mem-vault"></a>
37
+ <img alt="python" src="https://img.shields.io/badge/python-3.12%20%7C%203.13-blue">
38
+ <a href="https://github.com/kursatdinc/agent-mem-vault/blob/main/LICENSE"><img alt="license" src="https://img.shields.io/badge/license-MIT-green"></a>
39
+ <a href="https://github.com/kursatdinc/agent-mem-vault/wiki"><img alt="wiki" src="https://img.shields.io/badge/docs-wiki-informational"></a>
40
+ </p>
41
+
42
+ **Memory your coding agents share, and you can read, link and fix in Obsidian.**
43
+
44
+ agent-mem-vault is an [MCP](https://modelcontextprotocol.io) server that turns an
45
+ [Obsidian](https://obsidian.md) vault into the long-term memory of your coding agents. Claude Code,
46
+ Codex and any other MCP client record decisions, risks, handoffs and project snapshots as notes in
47
+ the vault. They read them back in the next session, in the next tool, on the next day. You see
48
+ the same memory in Obsidian, and you can correct it there.
49
+
50
+ ```mermaid
51
+ flowchart LR
52
+ CC["Claude Code"] <-->|"MCP, stdio"| S["agent-mem-vault<br/>MCP server"]
53
+ CX["Codex"] <-->|"MCP, stdio"| S
54
+ AN["Any MCP client"] <-->|"MCP, stdio"| S
55
+ S <-->|"read, atomic write"| V[("Obsidian vault<br/>one Markdown note per record")]
56
+ V --- O["Obsidian<br/>graph, backlinks, Bases dashboard"]
57
+ V -.->|"optional autocommit"| G["git history"]
58
+ Y(("You")) -->|"read and edit notes"| O
59
+ ```
60
+
61
+ ## Try it in 60 seconds
62
+
63
+ The repository ships a demo vault with synthetic records for two fictional projects: decisions
64
+ with a supersedes chain, a rejected idea, an open risk, pending and superseded handoffs, snapshots,
65
+ hub notes and the dashboard. You need [uv](https://docs.astral.sh/uv/) and, to see the graph,
66
+ [Obsidian](https://obsidian.md).
67
+
68
+ ```sh
69
+ git clone https://github.com/kursatdinc/agent-mem-vault && cd agent-mem-vault
70
+ export AGENT_MEM_VAULT_VAULT="$PWD/examples/demo-vault"
71
+
72
+ uv run agent-mem-vault doctor # 14 records, 0 issues
73
+ uv run agent-mem-vault handoffs --namespace project/harbor-api --status pending
74
+ uv run agent-mem-vault search "backfill" --namespace project/harbor-api
75
+ ```
76
+
77
+ Then in Obsidian choose *Open folder as vault* and pick `examples/demo-vault`. Open the graph
78
+ view to see the decision chain, and `_dashboards/memory.base` for pending handoffs and open
79
+ decisions and risks. Edit a note, run `doctor` again, and the change is picked up.
80
+
81
+ ## Install
82
+
83
+ You need [uv](https://docs.astral.sh/uv/) and an Obsidian vault (create one in Obsidian, for example
84
+ `~/agent-memory`; running `git init` inside it is optional).
85
+
86
+ Claude Code:
87
+
88
+ ```sh
89
+ claude mcp add agent-mem-vault -s user \
90
+ --env AGENT_MEM_VAULT_VAULT="$HOME/agent-memory" \
91
+ -- uvx agent-mem-vault
92
+ ```
93
+
94
+ Codex (`~/.codex/config.toml`):
95
+
96
+ ```toml
97
+ [mcp_servers.agent-mem-vault]
98
+ command = "uvx"
99
+ args = ["agent-mem-vault"]
100
+ env = { AGENT_MEM_VAULT_VAULT = "/Users/you/agent-memory" }
101
+ ```
102
+
103
+ Check the setup:
104
+
105
+ ```sh
106
+ AGENT_MEM_VAULT_VAULT="$HOME/agent-memory" uvx agent-mem-vault doctor
107
+ ```
108
+
109
+ To run the development version straight from GitHub, replace `uvx agent-mem-vault` with
110
+ `uvx --from git+https://github.com/kursatdinc/agent-mem-vault agent-mem-vault`.
111
+
112
+ Then ask your agent to "record this decision", "leave a handoff for Codex" or "what are the open
113
+ risks in this project?". It uses the tools below. More snippets are in [examples/](https://github.com/kursatdinc/agent-mem-vault/blob/main/examples).
114
+
115
+ ## Why
116
+
117
+ - **Agents forget.** Every new session starts cold, and the reasoning behind yesterday's choice
118
+ is gone.
119
+ - **Agents don't talk to each other.** What Claude Code decided is invisible to Codex, and the
120
+ other way round.
121
+ - **Agent memory is a black box.** It hides in JSON files or databases you can't read, review or
122
+ fix. A wrong "memory" quietly steers every later session.
123
+
124
+ ## What you get
125
+
126
+ **One memory for all your agents.**
127
+ - Claude Code and Codex read and write the same records.
128
+ - A handoff left by one agent is picked up by the next, with a real lifecycle: pending, read,
129
+ acknowledged.
130
+ - A new handoff can supersede older ones, so the queue holds one live thread instead of a
131
+ growing pile.
132
+
133
+ **Memory you can see.**
134
+ - Every record is a note in your vault.
135
+ - Obsidian's graph shows how decisions supersede each other and which records belong to which
136
+ project.
137
+ - A generated Bases dashboard lists pending handoffs, open decisions and risks.
138
+
139
+ **Memory you can correct.**
140
+ - Edit a note in Obsidian and the next query sees it.
141
+ - Mark a decision rejected, with a reason, and it stops steering agents but stays on record.
142
+ - Mark a record private and it stays out of automatic context.
143
+
144
+ **Typed, not a transcript dump.** Records are `decision`, `risk`, `handoff`, `snapshot`, `note`,
145
+ `assumption` and `task`, plus optional `receipt`. Agents can therefore ask precise questions:
146
+ "open risks in this project", "what did we decide about caching", "what is waiting for me".
147
+
148
+ **Yours.** Memory is plain Markdown in a folder you own. Put the vault in git and you get a full
149
+ audit trail for free. Everything works offline, and Obsidian does not need to be open.
150
+
151
+ ## How it compares
152
+
153
+ | | agent-mem-vault | Obsidian-plugin MCP servers (for example [obsidian-local-rest-api](https://github.com/coddingtonbear/obsidian-local-rest-api)) | Embedding-based memory (for example [mem0](https://github.com/mem0ai/mem0)) |
154
+ |---|---|---|---|
155
+ | Where memory lives | One Markdown note per record in your vault | Your vault, served by a plugin | Memory service built on an LLM and an embedding model |
156
+ | Obsidian has to be running | No | Yes: the server runs inside Obsidian | Not applicable |
157
+ | Needs an LLM or embedding API key | No | No | Yes, per its README (OpenAI models by default) |
158
+ | Readable and editable as notes, with graph and backlinks | Yes, in Obsidian | Yes | Not stored as notes |
159
+ | Memory-specific schema: kinds, supersedes, handoff lifecycle | Yes | No: general vault access | Memories |
160
+ | Hand edits are protected by revision checks | Yes | Not applicable | Not applicable |
161
+
162
+ Notes: the other columns summarize each project's public README; check their docs for current
163
+ behavior. The Obsidian-plugin servers offer broader vault access (live metadata, the active file,
164
+ the command palette) than this project, which is narrowly a memory store. Embedding services find
165
+ related memories by meaning, while this project matches stemmed keywords in titles, content and tags.
166
+
167
+ ## Tools
168
+
169
+ | Group | Tools |
170
+ |---|---|
171
+ | Write | `save_memory`, `save_context`, `create_snapshot`, `update_memory` |
172
+ | Handoffs | `create_handoff`, `read_handoff`, `peek_handoff`, `ack_handoff`, `reopen_handoff`, `list_handoffs` |
173
+ | Read | `get_project_brief`, `search_memory`, `list_contexts`, `read_latest_context`, `get_links` |
174
+ | Health | `list_issues` |
175
+ | Optional | `write_receipt` (receipts), `get_companion`, `update_companion` (companion) |
176
+
177
+ - Records are grouped by namespace, usually `project/<repo>`.
178
+ - Free-text search is stemmed, so "caching" finds "cache" and "cached".
179
+ - Memory content is written in English.
180
+
181
+ Every parameter is documented in the
182
+ [tools reference](https://github.com/kursatdinc/agent-mem-vault/wiki/Tools-Reference).
183
+
184
+ ## How it looks
185
+
186
+ ```text
187
+ agent-memory/ # your Obsidian vault
188
+ ├── project-harbor-api/
189
+ │ ├── project-harbor-api.md # generated hub: every record of the project
190
+ │ ├── decision/2026-03-06-move-order-storage-to-postgresql-234bc139.md
191
+ │ ├── risk/2026-03-08-migration-script-locks-the-orders-table-728f9c30.md
192
+ │ └── handoff/2026-03-10-handoff-to-codex-3ea7ecc4.md
193
+ ├── project-lantern-mobile/
194
+ │ └── ...
195
+ └── _dashboards/memory.base # pending handoffs, decisions and risks, all records
196
+ ```
197
+
198
+ ```markdown
199
+ ---
200
+ id: 234bc139-823f-5c1c-b7bb-d37ea1c3ee3c
201
+ kind: decision
202
+ namespace: project/harbor-api
203
+ agent: claude-code
204
+ title: Move order storage to PostgreSQL
205
+ created: 2026-03-06T09:01:00Z
206
+ updated: 2026-03-08T09:02:00Z
207
+ revision: 2
208
+ visibility: internal
209
+ validity: valid
210
+ tags: [storage]
211
+ status: accepted
212
+ supersedes: ['[[project-harbor-api/decision/2026-03-02-use-sqlite-for-the-first-release-d61740a1]]']
213
+ superseded_by: '[[project-harbor-api/decision/2026-03-08-pin-postgresql-16-in-ci-and-production-eb0b3836]]'
214
+ agent-written: true
215
+ ---
216
+ The pilot grew to three workers, which SQLite cannot serve safely. PostgreSQL gives concurrent writers and point-in-time recovery.
217
+
218
+ <!-- avm:related:start -->
219
+ ## Related
220
+ - Supersedes [[project-harbor-api/decision/2026-03-02-use-sqlite-for-the-first-release-d61740a1|Use SQLite for the first release]]
221
+ - Superseded by [[project-harbor-api/decision/2026-03-08-pin-postgresql-16-in-ci-and-production-eb0b3836|Pin PostgreSQL 16 in CI and production]]
222
+ <!-- avm:related:end -->
223
+ ```
224
+
225
+ ## Configuration
226
+
227
+ `~/.config/agent-mem-vault/config.yaml`. Every key is optional, and environment variables win.
228
+ A copy with comments is in [examples/config.yaml](https://github.com/kursatdinc/agent-mem-vault/blob/main/examples/config.yaml).
229
+
230
+ ```yaml
231
+ vault: ~/agent-memory # or AGENT_MEM_VAULT_VAULT
232
+ default_namespace: default # or AGENT_MEM_VAULT_DEFAULT_NAMESPACE
233
+ redact_secrets: true # or AGENT_MEM_VAULT_REDACT_SECRETS
234
+ features:
235
+ visibility: true # private records stay out of automatic context
236
+ receipts: false # immutable records of finished work, with file/commit refs
237
+ companion: false # per-project "last session" and "open threads" cards
238
+ hooks: false # session-start brief and stop nudge for Claude Code / Codex
239
+ git_autocommit: false # commit every change in the vault's git repo (never pushes)
240
+ companion:
241
+ max_chars: 3000
242
+ ```
243
+
244
+ With `hooks` on, `agent-mem-vault hook print-config --client claude|codex` prints the snippet
245
+ to add to your client settings. The hook command must be on your `PATH`: run
246
+ `uv tool install agent-mem-vault` once. The server never edits client settings itself.
247
+
248
+ ## Guarantees
249
+
250
+ - **No lost writes.** Two agents writing at once are serialized by a file lock, and every file is
251
+ replaced atomically.
252
+ - **No silent overwrites.** Updates check the record's revision. A note you edited by hand is
253
+ never overwritten; the agent gets a conflict and re-reads.
254
+ - **Broken notes are reported, not dropped.** A note with invalid frontmatter shows up in
255
+ `list_issues` and `doctor`, untouched.
256
+ - **Hands off your setup.** It never writes `.obsidian/`, never launches Obsidian, never pushes
257
+ git and makes no network calls.
258
+ - **Secrets stay out.** Token, key and password patterns are redacted before anything is
259
+ written.
260
+
261
+ ## Documentation
262
+
263
+ - [Wiki](https://github.com/kursatdinc/agent-mem-vault/wiki): getting started, configuration, tools
264
+ reference, record format, Obsidian integration, multi-agent handoffs, FAQ.
265
+ - [docs/DESIGN.md](https://github.com/kursatdinc/agent-mem-vault/blob/main/docs/DESIGN.md): the design contract the implementation follows.
266
+ - [CHANGELOG.md](https://github.com/kursatdinc/agent-mem-vault/blob/main/CHANGELOG.md) and [docs/RELEASING.md](https://github.com/kursatdinc/agent-mem-vault/blob/main/docs/RELEASING.md).
267
+ - [Discussions](https://github.com/kursatdinc/agent-mem-vault/discussions) for questions and ideas,
268
+ [Issues](https://github.com/kursatdinc/agent-mem-vault/issues) for bugs.
269
+
270
+ ## Development
271
+
272
+ ```sh
273
+ uv sync
274
+ uv run ruff check
275
+ uv run pytest -q
276
+ ```
277
+
278
+ Requires Python 3.12+ on macOS or Linux; file locking uses `fcntl`, so Windows is not supported
279
+ yet. See [CONTRIBUTING.md](https://github.com/kursatdinc/agent-mem-vault/blob/main/CONTRIBUTING.md). Releases follow [docs/RELEASING.md](https://github.com/kursatdinc/agent-mem-vault/blob/main/docs/RELEASING.md).
280
+
281
+ ## Star History
282
+
283
+ [![Star History Chart](https://api.star-history.com/svg?repos=kursatdinc/agent-mem-vault&type=Date)](https://star-history.com/#kursatdinc/agent-mem-vault&Date)
284
+
285
+ ## License
286
+
287
+ [MIT](https://github.com/kursatdinc/agent-mem-vault/blob/main/LICENSE) © 2026 Kürşat Dinç
@@ -0,0 +1,258 @@
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/kursatdinc/agent-mem-vault/main/docs/assets/banner.svg" alt="agent-mem-vault: memory your coding agents share, and you can read, link and fix in Obsidian" width="100%">
3
+ </p>
4
+
5
+ <p align="center">
6
+ <a href="https://github.com/kursatdinc/agent-mem-vault/actions/workflows/ci.yml"><img alt="ci" src="https://github.com/kursatdinc/agent-mem-vault/actions/workflows/ci.yml/badge.svg"></a>
7
+ <a href="https://pypi.org/project/agent-mem-vault/"><img alt="PyPI" src="https://img.shields.io/pypi/v/agent-mem-vault"></a>
8
+ <img alt="python" src="https://img.shields.io/badge/python-3.12%20%7C%203.13-blue">
9
+ <a href="https://github.com/kursatdinc/agent-mem-vault/blob/main/LICENSE"><img alt="license" src="https://img.shields.io/badge/license-MIT-green"></a>
10
+ <a href="https://github.com/kursatdinc/agent-mem-vault/wiki"><img alt="wiki" src="https://img.shields.io/badge/docs-wiki-informational"></a>
11
+ </p>
12
+
13
+ **Memory your coding agents share, and you can read, link and fix in Obsidian.**
14
+
15
+ agent-mem-vault is an [MCP](https://modelcontextprotocol.io) server that turns an
16
+ [Obsidian](https://obsidian.md) vault into the long-term memory of your coding agents. Claude Code,
17
+ Codex and any other MCP client record decisions, risks, handoffs and project snapshots as notes in
18
+ the vault. They read them back in the next session, in the next tool, on the next day. You see
19
+ the same memory in Obsidian, and you can correct it there.
20
+
21
+ ```mermaid
22
+ flowchart LR
23
+ CC["Claude Code"] <-->|"MCP, stdio"| S["agent-mem-vault<br/>MCP server"]
24
+ CX["Codex"] <-->|"MCP, stdio"| S
25
+ AN["Any MCP client"] <-->|"MCP, stdio"| S
26
+ S <-->|"read, atomic write"| V[("Obsidian vault<br/>one Markdown note per record")]
27
+ V --- O["Obsidian<br/>graph, backlinks, Bases dashboard"]
28
+ V -.->|"optional autocommit"| G["git history"]
29
+ Y(("You")) -->|"read and edit notes"| O
30
+ ```
31
+
32
+ ## Try it in 60 seconds
33
+
34
+ The repository ships a demo vault with synthetic records for two fictional projects: decisions
35
+ with a supersedes chain, a rejected idea, an open risk, pending and superseded handoffs, snapshots,
36
+ hub notes and the dashboard. You need [uv](https://docs.astral.sh/uv/) and, to see the graph,
37
+ [Obsidian](https://obsidian.md).
38
+
39
+ ```sh
40
+ git clone https://github.com/kursatdinc/agent-mem-vault && cd agent-mem-vault
41
+ export AGENT_MEM_VAULT_VAULT="$PWD/examples/demo-vault"
42
+
43
+ uv run agent-mem-vault doctor # 14 records, 0 issues
44
+ uv run agent-mem-vault handoffs --namespace project/harbor-api --status pending
45
+ uv run agent-mem-vault search "backfill" --namespace project/harbor-api
46
+ ```
47
+
48
+ Then in Obsidian choose *Open folder as vault* and pick `examples/demo-vault`. Open the graph
49
+ view to see the decision chain, and `_dashboards/memory.base` for pending handoffs and open
50
+ decisions and risks. Edit a note, run `doctor` again, and the change is picked up.
51
+
52
+ ## Install
53
+
54
+ You need [uv](https://docs.astral.sh/uv/) and an Obsidian vault (create one in Obsidian, for example
55
+ `~/agent-memory`; running `git init` inside it is optional).
56
+
57
+ Claude Code:
58
+
59
+ ```sh
60
+ claude mcp add agent-mem-vault -s user \
61
+ --env AGENT_MEM_VAULT_VAULT="$HOME/agent-memory" \
62
+ -- uvx agent-mem-vault
63
+ ```
64
+
65
+ Codex (`~/.codex/config.toml`):
66
+
67
+ ```toml
68
+ [mcp_servers.agent-mem-vault]
69
+ command = "uvx"
70
+ args = ["agent-mem-vault"]
71
+ env = { AGENT_MEM_VAULT_VAULT = "/Users/you/agent-memory" }
72
+ ```
73
+
74
+ Check the setup:
75
+
76
+ ```sh
77
+ AGENT_MEM_VAULT_VAULT="$HOME/agent-memory" uvx agent-mem-vault doctor
78
+ ```
79
+
80
+ To run the development version straight from GitHub, replace `uvx agent-mem-vault` with
81
+ `uvx --from git+https://github.com/kursatdinc/agent-mem-vault agent-mem-vault`.
82
+
83
+ Then ask your agent to "record this decision", "leave a handoff for Codex" or "what are the open
84
+ risks in this project?". It uses the tools below. More snippets are in [examples/](https://github.com/kursatdinc/agent-mem-vault/blob/main/examples).
85
+
86
+ ## Why
87
+
88
+ - **Agents forget.** Every new session starts cold, and the reasoning behind yesterday's choice
89
+ is gone.
90
+ - **Agents don't talk to each other.** What Claude Code decided is invisible to Codex, and the
91
+ other way round.
92
+ - **Agent memory is a black box.** It hides in JSON files or databases you can't read, review or
93
+ fix. A wrong "memory" quietly steers every later session.
94
+
95
+ ## What you get
96
+
97
+ **One memory for all your agents.**
98
+ - Claude Code and Codex read and write the same records.
99
+ - A handoff left by one agent is picked up by the next, with a real lifecycle: pending, read,
100
+ acknowledged.
101
+ - A new handoff can supersede older ones, so the queue holds one live thread instead of a
102
+ growing pile.
103
+
104
+ **Memory you can see.**
105
+ - Every record is a note in your vault.
106
+ - Obsidian's graph shows how decisions supersede each other and which records belong to which
107
+ project.
108
+ - A generated Bases dashboard lists pending handoffs, open decisions and risks.
109
+
110
+ **Memory you can correct.**
111
+ - Edit a note in Obsidian and the next query sees it.
112
+ - Mark a decision rejected, with a reason, and it stops steering agents but stays on record.
113
+ - Mark a record private and it stays out of automatic context.
114
+
115
+ **Typed, not a transcript dump.** Records are `decision`, `risk`, `handoff`, `snapshot`, `note`,
116
+ `assumption` and `task`, plus optional `receipt`. Agents can therefore ask precise questions:
117
+ "open risks in this project", "what did we decide about caching", "what is waiting for me".
118
+
119
+ **Yours.** Memory is plain Markdown in a folder you own. Put the vault in git and you get a full
120
+ audit trail for free. Everything works offline, and Obsidian does not need to be open.
121
+
122
+ ## How it compares
123
+
124
+ | | agent-mem-vault | Obsidian-plugin MCP servers (for example [obsidian-local-rest-api](https://github.com/coddingtonbear/obsidian-local-rest-api)) | Embedding-based memory (for example [mem0](https://github.com/mem0ai/mem0)) |
125
+ |---|---|---|---|
126
+ | Where memory lives | One Markdown note per record in your vault | Your vault, served by a plugin | Memory service built on an LLM and an embedding model |
127
+ | Obsidian has to be running | No | Yes: the server runs inside Obsidian | Not applicable |
128
+ | Needs an LLM or embedding API key | No | No | Yes, per its README (OpenAI models by default) |
129
+ | Readable and editable as notes, with graph and backlinks | Yes, in Obsidian | Yes | Not stored as notes |
130
+ | Memory-specific schema: kinds, supersedes, handoff lifecycle | Yes | No: general vault access | Memories |
131
+ | Hand edits are protected by revision checks | Yes | Not applicable | Not applicable |
132
+
133
+ Notes: the other columns summarize each project's public README; check their docs for current
134
+ behavior. The Obsidian-plugin servers offer broader vault access (live metadata, the active file,
135
+ the command palette) than this project, which is narrowly a memory store. Embedding services find
136
+ related memories by meaning, while this project matches stemmed keywords in titles, content and tags.
137
+
138
+ ## Tools
139
+
140
+ | Group | Tools |
141
+ |---|---|
142
+ | Write | `save_memory`, `save_context`, `create_snapshot`, `update_memory` |
143
+ | Handoffs | `create_handoff`, `read_handoff`, `peek_handoff`, `ack_handoff`, `reopen_handoff`, `list_handoffs` |
144
+ | Read | `get_project_brief`, `search_memory`, `list_contexts`, `read_latest_context`, `get_links` |
145
+ | Health | `list_issues` |
146
+ | Optional | `write_receipt` (receipts), `get_companion`, `update_companion` (companion) |
147
+
148
+ - Records are grouped by namespace, usually `project/<repo>`.
149
+ - Free-text search is stemmed, so "caching" finds "cache" and "cached".
150
+ - Memory content is written in English.
151
+
152
+ Every parameter is documented in the
153
+ [tools reference](https://github.com/kursatdinc/agent-mem-vault/wiki/Tools-Reference).
154
+
155
+ ## How it looks
156
+
157
+ ```text
158
+ agent-memory/ # your Obsidian vault
159
+ ├── project-harbor-api/
160
+ │ ├── project-harbor-api.md # generated hub: every record of the project
161
+ │ ├── decision/2026-03-06-move-order-storage-to-postgresql-234bc139.md
162
+ │ ├── risk/2026-03-08-migration-script-locks-the-orders-table-728f9c30.md
163
+ │ └── handoff/2026-03-10-handoff-to-codex-3ea7ecc4.md
164
+ ├── project-lantern-mobile/
165
+ │ └── ...
166
+ └── _dashboards/memory.base # pending handoffs, decisions and risks, all records
167
+ ```
168
+
169
+ ```markdown
170
+ ---
171
+ id: 234bc139-823f-5c1c-b7bb-d37ea1c3ee3c
172
+ kind: decision
173
+ namespace: project/harbor-api
174
+ agent: claude-code
175
+ title: Move order storage to PostgreSQL
176
+ created: 2026-03-06T09:01:00Z
177
+ updated: 2026-03-08T09:02:00Z
178
+ revision: 2
179
+ visibility: internal
180
+ validity: valid
181
+ tags: [storage]
182
+ status: accepted
183
+ supersedes: ['[[project-harbor-api/decision/2026-03-02-use-sqlite-for-the-first-release-d61740a1]]']
184
+ superseded_by: '[[project-harbor-api/decision/2026-03-08-pin-postgresql-16-in-ci-and-production-eb0b3836]]'
185
+ agent-written: true
186
+ ---
187
+ The pilot grew to three workers, which SQLite cannot serve safely. PostgreSQL gives concurrent writers and point-in-time recovery.
188
+
189
+ <!-- avm:related:start -->
190
+ ## Related
191
+ - Supersedes [[project-harbor-api/decision/2026-03-02-use-sqlite-for-the-first-release-d61740a1|Use SQLite for the first release]]
192
+ - Superseded by [[project-harbor-api/decision/2026-03-08-pin-postgresql-16-in-ci-and-production-eb0b3836|Pin PostgreSQL 16 in CI and production]]
193
+ <!-- avm:related:end -->
194
+ ```
195
+
196
+ ## Configuration
197
+
198
+ `~/.config/agent-mem-vault/config.yaml`. Every key is optional, and environment variables win.
199
+ A copy with comments is in [examples/config.yaml](https://github.com/kursatdinc/agent-mem-vault/blob/main/examples/config.yaml).
200
+
201
+ ```yaml
202
+ vault: ~/agent-memory # or AGENT_MEM_VAULT_VAULT
203
+ default_namespace: default # or AGENT_MEM_VAULT_DEFAULT_NAMESPACE
204
+ redact_secrets: true # or AGENT_MEM_VAULT_REDACT_SECRETS
205
+ features:
206
+ visibility: true # private records stay out of automatic context
207
+ receipts: false # immutable records of finished work, with file/commit refs
208
+ companion: false # per-project "last session" and "open threads" cards
209
+ hooks: false # session-start brief and stop nudge for Claude Code / Codex
210
+ git_autocommit: false # commit every change in the vault's git repo (never pushes)
211
+ companion:
212
+ max_chars: 3000
213
+ ```
214
+
215
+ With `hooks` on, `agent-mem-vault hook print-config --client claude|codex` prints the snippet
216
+ to add to your client settings. The hook command must be on your `PATH`: run
217
+ `uv tool install agent-mem-vault` once. The server never edits client settings itself.
218
+
219
+ ## Guarantees
220
+
221
+ - **No lost writes.** Two agents writing at once are serialized by a file lock, and every file is
222
+ replaced atomically.
223
+ - **No silent overwrites.** Updates check the record's revision. A note you edited by hand is
224
+ never overwritten; the agent gets a conflict and re-reads.
225
+ - **Broken notes are reported, not dropped.** A note with invalid frontmatter shows up in
226
+ `list_issues` and `doctor`, untouched.
227
+ - **Hands off your setup.** It never writes `.obsidian/`, never launches Obsidian, never pushes
228
+ git and makes no network calls.
229
+ - **Secrets stay out.** Token, key and password patterns are redacted before anything is
230
+ written.
231
+
232
+ ## Documentation
233
+
234
+ - [Wiki](https://github.com/kursatdinc/agent-mem-vault/wiki): getting started, configuration, tools
235
+ reference, record format, Obsidian integration, multi-agent handoffs, FAQ.
236
+ - [docs/DESIGN.md](https://github.com/kursatdinc/agent-mem-vault/blob/main/docs/DESIGN.md): the design contract the implementation follows.
237
+ - [CHANGELOG.md](https://github.com/kursatdinc/agent-mem-vault/blob/main/CHANGELOG.md) and [docs/RELEASING.md](https://github.com/kursatdinc/agent-mem-vault/blob/main/docs/RELEASING.md).
238
+ - [Discussions](https://github.com/kursatdinc/agent-mem-vault/discussions) for questions and ideas,
239
+ [Issues](https://github.com/kursatdinc/agent-mem-vault/issues) for bugs.
240
+
241
+ ## Development
242
+
243
+ ```sh
244
+ uv sync
245
+ uv run ruff check
246
+ uv run pytest -q
247
+ ```
248
+
249
+ Requires Python 3.12+ on macOS or Linux; file locking uses `fcntl`, so Windows is not supported
250
+ yet. See [CONTRIBUTING.md](https://github.com/kursatdinc/agent-mem-vault/blob/main/CONTRIBUTING.md). Releases follow [docs/RELEASING.md](https://github.com/kursatdinc/agent-mem-vault/blob/main/docs/RELEASING.md).
251
+
252
+ ## Star History
253
+
254
+ [![Star History Chart](https://api.star-history.com/svg?repos=kursatdinc/agent-mem-vault&type=Date)](https://star-history.com/#kursatdinc/agent-mem-vault&Date)
255
+
256
+ ## License
257
+
258
+ [MIT](https://github.com/kursatdinc/agent-mem-vault/blob/main/LICENSE) © 2026 Kürşat Dinç