memleaf 0.2.21__tar.gz → 0.2.22__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 (110) hide show
  1. {memleaf-0.2.21 → memleaf-0.2.22}/CHANGELOG.md +14 -0
  2. {memleaf-0.2.21/src/memleaf.egg-info → memleaf-0.2.22}/PKG-INFO +3 -3
  3. {memleaf-0.2.21 → memleaf-0.2.22}/README.en.md +2 -2
  4. {memleaf-0.2.21 → memleaf-0.2.22}/README.md +2 -2
  5. {memleaf-0.2.21 → memleaf-0.2.22}/pyproject.toml +1 -1
  6. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/__init__.py +1 -1
  7. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/hermes_provider/__init__.py +8 -2
  8. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/hermes_provider/plugin.yaml +1 -1
  9. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/processing.py +509 -46
  10. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/validation.py +2 -1
  11. {memleaf-0.2.21 → memleaf-0.2.22/src/memleaf.egg-info}/PKG-INFO +3 -3
  12. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_hermes_provider.py +5 -0
  13. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_pypi_install.py +1 -1
  14. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_stage_c1_mcp.py +1 -1
  15. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_stage_c3_packaging.py +1 -1
  16. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_todo_state_recovery.py +126 -0
  17. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_update_target_recovery.py +134 -0
  18. {memleaf-0.2.21 → memleaf-0.2.22}/IMPLEMENTATION_PLAN.md +0 -0
  19. {memleaf-0.2.21 → memleaf-0.2.22}/LICENSE +0 -0
  20. {memleaf-0.2.21 → memleaf-0.2.22}/MANIFEST.in +0 -0
  21. {memleaf-0.2.21 → memleaf-0.2.22}/RELEASE_CHECKLIST.md +0 -0
  22. {memleaf-0.2.21 → memleaf-0.2.22}/examples/README.md +0 -0
  23. {memleaf-0.2.21 → memleaf-0.2.22}/examples/basic_usage.py +0 -0
  24. {memleaf-0.2.21 → memleaf-0.2.22}/examples/mcp_stdio.ndjson +0 -0
  25. {memleaf-0.2.21 → memleaf-0.2.22}/install.ps1 +0 -0
  26. {memleaf-0.2.21 → memleaf-0.2.22}/install.sh +0 -0
  27. {memleaf-0.2.21 → memleaf-0.2.22}/setup.cfg +0 -0
  28. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/__main__.py +0 -0
  29. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/adapters/__init__.py +0 -0
  30. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/adapters/antigravity.py +0 -0
  31. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/adapters/base.py +0 -0
  32. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/adapters/codex.py +0 -0
  33. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/adapters/hermes.py +0 -0
  34. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/budget.py +0 -0
  35. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/capture.py +0 -0
  36. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/cli.py +0 -0
  37. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/compaction.py +0 -0
  38. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/config.py +0 -0
  39. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/credentials.py +0 -0
  40. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/frontmatter.py +0 -0
  41. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/hermes_provider/README.md +0 -0
  42. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/host_events.py +0 -0
  43. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/host_runtime.py +0 -0
  44. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/inbox.py +0 -0
  45. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/index.py +0 -0
  46. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/installer.py +0 -0
  47. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/llm/__init__.py +0 -0
  48. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/llm/base.py +0 -0
  49. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/llm/claude_compatible.py +0 -0
  50. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/llm/gemini.py +0 -0
  51. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/llm/openai_compatible.py +0 -0
  52. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/llm/router.py +0 -0
  53. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/locking.py +0 -0
  54. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/mcp_server.py +0 -0
  55. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/memory_writer.py +0 -0
  56. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/model_discovery.py +0 -0
  57. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/models.py +0 -0
  58. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/native_index.py +0 -0
  59. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/native_registration.py +0 -0
  60. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/prompts.py +0 -0
  61. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/redaction.py +0 -0
  62. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/retrieval.py +0 -0
  63. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/retrieval_gate.py +0 -0
  64. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/scope_maintenance.py +0 -0
  65. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/scope_state.py +0 -0
  66. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/service.py +0 -0
  67. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf/vault.py +0 -0
  68. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf.egg-info/SOURCES.txt +0 -0
  69. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf.egg-info/dependency_links.txt +0 -0
  70. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf.egg-info/entry_points.txt +0 -0
  71. {memleaf-0.2.21 → memleaf-0.2.22}/src/memleaf.egg-info/top_level.txt +0 -0
  72. {memleaf-0.2.21 → memleaf-0.2.22}/tests/__init__.py +0 -0
  73. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_admission_noise.py +0 -0
  74. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_codex_install.py +0 -0
  75. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_codex_native_cli.py +0 -0
  76. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_context_budget.py +0 -0
  77. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_credential_safety.py +0 -0
  78. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_cross_host_acceptance.py +0 -0
  79. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_cross_turn_dedupe_regressions.py +0 -0
  80. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_extraction_quality_regressions.py +0 -0
  81. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_global_todo_acceptance.py +0 -0
  82. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_global_todo_retrieval.py +0 -0
  83. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_hermes_native_registration.py +0 -0
  84. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_hermes_stdio_transport.py +0 -0
  85. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_host_events.py +0 -0
  86. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_host_runtime_contract.py +0 -0
  87. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_install.py +0 -0
  88. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_maintenance_v2.py +0 -0
  89. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_model_discovery.py +0 -0
  90. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_retrieval_gate.py +0 -0
  91. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_retrieval_v2.py +0 -0
  92. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_session_lineage.py +0 -0
  93. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_stage_a.py +0 -0
  94. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_stage_b1.py +0 -0
  95. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_stage_b2a.py +0 -0
  96. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_stage_b2b.py +0 -0
  97. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_stage_b3a_commit.py +0 -0
  98. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_stage_b3a_contract.py +0 -0
  99. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_stage_b3b_native_context.py +0 -0
  100. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_stage_b3b_native_index.py +0 -0
  101. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_stage_b3b_scope.py +0 -0
  102. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_stage_b3c_retrieval.py +0 -0
  103. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_stage_b3d_scope_maintenance.py +0 -0
  104. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_stage_c2_init.py +0 -0
  105. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_upgrade_preserves_vault.py +0 -0
  106. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_v2_gate_limits.py +0 -0
  107. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_v2_host_flow.py +0 -0
  108. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_v2_mcp_flow.py +0 -0
  109. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_v2_nomatch_semantics.py +0 -0
  110. {memleaf-0.2.21 → memleaf-0.2.22}/tests/test_v2_search_gate_acceptance.py +0 -0
