mempalace-code 1.3.0__tar.gz → 1.4.1__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 (137) hide show
  1. mempalace_code-1.4.1/.github/workflows/ci.yml +29 -0
  2. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.github/workflows/publish.yml +4 -4
  3. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/CHANGELOG.md +19 -0
  4. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/CLAUDE.md +3 -2
  5. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/PKG-INFO +62 -24
  6. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/README.md +57 -18
  7. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/AGENT_INSTALL.md +15 -12
  8. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/BACKLOG-archived.yaml +12 -0
  9. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/BACKLOG.yaml +0 -41
  10. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/hooks/README.md +13 -18
  11. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/cli.py +110 -0
  12. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/entity_detector.py +7 -1
  13. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/miner.py +41 -5
  14. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/storage.py +23 -2
  15. mempalace_code-1.4.1/mempalace/watcher.py +619 -0
  16. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/pyproject.toml +9 -10
  17. mempalace_code-1.4.1/tests/test_entity_detector.py +50 -0
  18. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_miner.py +45 -2
  19. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_symbol_extract.py +35 -0
  20. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_watcher.py +3 -1
  21. mempalace_code-1.3.0/.github/workflows/ci.yml +0 -73
  22. mempalace_code-1.3.0/mempalace/watcher.py +0 -240
  23. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/prompts/codex-hardening-review.md +0 -0
  24. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/prompts/codex-plan-review.md +0 -0
  25. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/settings.json +0 -0
  26. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/_shared/commit-checkpoint.md +0 -0
  27. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/_shared/mode-classification.md +0 -0
  28. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/_shared/task-state.md +0 -0
  29. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/bench/SKILL.md +0 -0
  30. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/doc-refresh/INSTRUCTIONS.md +0 -0
  31. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/doc-refresh/SKILL.md +0 -0
  32. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/entropy-gc/INSTRUCTIONS.md +0 -0
  33. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/entropy-gc/SKILL.md +0 -0
  34. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/mine/SKILL.md +0 -0
  35. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/palace-health/SKILL.md +0 -0
  36. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/release/SKILL.md +0 -0
  37. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/ship/INSTRUCTIONS.md +0 -0
  38. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/ship/SKILL.md +0 -0
  39. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/start/INSTRUCTIONS.md +0 -0
  40. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/start/SKILL.md +0 -0
  41. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/status/SKILL.md +0 -0
  42. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/task-hardening/INSTRUCTIONS.md +0 -0
  43. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/task-hardening/SKILL.md +0 -0
  44. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/task-plan/INSTRUCTIONS.md +0 -0
  45. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/task-plan/SKILL.md +0 -0
  46. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/verify/INSTRUCTIONS.md +0 -0
  47. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/verify/SKILL.md +0 -0
  48. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  49. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  50. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  51. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.gitignore +0 -0
  52. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.pre-commit-config.yaml +0 -0
  53. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/CONTRIBUTING.md +0 -0
  54. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/LICENSE +0 -0
  55. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/NOTICE +0 -0
  56. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/assets/mempalace_banner.jpg +0 -0
  57. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/BENCHMARKS.md +0 -0
  58. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/HYBRID_MODE.md +0 -0
  59. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/README.md +0 -0
  60. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/convomem_bench.py +0 -0
  61. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/dotnet_bench.py +0 -0
  62. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/embed_ab_bench.py +0 -0
  63. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/locomo_bench.py +0 -0
  64. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/longmemeval_bench.py +0 -0
  65. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/membench_bench.py +0 -0
  66. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/results_embed_ab_2026-04-09.json +0 -0
  67. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/results_token_delta_mempalace.json +0 -0
  68. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/results_token_delta_wh40k.json +0 -0
  69. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/token_delta_bench.py +0 -0
  70. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/BACKUP_RESTORE.md +0 -0
  71. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/BENCH_TOKEN_DELTA.md +0 -0
  72. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/COMPARISON_GRAPHIFY.md +0 -0
  73. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/HOW_SEARCH_WORKS.md +0 -0
  74. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/OFFLINE_USAGE.md +0 -0
  75. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/UPSTREAM_HARDENING.md +0 -0
  76. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/WHY_THIS_FORK.md +0 -0
  77. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/examples/HOOKS_TUTORIAL.md +0 -0
  78. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/examples/basic_mining.py +0 -0
  79. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/examples/convo_import.py +0 -0
  80. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/examples/gemini_cli_setup.md +0 -0
  81. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/examples/mcp_setup.md +0 -0
  82. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/hooks/mempal_precompact_hook.sh +0 -0
  83. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/hooks/mempal_save_hook.sh +0 -0
  84. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/README.md +0 -0
  85. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/__init__.py +0 -0
  86. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/__main__.py +0 -0
  87. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/_chroma_store.py +0 -0
  88. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/backup.py +0 -0
  89. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/config.py +0 -0
  90. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/convo_miner.py +0 -0
  91. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/dialect.py +0 -0
  92. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/entity_registry.py +0 -0
  93. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/export.py +0 -0
  94. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/general_extractor.py +0 -0
  95. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/knowledge_graph.py +0 -0
  96. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/layers.py +0 -0
  97. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/mcp_server.py +0 -0
  98. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/migrate.py +0 -0
  99. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/normalize.py +0 -0
  100. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/onboarding.py +0 -0
  101. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/palace_graph.py +0 -0
  102. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/py.typed +0 -0
  103. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/room_detector_local.py +0 -0
  104. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/searcher.py +0 -0
  105. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/spellcheck.py +0 -0
  106. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/split_mega_files.py +0 -0
  107. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/treesitter.py +0 -0
  108. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/version.py +0 -0
  109. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/scripts/bootstrap.sh +0 -0
  110. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/scripts/codex-review.sh +0 -0
  111. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/scripts/nuke_wing.py +0 -0
  112. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/conftest.py +0 -0
  113. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_backup.py +0 -0
  114. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_chroma_compat.py +0 -0
  115. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_chunking.py +0 -0
  116. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_cli.py +0 -0
  117. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_config.py +0 -0
  118. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_convo_miner.py +0 -0
  119. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_dialect.py +0 -0
  120. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_dotnet_config.py +0 -0
  121. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_e2e.py +0 -0
  122. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_embed_ab_bench.py +0 -0
  123. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_export.py +0 -0
  124. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_kg_extract.py +0 -0
  125. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_knowledge_graph.py +0 -0
  126. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_lang_detect.py +0 -0
  127. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_mcp_server.py +0 -0
  128. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_migrate.py +0 -0
  129. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_normalize.py +0 -0
  130. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_offline.py +0 -0
  131. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_searcher.py +0 -0
  132. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_split_mega_files.py +0 -0
  133. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_storage.py +0 -0
  134. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_storage_lance.py +0 -0
  135. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_treesitter.py +0 -0
  136. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_version_consistency.py +0 -0
  137. {mempalace_code-1.3.0 → mempalace_code-1.4.1}/uv.lock +0 -0
