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.
- memory_boost-0.1.0/.claude-plugin/marketplace.json +12 -0
- memory_boost-0.1.0/.claude-plugin/plugin.json +29 -0
- memory_boost-0.1.0/.github/ISSUE_TEMPLATE/bug.md +14 -0
- memory_boost-0.1.0/.github/ISSUE_TEMPLATE/harness.md +8 -0
- memory_boost-0.1.0/.github/workflows/ci.yml +54 -0
- memory_boost-0.1.0/.github/workflows/release.yml +154 -0
- memory_boost-0.1.0/.gitignore +10 -0
- memory_boost-0.1.0/CHANGELOG.md +29 -0
- memory_boost-0.1.0/CONTRIBUTING.md +11 -0
- memory_boost-0.1.0/LICENSE +21 -0
- memory_boost-0.1.0/PKG-INFO +229 -0
- memory_boost-0.1.0/README.md +207 -0
- memory_boost-0.1.0/SECURITY.md +28 -0
- memory_boost-0.1.0/docs/demo.gif +0 -0
- memory_boost-0.1.0/docs/demo.tape +28 -0
- memory_boost-0.1.0/docs/social.html +22 -0
- memory_boost-0.1.0/docs/social.png +0 -0
- memory_boost-0.1.0/pyproject.toml +50 -0
- memory_boost-0.1.0/scripts/render-demo.sh +16 -0
- memory_boost-0.1.0/scripts/smoke.sh +49 -0
- memory_boost-0.1.0/server.json +22 -0
- memory_boost-0.1.0/skills/memory-boost/SKILL.md +43 -0
- memory_boost-0.1.0/skills/restore-session/SKILL.md +13 -0
- memory_boost-0.1.0/skills/retro/SKILL.md +35 -0
- memory_boost-0.1.0/skills/save-session/SKILL.md +18 -0
- memory_boost-0.1.0/src/memory_boost/__init__.py +3 -0
- memory_boost-0.1.0/src/memory_boost/cli.py +389 -0
- memory_boost-0.1.0/src/memory_boost/core.py +681 -0
- memory_boost-0.1.0/src/memory_boost/drift.py +145 -0
- memory_boost-0.1.0/src/memory_boost/example_transcripts/-work-acme-api/0a1b2c3d-1111-4aaa-8bbb-000000000001.jsonl +136 -0
- memory_boost-0.1.0/src/memory_boost/example_transcripts/-work-acme-api/0a1b2c3d-3333-4aaa-8bbb-000000000003.jsonl +46 -0
- memory_boost-0.1.0/src/memory_boost/example_transcripts/-work-acme-api/0a1b2c3d-4444-4aaa-8bbb-000000000004.jsonl +10 -0
- memory_boost-0.1.0/src/memory_boost/example_transcripts/-work-pixel-notes/0a1b2c3d-2222-4aaa-8bbb-000000000002.jsonl +54 -0
- memory_boost-0.1.0/src/memory_boost/example_wiki/concepts/money-as-integer-cents.md +15 -0
- memory_boost-0.1.0/src/memory_boost/example_wiki/concepts/retry-jobs-idempotently.md +16 -0
- memory_boost-0.1.0/src/memory_boost/example_wiki/context/preferences.md +7 -0
- memory_boost-0.1.0/src/memory_boost/example_wiki/decisions/cors-allow-all.md +9 -0
- memory_boost-0.1.0/src/memory_boost/example_wiki/decisions/float-money.md +9 -0
- memory_boost-0.1.0/src/memory_boost/example_wiki/decisions/pin-postgres-15.md +14 -0
- memory_boost-0.1.0/src/memory_boost/example_wiki/decisions/queue-in-postgres.md +15 -0
- memory_boost-0.1.0/src/memory_boost/example_wiki/decisions/sessions-in-redis.md +9 -0
- memory_boost-0.1.0/src/memory_boost/example_wiki/log.md +37 -0
- memory_boost-0.1.0/src/memory_boost/example_wiki/projects/acme-api.md +24 -0
- memory_boost-0.1.0/src/memory_boost/example_wiki/projects/legacy-dashboard.md +13 -0
- memory_boost-0.1.0/src/memory_boost/example_wiki/projects/pixel-notes.md +9 -0
- memory_boost-0.1.0/src/memory_boost/lessons.py +77 -0
- memory_boost-0.1.0/src/memory_boost/mine.py +172 -0
- memory_boost-0.1.0/src/memory_boost/server.py +102 -0
- memory_boost-0.1.0/tests/conftest.py +19 -0
- memory_boost-0.1.0/tests/test_cli.py +128 -0
- memory_boost-0.1.0/tests/test_core.py +192 -0
- memory_boost-0.1.0/tests/test_drift.py +108 -0
- memory_boost-0.1.0/tests/test_lessons.py +56 -0
- memory_boost-0.1.0/tests/test_mcp.py +48 -0
- memory_boost-0.1.0/tests/test_mine.py +81 -0
- 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,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,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
|