@@ -2,6 +2,20 @@
2
2
 
3
3
  All notable changes to memleaf are documented here.
4
4
 
5
+ ## 0.2.22 — 2026-09-03
6
+
7
+ - Safely split valid multi-project `unscoped` aggregate candidates using only
8
+ project names grounded in each candidate, so one ambiguous fragment no
9
+ longer blocks valid project-local siblings.
10
+ - Persist explicit completion of an existing todo separately from new
11
+ customer rework, preserving immutable targets and making replay idempotent.
12
+ - Require declarative completion language before closing todos, avoiding false
13
+ completion for future actions such as needing to submit, waiting for
14
+ feedback, or being asked to send materials.
15
+ - Keep Hermes from claiming permanent persistence before automatic processing
16
+ succeeds; only a successful explicit remember/update result authorizes that
17
+ claim.
18
+
5
19
  ## 0.2.21 — 2026-09-03
6
20
 
7
21
  - Fix `memleaf install` for Hermes after the 12th MCP tool was added: the installer now uses the adapter's canonical tool-count constant instead of a stale private `11`.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: memleaf
3
- Version: 0.2.21
3
+ Version: 0.2.22
4
4
  Summary: A local-first Markdown memory core for AI agents
5
5
  Author: memleaf contributors
6
6
  License-Expression: MIT
@@ -23,8 +23,8 @@ Dynamic: license-file
23
23
 