@@ -0,0 +1,29 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v5
14
+ - uses: actions/setup-python@v6
15
+ with:
16
+ python-version: "3.13"
17
+ - run: pip install -e ".[dev,treesitter]"
18
+ - run: python3 -m pytest tests/ -v -m "not needs_network"
19
+
20
+ lint:
21
+ runs-on: ubuntu-latest
22
+ steps:
23
+ - uses: actions/checkout@v5
24
+ - uses: actions/setup-python@v6
25
+ with:
26
+ python-version: "3.13"
27
+ - run: pip install ruff
28
+ - run: ruff check .
29
+ - run: ruff format --check .
@@ -11,13 +11,13 @@ jobs:
11
11
  build:
12
12
  runs-on: ubuntu-latest
13
13
  steps:
14
- - uses: actions/checkout@v4
15
- - uses: actions/setup-python@v5
14
+ - uses: actions/checkout@v5
15
+ - uses: actions/setup-python@v6
16
16
  with:
17
17
  python-version: "3.11"
18
18
  - run: pip install build
19
19
  - run: python -m build
20
- - uses: actions/upload-artifact@v4
20
+ - uses: actions/upload-artifact@v5
21
21
  with:
22
22
  name: dist
23
23
  path: dist/
@@ -29,7 +29,7 @@ jobs:
29
29
  permissions:
30
30
  id-token: write
31
31
  steps:
32
- - uses: actions/download-artifact@v4
32
+ - uses: actions/download-artifact@v5
33
33
  with:
34
34
  name: dist
35
35
  path: dist/
@@ -1,5 +1,24 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.4.1 — 2026-04-20
4
+
5
+ ### Changed
6
+ - **Docs: hooks are legacy** — MCP tools + usage rules are now the recommended approach for all agents (Claude Code, Codex, Cursor); hooks demoted to optional Claude Code-only extra
7
+ - **Docs: unified saving story** — README, AGENT_INSTALL, and hooks README all consistently describe watcher for code mining + MCP for conversation context
8
+
9
+ ## v1.4.0 — 2026-04-19
10
+
11
+ ### Added
12
+ - **Watcher quiet mode** — re-mines suppress verbose output; only logs a one-line summary when drawers are actually filed; no-op commits produce zero log noise; optimize skipped on empty batches
13
+ - **Per-project `bin/` skip** — `bin/` no longer globally skipped; only excluded when .NET project markers (`.csproj`, `.sln`, `.fsproj`, `.vbproj`) are present (MINE-BIN-SKIP-DIRS)
14
+ - **Kotlin nested generic receiver** — `fun <T> List<Pair<K,V>>.ext()` now parsed correctly (MINE-KOTLIN-GENERIC-RECEIVER-NESTED)
15
+ - `mine()` now returns stats dict (`files_processed`, `drawers_filed`, `elapsed_secs`)
16
+
17
+ ### Fixed
18
+ - **Watcher on-commit detection** — `watchfiles.DefaultFilter` ignores `.git/` by default; on-commit mode now passes `watch_filter=None` so `.git/refs/heads/` changes are detected
19
+ - **Watcher log buffering** — flush Python stdout/stderr before restoring file descriptors to prevent mine() output leaking to real stdout
20
+ - **HuggingFace/safetensors noise** — suppress BertModel LOAD REPORT and progress bars via OS fd-level redirect during model init
21
+
3
22
  ## v1.3.0 — 2026-04-19
4
23
 
5
24
  First-class C#/.NET support — delivers [rergards/mempalace-code#1](https://github.com/rergards/mempalace-code/issues/1) in full.
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Stack
4
4
 
5
- - **Python** 3.9+ (supports 3.9–3.12)
5
+ - **Python** 3.11+ (supports 3.11–3.14)
6
6
  - **Storage**: LanceDB (core, crash-safe vector DB — no server required)
7
7
  - **Embeddings**: sentence-transformers (local, no API key)
8
8
  - **Config**: PyYAML
@@ -72,7 +72,8 @@ Line length: 100. Target: py39. Quote style: double.
72
72
  | `layers.py` | Tiered context loading — L0/L1/L2/L3 wake-up layers for local models |
73
73
  | `palace_graph.py` | Graph traversal and tunnel detection across wings/rooms |
74
74
  | `mcp_server.py` | MCP server — exposes palace tools to Claude Code and other MCP clients |
75
- | `cli.py` | `mempalace` CLI entry point init, mine, search, health, repair, backup |
75
+ | `watcher.py` | File watcher`watch_and_mine`, `watch_all`, launchd/cron schedule rendering |
76
+ | `cli.py` | `mempalace` CLI entry point — init, mine, mine-all, watch, search, health, repair, backup |
76
77
 
