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.
- mempalace_code-1.4.1/.github/workflows/ci.yml +29 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.github/workflows/publish.yml +4 -4
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/CHANGELOG.md +19 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/CLAUDE.md +3 -2
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/PKG-INFO +62 -24
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/README.md +57 -18
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/AGENT_INSTALL.md +15 -12
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/BACKLOG-archived.yaml +12 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/BACKLOG.yaml +0 -41
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/hooks/README.md +13 -18
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/cli.py +110 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/entity_detector.py +7 -1
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/miner.py +41 -5
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/storage.py +23 -2
- mempalace_code-1.4.1/mempalace/watcher.py +619 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/pyproject.toml +9 -10
- mempalace_code-1.4.1/tests/test_entity_detector.py +50 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_miner.py +45 -2
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_symbol_extract.py +35 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_watcher.py +3 -1
- mempalace_code-1.3.0/.github/workflows/ci.yml +0 -73
- mempalace_code-1.3.0/mempalace/watcher.py +0 -240
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/prompts/codex-hardening-review.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/prompts/codex-plan-review.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/settings.json +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/_shared/commit-checkpoint.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/_shared/mode-classification.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/_shared/task-state.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/bench/SKILL.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/doc-refresh/INSTRUCTIONS.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/doc-refresh/SKILL.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/entropy-gc/INSTRUCTIONS.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/entropy-gc/SKILL.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/mine/SKILL.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/palace-health/SKILL.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/release/SKILL.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/ship/INSTRUCTIONS.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/ship/SKILL.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/start/INSTRUCTIONS.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/start/SKILL.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/status/SKILL.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/task-hardening/INSTRUCTIONS.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/task-hardening/SKILL.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/task-plan/INSTRUCTIONS.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/task-plan/SKILL.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/verify/INSTRUCTIONS.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.claude/skills/verify/SKILL.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.gitignore +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/.pre-commit-config.yaml +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/CONTRIBUTING.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/LICENSE +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/NOTICE +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/assets/mempalace_banner.jpg +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/BENCHMARKS.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/HYBRID_MODE.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/README.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/convomem_bench.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/dotnet_bench.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/embed_ab_bench.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/locomo_bench.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/longmemeval_bench.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/membench_bench.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/results_embed_ab_2026-04-09.json +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/results_token_delta_mempalace.json +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/results_token_delta_wh40k.json +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/benchmarks/token_delta_bench.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/BACKUP_RESTORE.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/BENCH_TOKEN_DELTA.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/COMPARISON_GRAPHIFY.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/HOW_SEARCH_WORKS.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/OFFLINE_USAGE.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/UPSTREAM_HARDENING.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/docs/WHY_THIS_FORK.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/examples/HOOKS_TUTORIAL.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/examples/basic_mining.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/examples/convo_import.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/examples/gemini_cli_setup.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/examples/mcp_setup.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/hooks/mempal_precompact_hook.sh +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/hooks/mempal_save_hook.sh +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/README.md +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/__init__.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/__main__.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/_chroma_store.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/backup.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/config.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/convo_miner.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/dialect.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/entity_registry.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/export.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/general_extractor.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/knowledge_graph.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/layers.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/mcp_server.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/migrate.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/normalize.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/onboarding.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/palace_graph.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/py.typed +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/room_detector_local.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/searcher.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/spellcheck.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/split_mega_files.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/treesitter.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/mempalace/version.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/scripts/bootstrap.sh +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/scripts/codex-review.sh +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/scripts/nuke_wing.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/conftest.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_backup.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_chroma_compat.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_chunking.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_cli.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_config.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_convo_miner.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_dialect.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_dotnet_config.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_e2e.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_embed_ab_bench.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_export.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_kg_extract.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_knowledge_graph.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_lang_detect.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_mcp_server.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_migrate.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_normalize.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_offline.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_searcher.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_split_mega_files.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_storage.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_storage_lance.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_treesitter.py +0 -0
- {mempalace_code-1.3.0 → mempalace_code-1.4.1}/tests/test_version_consistency.py +0 -0
- {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@
|
|
15
|
-
- uses: actions/setup-python@
|
|
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@
|
|
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@
|
|
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.
|
|
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
|
-
| `
|
|
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
|
+
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.
|
|
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;
|
|
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.
|
|
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>
|
|
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
|
-
|
|
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 |
|
|
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>
|
|
570
|
+
<summary><strong>Saving Conversation Context</strong></summary>
|
|
527
571
|
|
|
528
|
-
|
|
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
|
-
|
|
531
|
-
|
|
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
|
-
|
|
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/ ←
|
|
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.
|
|
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>
|
|
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
|
-
|
|
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 |
|
|
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>
|
|
523
|
+
<summary><strong>Saving Conversation Context</strong></summary>
|
|
479
524
|
|
|
480
|
-
|
|
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
|
-
|
|
483
|
-
|
|
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
|
-
|
|
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/ ←
|
|
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.
|
|
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.
|
|
33
|
-
Wait for `ready`. Re-run Step 1.1. If still failing after one retry, halt and report: "Cannot proceed — Python 3.
|
|
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 (`
|
|
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`.
|
|
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.
|
|
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=
|
|
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
|
|
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
|
|
494
|
+
### Step 5.3: Auto-save for conversation context
|
|
495
495
|
|
|
496
|
-
|
|
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
|
-
|
|
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
|
-
|
|
501
|
-
|
|
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
|
|
1
|
+
# mempalace-code Hooks — Claude Code Auto-Save (Legacy)
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
##
|
|
45
|
+
## Codex CLI / Other Agents
|
|
46
46
|
|
|
47
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
|