memory-boost 0.1.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 (56) hide show
  1. memory_boost-0.1.0/.claude-plugin/marketplace.json +12 -0
  2. memory_boost-0.1.0/.claude-plugin/plugin.json +29 -0
  3. memory_boost-0.1.0/.github/ISSUE_TEMPLATE/bug.md +14 -0
  4. memory_boost-0.1.0/.github/ISSUE_TEMPLATE/harness.md +8 -0
  5. memory_boost-0.1.0/.github/workflows/ci.yml +54 -0
  6. memory_boost-0.1.0/.github/workflows/release.yml +154 -0
  7. memory_boost-0.1.0/.gitignore +10 -0
  8. memory_boost-0.1.0/CHANGELOG.md +29 -0
  9. memory_boost-0.1.0/CONTRIBUTING.md +11 -0
  10. memory_boost-0.1.0/LICENSE +21 -0
  11. memory_boost-0.1.0/PKG-INFO +229 -0
  12. memory_boost-0.1.0/README.md +207 -0
  13. memory_boost-0.1.0/SECURITY.md +28 -0
  14. memory_boost-0.1.0/docs/demo.gif +0 -0
  15. memory_boost-0.1.0/docs/demo.tape +28 -0
  16. memory_boost-0.1.0/docs/social.html +22 -0
  17. memory_boost-0.1.0/docs/social.png +0 -0
  18. memory_boost-0.1.0/pyproject.toml +50 -0
  19. memory_boost-0.1.0/scripts/render-demo.sh +16 -0
  20. memory_boost-0.1.0/scripts/smoke.sh +49 -0
  21. memory_boost-0.1.0/server.json +22 -0
  22. memory_boost-0.1.0/skills/memory-boost/SKILL.md +43 -0
  23. memory_boost-0.1.0/skills/restore-session/SKILL.md +13 -0
  24. memory_boost-0.1.0/skills/retro/SKILL.md +35 -0
  25. memory_boost-0.1.0/skills/save-session/SKILL.md +18 -0
  26. memory_boost-0.1.0/src/memory_boost/__init__.py +3 -0
  27. memory_boost-0.1.0/src/memory_boost/cli.py +389 -0
  28. memory_boost-0.1.0/src/memory_boost/core.py +681 -0
  29. memory_boost-0.1.0/src/memory_boost/drift.py +145 -0
  30. memory_boost-0.1.0/src/memory_boost/example_transcripts/-work-acme-api/0a1b2c3d-1111-4aaa-8bbb-000000000001.jsonl +136 -0
  31. memory_boost-0.1.0/src/memory_boost/example_transcripts/-work-acme-api/0a1b2c3d-3333-4aaa-8bbb-000000000003.jsonl +46 -0
  32. memory_boost-0.1.0/src/memory_boost/example_transcripts/-work-acme-api/0a1b2c3d-4444-4aaa-8bbb-000000000004.jsonl +10 -0
  33. memory_boost-0.1.0/src/memory_boost/example_transcripts/-work-pixel-notes/0a1b2c3d-2222-4aaa-8bbb-000000000002.jsonl +54 -0
  34. memory_boost-0.1.0/src/memory_boost/example_wiki/concepts/money-as-integer-cents.md +15 -0
  35. memory_boost-0.1.0/src/memory_boost/example_wiki/concepts/retry-jobs-idempotently.md +16 -0
  36. memory_boost-0.1.0/src/memory_boost/example_wiki/context/preferences.md +7 -0
  37. memory_boost-0.1.0/src/memory_boost/example_wiki/decisions/cors-allow-all.md +9 -0
  38. memory_boost-0.1.0/src/memory_boost/example_wiki/decisions/float-money.md +9 -0
  39. memory_boost-0.1.0/src/memory_boost/example_wiki/decisions/pin-postgres-15.md +14 -0
  40. memory_boost-0.1.0/src/memory_boost/example_wiki/decisions/queue-in-postgres.md +15 -0
  41. memory_boost-0.1.0/src/memory_boost/example_wiki/decisions/sessions-in-redis.md +9 -0
  42. memory_boost-0.1.0/src/memory_boost/example_wiki/log.md +37 -0
  43. memory_boost-0.1.0/src/memory_boost/example_wiki/projects/acme-api.md +24 -0
  44. memory_boost-0.1.0/src/memory_boost/example_wiki/projects/legacy-dashboard.md +13 -0
  45. memory_boost-0.1.0/src/memory_boost/example_wiki/projects/pixel-notes.md +9 -0
  46. memory_boost-0.1.0/src/memory_boost/lessons.py +77 -0
  47. memory_boost-0.1.0/src/memory_boost/mine.py +172 -0
  48. memory_boost-0.1.0/src/memory_boost/server.py +102 -0
  49. memory_boost-0.1.0/tests/conftest.py +19 -0
  50. memory_boost-0.1.0/tests/test_cli.py +128 -0
  51. memory_boost-0.1.0/tests/test_core.py +192 -0
  52. memory_boost-0.1.0/tests/test_drift.py +108 -0
  53. memory_boost-0.1.0/tests/test_lessons.py +56 -0
  54. memory_boost-0.1.0/tests/test_mcp.py +48 -0
  55. memory_boost-0.1.0/tests/test_mine.py +81 -0
  56. memory_boost-0.1.0/tests/test_packaging.py +42 -0
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "memory-boost",
3
+ "description": "memory-boost: memory for coding agents that reviews itself.",
4
+ "owner": { "name": "Arnau González", "url": "https://github.com/arnaugonzalez" },
5
+ "plugins": [
6
+ {
7
+ "name": "memory-boost",
8
+ "source": "./",
9
+ "description": "Markdown memory over MCP, a session-start brief, drift reports, session digests and /retro lessons."
10
+ }
11
+ ]
12
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "memory-boost",
3
+ "version": "0.1.0",
4
+ "description": "Memory that reviews itself: a markdown wiki your agents read and write over MCP, plus drift reports on that memory and local digests of your own sessions.",
5
+ "author": { "name": "Arnau González", "url": "https://github.com/arnaugonzalez" },
6
+ "homepage": "https://github.com/arnaugonzalez/memory-boost",
7
+ "repository": "https://github.com/arnaugonzalez/memory-boost",
8
+ "license": "MIT",
9
+ "keywords": ["memory", "mcp", "drift", "retrospective", "session-analytics", "context"],
10
+ "mcpServers": {
11
+ "memory": {
12
+ "command": "uvx",
13
+ "args": ["--from", "${CLAUDE_PLUGIN_ROOT}", "memory-boost", "serve"]
14
+ }
15
+ },
16
+ "hooks": {
17
+ "SessionStart": [
18
+ {
19
+ "hooks": [
20
+ {
21
+ "type": "command",
22
+ "command": "uvx --from \"${CLAUDE_PLUGIN_ROOT}\" memory-boost hook session-start",
23
+ "timeout": 120
24
+ }
25
+ ]
26
+ }
27
+ ]
28
+ }
29
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ name: Bug report
3
+ about: Something does not work as documented
4
+ ---
5
+
6
+ **Harness and version** (Claude Code, Codex, Cursor…):
7
+ **memory-boost version** (`memory-boost --version`):
8
+ **OS / Python:**
9
+
10
+ **What you did**
11
+
12
+ **What happened** (include `memory-boost` stderr if any)
13
+
14
+ **What you expected**
@@ -0,0 +1,8 @@
1
+ ---
2
+ name: Harness support
3
+ about: Report how memory-boost works (or not) in a harness
4
+ ---
5
+
6
+ **Harness and version:**
7
+ **MCP config you used:**
8
+ **Does the harness have a session-start hook?** (link to its docs)
@@ -0,0 +1,54 @@
1
+ name: CI
2
+ on:
3
+ push:
4
+ pull_request:
5
+
6
+ permissions: {} # every job states what it needs; nothing here writes
7
+
8
+ concurrency:
9
+ group: ci-${{ github.ref }}
10
+ cancel-in-progress: true
11
+
12
+ jobs:
13
+ test:
14
+ strategy:
15
+ fail-fast: false
16
+ matrix:
17
+ os: [ubuntu-latest, macos-latest]
18
+ python: ["3.11", "3.12", "3.13"]
19
+ runs-on: ${{ matrix.os }}
20
+ permissions:
21
+ contents: read
22
+ steps:
23
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
24
+ with:
25
+ persist-credentials: false
26
+ - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6.8.0
27
+ with:
28
+ python-version: ${{ matrix.python }}
29
+ - run: uv sync
30
+ - run: uvx ruff check .
31
+ - run: uv run pytest
32
+ - run: uv build && uvx twine check dist/*
33
+
34
+ # G4 automated: install the built wheel as a stranger would and run the README quickstart.
35
+ smoke:
36
+ needs: test
37
+ strategy:
38
+ fail-fast: false
39
+ matrix:
40
+ os: [ubuntu-latest, macos-latest]
41
+ runs-on: ${{ matrix.os }}
42
+ timeout-minutes: 10
43
+ permissions:
44
+ contents: read
45
+ steps:
46
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
47
+ with:
48
+ persist-credentials: false
49
+ - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6.8.0
50
+ with:
51
+ python-version: "3.12"
52
+ - run: uv build
53
+ - run: uv tool install dist/*.whl && echo "$HOME/.local/bin" >> "$GITHUB_PATH"
54
+ - run: bash scripts/smoke.sh
@@ -0,0 +1,154 @@
1
+ # Push a tag vX.Y.Z whose number matches pyproject.toml: tests, builds, installs the wheel on
2
+ # Linux and macOS, publishes to PyPI with Trusted Publishing (no token stored anywhere) after a
3
+ # manual approval on the `pypi` environment, creates the GitHub release from CHANGELOG.md, then
4
+ # installs from PyPI and smoke-tests again.
5
+ #
6
+ # Hardening: actions pinned to commit SHAs, no default token permissions, no persisted git
7
+ # credentials, no dependency cache (a poisoned cache could reach the publish job).
8
+ name: Release
9
+ on:
10
+ push:
11
+ tags: ["v*"]
12
+
13
+ permissions: {}
14
+
15
+ concurrency: # never two releases at once; never cancel one half-way
16
+ group: release
17
+ cancel-in-progress: false
18
+
19
+ jobs:
20
+ build:
21
+ runs-on: ubuntu-latest
22
+ permissions:
23
+ contents: read
24
+ steps:
25
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
26
+ with:
27
+ persist-credentials: false
28
+ - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6.8.0
29
+ with:
30
+ python-version: "3.12"
31
+ enable-cache: false
32
+ - name: Tag matches pyproject version
33
+ run: |
34
+ v=$(python3 -c 'import tomllib; print(tomllib.load(open("pyproject.toml","rb"))["project"]["version"])')
35
+ test "${GITHUB_REF_NAME#v}" = "$v" || { echo "tag $GITHUB_REF_NAME != version $v"; exit 1; }
36
+ - name: CHANGELOG has a dated entry for this version
37
+ run: grep -qE "^## ${GITHUB_REF_NAME#v} — [0-9]{4}-[0-9]{2}-[0-9]{2}" CHANGELOG.md
38
+ - run: uv sync && uvx ruff check . && uv run pytest -q
39
+ - run: uv build && uvx twine check dist/*
40
+ - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
41
+ with:
42
+ name: dist
43
+ path: dist/
44
+
45
+ smoke:
46
+ needs: build
47
+ strategy:
48
+ matrix:
49
+ os: [ubuntu-latest, macos-latest]
50
+ runs-on: ${{ matrix.os }}
51
+ timeout-minutes: 10
52
+ permissions:
53
+ contents: read
54
+ steps:
55
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
56
+ with:
57
+ persist-credentials: false
58
+ - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6.8.0
59
+ with:
60
+ enable-cache: false
61
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
62
+ with:
63
+ name: dist
64
+ path: dist/
65
+ - run: uv tool install dist/*.whl && echo "$HOME/.local/bin" >> "$GITHUB_PATH"
66
+ - run: bash scripts/smoke.sh
67
+
68
+ publish:
69
+ needs: smoke
70
+ runs-on: ubuntu-latest
71
+ environment: pypi # requires the maintainer's approval (set by go-public.sh)
72
+ permissions:
73
+ id-token: write # Trusted Publishing: short-lived OIDC token, nothing stored
74
+ steps:
75
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
76
+ with:
77
+ name: dist
78
+ path: dist/
79
+ - uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
80
+
81
+ github-release:
82
+ needs: publish
83
+ runs-on: ubuntu-latest
84
+ permissions:
85
+ contents: write
86
+ steps:
87
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
88
+ with:
89
+ persist-credentials: false
90
+ - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
91
+ with:
92
+ name: dist
93
+ path: dist/
94
+ - name: Release notes from CHANGELOG.md
95
+ run: awk -v v="${GITHUB_REF_NAME#v}" '$0 ~ "^## "v" " {on=1; next} /^## / {on=0} on' CHANGELOG.md > notes.md
96
+ - run: gh release create "$GITHUB_REF_NAME" dist/* --title "$GITHUB_REF_NAME" --notes-file notes.md
97
+ env:
98
+ GH_TOKEN: ${{ github.token }}
99
+
100
+ # Official MCP registry (Glama, PulseMCP, mcp.so and others index from it). Runs after PyPI has
101
+ # the release, because the registry verifies ownership from the `mcp-name:` line of the README
102
+ # published there. The publisher binary is pinned and checksum-verified like every action here.
103
+ mcp-registry:
104
+ needs: verify-pypi
105
+ runs-on: ubuntu-latest
106
+ permissions:
107
+ contents: read
108
+ id-token: write # GitHub OIDC login to the registry; nothing stored
109
+ env:
110
+ PUBLISHER_VERSION: "1.8.1"
111
+ PUBLISHER_SHA256: a06c9096dcb9727c13555b6be26c7effa707b01f06a4c561ba7a3635443cf2cc
112
+ steps:
113
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
114
+ with:
115
+ persist-credentials: false
116
+ - name: Install mcp-publisher (pinned, checksum-verified)
117
+ run: |
118
+ curl -sSfL -o mcp-publisher.tar.gz \
119
+ "https://github.com/modelcontextprotocol/registry/releases/download/v${PUBLISHER_VERSION}/mcp-publisher_linux_amd64.tar.gz"
120
+ echo "${PUBLISHER_SHA256} mcp-publisher.tar.gz" | sha256sum -c -
121
+ tar xzf mcp-publisher.tar.gz mcp-publisher
122
+ - name: server.json matches the tag
123
+ run: |
124
+ python3 -c 'import json,os; d=json.load(open("server.json")); v=os.environ["GITHUB_REF_NAME"][1:]; assert d["version"]==v and d["packages"][0]["version"]==v, d["version"]'
125
+ - run: ./mcp-publisher login github-oidc
126
+ - run: ./mcp-publisher publish
127
+
128
+ verify-pypi:
129
+ needs: publish
130
+ strategy:
131
+ matrix:
132
+ os: [ubuntu-latest, macos-latest]
133
+ runs-on: ${{ matrix.os }}
134
+ timeout-minutes: 15
135
+ permissions:
136
+ contents: read
137
+ steps:
138
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
139
+ with:
140
+ persist-credentials: false
141
+ - uses: astral-sh/setup-uv@d0cc045d04ccac9d8b7881df0226f9e82c39688e # v6.8.0
142
+ with:
143
+ enable-cache: false
144
+ - name: Install from PyPI (retry while the index propagates)
145
+ run: |
146
+ for _ in $(seq 1 10); do
147
+ uv tool install --refresh "memory-boost==${GITHUB_REF_NAME#v}" && break
148
+ sleep 30
149
+ done
150
+ command -v memory-boost >/dev/null || test -x "$HOME/.local/bin/memory-boost"
151
+ echo "$HOME/.local/bin" >> "$GITHUB_PATH"
152
+ - name: The README quickstart form (uvx, no install) resolves the release
153
+ run: uvx --refresh "memory-boost@${GITHUB_REF_NAME#v}" --version
154
+ - run: bash scripts/smoke.sh
@@ -0,0 +1,10 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ dist/
5
+ build/
6
+ *.egg-info/
7
+ .pytest_cache/
8
+ .ruff_cache/
9
+ uv.lock
10
+ .demo/
@@ -0,0 +1,29 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 — 2026-09-26
4
+
5
+ First public release.
6
+
7
+ - Claude Code plugin (`/plugin install memory-boost@memory-boost`): MCP server, session-start
8
+ hook and skills in one step. Listed in the official MCP registry as
9
+ `io.github.arnaugonzalez/memory-boost`.
10
+ - Release pipeline hardened: actions pinned to SHAs, no default token permissions, no cache in
11
+ release jobs, PyPI publish gated by manual approval; zizmor, pip-audit and bandit in preflight.
12
+ - Example wiki shows one finding of each drift kind; `MEMORY_BOOST_TODAY` pins the date for
13
+ reproducible reports and tests.
14
+ - CLI contract for agents: stdout = data, stderr = `error:` + `fix:`, exit 0/1/2, `--json` on every
15
+ reading command (with `version`), reports end with a `next:` command; `/memory-boost` router skill.
16
+ - MCP server (stdio) with `memory_brief`, `memory_recall`, `memory_page`, `memory_save`,
17
+ `memory_checkpoint`, `memory_resume`, `memory_drift`, `memory_lesson`.
18
+ - Markdown wiki store under `MEMORY_BOOST_HOME`; SQLite FTS5 index refreshed incrementally on
19
+ every recall.
20
+ - Freshness labels (current / unclassified / review / historic / superseded); decisions carry
21
+ `status:` and `review_by:`.
22
+ - `memory-boost drift`: decisions past review, superseded without successor, silent projects,
23
+ busy projects with no decisions, checkpoints left open. Top findings injected in the brief.
24
+ - `memory-boost mine`: aggregate digest of local Claude Code transcripts (tools, failed
25
+ commands, re-reads, subagent fan-out, checkpoint discipline). Contents never leave the machine.
26
+ - `memory-boost lesson` / `lessons`: `concepts/` pages with `applies_when:` that reach other
27
+ projects through their `tags:`; `/retro` skill to write them at session end.
28
+ - `memory-boost hook session-start` for Claude Code `SessionStart` (startup, resume, compact).
29
+ - `memory-boost init --example` seeds a small example wiki and four synthetic transcripts.
@@ -0,0 +1,11 @@
1
+ # Contributing
2
+
3
+ ```bash
4
+ uv sync
5
+ uv run pytest
6
+ uvx ruff check .
7
+ ```
8
+
9
+ Keep the core stdlib-only (the `mcp` package is the single runtime dependency) and keep
10
+ the hook path fast: `memory-boost hook` must not import `mcp`. Open an issue before
11
+ large changes.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Arnau González
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,229 @@
1
+ Metadata-Version: 2.5
2
+ Name: memory-boost
3
+ Version: 0.1.0
4
+ Summary: Memory that reviews itself: a markdown wiki for coding agents over MCP, plus drift reports on the wiki and digests of your own sessions.
5
+ Project-URL: Repository, https://github.com/arnaugonzalez/memory-boost
6
+ Project-URL: Issues, https://github.com/arnaugonzalez/memory-boost/issues
7
+ Project-URL: Changelog, https://github.com/arnaugonzalez/memory-boost/blob/main/CHANGELOG.md
8
+ Author: Arnau González
9
+ License-Expression: MIT
10
+ License-File: LICENSE
11
+ Keywords: ai-agents,claude-code,codex,llm,mcp,memory
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Environment :: Console
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Operating System :: MacOS
16
+ Classifier: Operating System :: POSIX :: Linux
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Topic :: Software Development
19
+ Requires-Python: >=3.11
20
+ Requires-Dist: mcp<2,>=1.2
21
+ Description-Content-Type: text/markdown
22
+
23
+ <!-- mcp-name: io.github.arnaugonzalez/memory-boost -->
24
+ <h1 align="center">memory-boost</h1>
25
+
26
+ <p align="center"><em>Memory for coding agents that reviews itself.</em></p>
27
+
28
+ <p align="center">
29
+ <a href="https://github.com/arnaugonzalez/memory-boost/actions/workflows/ci.yml"><img src="https://github.com/arnaugonzalez/memory-boost/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
30
+ <img src="https://img.shields.io/badge/license-MIT-blue" alt="License: MIT">
31
+ <img src="https://img.shields.io/badge/python-3.11%2B-blue" alt="Python 3.11+">
32
+ </p>
33
+
34
+ <p align="center">
35
+ <img src="docs/demo.gif" alt="memory-boost drift, mine and lessons running on the bundled example data" width="92%"><br>
36
+ <sub>drift, mine and lessons on the bundled example data · everything runs locally</sub>
37
+ </p>
38
+
39
+ <p align="center">
40
+ <a href="#try-it-in-30-seconds">Try it</a> ·
41
+ <a href="#what-it-answers">What it answers</a> ·
42
+ <a href="#connect-your-harness">Connect your agent</a> ·
43
+ <a href="#how-it-works">How it works</a> ·
44
+ <a href="#vs-alternatives">vs. alternatives</a>
45
+ </p>
46
+
47
+ **Your agents write everything down. Nobody reads it back.**
48
+
49
+ Every memory tool for coding agents helps them remember *more*. None of them mention that half of
50
+ what they remember expired in July. memory-boost keeps a plain-markdown memory your agents read
51
+ and write over MCP, and then does the unglamorous part: it audits that memory and your own
52
+ sessions, and tells you what drifted. Politely, with numbers.
53
+
54
+ Think of it as a code review for what your agents remember and a fitness tracker for how you work
55
+ with them. Mostly the fitness tracker: `mine` told me my most-failed command was `cd`. Sixty-nine
56
+ times.
57
+
58
+ ## What it answers
59
+
60
+ | You wonder… | memory-boost answers |
61
+ |---|---|
62
+ | Which decisions quietly expired while we were busy shipping? | `drift`: *review_by 2026-07-08, 78 days ago* |
63
+ | Which "active" projects actually died months ago? | `drift`: *last session 161 days ago; still listed as live* |
64
+ | We fixed this exact bug in another repo. How? | `lessons`: the fix follows you to every project with the same stack |
65
+ | Why does my agent keep re-reading the same file? | `mine`: *one file, read 18 times* |
66
+ | Is my agent spawning 20 subagents behind my back? | `mine`: yes, and in which session |
67
+ | Where was I before `/compact` ate my context? | The session-start hook puts your checkpoint back |
68
+
69
+ ## Try it in 30 seconds
70
+
71
+ No install needed; the wiki lands in `~/.local/share/memory-boost`:
72
+
73
+ ```bash
74
+ uvx memory-boost init --example # sample wiki with five kinds of rot + four synthetic transcripts
75
+ uvx memory-boost drift # what in that memory is stale, orphaned or never written down
76
+ uvx memory-boost mine # now on your real ~/.claude/projects: aggregates only
77
+ ```
78
+
79
+ To keep it in Claude Code, install the plugin. It brings the MCP server, the session-start
80
+ brief and the skills in one step; it only needs [uv](https://docs.astral.sh/uv/) on your PATH.
81
+
82
+ ```
83
+ /plugin marketplace add arnaugonzalez/memory-boost
84
+ /plugin install memory-boost@memory-boost
85
+ ```
86
+
87
+ Other agents, or the CLI on its own: `uv tool install memory-boost` (or `pipx install memory-boost`).
88
+
89
+ ## On a real machine
90
+
91
+ Five weeks of the author's own daily use: 29 decisions, 24 projects, 657 Claude Code transcripts.
92
+ Output as produced; only project and file names are replaced.
93
+
94
+ ```
95
+ $ memory-boost drift
96
+ # Drift report — 2026-09-24
97
+ 29 decisions · 24 projects · 204 log entries · 33 open checkpoints · **20 findings**
98
+
99
+ ## decision-expired (9)
100
+ - deploy-via-bastion — review_by 2026-07-08 (78 days ago); revisit or mark historic
101
+ - bot-guardrails — review_by 2026-07-08 (78 days ago); revisit or mark historic
102
+ …
103
+ ## project-no-decisions (2)
104
+ - thesis-solver — 20 sessions logged, 0 decisions tagged 'thesis-solver': the learning lives only in transcripts
105
+ ## project-silent (5)
106
+ - mood-api — last session 2026-04-16 (161 days ago); still listed as live
107
+ …
108
+
109
+ $ memory-boost mine
110
+ # Session digest — 2026-09-24
111
+ sessions 80 with ≥20 turns
112
+ tools Bash 5956 · Edit 860 · Read 692 · Write 493 · Agent 203 · ToolSearch 138
113
+ bash 5956 calls, 159 failed (2.7%); most failed: cd (69), sleep (12), ssh (9), pkill (8), ls (7)
114
+ bash/edit 4.4x; extreme: crm-wt-f11 107.5x, sandbox 70.0x, sandbox 54.0x
115
+ reads 692 calls, 131 re-reads of a file already read (19%); top: …/apply_email.py ×18
116
+ discipline 62 long sessions (≥60 turns): 47 never checkpointed, 29 never saved
117
+ subagents 203 spawned in 44 sessions; max in one session: 20
118
+ ```
119
+
120
+ Every line is a habit to change, a decision to revisit, or a rule worth writing down. None of
121
+ it needed a new tool: the data was already on disk. It needed a reader.
122
+
123
+ ## What it is
124
+
125
+ 1. **A wiki you own.** `projects/*.md`, `decisions/*.md`, `concepts/*.md`, `log.md`. Plain
126
+ markdown; edit by hand, keep it in git. SQLite FTS5 index as a disposable cache. Eight MCP
127
+ tools for any harness: `memory_brief`, `memory_recall`, `memory_page`, `memory_save`,
128
+ `memory_checkpoint`, `memory_resume`, `memory_drift`, `memory_lesson`.
129
+ 2. **Freshness as data.** Decisions carry `status:` and `review_by:`. Search results are tagged
130
+ `current / unclassified / review / historic / superseded`, current first.
131
+ 3. **Session checkpoints** that survive `/compact`, with one line per *other* active session on
132
+ the same project so parallel agents don't collide.
133
+ 4. **`drift`** reads the wiki and reports what expired, what went silent, what was never written
134
+ down and what was left half-done. The current project's top findings go into every session brief.
135
+ 5. **`mine`** reads your local Claude Code transcripts and reports tool usage, failed commands,
136
+ re-reads, subagent fan-out and checkpoint discipline. Aggregates only: no prompt, command or
137
+ file content is stored or printed, so the digest is safe to paste anywhere.
138
+ 6. **`lessons`**: `concepts/` pages with `applies_when: [tags]`. A project page that lists
139
+ matching `tags:` gets those lessons in its brief, so what worked in one repo reaches the next.
140
+ The `/retro` skill writes them at session end.
141
+
142
+ ## Connect your harness
143
+
144
+ MCP server (all harnesses): command `memory-boost`, args `["serve"]`.
145
+
146
+ | Harness | MCP registration | Context at session start |
147
+ |---|---|---|
148
+ | Claude Code (plugin) | `/plugin install memory-boost@memory-boost` | Included: hook, MCP server, skills |
149
+ | Claude Code (manual) | `claude mcp add memory -s user -- memory-boost serve` | Hook below (startup, resume, compact); `mine` reads its transcripts |
150
+ | Codex CLI | `codex mcp add memory -- memory-boost serve` | `AGENTS.md`: "call `memory_brief` first" |
151
+ | Cursor / VS Code / Gemini CLI | stdio entry in their `mcp.json` / `settings.json` | Same line in rules (hook adapters: roadmap) |
152
+
153
+ Manual Claude Code hook (`~/.claude/settings.json`), not needed with the plugin:
154
+
155
+ ```json
156
+ { "hooks": { "SessionStart": [ { "hooks": [ { "type": "command", "command": "memory-boost hook session-start" } ] } ] } }
157
+ ```
158
+
159
+ On `startup`/`resume` it injects ~1k tokens: catalog, the project's context and last sessions,
160
+ its drift, lessons from other projects, your open checkpoint. On `compact` only this session's
161
+ checkpoint. It never blocks session start: on any error it prints nothing.
162
+
163
+ Skills: `/memory-boost` (router: when to run what), `/save-session`, `/restore-session`,
164
+ `/retro`. The plugin installs them as `/memory-boost:retro` and so on; without it, copy
165
+ `skills/*` into `~/.claude/skills/`. The first session after installing the plugin takes a few
166
+ extra seconds while uv fetches the package; later sessions start in about 0.2 s.
167
+
168
+ CLI contract for agents: data on stdout, errors on stderr with a `fix:` line, `--json` on every
169
+ reading command (with a `version` field), exit 0 = trust stdout, 1 = not found, 2 = bad input.
170
+ Reports end with a `next:` line naming the exact command to run.
171
+
172
+ ## How it works
173
+
174
+ ```mermaid
175
+ flowchart LR
176
+ A[Claude Code / Codex / Cursor] -->|MCP stdio| S[memory-boost serve]
177
+ H[SessionStart hook] --> B[memory-boost hook]
178
+ S --> W[(wiki/*.md + log.md)]
179
+ S --> K[(checkpoints/*.json)]
180
+ D[memory-boost drift] --> W
181
+ D --> K
182
+ M[memory-boost mine] --> T[(~/.claude/projects/*.jsonl)]
183
+ D --> R[report + brief injection]
184
+ M --> R
185
+ W -.incremental refresh.-> I[(SQLite FTS5)]
186
+ ```
187
+
188
+ The project is resolved from the working directory name (`~/work/acme-api` → `projects/acme-api.md`);
189
+ map other names in `aliases.json`. Under 1,600 lines of Python, one dependency (`mcp`), no
190
+ embeddings, no daemon.
191
+
192
+ ## Configuration
193
+
194
+ | Variable | Default | Purpose |
195
+ |---|---|---|
196
+ | `MEMORY_BOOST_HOME` | `$XDG_DATA_HOME/memory-boost` | Wiki, events, checkpoints, `aliases.json` |
197
+ | `MEMORY_BOOST_WIKI` | `$MEMORY_BOOST_HOME/wiki` | Point at an existing wiki (e.g. a git repo) |
198
+ | `MEMORY_BOOST_INDEX` | `$XDG_CACHE_HOME/memory-boost/index-<hash>.db` | Search index |
199
+ | `MEMORY_BOOST_CHECKPOINTS` | `$MEMORY_BOOST_HOME/checkpoints` | Checkpoint directory |
200
+ | `MEMORY_BOOST_TRANSCRIPTS` | `~/.claude/projects` | Where `mine` looks (several dirs: `a:b`) |
201
+ | `MEMORY_BOOST_TODAY` | today (UTC) | Pin the date for reproducible reports |
202
+
203
+ ## vs. alternatives
204
+
205
+ | | memory-boost | [basic-memory](https://github.com/basicmachines-co/basic-memory) | [claude-mem](https://github.com/thedotmack/claude-mem) | [agent-retro](https://github.com/giannimassi/agent-retro) |
206
+ |---|---|---|---|---|
207
+ | Store | Markdown wiki you edit | Markdown | Captured observations | None (prompt skill) |
208
+ | Search | FTS5 | FTS + vectors | FTS + vectors | — |
209
+ | Freshness / review dates | Yes | No | No | — |
210
+ | Drift report over memory | Yes | No | No | No |
211
+ | Session analytics | Yes (aggregates, local) | No | No | LLM reads the conversation |
212
+ | Parallel-session awareness | Yes | No | No | — |
213
+ | License | MIT | AGPL-3.0 | Apache-2.0 | ? |
214
+
215
+ Want better search, more integrations and a community? Use basic-memory. Want everything
216
+ captured automatically? claude-mem. Use memory-boost if you want to *learn from* what your
217
+ agents already wrote down.
218
+
219
+ ## Limits / non-goals
220
+
221
+ - Keyword search only; no embeddings.
222
+ - `mine` understands Claude Code transcripts today. Codex is on the roadmap.
223
+ - Reports are as good as the wiki: an empty wiki yields an empty `drift`.
224
+ - Single user, local files. Linux and macOS; Windows untested.
225
+ - The wiki is read by your agents as instructions. Only use a wiki you trust; see [SECURITY.md](SECURITY.md).
226
+
227
+ ## License
228
+
229
+ MIT