From 20878697529fe854a39584db0e46c6879677d0f1 Mon Sep 17 00:00:00 2001 From: Igor Lins e Silva <4753812+igorls@users.noreply.github.com> Date: Thu, 16 Apr 2026 16:09:02 -0300 Subject: [PATCH 1/3] release: v3.3.1 Bumps version across pyproject.toml, mempalace/version.py, README badge, and uv.lock. Finalizes the 3.3.0 CHANGELOG section (was still labeled 'Unreleased') and adds a 3.3.1 section covering the multi-language entity-detection infra and the five new locales landed since 2026-04-13. Highlights: - Multi-language entity detection infra (#911) + script-aware word boundaries for combining-mark scripts (#932) + BCP 47 case-insensitive locale resolution (#928) + i18n patterns wired into miner/palace/ entity_registry (#931) - Five new fully-supported locales: pt-br (#156), ru (#760), it (#907), hi (#773), id (#778) - UTF-8 encoding fix on read_text() calls for non-UTF-8 Windows locales (#946) - KnowledgeGraph lock correctness (#884, #887) - Various smaller fixes and improvements --- CHANGELOG.md | 60 +++++++++++++++++++++++++++++++++++++++++++- README.md | 2 +- mempalace/version.py | 2 +- pyproject.toml | 2 +- uv.lock | 2 +- 5 files changed, 63 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd01968..54a8a15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,65 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), --- -## [Unreleased] — v3.3.0 (on develop) +## [3.3.1] — 2026-04-16 + +### New Features + +**Multi-language entity detection** — lexical patterns (person verbs, pronouns, dialogue markers, project verbs, stopwords, candidate character classes) now live in the optional `entity` section of each locale JSON under `mempalace/i18n/.json`. Every public function in `entity_detector` accepts a `languages=` tuple and unions patterns across enabled locales. Default stays `("en",)` so existing English-only callers are unchanged. (#911) + +- **Five new fully-supported locales** with CLI strings, AAAK compression instructions, and entity-detection patterns: + - Brazilian Portuguese `pt-br` (#156) + - Russian `ru` (#760) + - Italian `it` (#907) + - Hindi `hi` (#773) + - Indonesian `id` (#778) +- **`MempalaceConfig.entity_languages`** — persistent palace-level language selection; `MEMPALACE_ENTITY_LANGUAGES` env override; `mempalace init --lang en,pt-br` flag that saves to `~/.mempalace/config.json` (#911) +- **Per-language `candidate_pattern`** — non-Latin scripts register their own character class, so names like `João`, `Инна`, `राज` are no longer silently dropped by the ASCII-only default (#911) +- **VSCode devcontainer** matching the CI environment (#881) +- `created_at` timestamps in search results *(landed in 3.3.0-era code but not previously documented)* + +### Bug Fixes + +**i18n / Unicode** + +- Script-aware word boundaries for combining-mark scripts — Python's `\b` fails on Devanagari vowel signs (`ा ी ु`), Arabic, Hebrew, Thai, Tamil, Khmer etc., truncating names like `अनीता` → `अनीत` and making person-verb patterns never fire. Locales now declare an optional `boundary_chars` field and the i18n loader expands `\b` into a script-aware lookaround boundary (#932) +- Case-insensitive BCP 47 language code resolution — `--lang PT-BR`, `zh-cn`, `Pt-Br` previously fell through to English silently; now resolve to the canonical locale file via lowercase matching, with the entity-pattern cache keyed on the canonical form so casing variations share one cache entry (#928) +- Wire i18n candidate patterns into `miner._extract_entities_for_metadata()`, `palace.build_closet_lines()`, and `entity_registry.extract_unknown_candidates()` — three code paths that still hardcoded ASCII-only `[A-Z][a-z]{2,}` and silently missed Cyrillic, accented Latin, and non-Latin entity metadata tags (#931) +- Explicit `encoding="utf-8"` on `Path.read_text()` calls across entity_registry, instructions_cli, split_mega_files, and onboarding tests — prevents Windows GBK (and other non-UTF-8) locales from corrupting UTF-8 files (#946, #776) +- `ko.json` `status_drawers` used `{drawers}` instead of `{count}`, showing the raw template string instead of the number (#758) +- Move `test_i18n.py` from inside the installed package into `tests/` so pytest actually collects it; remove the `sys.path.insert` hack (#758) +- `Dialect.from_config()` defaulted to `current_lang()` (module-global) when config had no `lang` key — replaced with explicit `"en"` fallback for determinism (#758) + +**Other** + +- Guard `KnowledgeGraph.close()` and `query_relationship`/`timeline`/`stats` methods with the instance lock to prevent concurrent-access corruption (#887, #884) +- Replace invalid `{"decision": "allow"}` with `{}` in hook responses — the string wasn't a valid decision value and triggered schema warnings (#885) +- Restrict file permissions on sensitive palace data (previously landed on develop without a changelog entry; #814) +- Allow `mempalace mine` to run in directories without a local `mempalace.yaml` and surface the missing-yaml warning on stderr (#604) +- Security hook injection fix (#812) +- Pin the Pages custom domain via a shipped `CNAME` in the deploy artifact (#877) +- Version drift safeguard — sync pyproject + `version.py` + README badge in one place (#876) +- Deploy docs workflow now runs on `develop` only, preventing accidental main-branch deploys (#845) + +### Improvements + +- Regex compilation optimization for entity extraction — pre-compile per-entity pattern sets once and cache by `(name, languages)` tuple, so multi-language callers don't thrash the cache (#880) +- Knowledge-graph value sanitization now preserves natural punctuation (commas, colons, parentheses) that commonly appears in KG subject/object values (#873) + +### Documentation + +- Domain name and specific impostor sites called out in the scam-alert section (#869) +- Tightened `SECURITY.md` with a real version-support policy and the GHPVR-only reporting channel (#810) +- Fixed stale `pyproject.toml` URLs (#853) +- v4 planning prep (#852) + +### Internal + +- `palace_graph` tunnel helper test coverage (#908) + +--- + +## [3.3.0] — 2026-04-13 ### New Features - Closet layer — a compact searchable index of pointers to verbatim drawers, enabling fast topical lookup without reading all content (#788) diff --git a/README.md b/README.md index 27508e9..ac15446 100644 --- a/README.md +++ b/README.md @@ -177,7 +177,7 @@ PRs welcome. See [CONTRIBUTING.md](CONTRIBUTING.md). MIT — see [LICENSE](LICENSE). -[version-shield]: https://img.shields.io/badge/version-3.3.0-4dc9f6?style=flat-square&labelColor=0a0e14 +[version-shield]: https://img.shields.io/badge/version-3.3.1-4dc9f6?style=flat-square&labelColor=0a0e14 [release-link]: https://github.com/MemPalace/mempalace/releases [python-shield]: https://img.shields.io/badge/python-3.9+-7dd8f8?style=flat-square&labelColor=0a0e14&logo=python&logoColor=7dd8f8 [python-link]: https://www.python.org/ diff --git a/mempalace/version.py b/mempalace/version.py index c299346..4557efe 100644 --- a/mempalace/version.py +++ b/mempalace/version.py @@ -1,3 +1,3 @@ """Single source of truth for the MemPalace package version.""" -__version__ = "3.3.0" +__version__ = "3.3.1" diff --git a/pyproject.toml b/pyproject.toml index f3067f3..764abd0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "mempalace" -version = "3.3.0" +version = "3.3.1" description = "Give your AI a memory — mine projects and conversations into a searchable palace. No API key required." readme = "README.md" requires-python = ">=3.9" diff --git a/uv.lock b/uv.lock index f9b6dca..b03f710 100644 --- a/uv.lock +++ b/uv.lock @@ -1208,7 +1208,7 @@ wheels = [ [[package]] name = "mempalace" -version = "3.3.0" +version = "3.3.1" source = { editable = "." } dependencies = [ { name = "chromadb" }, From fd89303fe18d27e95c7e1b65e7fffe9671e260f2 Mon Sep 17 00:00:00 2001 From: Igor Lins e Silva <4753812+igorls@users.noreply.github.com> Date: Thu, 16 Apr 2026 16:12:37 -0300 Subject: [PATCH 2/3] docs(changelog): backfill post-v3.3.0 PRs missed by initial boundary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Advisor caught: initial boundary (962776c..develop) skipped PRs that landed on develop after v3.3.0 tag but before the sync-back merge. Adds entries for #871 MEMPAL_VERBOSE, #811 research() local-only default, #866 init .gitignore, #864 MCP stdout redirect, #863 precompact hook, #865 searcher empty results, #831 cold-start palace, #862 init help, #815 Slack provenance, #840 save hook auto-mine. Also drops the awkward caveat on #846 created_at — it's post-v3.3.0. --- CHANGELOG.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54a8a15..9cf77e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,7 +21,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), - **`MempalaceConfig.entity_languages`** — persistent palace-level language selection; `MEMPALACE_ENTITY_LANGUAGES` env override; `mempalace init --lang en,pt-br` flag that saves to `~/.mempalace/config.json` (#911) - **Per-language `candidate_pattern`** — non-Latin scripts register their own character class, so names like `João`, `Инна`, `राज` are no longer silently dropped by the ASCII-only default (#911) - **VSCode devcontainer** matching the CI environment (#881) -- `created_at` timestamps in search results *(landed in 3.3.0-era code but not previously documented)* +- `MEMPAL_VERBOSE` env toggle — developers see diaries surfaced in chat while the default remains silent (#871) +- `created_at` timestamps included in search results (#846) ### Bug Fixes @@ -39,9 +40,17 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), - Guard `KnowledgeGraph.close()` and `query_relationship`/`timeline`/`stats` methods with the instance lock to prevent concurrent-access corruption (#887, #884) - Replace invalid `{"decision": "allow"}` with `{}` in hook responses — the string wasn't a valid decision value and triggered schema warnings (#885) -- Restrict file permissions on sensitive palace data (previously landed on develop without a changelog entry; #814) +- `entity_registry.research()` defaults to local-only — previously made outbound Wikipedia HTTPS requests without explicit user opt-in; callers now must pass `allow_network=True` (#811) +- Precompact hook no longer blocks compaction when it fails or takes too long (#856, #858, #863) +- Redirect stdout to stderr during MCP server import so library logging can't corrupt the JSON-RPC channel (#225, #864) +- `mempalace init` auto-adds per-project files to `.gitignore` in git repositories so users don't accidentally commit `mempalace.yaml` / `entities.json` (#185, #866) +- Searcher guards against empty ChromaDB query results that previously raised on edge-case corpora (#195, #865) +- Return empty status instead of an error on a cold-start palace with no drawers yet (#830, #831) +- Restrict file permissions on sensitive palace data (#814) +- Slack transcript importer writes a provenance header and preserves speaker IDs (#815) - Allow `mempalace mine` to run in directories without a local `mempalace.yaml` and surface the missing-yaml warning on stderr (#604) - Security hook injection fix (#812) +- Save hook auto-mines transcripts even when `MEMPAL_DIR` is unset (#840) - Pin the Pages custom domain via a shipped `CNAME` in the deploy artifact (#877) - Version drift safeguard — sync pyproject + `version.py` + README badge in one place (#876) - Deploy docs workflow now runs on `develop` only, preventing accidental main-branch deploys (#845) @@ -53,6 +62,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), ### Documentation +- Clarify that `mempalace init` requires a `` argument in CLI help text (#210, #862) - Domain name and specific impostor sites called out in the scam-alert section (#869) - Tightened `SECURITY.md` with a real version-support policy and the GHPVR-only reporting channel (#810) - Fixed stale `pyproject.toml` URLs (#853) From 05ad2dc19493a615d340d4b410cbf97477820192 Mon Sep 17 00:00:00 2001 From: Igor Lins e Silva <4753812+igorls@users.noreply.github.com> Date: Thu, 16 Apr 2026 16:25:00 -0300 Subject: [PATCH 3/3] release: bump plugin manifests to 3.3.1 version-guard workflow checks five sources must agree: mempalace/version.py, pyproject.toml, .claude-plugin/marketplace.json, .claude-plugin/plugin.json, .codex-plugin/plugin.json. Initial release commit missed the three plugin manifests. --- .claude-plugin/marketplace.json | 2 +- .claude-plugin/plugin.json | 2 +- .codex-plugin/plugin.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index cbe6307..c03ecc8 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -9,7 +9,7 @@ "name": "mempalace", "source": "./.claude-plugin", "description": "AI memory system — mine projects and conversations into a searchable palace. 19 MCP tools, auto-save hooks, guided setup.", - "version": "3.3.0", + "version": "3.3.1", "author": { "name": "milla-jovovich" } diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index ba5759a..99da9a0 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "mempalace", - "version": "3.3.0", + "version": "3.3.1", "description": "Give your AI a memory — mine projects and conversations into a searchable palace. 19 MCP tools, auto-save hooks, and guided setup.", "author": { "name": "milla-jovovich" diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json index 9017d9b..49db916 100644 --- a/.codex-plugin/plugin.json +++ b/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "mempalace", - "version": "3.3.0", + "version": "3.3.1", "description": "Give your AI a memory — mine projects and conversations into a searchable palace. 19 MCP tools, auto-save hooks, and guided setup.", "author": { "name": "milla-jovovich"