Skip to content

Commit ea3c861

Browse files
rusel95claude
andcommitted
merge: upstream/develop into feat/sync-command
Brings in 93 commits from develop including: - File-level locking for concurrent mining (MemPalace#784) - Noise stripping from transcripts (MemPalace#785) - Tunnel functions (create/list/delete/follow) - ChromaBackend abstraction for repair - Hybrid closet+drawer search with BM25 rerank - Hall detection and entity metadata - Version sync to 3.2.0 - i18n support (8 languages) Conflict resolution: - cli.py: took upstream's repair (ChromaBackend), kept our sync/force - miner.py: took upstream's halls/entities/closets, kept content_hash - convo_miner.py: added content_hash to upstream's _file_chunks_locked - mcp_server.py: kept both sync_status + tunnel tools - test_cli.py: took upstream's ChromaBackend mocks for repair test Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
2 parents 3f8062c + b060171 commit ea3c861

80 files changed

Lines changed: 9388 additions & 581 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude-plugin/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ A Claude Code plugin that gives your AI a persistent memory system. Mine project
1111
### Claude Code Marketplace
1212

1313
```bash
14-
claude plugin marketplace add milla-jovovich/mempalace
14+
claude plugin marketplace add MemPalace/mempalace
1515
claude plugin install --scope user mempalace
1616
```
1717

.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,5 @@
2525
"palace",
2626
"search"
2727
],
28-
"repository": "https://github.com/milla-jovovich/mempalace"
28+
"repository": "https://github.com/MemPalace/mempalace"
2929
}

.codex-plugin/README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ codex /init
3535
1. Clone the MemPalace repository:
3636

3737
```bash
38-
git clone https://github.com/milla-jovovich/mempalace.git
38+
git clone https://github.com/MemPalace/mempalace.git
3939
cd mempalace
4040
```
4141

@@ -71,5 +71,5 @@ Set the `MEMPAL_DIR` environment variable to a directory path to automatically r
7171

7272
## Support
7373

74-
- Repository: https://github.com/milla-jovovich/mempalace
75-
- Issues: https://github.com/milla-jovovich/mempalace/issues
74+
- Repository: https://github.com/MemPalace/mempalace
75+
- Issues: https://github.com/MemPalace/mempalace/issues