77
78
  ## Architecture Principles
78
79
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mempalace-code
3
- Version: 1.3.0
3
+ Version: 1.4.1
4
4
  Summary: Developer memory tool — mine codebases and conversations into a LanceDB-backed searchable palace. No API key required.
5
5
  Project-URL: Homepage, https://github.com/rergards/mempalace-code
6
6
  Project-URL: Repository, https://github.com/rergards/mempalace-code
@@ -16,7 +16,6 @@ Classifier: Development Status :: 4 - Beta
16
16
  Classifier: Environment :: Console
17
17
  Classifier: Intended Audience :: Developers
18
18
  Classifier: Programming Language :: Python :: 3
19
- Classifier: Programming Language :: Python :: 3.9
20
19
  Classifier: Programming Language :: Python :: 3.10
21
20
  Classifier: Programming Language :: Python :: 3.11
22
21
  Classifier: Programming Language :: Python :: 3.12
@@ -24,7 +23,7 @@ Classifier: Programming Language :: Python :: 3.13
24
23
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
25
24
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
26
25
  Classifier: Topic :: Utilities
27
- Requires-Python: >=3.9
26
+ Requires-Python: >=3.11
28
27
  Requires-Dist: lancedb>=0.17
29
28
  Requires-Dist: pyyaml>=6.0
30
29
  Requires-Dist: sentence-transformers>=2.2
@@ -33,15 +32,15 @@ Requires-Dist: chromadb<2,>=0.5.0; extra == 'chroma'
33
32
  Provides-Extra: dev
34
33
  Requires-Dist: pytest>=7.0; extra == 'dev'
35
34
  Requires-Dist: ruff>=0.4.0; extra == 'dev'
35
+ Requires-Dist: watchfiles>=1.0; extra == 'dev'
36
36
  Provides-Extra: spellcheck
37
37
  Requires-Dist: autocorrect>=2.0; extra == 'spellcheck'
38
38
  Provides-Extra: treesitter
39
39
  Requires-Dist: tree-sitter-go<0.26,>=0.23; extra == 'treesitter'
40
- Requires-Dist: tree-sitter-python<0.26,>=0.23; (python_version >= '3.10') and extra == 'treesitter'
40
+ Requires-Dist: tree-sitter-python<0.26,>=0.23; extra == 'treesitter'
41
41
  Requires-Dist: tree-sitter-rust<0.26,>=0.23; extra == 'treesitter'
42
42
  Requires-Dist: tree-sitter-typescript<0.26,>=0.23; extra == 'treesitter'
43
- Requires-Dist: tree-sitter<0.24,>=0.22; (python_version < '3.10') and extra == 'treesitter'
44
- Requires-Dist: tree-sitter<0.26,>=0.22; (python_version >= '3.10') and extra == 'treesitter'
43
+ Requires-Dist: tree-sitter<0.26,>=0.22; extra == 'treesitter'
45
44
  Provides-Extra: watch
46
45
  Requires-Dist: watchfiles>=1.0; extra == 'watch'
47
46
  Description-Content-Type: text/markdown
@@ -77,7 +76,7 @@ No cloud. No API keys. No subscription. Nothing leaves your machine.
77
76
  <tr>
78
77
  <td align="center"><strong>595x Token Savings</strong><br><sub>measured peak · median 80x<br><a href="docs/BENCH_TOKEN_DELTA.md">scales with project size</a></sub></td>
79
78
  <td align="center"><strong>Cross-Project Tunnels</strong><br><sub>Search <code>auth</code> in one project<br>find it everywhere</sub></td>
80
- <td align="center"><strong>1002 Tests · $0 Cost</strong><br><sub>Every feature acceptance-gated<br>fully offline after install</sub></td>
79
+ <td align="center"><strong>1008 Tests · $0 Cost</strong><br><sub>Every feature acceptance-gated<br>fully offline after install</sub></td>
81
80
  </tr>
82
81
  </table>
83
82
 
@@ -88,7 +87,13 @@ No cloud. No API keys. No subscription. Nothing leaves your machine.
88
87
  ## Quick Start
89
88
 
90
89
  ```bash
91
- pip install mempalace-code
90
+ uv tool install mempalace-code # recommended (fast, Rust-based)
91
+ # or
92
+ pipx install mempalace-code # alternative
93
+ # or
94
+ pip install mempalace-code # into current environment
95
+ # or
96
+ uvx --from mempalace-code mempalace --help # try without installing
92
97
  ```
93
98
 
94
99
  Then ask your AI to read [`docs/AGENT_INSTALL.md`](docs/AGENT_INSTALL.md) — it will handle setup, MCP wiring, prompt injection, and verification automatically.
@@ -102,6 +107,11 @@ mempalace mine ~/projects/myapp # index your codebase
102
107
  claude mcp add mempalace -- python -m mempalace.mcp_server # connect to Claude Code
103
108
  ```
104
109
 
110
+ **Optional: auto-sync on commit** (requires `[watch]` extra — see [Auto-Watch](#auto-watch)):
111
+ ```bash
112
+ mempalace watch ~/projects/ # re-mines on every commit, zero noise
113
+ ```
114
+
105
115
  This makes the 27 tools available to your AI. For proactive search and storage (without you asking), you'll also need to add usage rules to your `CLAUDE.md` — see [`docs/AGENT_INSTALL.md`](docs/AGENT_INSTALL.md) Section 7.
106
116
 
107
117
  </details>
@@ -175,10 +185,40 @@ Tree-sitter is optional (`pip install "mempalace-code[treesitter]"`). Without it
175
185
  mempalace mine ~/projects/myapp # all supported file types
176
186
  mempalace mine ~/projects/myapp --wing myapp # tag with a specific wing
177
187
  mempalace mine ~/chats/ --mode convos # mine conversation exports
188
+ mempalace mine-all ~/projects/ # batch mine all projects in a directory
178
189
  ```