24
24
  [English](README.en.md) · [PyPI](https://pypi.org/project/memleaf/) · [GitHub](https://github.com/miffyblueboo/memleaf)
25
25
 
26
- > **当前版本:0.2.21。**
27
- > 核心库、Vault、stdio MCP Server、初始化 CLI、模型路由、提炼流程、受控检索协议和宿主适配器已经实现。memleaf 0.2.21 通过 PyPI 分发。
26
+ > **当前版本:0.2.22。**
27
+ > 核心库、Vault、stdio MCP Server、初始化 CLI、模型路由、提炼流程、受控检索协议和宿主适配器已经实现。memleaf 0.2.22 通过 PyPI 分发。
28
28
  > **当前版本支持 Hermes 和 Codex。** Antigravity(反重力)不检测、不安装、不配置。
29
29
 
30
30
  ## 项目定位
@@ -4,8 +4,8 @@
4
4
 
5
5
  [中文](README.md) · [PyPI](https://pypi.org/project/memleaf/) · [GitHub](https://github.com/miffyblueboo/memleaf)
6
6
 
7
- > **Version: 0.2.21.**
8
- > The core library, Vault, stdio MCP server, initialization CLI, model routing, memory extraction, controlled retrieval protocol, and host adapters are implemented. memleaf 0.2.21 is distributed through PyPI.
7
+ > **Version: 0.2.22.**
8
+ > The core library, Vault, stdio MCP server, initialization CLI, model routing, memory extraction, controlled retrieval protocol, and host adapters are implemented. memleaf 0.2.22 is distributed through PyPI.
9
9
  > **The current release supports Hermes and Codex.** Antigravity is not detected, installed, or configured.
10
10
 
11
11
  ## Project scope
@@ -4,8 +4,8 @@
4
4
 
5
5
  [English](README.en.md) · [PyPI](https://pypi.org/project/memleaf/) · [GitHub](https://github.com/miffyblueboo/memleaf)
6
6
 
7
- > **当前版本:0.2.21。**
8
- > 核心库、Vault、stdio MCP Server、初始化 CLI、模型路由、提炼流程、受控检索协议和宿主适配器已经实现。memleaf 0.2.21 通过 PyPI 分发。
7
+ > **当前版本:0.2.22。**
8
+ > 核心库、Vault、stdio MCP Server、初始化 CLI、模型路由、提炼流程、受控检索协议和宿主适配器已经实现。memleaf 0.2.22 通过 PyPI 分发。
9
9
  > **当前版本支持 Hermes 和 Codex。** Antigravity(反重力)不检测、不安装、不配置。
10
10
 
11
11
  ## 项目定位
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "memleaf"
7
- version = "0.2.21"
7
+ version = "0.2.22"
8
8
  description = "A local-first Markdown memory core for AI agents"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,6 +1,6 @@
1
1
  """Local-first Markdown memory core for AI agents."""
2
2
 
3
- __version__ = "0.2.21"
3
+ __version__ = "0.2.22"
4
4
 
5
5
  from .config import DEFAULT_CONFIG, default_config, load_config, save_config
6
6
  from .frontmatter import FrontmatterError, dump_frontmatter, dump_yaml, load_yaml, parse_frontmatter
@@ -1964,8 +1964,14 @@ class MemleafMemoryProvider(MemoryProvider):
1964
1964
  "observer only: do not claim a search happened unless the visible tool "
1965
1965
  "messages show it. Visible Hermes "
1966
1966
  "turns are durably captured into the local memleaf inbox. Automatic "
1967
- "capture → process is authoritative: if process fails, report that "
1968
- "automatic processing failed and leave the inbox retryable. Do not use "
1967
+ "capture → process runs after your final answer and is authoritative: "
1968
+ "a capture only proves that the inbox received the turn. Until a "
1969
+ "successful explicit remember or update tool result is visible, never "
1970
+ "say that the turn was saved to permanent memory, persisted, or "
1971
+ "记好了/已落库. For automatic handling, say only that you will process "
1972
+ "it through the workflow or that it is recorded in the current "
1973
+ "conversation. If process fails, report that automatic processing "
1974
+ "failed and leave the inbox retryable. Do not use "
1969
1975
  "terminal, search_files, read_file, Python, or direct filesystem "
1970
1976
  "operations to search or read the memleaf Vault; those tools remain "
1971
1977
  "available for ordinary project/wiki files. Do not use direct vault "
@@ -1,5 +1,5 @@
1
1
  name: memleaf
2
- version: 0.2.21
2
+ version: 0.2.22
3
3
  description: "Hermes-native external MemoryProvider for local-first Markdown memory shared with the memleaf MCP server."
4
4
  hooks:
5
5
  - prefetch