.codex-plugin/plugin.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
"author": {
66
"name": "milla-jovovich"
77
},
8-
"homepage": "https://github.com/milla-jovovich/mempalace",
9-
"repository": "https://github.com/milla-jovovich/mempalace",
8+
"homepage": "https://github.com/MemPalace/mempalace",
9+
"repository": "https://github.com/MemPalace/mempalace",
1010
"license": "MIT",
1111
"keywords": [
1212
"memory",
@@ -39,9 +39,9 @@
3939
"Read",
4040
"Write"
4141
],
42-
"websiteURL": "https://github.com/milla-jovovich/mempalace",
43-
"privacyPolicyURL": "https://github.com/milla-jovovich/mempalace",
44-
"termsOfServiceURL": "https://github.com/milla-jovovich/mempalace",
42+
"websiteURL": "https://github.com/MemPalace/mempalace",
43+
"privacyPolicyURL": "https://github.com/MemPalace/mempalace",
44+
"termsOfServiceURL": "https://github.com/MemPalace/mempalace",
4545
"defaultPrompt": [
4646
"Search my memories for recent decisions",
4747
"Mine this project into my memory palace",

.github/workflows/deploy-docs.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: Deploy Docs
22

33
on:
44
push:
5-
branches: [main, develop]
5+
branches: [develop]
66
paths:
77
- ".github/workflows/deploy-docs.yml"
88
- "website/**"
@@ -51,7 +51,7 @@ jobs:
5151
path: website/.vitepress/dist
5252

5353
deploy:
54-
if: github.ref_name == 'main' || github.ref_name == 'develop'
54+
if: github.ref_name == 'develop'
5555
environment:
5656
name: github-pages
5757
url: ${{ steps.deployment.outputs.page_url }}

AGENTS.md

Lines changed: 0 additions & 78 deletions
This file was deleted.

AGENTS.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
CLAUDE.md

CHANGELOG.md

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
# Changelog
2+
3+
All notable changes to [MemPalace](https://github.com/MemPalace/mempalace) are documented in this file.
4+
5+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/).
6+
7+
---
8+
9+
## [Unreleased] — v3.3.0 (on develop)
10+
11+
### New Features
12+
- Closet layer — a compact searchable index of pointers to verbatim drawers, enabling fast topical lookup without reading all content (#788)
13+
- BM25 hybrid search — closets boost ranking, drawers remain the source of truth (#795, #829)
14+
- Entity metadata on every drawer for filterable search (#829)
15+
- Diary ingest — day-based rooms for conversation transcripts (#829)
16+
- Cross-wing tunnels — explicit links between rooms in different wings for multi-project agents (#829)
17+
- Drawer-grep — returns the best-matching chunk plus adjacent context drawers (#829)
18+
- Offline fact checker against the entity registry and knowledge graph (#829)
19+
- LLM-based closet regeneration — optional, bring-your-own endpoint, no mandatory API key (#793)
20+
- Hall detection — routes drawer content to `emotions` / `technical` / `family` / `memory` / `identity` / `consciousness` / `creative` halls, enabling hall-based graph connectivity within wings (#835)
21+
22+
### Bug Fixes
23+
- Set `hnsw:space=cosine` metadata on all collection creation sites — fixes broken similarity scoring under ChromaDB's default L2 distance (#807, #218)
24+
- File-level locking prevents duplicate drawers when agents mine the same file concurrently (#784, #826)
25+
- Hybrid closet+drawer retrieval — closets boost ranking, never gate results (#795)
26+
- Stop hooks from making agents write in chat — saves tokens on every turn (#786)
27+
- Strip system tags, hook output, and Claude UI chrome from drawers before filing (#785)
28+
- Verbatim-safe `strip_noise` scoped to Claude Code JSONL only (#785)
29+
- Prevent diary entry ID collisions via microsecond timestamp and full content hash (#819)
30+
- Auto-rebuild stale drawers via `NORMALIZE_VERSION` schema gate
31+
- Enforce atomic topics in closets and extract richer pointers
32+
- Sync `version.py` to match `pyproject.toml` (#820)
33+
- Remove unused `main` import from `mempalace/__init__.py` (#827)
34+
- README audit — fix 7 stale claims (tool count, version badge, wake-up token cost, `dialect.py` lossless disclaimer, `pyproject.toml` version) with 42 regression-guard tests (#835)
35+
36+
### Improvements
37+
- Optimize entity detection with regex caching and pre-compilation (#828)
38+
- Extract locked filing block into helper to keep `mine_convos` under C901 complexity
39+
40+
### Documentation
41+
- Add `docs/CLOSETS.md` — closet layer overview
42+
- Fix stale `milla-jovovich/*` org URLs in website and plugin manifests (#787)
43+
- Fix remaining stale org URLs in contributor docs (#808)
44+
45+
### Internal
46+
- Add test coverage for `mine_lock`, closets, entity metadata, BM25, and diary
47+
- Verify `mine_lock` via disjoint critical-section intervals
48+
- Serialize `mine_lock` concurrency test with multiprocessing
49+
- Make diary state path assertion platform-neutral
50+
- Add `TestTunnels` coverage for cross-wing tunnel operations
51+
- Ruff format with CI-pinned version (0.4.x); format `mempalace/palace.py`
52+
53+
---
54+
55+
## [3.2.0] — 2026-04-12
56+
57+
### Packaging
58+
- Remove `chromadb<0.7` upper bound — unblocks installs against chromadb 1.x palaces (#690)
59+
- Bump version to 3.2.0 across `pyproject.toml`, `mempalace/version.py`, README badge, and OpenClaw SKILL (#761)
60+
61+
### Security
62+
- Harden palace deletion, WAL redaction, and MCP search input handling (#739)
63+
- Consistent input validation, argument whitelisting, concurrency safety, and WAL fixes (#647)
64+
- Remove hardcoded credential paths from benchmark runners (#177)
65+
- Remove global SSL verification bypass in convomem_bench (#176)
66+
67+
### Bug Fixes
68+
- Parse Claude.ai privacy export with `messages` key and sender field (#685, #677)
69+
- Detect mtime changes in `_get_client` to prevent stale HNSW index (#757)
70+
- Hash full content in `tool_add_drawer` drawer ID — stable re-mines (#716)
71+
- Remove 10k drawer cap from status display (#707, #603)
72+
- Correct typo in entity_detector interactive classification prompt (#755)
73+
- Prevent convo_miner from re-processing 0-chunk files on every run (#732, #654)
74+
- Remove silent 8-line AI response truncation in convo_miner (#708, #692)
75+
- Store full AI response in convo_miner exchange chunking (#695)
76+
- Fix `mine --dry-run` TypeError on files with room=None (#687, #586)
77+
- Skip arg whitelist for handlers accepting `**kwargs` (#684, #572)
78+
- Allow Unicode in `sanitize_name()` — Latvian, CJK, Cyrillic (#683, #637)
79+
- Auto-repair BLOB seq_ids from chromadb 0.6→1.5 migration (#664)
80+
- Remove no-op `ORT_DISABLE_COREML` env var (#653, #397)
81+
- Disambiguate hook block reasons to name MemPalace explicitly (#666)
82+
- Use epsilon comparison for mtime to prevent unnecessary re-mining (#610)
83+
- Correct token count estimate in compress summary (#609)
84+
- Implement MCP ping health checks (#600)
85+
- Align `cmd_compress` dict keys with `compression_stats()` return values (#569)
86+
- Skip unreachable reparse points in `detect_rooms_from_folders` on Windows (#558)
87+
- Prevent HNSW index bloat from duplicate `add()` calls (#544, #525)
88+
- Purge stale drawers before re-mine to avoid hnswlib segfault (#544)
89+
- Mitigate system prompt contamination in search queries (#385, #333)
90+
- Count Codex `user_message` turns in `_count_human_messages` (#373, #347)
91+
- Paginate large collection reads and surface errors in MCP tools (#371, #339, #338)
92+
- Expand `~` in split command directory argument (#361)
93+
- Ignore `wait_for_previous` argument to support Gemini MCP clients (#322)
94+
- Close KnowledgeGraph SQLite connections in test fixtures (#450)
95+
- Remove duplicate cache variable declarations in mcp_server.py (#449)
96+
- Add `--yes` flag to init instructions for non-interactive use (#682, #534)
97+
- Add `mcp` command with setup guidance (#315)
98+
99+
### New Features
100+
- i18n support — 8 languages (en, es, fr, de, ja, ko, zh-CN, zh-TW) (#718)
101+
- New MCP tools: get/list/update drawer, hook settings, export (#667, #635)
102+
- `mempalace migrate` — recover palaces from different ChromaDB versions (#502)
103+
- Add OpenClaw/ClawHub skill (#491)
104+
- Backend seam for pluggable storage backends (#413)
105+
106+
### Improvements
107+
- Disable broken auto-bump workflow (#414)
108+
- Improve agent readiness — AGENTS.md, dependabot, CODEOWNERS, labels (#497)
109+
110+
### Documentation
111+
- Add CLAUDE.md and mission/principles to AGENTS.md (#720)
112+
- Add VitePress documentation site (#439)
113+
- Add warning about fake MemPalace websites (#598)
114+
- Fix stale org URLs and PR branch target in contributor docs (#679)
115+
- Fix misaligned architecture diagram (#734, #733)
116+
- Add ROADMAP.md — v3.1.1 stability patch and v4.0.0-alpha plan
117+
118+
### Internal
119+
- ruff format convo_miner.py (#741)
120+
- ruff format all Python files (#675)
121+
- CI: trigger tests on develop branch PRs and pushes (#674)
122+
- CI: fix GitHub Pages publishing (#691)
123+
124+
---
125+
126+
## [3.1.0] — 2026-04-09
127+
128+
### Security
129+
- Harden inputs, fix shell injection, optimize DB access (#387)
130+
- Sanitize SESSION_ID in save hook to prevent path traversal (#141)
131+
- Sanitize error responses and remove `sys.exit` from library code (#139)
132+
- Shell injection fix in hooks, Claude Code mining, chromadb pin (#114)
133+
134+
### Bug Fixes
135+
- MCP null args hang, repair infinite recursion, OOM on large files (#399)
136+
- Release ChromaDB handles before rmtree on Windows (#392)
137+
- Use `os.utime` in mtime test for Windows compatibility (#392)
138+
- Negotiate MCP protocol version instead of hardcoding (#324)
139+
- Use upsert and deterministic IDs to prevent data stagnation (#140)
140+
- Make `drawer_id` deterministic for idempotent writes (#387)
141+
- Honest AAAK stats — word-based token estimator, lossy labels (#147)
142+
- Room detection checks keywords against folder paths (#145)
143+
- Use actual detected room in mine summary stats (#165)
144+
- Honour `--palace` flag in mcp_server (#264)
145+
- Preserve default KG path when `--palace` not passed (#270)
146+
- `--yes` flag skips all interactive prompts in init (#123)
147+
- Repair command, split args, Claude export, room keywords (#119)
148+
- Replace Unicode separator in convo_miner.py for Windows compatibility (#129)
149+
- Coerce MCP integer arguments to native Python int (#84)
150+
- Batch ChromaDB reads to avoid SQLite variable limit (#66)
151+
- Respect nested .gitignore rules during mining (#78)
152+
- Narrow bare `except Exception` to specific types where safe (#54)
153+
- Mark MD5 as non-security in miner drawer ID generation (#53)
154+
- Remove dead code and duplicate set items in entity_registry.py (#42)
155+
- Silence ChromaDB telemetry warnings and CoreML segfault on Apple Silicon (#236)
156+
- Unify package and MCP version reporting (#16)
157+
- Fix broken AAAK Dialect link in README (#238)
158+
- Update input prompt for entity confirmation (#83)
159+
- Preserve CLI exit codes, log tracebacks, sanitize search errors (#139)
160+
- Enable SQLite WAL mode and add consistent LIMIT to KG timeline (#136)
161+
- Add limit=10000 safety cap to all unbounded ChromaDB `.get()` calls (#137)
162+
- Re-mine modified files, idempotent `add_drawer`, cleanup ChromaDB handles (#140)
163+
- Resolve formatting, regression logic, and pytest defaults (#270)
164+
- Use `parse_known_args` to allow importing mcp_server during pytest (#270)
165+
166+
### New Features
167+
- Package MemPalace as standard Claude and Codex plugins (#270)
168+
- Add OpenAI Codex CLI JSONL normalizer (#61)
169+
- Add Codex plugin support with hooks, commands, and documentation (#270)
170+
- Add command documentation for help, init, mine, search, and status (#270)
171+
172+
### Improvements
173+
- Cache ChromaDB `PersistentClient` instead of re-instantiating per call (#135)
174+
- Tighten chromadb version range and add `py.typed` marker (#142)
175+
- Consolidate split known-names config loading (#22)
176+
- CI: add separate jobs for Windows and macOS testing
177+
- CI: Upgrade GitHub Actions for Node 24 compatibility (#55)
178+
179+
### Documentation
180+
- Add Gemini CLI setup guide and integration section (#106)
181+
- Add beginner-friendly hooks tutorial (#103)
182+
- Align MCP setup examples with shipped server (#21)
183+
- Honest README update — own the mistakes, fix the claims
184+
185+
### Internal
186+
- Expand test coverage from 20 to 92 tests, migrate to uv (#131)
187+
- Add scale benchmark suite — 106 tests (#223)
188+
- Increase test coverage from 30% to 85%, fix Windows encoding bugs (#281)
189+
- Add WAL mode and entity timeline limit assertions
190+
- Add coverage for `file_already_mined` mtime check
191+
192+
---
193+
194+
## [3.0.0] — 2026-04-06
195+
196+
Initial public release.
197+
198+
- Palace architecture with day-based rooms, drawers (verbatim), and closets (searchable index)
199+
- AAAK compression dialect for memory folding
200+
- Knowledge graph with entity detection and timeline queries
201+
- MCP server for Claude, Codex, and Gemini integration
202+
- CLI: `init`, `mine`, `search`, `status`, `compress`, `repair`, `split`
203+
- Benchmark suite with recall and scale tests
204+
- README with MCP flow, local model flow, and specialist agent documentation
205+
206+
---
207+
208+
[Unreleased]: https://github.com/MemPalace/mempalace/compare/v3.2.0...HEAD
209+
[3.2.0]: https://github.com/MemPalace/mempalace/compare/v3.1.0...v3.2.0
210+
[3.1.0]: https://github.com/MemPalace/mempalace/compare/v3.0.0...v3.1.0
211+
[3.0.0]: https://github.com/MemPalace/mempalace/releases/tag/v3.0.0

0 commit comments

Comments
 (0)