179
190
 
180
191
  Mining is **incremental** by default — content-hash based, only changed files are re-chunked. Use `--full` to force a rebuild.
181
192
 
193
+ ### Auto-Watch
194
+
195
+ Keep your palace in sync automatically. By default, watches `.git/refs/heads/` and re-mines only on **commit** — no noise from work-in-progress saves. Handles multiple branches and worktrees.
196
+
197
+ Requires the `watch` extra:
198
+ ```bash
199
+ uv tool install "mempalace-code[watch]" # or: pipx install "mempalace-code[watch]"
200
+ ```
201
+
202
+ Already installed without it? Add watchfiles:
203
+ ```bash
204
+ uv tool inject mempalace-code watchfiles # or: pipx inject mempalace-code watchfiles
205
+ ```
206
+
207
+ ```bash
208
+ mempalace watch ~/projects/ # watch all projects (on commit, default)
209
+ mempalace watch ~/projects/ --on-save # watch all file saves instead (noisier)
210
+ mempalace watch ~/projects/ schedule # print launchd/cron snippet for daemon
211
+ ```
212
+
213
+ **Install as persistent daemon (macOS):**
214
+
215
+ ```bash
216
+ mempalace watch ~/projects/ schedule > ~/Library/LaunchAgents/com.mempalace.watch.plist
217
+ launchctl load ~/Library/LaunchAgents/com.mempalace.watch.plist
218
+ ```
219
+
220
+ Starts at login, restarts if crashed. Logs to `/tmp/mempalace-watch.log`.
221
+
182
222
  ---
183
223
 
184
224
  ### The Palace
