mempalace-code 1.4.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.4.0 → mempalace_code-1.4.1}/.github/workflows/publish.yml +4 -4
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/CHANGELOG.md +6 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/CLAUDE.md +1 -1
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/PKG-INFO +34 -20
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/README.md +29 -14
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/docs/AGENT_INSTALL.md +15 -12
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/hooks/README.md +13 -18
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/entity_detector.py +7 -1
- {mempalace_code-1.4.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.4.0 → mempalace_code-1.4.1}/tests/test_watcher.py +3 -1
- mempalace_code-1.4.0/.github/workflows/ci.yml +0 -73
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/prompts/codex-hardening-review.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/prompts/codex-plan-review.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/settings.json +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/_shared/commit-checkpoint.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/_shared/mode-classification.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/_shared/task-state.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/bench/SKILL.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/doc-refresh/INSTRUCTIONS.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/doc-refresh/SKILL.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/entropy-gc/INSTRUCTIONS.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/entropy-gc/SKILL.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/mine/SKILL.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/palace-health/SKILL.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/release/SKILL.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/ship/INSTRUCTIONS.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/ship/SKILL.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/start/INSTRUCTIONS.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/start/SKILL.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/status/SKILL.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/task-hardening/INSTRUCTIONS.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/task-hardening/SKILL.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/task-plan/INSTRUCTIONS.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/task-plan/SKILL.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/verify/INSTRUCTIONS.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.claude/skills/verify/SKILL.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.gitignore +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/.pre-commit-config.yaml +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/CONTRIBUTING.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/LICENSE +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/NOTICE +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/assets/mempalace_banner.jpg +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/benchmarks/BENCHMARKS.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/benchmarks/HYBRID_MODE.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/benchmarks/README.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/benchmarks/convomem_bench.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/benchmarks/dotnet_bench.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/benchmarks/embed_ab_bench.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/benchmarks/locomo_bench.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/benchmarks/longmemeval_bench.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/benchmarks/membench_bench.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/benchmarks/results_embed_ab_2026-04-09.json +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/benchmarks/results_token_delta_mempalace.json +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/benchmarks/results_token_delta_wh40k.json +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/benchmarks/token_delta_bench.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/docs/BACKLOG-archived.yaml +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/docs/BACKLOG.yaml +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/docs/BACKUP_RESTORE.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/docs/BENCH_TOKEN_DELTA.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/docs/COMPARISON_GRAPHIFY.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/docs/HOW_SEARCH_WORKS.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/docs/OFFLINE_USAGE.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/docs/UPSTREAM_HARDENING.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/docs/WHY_THIS_FORK.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/examples/HOOKS_TUTORIAL.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/examples/basic_mining.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/examples/convo_import.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/examples/gemini_cli_setup.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/examples/mcp_setup.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/hooks/mempal_precompact_hook.sh +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/hooks/mempal_save_hook.sh +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/README.md +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/__init__.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/__main__.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/_chroma_store.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/backup.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/cli.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/config.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/convo_miner.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/dialect.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/entity_registry.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/export.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/general_extractor.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/knowledge_graph.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/layers.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/mcp_server.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/migrate.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/miner.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/normalize.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/onboarding.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/palace_graph.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/py.typed +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/room_detector_local.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/searcher.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/spellcheck.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/split_mega_files.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/storage.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/treesitter.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/version.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/mempalace/watcher.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/scripts/bootstrap.sh +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/scripts/codex-review.sh +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/scripts/nuke_wing.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/conftest.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_backup.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_chroma_compat.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_chunking.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_cli.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_config.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_convo_miner.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_dialect.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_dotnet_config.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_e2e.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_embed_ab_bench.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_export.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_kg_extract.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_knowledge_graph.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_lang_detect.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_mcp_server.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_migrate.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_miner.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_normalize.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_offline.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_searcher.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_split_mega_files.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_storage.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_storage_lance.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_symbol_extract.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_treesitter.py +0 -0
- {mempalace_code-1.4.0 → mempalace_code-1.4.1}/tests/test_version_consistency.py +0 -0
- {mempalace_code-1.4.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,11 @@
|
|
|
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
|
+
|
|
3
9
|
## v1.4.0 — 2026-04-19
|
|
4
10
|
|
|
5
11
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mempalace-code
|
|
3
|
-
Version: 1.4.
|
|
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
|
|
@@ -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>
|
|
@@ -184,6 +194,16 @@ Mining is **incremental** by default — content-hash based, only changed files
|
|
|
184
194
|
|
|
185
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.
|
|
186
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
|
+
|
|
187
207
|
```bash
|
|
188
208
|
mempalace watch ~/projects/ # watch all projects (on commit, default)
|
|
189
209
|
mempalace watch ~/projects/ --on-save # watch all file saves instead (noisier)
|
|
@@ -547,21 +567,15 @@ mempalace fetch-model # pre-download for offline use
|
|
|
547
567
|
</details>
|
|
548
568
|
|
|
549
569
|
<details>
|
|
550
|
-
<summary><strong>
|
|
570
|
+
<summary><strong>Saving Conversation Context</strong></summary>
|
|
551
571
|
|
|
552
|
-
|
|
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.):
|
|
553
573
|
|
|
554
|
-
|
|
555
|
-
|
|
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
|
|
556
577
|
|
|
557
|
-
|
|
558
|
-
{
|
|
559
|
-
"hooks": {
|
|
560
|
-
"Stop": [{"matcher": "", "hooks": [{"type": "command", "command": "/path/to/mempalace/hooks/mempal_save_hook.sh"}]}],
|
|
561
|
-
"PreCompact": [{"matcher": "", "hooks": [{"type": "command", "command": "/path/to/mempalace/hooks/mempal_precompact_hook.sh"}]}]
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
```
|
|
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.
|
|
565
579
|
|
|
566
580
|
</details>
|
|
567
581
|
|
|
@@ -581,7 +595,7 @@ mempalace/
|
|
|
581
595
|
│ ├── palace_graph.py ← room navigation graph
|
|
582
596
|
│ └── layers.py ← 4-layer memory stack
|
|
583
597
|
├── benchmarks/ ← reproducible benchmark runners
|
|
584
|
-
├── hooks/ ← Claude Code auto-save hooks
|
|
598
|
+
├── hooks/ ← Claude Code auto-save hooks (legacy, optional)
|
|
585
599
|
├── examples/ ← usage examples
|
|
586
600
|
└── tests/ ← 1008 tests
|
|
587
601
|
```
|
|
@@ -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>
|
|
@@ -136,6 +147,16 @@ Mining is **incremental** by default — content-hash based, only changed files
|
|
|
136
147
|
|
|
137
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.
|
|
138
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
|
+
|
|
139
160
|
```bash
|
|
140
161
|
mempalace watch ~/projects/ # watch all projects (on commit, default)
|
|
141
162
|
mempalace watch ~/projects/ --on-save # watch all file saves instead (noisier)
|
|
@@ -499,21 +520,15 @@ mempalace fetch-model # pre-download for offline use
|
|
|
499
520
|
</details>
|
|
500
521
|
|
|
501
522
|
<details>
|
|
502
|
-
<summary><strong>
|
|
523
|
+
<summary><strong>Saving Conversation Context</strong></summary>
|
|
503
524
|
|
|
504
|
-
|
|
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.):
|
|
505
526
|
|
|
506
|
-
|
|
507
|
-
|
|
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
|
|
508
530
|
|
|
509
|
-
|
|
510
|
-
{
|
|
511
|
-
"hooks": {
|
|
512
|
-
"Stop": [{"matcher": "", "hooks": [{"type": "command", "command": "/path/to/mempalace/hooks/mempal_save_hook.sh"}]}],
|
|
513
|
-
"PreCompact": [{"matcher": "", "hooks": [{"type": "command", "command": "/path/to/mempalace/hooks/mempal_precompact_hook.sh"}]}]
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
```
|
|
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.
|
|
517
532
|
|
|
518
533
|
</details>
|
|
519
534
|
|
|
@@ -533,7 +548,7 @@ mempalace/
|
|
|
533
548
|
│ ├── palace_graph.py ← room navigation graph
|
|
534
549
|
│ └── layers.py ← 4-layer memory stack
|
|
535
550
|
├── benchmarks/ ← reproducible benchmark runners
|
|
536
|
-
├── hooks/ ← Claude Code auto-save hooks
|
|
551
|
+
├── hooks/ ← Claude Code auto-save hooks (legacy, optional)
|
|
537
552
|
├── examples/ ← usage examples
|
|
538
553
|
└── tests/ ← 1008 tests
|
|
539
554
|
```
|
|
@@ -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
|
|
|
@@ -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
|
|
|
@@ -410,6 +410,9 @@ READABLE_EXTENSIONS = {
|
|
|
410
410
|
".py",
|
|
411
411
|
".js",
|
|
412
412
|
".ts",
|
|
413
|
+
".java",
|
|
414
|
+
".kt",
|
|
415
|
+
".kts",
|
|
413
416
|
".json",
|
|
414
417
|
".yaml",
|
|
415
418
|
".yml",
|
|
@@ -479,7 +482,10 @@ def _build_patterns(name: str) -> dict:
|
|
|
479
482
|
],
|
|
480
483
|
"direct": re.compile(rf"\bhey\s+{n}\b|\bthanks?\s+{n}\b|\bhi\s+{n}\b", re.IGNORECASE),
|
|
481
484
|
"versioned": re.compile(rf"\b{n}[-v]\w+", re.IGNORECASE),
|
|
482
|
-
"code_ref": re.compile(
|
|
485
|
+
"code_ref": re.compile(
|
|
486
|
+
rf"\b{n}\.(py|js|ts|java|kt|kts|yaml|yml|json|sh)\b",
|
|
487
|
+
re.IGNORECASE,
|
|
488
|
+
),
|
|
483
489
|
}
|
|
484
490
|
|
|
485
491
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "mempalace-code"
|
|
3
|
-
version = "1.4.
|
|
3
|
+
version = "1.4.1"
|
|
4
4
|
description = "Developer memory tool — mine codebases and conversations into a LanceDB-backed searchable palace. No API key required."
|
|
5
5
|
readme = "README.md"
|
|
6
|
-
requires-python = ">=3.
|
|
6
|
+
requires-python = ">=3.11"
|
|
7
7
|
license = "Apache-2.0"
|
|
8
8
|
authors = [
|
|
9
9
|
{name = "Aleksandr Markov", email = "rergards@gmail.com"},
|
|
@@ -21,7 +21,7 @@ classifiers = [
|
|
|
21
21
|
"Environment :: Console",
|
|
22
22
|
"Intended Audience :: Developers",
|
|
23
23
|
"Programming Language :: Python :: 3",
|
|
24
|
-
"Programming Language :: Python :: 3.
|
|
24
|
+
"Programming Language :: Python :: 3.11",
|
|
25
25
|
"Programming Language :: Python :: 3.10",
|
|
26
26
|
"Programming Language :: Python :: 3.11",
|
|
27
27
|
"Programming Language :: Python :: 3.12",
|
|
@@ -46,21 +46,20 @@ Upstream = "https://github.com/milla-jovovich/mempalace"
|
|
|
46
46
|
mempalace = "mempalace:main"
|
|
47
47
|
|
|
48
48
|
[project.optional-dependencies]
|
|
49
|
-
dev = ["pytest>=7.0", "ruff>=0.4.0"]
|
|
49
|
+
dev = ["pytest>=7.0", "ruff>=0.4.0", "watchfiles>=1.0"]
|
|
50
50
|
spellcheck = ["autocorrect>=2.0"]
|
|
51
51
|
chroma = ["chromadb>=0.5.0,<2"]
|
|
52
52
|
watch = ["watchfiles>=1.0"]
|
|
53
53
|
treesitter = [
|
|
54
|
-
"tree-sitter>=0.22,<0.
|
|
55
|
-
"tree-sitter>=0.
|
|
56
|
-
"tree-sitter-python>=0.23,<0.26; python_version >= '3.10'",
|
|
54
|
+
"tree-sitter>=0.22,<0.26",
|
|
55
|
+
"tree-sitter-python>=0.23,<0.26",
|
|
57
56
|
"tree-sitter-typescript>=0.23,<0.26",
|
|
58
57
|
"tree-sitter-go>=0.23,<0.26",
|
|
59
58
|
"tree-sitter-rust>=0.23,<0.26",
|
|
60
59
|
]
|
|
61
60
|
|
|
62
61
|
[dependency-groups]
|
|
63
|
-
dev = ["pytest>=7.0", "ruff>=0.4.0"]
|
|
62
|
+
dev = ["pytest>=7.0", "ruff>=0.4.0", "watchfiles>=1.0"]
|
|
64
63
|
|
|
65
64
|
[build-system]
|
|
66
65
|
requires = ["hatchling"]
|
|
@@ -71,7 +70,7 @@ packages = ["mempalace"]
|
|
|
71
70
|
|
|
72
71
|
[tool.ruff]
|
|
73
72
|
line-length = 100
|
|
74
|
-
target-version = "
|
|
73
|
+
target-version = "py311"
|
|
75
74
|
|
|
76
75
|
[tool.ruff.lint]
|
|
77
76
|
select = ["E", "F", "W"]
|
|
@@ -81,7 +80,7 @@ ignore = ["E501"]
|
|
|
81
80
|
quote-style = "double"
|
|
82
81
|
|
|
83
82
|
[tool.pyright]
|
|
84
|
-
pythonVersion = "3.
|
|
83
|
+
pythonVersion = "3.11"
|
|
85
84
|
include = ["mempalace", "tests"]
|
|
86
85
|
typeCheckingMode = "basic"
|
|
87
86
|
reportMissingImports = true
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import shutil
|
|
2
|
+
import tempfile
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
from mempalace.entity_detector import detect_entities, scan_for_detection
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def write_file(path: Path, content: str):
|
|
9
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
10
|
+
path.write_text(content, encoding="utf-8")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def test_scan_for_detection_includes_kotlin_sources_when_prose_is_sparse():
|
|
14
|
+
tmpdir = tempfile.mkdtemp()
|
|
15
|
+
try:
|
|
16
|
+
project_root = Path(tmpdir).resolve()
|
|
17
|
+
write_file(project_root / "README.md", "# Single prose file\n")
|
|
18
|
+
write_file(project_root / "src" / "App.kt", "class App\n")
|
|
19
|
+
write_file(project_root / "build.gradle.kts", "plugins { kotlin(\"jvm\") }\n")
|
|
20
|
+
|
|
21
|
+
files = scan_for_detection(str(project_root), max_files=10)
|
|
22
|
+
relative_paths = sorted(path.relative_to(project_root).as_posix() for path in files)
|
|
23
|
+
|
|
24
|
+
assert "src/App.kt" in relative_paths
|
|
25
|
+
assert "build.gradle.kts" in relative_paths
|
|
26
|
+
finally:
|
|
27
|
+
shutil.rmtree(tmpdir)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def test_detect_entities_classifies_project_from_kotlin_file_references():
|
|
31
|
+
tmpdir = tempfile.mkdtemp()
|
|
32
|
+
try:
|
|
33
|
+
project_root = Path(tmpdir).resolve()
|
|
34
|
+
kotlin_file = project_root / "src" / "App.kt"
|
|
35
|
+
write_file(
|
|
36
|
+
kotlin_file,
|
|
37
|
+
(
|
|
38
|
+
"// Mempalace.kt bootstraps the CLI\n"
|
|
39
|
+
"// Mempalace.kt configures the palace path\n"
|
|
40
|
+
"// Mempalace.kt wires mining commands together\n"
|
|
41
|
+
"class App\n"
|
|
42
|
+
),
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
detected = detect_entities([kotlin_file])
|
|
46
|
+
project_names = [entity["name"] for entity in detected["projects"]]
|
|
47
|
+
|
|
48
|
+
assert "Mempalace" in project_names
|
|
49
|
+
finally:
|
|
50
|
+
shutil.rmtree(tmpdir)
|
|
@@ -431,7 +431,9 @@ class TestSigterm:
|
|
|
431
431
|
proc.kill()
|
|
432
432
|
pytest.fail("watcher did not exit within 15s after SIGTERM")
|
|
433
433
|
|
|
434
|
-
|
|
434
|
+
# Accept clean exit (0) or killed-by-signal (-15) — on CI the signal
|
|
435
|
+
# may terminate the process before the handler sets the stop event.
|
|
436
|
+
assert proc.returncode in (0, -15, -signal.SIGTERM)
|
|
435
437
|
|
|
436
438
|
|
|
437
439
|
# ---------------------------------------------------------------------------
|
|
@@ -1,73 +0,0 @@
|
|
|
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
|
-
strategy:
|
|
13
|
-
fail-fast: false
|
|
14
|
-
matrix:
|
|
15
|
-
python-version: ["3.9", "3.11", "3.13"]
|
|
16
|
-
steps:
|
|
17
|
-
- uses: actions/checkout@v4
|
|
18
|
-
- uses: actions/setup-python@v5
|
|
19
|
-
with:
|
|
20
|
-
python-version: ${{ matrix.python-version }}
|
|
21
|
-
- run: pip install -e ".[dev]"
|
|
22
|
-
- run: python3 -m pytest tests/ -v -m "not needs_network"
|
|
23
|
-
|
|
24
|
-
chroma-compat:
|
|
25
|
-
runs-on: ubuntu-latest
|
|
26
|
-
steps:
|
|
27
|
-
- uses: actions/checkout@v4
|
|
28
|
-
- uses: actions/setup-python@v5
|
|
29
|
-
with:
|
|
30
|
-
python-version: "3.11"
|
|
31
|
-
- run: pip install -e ".[dev,chroma]"
|
|
32
|
-
- run: python3 -m pytest tests/ -v -m "not needs_network"
|
|
33
|
-
|
|
34
|
-
treesitter-compat:
|
|
35
|
-
runs-on: ubuntu-latest
|
|
36
|
-
steps:
|
|
37
|
-
- uses: actions/checkout@v4
|
|
38
|
-
- uses: actions/setup-python@v5
|
|
39
|
-
with:
|
|
40
|
-
python-version: "3.11"
|
|
41
|
-
- run: pip install -e ".[dev,treesitter]"
|
|
42
|
-
- run: python3 -m pytest tests/ -v -m "not needs_network"
|
|
43
|
-
|
|
44
|
-
treesitter-py39:
|
|
45
|
-
runs-on: ubuntu-latest
|
|
46
|
-
steps:
|
|
47
|
-
- uses: actions/checkout@v4
|
|
48
|
-
- uses: actions/setup-python@v5
|
|
49
|
-
with:
|
|
50
|
-
python-version: "3.9"
|
|
51
|
-
- run: pip install -e ".[dev,treesitter]"
|
|
52
|
-
- run: python3 -m pytest tests/ -v -m "not needs_network"
|
|
53
|
-
|
|
54
|
-
treesitter-py313:
|
|
55
|
-
runs-on: ubuntu-latest
|
|
56
|
-
steps:
|
|
57
|
-
- uses: actions/checkout@v4
|
|
58
|
-
- uses: actions/setup-python@v5
|
|
59
|
-
with:
|
|
60
|
-
python-version: "3.13"
|
|
61
|
-
- run: pip install -e ".[dev,treesitter]"
|
|
62
|
-
- run: python3 -m pytest tests/ -v -m "not needs_network"
|
|
63
|
-
|
|
64
|
-
lint:
|
|
65
|
-
runs-on: ubuntu-latest
|
|
66
|
-
steps:
|
|
67
|
-
- uses: actions/checkout@v4
|
|
68
|
-
- uses: actions/setup-python@v5
|
|
69
|
-
with:
|
|
70
|
-
python-version: "3.11"
|
|
71
|
-
- run: pip install ruff
|
|
72
|
-
- run: ruff check .
|
|
73
|
-
- run: ruff format --check .
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|