@@ -421,7 +461,7 @@ This is a code-first fork of [milla-jovovich/mempalace](https://github.com/milla
421
461
  | ChromaDB — [silently deletes data on version bump](https://github.com/milla-jovovich/mempalace/issues/469) | LanceDB — crash-safe Arrow storage, no version-cliff |
422
462
  | "No internet after install" — [false](https://github.com/milla-jovovich/mempalace/issues/524) | `mempalace init` downloads model explicitly; fully offline after |
423
463
  | "100% R@5" — [unverifiable](https://github.com/milla-jovovich/mempalace/issues/27) | Number removed. Methodology caveats documented |
424
- | ~30% test coverage | 1002 tests, every feature acceptance-gated |
464
+ | ~30% test coverage | 1008 tests, every feature acceptance-gated |
425
465
  | No backup, no recovery | `backup` / `restore` / `export` / `import` |
426
466
  | No incremental mining | Content-hash incremental: only changed files re-chunked |
427
467
  | No code-search | `code_search` — filter by language, symbol, glob |
@@ -496,6 +536,10 @@ mempalace mine <dir> --full # force full rebuild
496
536
  mempalace mine <dir> --watch # auto-incremental on file changes
497
537
  mempalace mine-all <parent-dir> # batch mine all projects in a directory
498
538
 
539
+ # Watch (multi-project auto-sync)
540
+ mempalace watch <parent-dir> # watch all initialized projects
541
+ mempalace watch <parent-dir> schedule # print launchd/cron daemon snippet
542
+
499
543
  # Search
500
544
  mempalace search "query" # search everything
501
545
  mempalace search "query" --wing myapp # scoped to wing
@@ -523,21 +567,15 @@ mempalace fetch-model # pre-download for offline use
523
567
  </details>
524
568
 
525
569
  <details>
526
- <summary><strong>Auto-Save Hooks</strong></summary>
570
+ <summary><strong>Saving Conversation Context</strong></summary>
527
571
 
528
- Two Claude Code hooks for automatic memory saving:
572
+ Code mining is automatic via `mempalace watch-all`. For conversation context (decisions, discussions, debugging notes), the AI uses MCP tools directly — works with **any agent** (Claude Code, Codex, Cursor, etc.):
529
573
 
530
- - **Stop Hook** after each response, saves topics, decisions, and code changes
531
- - **PreCompact Hook** emergency save before context compression
574
+ 1. Wire the MCP server (see [install docs](docs/AGENT_INSTALL.md))
575
+ 2. Add usage rules to your agent's instructions (CLAUDE.md, system prompt, etc.)
576
+ 3. The agent calls `mempalace_add_drawer` and `mempalace_diary_write` during sessions
532
577
 
533
- ```json
534
- {
535
- "hooks": {
536
- "Stop": [{"matcher": "", "hooks": [{"type": "command", "command": "/path/to/mempalace/hooks/mempal_save_hook.sh"}]}],
537
- "PreCompact": [{"matcher": "", "hooks": [{"type": "command", "command": "/path/to/mempalace/hooks/mempal_precompact_hook.sh"}]}]
538
- }
539
- }
540
- ```
578
+ > **Legacy:** Claude Code also supports optional [auto-save hooks](hooks/README.md) that remind the AI to save at fixed intervals. These are redundant if MCP + usage rules are set up.
541
579
 
542
580
  </details>
543
581
 
@@ -557,9 +595,9 @@ mempalace/
557
595
  │ ├── palace_graph.py ← room navigation graph
558
596
  │ └── layers.py ← 4-layer memory stack
559
597
  ├── benchmarks/ ← reproducible benchmark runners
560
- ├── hooks/ ← Claude Code auto-save hooks
598
+ ├── hooks/ ← Claude Code auto-save hooks (legacy, optional)
561
599
  ├── examples/ ← usage examples
562
- └── tests/ ← 1002 tests
600
+ └── tests/ ← 1008 tests
563
601
  ```
564
602
 
565
603
  </details>
@@ -579,7 +617,7 @@ python -m pytest tests/ -x -q # full suite, all local, no network
579
617
  Apache 2.0 — see [LICENSE](LICENSE) and [NOTICE](NOTICE).
580
618
 
581
619
  <!-- Link Definitions -->
582
- [version-shield]: https://img.shields.io/badge/version-1.3.0-4dc9f6?style=flat-square&labelColor=0a0e14
620
+ [version-shield]: https://img.shields.io/badge/version-1.4.0-4dc9f6?style=flat-square&labelColor=0a0e14
583
621
  [release-link]: https://github.com/rergards/mempalace-code/releases
584
622
  [python-shield]: https://img.shields.io/badge/python-3.9+-7dd8f8?style=flat-square&labelColor=0a0e14&logo=python&logoColor=7dd8f8
585
623
  [python-link]: https://www.python.org/
@@ -29,7 +29,7 @@ No cloud. No API keys. No subscription. Nothing leaves your machine.
29
29
  <tr>
30
30
  <td align="center"><strong>595x Token Savings</strong><br><sub>measured peak · median 80x<br><a href="docs/BENCH_TOKEN_DELTA.md">scales with project size</a></sub></td>
31
31
  <td align="center"><strong>Cross-Project Tunnels</strong><br><sub>Search <code>auth</code> in one project<br>find it everywhere</sub></td>
32
- <td align="center"><strong>1002 Tests · $0 Cost</strong><br><sub>Every feature acceptance-gated<br>fully offline after install</sub></td>
32
+ <td align="center"><strong>1008 Tests · $0 Cost</strong><br><sub>Every feature acceptance-gated<br>fully offline after install</sub></td>
33
33
  </tr>
34
34
  </table>
35
35
 
@@ -40,7 +40,13 @@ No cloud. No API keys. No subscription. Nothing leaves your machine.
40
40
  ## Quick Start
41
41
 
42
42
  ```bash
43
- pip install mempalace-code
43
+ uv tool install mempalace-code # recommended (fast, Rust-based)
44
+ # or
45
+ pipx install mempalace-code # alternative
46
+ # or
47
+ pip install mempalace-code # into current environment
48
+ # or
49
+ uvx --from mempalace-code mempalace --help # try without installing
44
50
  ```
45
51
 
46
52
  Then ask your AI to read [`docs/AGENT_INSTALL.md`](docs/AGENT_INSTALL.md) — it will handle setup, MCP wiring, prompt injection, and verification automatically.
@@ -54,6 +60,11 @@ mempalace mine ~/projects/myapp # index your codebase
54
60
  claude mcp add mempalace -- python -m mempalace.mcp_server # connect to Claude Code
55
61
  ```
56
62
 
63
+ **Optional: auto-sync on commit** (requires `[watch]` extra — see [Auto-Watch](#auto-watch)):
64
+ ```bash
65
+ mempalace watch ~/projects/ # re-mines on every commit, zero noise
66
+ ```
67
+
57
68
  This makes the 27 tools available to your AI. For proactive search and storage (without you asking), you'll also need to add usage rules to your `CLAUDE.md` — see [`docs/AGENT_INSTALL.md`](docs/AGENT_INSTALL.md) Section 7.
58
69
 
59
70
  </details>
@@ -127,10 +138,40 @@ Tree-sitter is optional (`pip install "mempalace-code[treesitter]"`). Without it
127
138
  mempalace mine ~/projects/myapp # all supported file types
128
139
  mempalace mine ~/projects/myapp --wing myapp # tag with a specific wing
129
140
  mempalace mine ~/chats/ --mode convos # mine conversation exports
141
+ mempalace mine-all ~/projects/ # batch mine all projects in a directory
130
142
  ```
131
143
 
132
144
  Mining is **incremental** by default — content-hash based, only changed files are re-chunked. Use `--full` to force a rebuild.
133
145
 
146
+ ### Auto-Watch
147
+
148
+ Keep your palace in sync automatically. By default, watches `.git/refs/heads/` and re-mines only on **commit** — no noise from work-in-progress saves. Handles multiple branches and worktrees.
149
+
150
+ Requires the `watch` extra:
151
+ ```bash
152
+ uv tool install "mempalace-code[watch]" # or: pipx install "mempalace-code[watch]"
153
+ ```
154
+
155
+ Already installed without it? Add watchfiles:
156
+ ```bash
157
+ uv tool inject mempalace-code watchfiles # or: pipx inject mempalace-code watchfiles
158
+ ```
159
+
160
+ ```bash
161
+ mempalace watch ~/projects/ # watch all projects (on commit, default)
162
+ mempalace watch ~/projects/ --on-save # watch all file saves instead (noisier)
163
+ mempalace watch ~/projects/ schedule # print launchd/cron snippet for daemon
164
+ ```
165
+
166
+ **Install as persistent daemon (macOS):**
167
+
168
+ ```bash
169
+ mempalace watch ~/projects/ schedule > ~/Library/LaunchAgents/com.mempalace.watch.plist
170
+ launchctl load ~/Library/LaunchAgents/com.mempalace.watch.plist
171
+ ```
172
+
173
+ Starts at login, restarts if crashed. Logs to `/tmp/mempalace-watch.log`.
174
+
134
175
  ---
135
176
 
136
177
  ### The Palace
@@ -373,7 +414,7 @@ This is a code-first fork of [milla-jovovich/mempalace](https://github.com/milla
373
414
  | ChromaDB — [silently deletes data on version bump](https://github.com/milla-jovovich/mempalace/issues/469) | LanceDB — crash-safe Arrow storage, no version-cliff |
374
415
  | "No internet after install" — [false](https://github.com/milla-jovovich/mempalace/issues/524) | `mempalace init` downloads model explicitly; fully offline after |
375
416
  | "100% R@5" — [unverifiable](https://github.com/milla-jovovich/mempalace/issues/27) | Number removed. Methodology caveats documented |
376
- | ~30% test coverage | 1002 tests, every feature acceptance-gated |
417
+ | ~30% test coverage | 1008 tests, every feature acceptance-gated |
377
418
  | No backup, no recovery | `backup` / `restore` / `export` / `import` |
378
419
  | No incremental mining | Content-hash incremental: only changed files re-chunked |
379
420
  | No code-search | `code_search` — filter by language, symbol, glob |
@@ -448,6 +489,10 @@ mempalace mine <dir> --full # force full rebuild
448
489
  mempalace mine <dir> --watch # auto-incremental on file changes
449
490
  mempalace mine-all <parent-dir> # batch mine all projects in a directory
450
491
 
492
+ # Watch (multi-project auto-sync)
493
+ mempalace watch <parent-dir> # watch all initialized projects
494
+ mempalace watch <parent-dir> schedule # print launchd/cron daemon snippet
495
+
451
496
  # Search
452
497
  mempalace search "query" # search everything
453
498
  mempalace search "query" --wing myapp # scoped to wing
@@ -475,21 +520,15 @@ mempalace fetch-model # pre-download for offline use
475
520
  </details>
476
521
 
477
522
  <details>
478
- <summary><strong>Auto-Save Hooks</strong></summary>
523
+ <summary><strong>Saving Conversation Context</strong></summary>
479
524
 
480
- Two Claude Code hooks for automatic memory saving:
525
+ Code mining is automatic via `mempalace watch-all`. For conversation context (decisions, discussions, debugging notes), the AI uses MCP tools directly — works with **any agent** (Claude Code, Codex, Cursor, etc.):
481
526
 
482
- - **Stop Hook** after each response, saves topics, decisions, and code changes
483
- - **PreCompact Hook** emergency save before context compression
527
+ 1. Wire the MCP server (see [install docs](docs/AGENT_INSTALL.md))
528
+ 2. Add usage rules to your agent's instructions (CLAUDE.md, system prompt, etc.)
529
+ 3. The agent calls `mempalace_add_drawer` and `mempalace_diary_write` during sessions
484
530
 
485
- ```json
486
- {
487
- "hooks": {
488
- "Stop": [{"matcher": "", "hooks": [{"type": "command", "command": "/path/to/mempalace/hooks/mempal_save_hook.sh"}]}],
489
- "PreCompact": [{"matcher": "", "hooks": [{"type": "command", "command": "/path/to/mempalace/hooks/mempal_precompact_hook.sh"}]}]
490
- }
491
- }
492
- ```
531
+ > **Legacy:** Claude Code also supports optional [auto-save hooks](hooks/README.md) that remind the AI to save at fixed intervals. These are redundant if MCP + usage rules are set up.
493
532
 
494
533
  </details>
495
534
 
@@ -509,9 +548,9 @@ mempalace/
509
548
  │ ├── palace_graph.py ← room navigation graph
510
549
  │ └── layers.py ← 4-layer memory stack
511
550
  ├── benchmarks/ ← reproducible benchmark runners
512
- ├── hooks/ ← Claude Code auto-save hooks
551
+ ├── hooks/ ← Claude Code auto-save hooks (legacy, optional)
513
552
  ├── examples/ ← usage examples
514
- └── tests/ ← 1002 tests
553
+ └── tests/ ← 1008 tests
515
554
  ```
516
555
 
517
556
  </details>
@@ -531,7 +570,7 @@ python -m pytest tests/ -x -q # full suite, all local, no network
531
570
  Apache 2.0 — see [LICENSE](LICENSE) and [NOTICE](NOTICE).
532
571
 
533
572
  <!-- Link Definitions -->
534
- [version-shield]: https://img.shields.io/badge/version-1.3.0-4dc9f6?style=flat-square&labelColor=0a0e14
573
+ [version-shield]: https://img.shields.io/badge/version-1.4.0-4dc9f6?style=flat-square&labelColor=0a0e14
535
574
  [release-link]: https://github.com/rergards/mempalace-code/releases
536
575
  [python-shield]: https://img.shields.io/badge/python-3.9+-7dd8f8?style=flat-square&labelColor=0a0e14&logo=python&logoColor=7dd8f8
537
576
  [python-link]: https://www.python.org/
@@ -29,8 +29,8 @@ Parse `major.minor` from stdout (e.g. `Python 3.11.4` → `3.11`).
29
29
 
30
30
  **Pass →** `major >= 3` and `minor >= 9`. Record Python binary as `PYTHON=python3`. Continue to Step 1.2.
31
31
 
32
- **Fail →** Python is absent or version < 3.9. **ASK HUMAN:** "Python 3.9 or later is required but was not found (or is too old). Please install Python 3.9+ and re-run this script. Reply `ready` when done."
33
- Wait for `ready`. Re-run Step 1.1. If still failing after one retry, halt and report: "Cannot proceed — Python 3.9+ is required."
32
+ **Fail →** Python is absent or version < 3.11. **ASK HUMAN:** "Python 3.11 or later is required but was not found (or is too old). Please install Python 3.11+ and re-run this script. Reply `ready` when done."
33
+ Wait for `ready`. Re-run Step 1.1. If still failing after one retry, halt and report: "Cannot proceed — Python 3.11+ is required."
34
34
 
35
35
  ---
36
36
 
@@ -109,10 +109,10 @@ Ask all five questions before acting. Record answers; they parameterize Sections
109
109
 
110
110
  **Condition:** `ALREADY_INSTALLED=false`
111
111
 
112
- **ASK HUMAN:** "I can install mempalace at the user level (recommended: `pipx`, isolated from other packages) or as a project dependency in the current virtual environment (`uv`/`pip`). Reply `user` for pipx or `project` for the current venv."
112
+ **ASK HUMAN:** "I can install mempalace at the user level (recommended: `uv tool install` or `pipx`, isolated from other packages) or as a project dependency in the current virtual environment (`pip`). Reply `user` for isolated install or `project` for the current venv."
113
113
 
114
114
  **Parse response:**
115
- - `user` → Set `INSTALL_METHOD=user`. (If `HAS_PIPX=false`, note pipx must be installed first see Step 3.1 fallback.)
115
+ - `user` → Set `INSTALL_METHOD=user`. Prefer `uv tool install` if `HAS_UV=true`, else fall back to `pipx`.
116
116
  - `project` → Set `INSTALL_METHOD=project`.
117
117
  - Anything else → Repeat the question once. If still unclear, default to `user` and inform the human.
118
118
 
@@ -189,7 +189,7 @@ curl -fsSL https://raw.githubusercontent.com/rergards/mempalace-code/main/script
189
189
 
190
190
  **Pass →** Script exits 0 and prints `Done. mempalace <version> is ready.` Skip to Section 4.
191
191
 
192
- **Fail →** Script exits non-zero. Read the error output. Common causes: no Python 3.9+, no `venv` module (`apt install python3-venv`). Fix and re-run, or fall through to manual Steps 3.1–3.3.
192
+ **Fail →** Script exits non-zero. Read the error output. Common causes: no Python 3.11+, no `venv` module (`apt install python3-venv`). Fix and re-run, or fall through to manual Steps 3.1–3.3.
193
193
 
194
194
  ---
195
195
 
@@ -215,7 +215,7 @@ If that succeeds, re-run `pipx install mempalace-code`. If pipx install fails, f
215
215
 
216
216
  ---
217
217
 
218
- ### Step 3.2: Install via uv (INSTALL_METHOD=project or pipx unavailable, HAS_UV=true)
218
+ ### Step 3.2: Install via uv (INSTALL_METHOD=user and HAS_UV=true, or pipx unavailable)
219
219
 
220
220
  **Check:**
221
221
  ```bash
@@ -224,7 +224,7 @@ command -v uv
224
224
 
225
225
  **Pass →** Run:
226
226
  ```bash
227
- uv pip install mempalace-code
227
+ uv tool install mempalace-code
228
228
  ```
229
229
  Exit code 0 = success. Continue to Step 3.4.
230
230
 
@@ -491,14 +491,17 @@ mkdir -p ~/.codex
491
491
 
492
492
  ---
493
493
 
494
- ### Step 5.3: Auto-save hooks (optional, recommended)
494
+ ### Step 5.3: Auto-save for conversation context
495
495
 
496
- Auto-save hooks are separate from MCP wiring. They trigger automatic memory saves during AI sessions. Configuration is documented in [`hooks/README.md`](../hooks/README.md). Do NOT inline hook setup here reference the README and let the human decide.
496
+ Code mining is handled by the watcher (`mempalace watch-all`) and works with any client. Conversation context (decisions, discussions, debugging notes) is saved via **MCP tools + usage rules** this works identically across all agents.
497
497
 
498
- **ASK HUMAN:** "Would you like to set up auto-save hooks (these automatically save memories during AI sessions — see `hooks/README.md`)? Reply `yes` or `no`."
498
+ The recommended approach for **all agents** (Claude Code, Codex, Cursor, etc.):
499
+ 1. Wire the MCP server (Steps 5.1/5.2) so the agent can call `mempalace_add_drawer` and `mempalace_diary_write`.
500
+ 2. Add usage rules to the agent's instructions (Section 7) so it knows when to save.
499
501
 
500
- - `yes` Refer human to `hooks/README.md` for configuration instructions. Do not proceed autonomously.
501
- - `no` → Skip.
502
+ That's it. No hooks needed.
503
+
504
+ > **Legacy: Claude Code auto-save hooks.** Claude Code also supports optional bash hooks that fire on Stop/PreCompact events and remind the AI to save at fixed intervals. These are redundant if you have MCP + usage rules set up, but are documented in [`hooks/README.md`](../hooks/README.md) for users who want belt-and-suspenders.
502
505
 
503
506
  ---
504
507
 
@@ -148,3 +148,15 @@ items:
148
148
  summary: Track plain Name= attribute as well as x:Name for has_named_control triples
149
149
  resolution: '2026-04-19: Updated parse_xaml_file() section 3 to collect both x:Name and plain Name= per element into a set before emitting has_named_control triples; added 2 regression tests (plain Name= and same-value dedup). All 189 tests pass.'
150
150
  archived_date: "2026-04-19"
151
+ - key: MINE-KOTLIN-GENERIC-RECEIVER-NESTED
152
+ summary: Extract function names from Kotlin generic functions with deeply nested receiver types
153
+ resolution: '2026-04-19: Replaced [^>]+ with (?:[^<>]|<[^<>]*>)* in fun regex; added 2 tests for depth-2 generic nesting (AC-1, AC-2); all 176 symbol extract tests pass'
154
+ archived_date: "2026-04-19"
155
+ - key: MINE-BIN-SKIP-DIRS
156
+ summary: bin/ in SKIP_DIRS silently excludes non-.NET script directories
157
+ resolution: '2026-04-19: Remove bin from global SKIP_DIRS; add _is_dotnet_project() helper; skip bin/ conditionally in scan_project() when .NET markers present. Hardened round-1: fixed weak .dll test fixture in test_bin_dir_skipped_when_sln_at_root.'
158
+ archived_date: "2026-04-19"
159
+ - key: CLARIFY-MINE-BIN-SKIP-DIRS
160
+ summary: Clarify scope for MINE-BIN-SKIP-DIRS before planning can proceed
161
+ resolution: '2026-04-19: Owner decision: implement per-project detection — skip bin/ only when .NET markers (.csproj, .sln, .fsproj, .vbproj) are present. Add non-.NET regression test.'
162
+ archived_date: "2026-04-19"
@@ -840,26 +840,6 @@ items:
840
840
  - [ ] extract_symbol("String getName() {\n}\n", "java") returns ("getName", "method")
841
841
  - [ ] extract_symbol("String name;\n", "java") still returns ("", "")
842
842
  - [ ] All existing Java symbol-extraction tests pass
843
- - key: MINE-KOTLIN-GENERIC-RECEIVER-NESTED
844
- summary: Extract function names from Kotlin generic functions with deeply nested receiver types
845
- type: feature
846
- status: open
847
- priority: low
848
- size: S
849
- section_id: immediate
850
- labels: [feat, miner, kotlin]
851
- description: |-
852
- ## Problem
853
- The fun extraction regex uses negated-class [^>] that stops at the first >, so nested generics like Map<String, List<Int>> or bounds like <T : Comparable<T>> cause extract_symbol to return ("", ""). Chunks are stored but symbol metadata is empty, degrading search relevance for generic utility/extension code.
854
-
855
- ## Scope
856
- - Update fun regex in _KOTLIN_EXTRACT to handle depth-2 nesting
857
- - Cover: type param bounds, generic receivers
858
-
859
- ## Acceptance criteria
860
- - [ ] extract_symbol('fun <T : Comparable<T>> List<T>.sorted(): List<T>', 'kotlin') == ('sorted', 'function')
861
- - [ ] extract_symbol('fun Map<String, List<Int>>.flatten(): List<Int>', 'kotlin') == ('flatten', 'function')
862
- - [ ] All 23 existing Kotlin symbol tests still pass
863
843
  - key: MINE-CSHARP-EXPR-BODY
864
844
  summary: C# expression-bodied properties not detected as boundaries or symbols
865
845
  type: feature
@@ -888,27 +868,6 @@ items:
888
868
  - [ ] extract_symbol('public int Count => _items.Count;\n', 'csharp') returns ('Count', 'property')
889
869
  - [ ] chunk_code() creates a boundary at expression-bodied property declarations
890
870
  - [ ] Existing tests unaffected
891
- - key: MINE-BIN-SKIP-DIRS
892
- summary: bin/ in SKIP_DIRS silently excludes non-.NET script directories
893
- type: task
894
- status: open
895
- priority: low
896
- size: S
897
- section_id: immediate
898
- labels: [miner]
899
- description: |-
900
- ## Problem
901
- The MINE-DOTNET feature added 'bin' to SKIP_DIRS globally. In non-.NET projects (e.g. Ruby on Rails, Go), a 'bin/' directory legitimately contains source scripts/executables that should be mined. Currently these files are silently skipped with no warning.
902
-
903
- ## Scope
904
- - Investigate whether 'bin' should be kept global or made .NET-specific
905
- - Option A: Replace global 'bin' entry with per-project detection (only skip bin/ when .csproj/.sln is present in the project root)
906
- - Option B: Document as a known limitation in CLAUDE.md and README
907
-
908
- ## Acceptance criteria
909
- - A Ruby on Rails or Go project with a 'bin/' directory has those files mined correctly (option A), OR the limitation is clearly documented in user-facing docs (option B)
910
- - .NET project mining still skips bin/ and obj/ correctly
911
- - No existing tests regress
912
871
  - key: BENCH-DOTNET-CLONE-REPO
913
872
  summary: Clone jasontaylordev/CleanArchitecture (pin to a stable tag, e.g. v8.0.x) and record the commit hash before running the benchmark
914
873
  type: task
@@ -1,6 +1,6 @@
1
- # mempalace-code Hooks — Auto-Save for Terminal AI Tools
1
+ # mempalace-code Hooks — Claude Code Auto-Save (Legacy)
2
2
 
3
- These hook scripts make mempalace-code save automatically. No manual "save" commands needed.
3
+ Optional Claude Code hooks that trigger automatic memory saves during conversations. Not required MCP tools + usage rules (see `docs/AGENT_INSTALL.md` Section 7) achieve the same result for any agent.
4
4
 
5
5
  ## What They Do
6
6
 
@@ -42,24 +42,19 @@ Make them executable:
42
42
  chmod +x hooks/mempal_save_hook.sh hooks/mempal_precompact_hook.sh
43
43
  ```
44
44
 
45
- ## Install — Codex CLI (OpenAI)
45
+ ## Codex CLI / Other Agents
46
46
 
47
- Add to `.codex/hooks.json`:
47
+ These hooks are **Claude Code-only** — they rely on Claude Code's `Stop` and `PreCompact` hook events (JSON with `session_id`, `stop_hook_active`, and `transcript_path` on stdin). Other agents (Codex CLI, Cursor, etc.) do not support these events.
48
48
 
49
- ```json
50
- {
51
- "Stop": [{
52
- "type": "command",
53
- "command": "/absolute/path/to/hooks/mempal_save_hook.sh",
54
- "timeout": 30
55
- }],
56
- "PreCompact": [{
57
- "type": "command",
58
- "command": "/absolute/path/to/hooks/mempal_precompact_hook.sh",
59
- "timeout": 30
60
- }]
61
- }
62
- ```
49
+ **What to use instead:**
50
+
51
+ | Concern | Solution |
52
+ |---------|----------|
53
+ | **Code mining** (indexing source files) | `mempalace watch-all` — works with any client, re-mines on commit |
54
+ | **Conversation context** (decisions, discussions) | MCP tools — `mempalace_add_drawer`, `mempalace_diary_write` |
55
+ | **Session continuity** | Add mempalace usage rules to agent instructions (see `docs/AGENT_INSTALL.md` Section 7) |
56
+
57
+ For Codex specifically, wire the MCP server in `~/.codex/config.toml` (see `docs/AGENT_INSTALL.md` Step 5.2) and add a system prompt instruction like: *"At the end of each session, save key decisions and context to mempalace using `mempalace_add_drawer` and `mempalace_diary_write`."*
63
58
 
64
59
  ## Configuration
65
60