clawdiney 0.2.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 (107) hide show
  1. clawdiney-0.2.1/.env.example +38 -0
  2. clawdiney-0.2.1/.github/workflows/ci.yml +92 -0
  3. clawdiney-0.2.1/.github/workflows/publish.yml +50 -0
  4. clawdiney-0.2.1/.gitignore +57 -0
  5. clawdiney-0.2.1/AGENTS.md +150 -0
  6. clawdiney-0.2.1/CHANGELOG.md +46 -0
  7. clawdiney-0.2.1/CLAUDE.md +277 -0
  8. clawdiney-0.2.1/LICENSE +21 -0
  9. clawdiney-0.2.1/PKG-INFO +609 -0
  10. clawdiney-0.2.1/README.md +571 -0
  11. clawdiney-0.2.1/SECURITY_REVIEW.md +173 -0
  12. clawdiney-0.2.1/assets/clawdiney-image.jpeg +0 -0
  13. clawdiney-0.2.1/examples/context_manager_example.py +33 -0
  14. clawdiney-0.2.1/examples/read_note_example.py +46 -0
  15. clawdiney-0.2.1/mypy.ini +9 -0
  16. clawdiney-0.2.1/openspec/changes/archive/2026-07-08-sqlite-migration/.openspec.yaml +2 -0
  17. clawdiney-0.2.1/openspec/changes/archive/2026-07-08-sqlite-migration/design.md +133 -0
  18. clawdiney-0.2.1/openspec/changes/archive/2026-07-08-sqlite-migration/proposal.md +35 -0
  19. clawdiney-0.2.1/openspec/changes/archive/2026-07-08-sqlite-migration/specs/embedding-abstraction/spec.md +36 -0
  20. clawdiney-0.2.1/openspec/changes/archive/2026-07-08-sqlite-migration/specs/graph-store/spec.md +54 -0
  21. clawdiney-0.2.1/openspec/changes/archive/2026-07-08-sqlite-migration/specs/hybrid-search/spec.md +69 -0
  22. clawdiney-0.2.1/openspec/changes/archive/2026-07-08-sqlite-migration/tasks.md +63 -0
  23. clawdiney-0.2.1/openspec/changes/project-knowledge-graph/.openspec.yaml +2 -0
  24. clawdiney-0.2.1/openspec/changes/project-knowledge-graph/design.md +74 -0
  25. clawdiney-0.2.1/openspec/changes/project-knowledge-graph/proposal.md +31 -0
  26. clawdiney-0.2.1/openspec/changes/project-knowledge-graph/specs/entity-extraction/spec.md +51 -0
  27. clawdiney-0.2.1/openspec/changes/project-knowledge-graph/specs/graph-store/spec.md +26 -0
  28. clawdiney-0.2.1/openspec/changes/project-knowledge-graph/specs/project-cards/spec.md +35 -0
  29. clawdiney-0.2.1/openspec/changes/project-knowledge-graph/specs/project-graph-tools/spec.md +36 -0
  30. clawdiney-0.2.1/openspec/changes/project-knowledge-graph/tasks.md +42 -0
  31. clawdiney-0.2.1/openspec/config.yaml +20 -0
  32. clawdiney-0.2.1/openspec/specs/embedding-abstraction/spec.md +36 -0
  33. clawdiney-0.2.1/openspec/specs/graph-store/spec.md +54 -0
  34. clawdiney-0.2.1/openspec/specs/hybrid-search/spec.md +69 -0
  35. clawdiney-0.2.1/pyproject.toml +87 -0
  36. clawdiney-0.2.1/ruff.toml +7 -0
  37. clawdiney-0.2.1/scripts/README_WATCHER.md +195 -0
  38. clawdiney-0.2.1/scripts/ask_brain.sh +11 -0
  39. clawdiney-0.2.1/scripts/claude_hook_context.py +104 -0
  40. clawdiney-0.2.1/scripts/clawdiney-watcher.service +24 -0
  41. clawdiney-0.2.1/scripts/configure_claude_mcp.py +90 -0
  42. clawdiney-0.2.1/scripts/index_projects.sh +57 -0
  43. clawdiney-0.2.1/scripts/provision_project_vaults.sh +185 -0
  44. clawdiney-0.2.1/scripts/run_tests.sh +14 -0
  45. clawdiney-0.2.1/scripts/setup_brain.sh +120 -0
  46. clawdiney-0.2.1/scripts/start_watcher.sh +54 -0
  47. clawdiney-0.2.1/scripts/stop_brain.sh +15 -0
  48. clawdiney-0.2.1/scripts/stop_watcher.sh +40 -0
  49. clawdiney-0.2.1/setup.cfg +4 -0
  50. clawdiney-0.2.1/setup_vault.sh +511 -0
  51. clawdiney-0.2.1/src/clawdiney/__init__.py +48 -0
  52. clawdiney-0.2.1/src/clawdiney/_version.py +24 -0
  53. clawdiney-0.2.1/src/clawdiney/chunking.py +150 -0
  54. clawdiney-0.2.1/src/clawdiney/cli.py +93 -0
  55. clawdiney-0.2.1/src/clawdiney/config.py +201 -0
  56. clawdiney-0.2.1/src/clawdiney/constants.py +25 -0
  57. clawdiney-0.2.1/src/clawdiney/embedding_providers.py +156 -0
  58. clawdiney-0.2.1/src/clawdiney/entity_extractor.py +516 -0
  59. clawdiney-0.2.1/src/clawdiney/incremental_indexer.py +209 -0
  60. clawdiney-0.2.1/src/clawdiney/indexer.py +262 -0
  61. clawdiney-0.2.1/src/clawdiney/logging_config.py +63 -0
  62. clawdiney-0.2.1/src/clawdiney/mcp_server.py +612 -0
  63. clawdiney-0.2.1/src/clawdiney/project_index_config.py +171 -0
  64. clawdiney-0.2.1/src/clawdiney/project_indexer.py +662 -0
  65. clawdiney-0.2.1/src/clawdiney/py.typed +0 -0
  66. clawdiney-0.2.1/src/clawdiney/query_engine.py +370 -0
  67. clawdiney-0.2.1/src/clawdiney/rag_optimizer.py +457 -0
  68. clawdiney-0.2.1/src/clawdiney/reranker.py +116 -0
  69. clawdiney-0.2.1/src/clawdiney/scripts/__init__.py +1 -0
  70. clawdiney-0.2.1/src/clawdiney/scripts/index_projects.py +218 -0
  71. clawdiney-0.2.1/src/clawdiney/scripts/sync_vault.py +122 -0
  72. clawdiney-0.2.1/src/clawdiney/scripts/watch_projects.py +358 -0
  73. clawdiney-0.2.1/src/clawdiney/scripts/watch_vault.py +229 -0
  74. clawdiney-0.2.1/src/clawdiney/storage.py +943 -0
  75. clawdiney-0.2.1/src/clawdiney/vault_config.py +76 -0
  76. clawdiney-0.2.1/src/clawdiney/vault_writer.py +266 -0
  77. clawdiney-0.2.1/src/clawdiney.egg-info/PKG-INFO +609 -0
  78. clawdiney-0.2.1/src/clawdiney.egg-info/SOURCES.txt +105 -0
  79. clawdiney-0.2.1/src/clawdiney.egg-info/dependency_links.txt +1 -0
  80. clawdiney-0.2.1/src/clawdiney.egg-info/entry_points.txt +4 -0
  81. clawdiney-0.2.1/src/clawdiney.egg-info/requires.txt +18 -0
  82. clawdiney-0.2.1/src/clawdiney.egg-info/scm_file_list.json +100 -0
  83. clawdiney-0.2.1/src/clawdiney.egg-info/scm_version.json +8 -0
  84. clawdiney-0.2.1/src/clawdiney.egg-info/top_level.txt +1 -0
  85. clawdiney-0.2.1/tests/__init__.py +1 -0
  86. clawdiney-0.2.1/tests/test_cli.py +77 -0
  87. clawdiney-0.2.1/tests/test_config.py +203 -0
  88. clawdiney-0.2.1/tests/test_embedding_providers.py +61 -0
  89. clawdiney-0.2.1/tests/test_entity_extractor.py +299 -0
  90. clawdiney-0.2.1/tests/test_hybrid_search.py +141 -0
  91. clawdiney-0.2.1/tests/test_incremental_indexer.py +63 -0
  92. clawdiney-0.2.1/tests/test_indexing_pipeline.py +121 -0
  93. clawdiney-0.2.1/tests/test_integration.py +242 -0
  94. clawdiney-0.2.1/tests/test_mcp.py +15 -0
  95. clawdiney-0.2.1/tests/test_mcp_client.py +179 -0
  96. clawdiney-0.2.1/tests/test_mcp_client_async.py +137 -0
  97. clawdiney-0.2.1/tests/test_mcp_http.py +166 -0
  98. clawdiney-0.2.1/tests/test_mcp_server.py +365 -0
  99. clawdiney-0.2.1/tests/test_mcp_session.py +148 -0
  100. clawdiney-0.2.1/tests/test_project_indexer.py +279 -0
  101. clawdiney-0.2.1/tests/test_query_engine.py +173 -0
  102. clawdiney-0.2.1/tests/test_rag_optimizer.py +199 -0
  103. clawdiney-0.2.1/tests/test_reranker.py +70 -0
  104. clawdiney-0.2.1/tests/test_scripts_sync_vault.py +139 -0
  105. clawdiney-0.2.1/tests/test_storage.py +368 -0
  106. clawdiney-0.2.1/tests/test_vault_config.py +148 -0
  107. clawdiney-0.2.1/tests/test_vault_writer.py +100 -0
@@ -0,0 +1,38 @@
1
+ # --- Clawdiney Multi-Vault Configuration ---
2
+
3
+ # Lista de vaults (separados por vírgula)
4
+ VAULTS=general,projects,personal
5
+
6
+ # Paths para cada vault
7
+ VAULT_GENERAL_PATH=~/clawdiney-vaults/general
8
+ VAULT_PROJECTS_PATH=~/clawdiney-vaults/projects
9
+ VAULT_PERSONAL_PATH=~/clawdiney-vaults/personal
10
+
11
+ # Vault padrão usado pelo MCP server
12
+ MCP_DEFAULT_VAULT=general
13
+
14
+ # OU: Descobrir vaults automaticamente de um diretório
15
+ # VAULTS_DIR=~/clawdiney-vaults
16
+ #
17
+ # Cada subpasta com clawdiney.toml vira um vault automaticamente.
18
+ # Exemplo de estrutura:
19
+ # ~/clawdiney-vaults/
20
+ # ├── general/clawdiney.toml
21
+ # ├── cliente-alfa/clawdiney.toml
22
+ # └── cliente-beta/clawdiney.toml
23
+
24
+ # Embedded storage (SQLite) — no external services required
25
+ BRAIN_DB_PATH=~/.clawdiney/brain.db
26
+
27
+ # Embedding model to use via Ollama
28
+ MODEL_NAME=bge-m3:latest
29
+ EMBEDDING_PROVIDER=ollama
30
+ EMBEDDING_DIMENSION=1024
31
+
32
+ # Optional reranker (cross-encoder, BAAI/bge-reranker-v2-m3)
33
+ ENABLE_RERANK=true
34
+
35
+ # Chunking
36
+ CHUNKING_STRATEGY=headers
37
+ CHUNK_SIZE=500
38
+ CHUNK_OVERLAP=50
@@ -0,0 +1,92 @@
1
+ name: CI
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
+ matrix:
14
+ python-version: ["3.10", "3.11", "3.12"]
15
+
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: Set up Python ${{ matrix.python-version }}
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: ${{ matrix.python-version }}
23
+
24
+ - name: Cache pip dependencies
25
+ uses: actions/cache@v4
26
+ with:
27
+ path: ~/.cache/pip
28
+ key: ${{ runner.os }}-pip-${{ hashFiles('pyproject.toml') }}
29
+ restore-keys: |
30
+ ${{ runner.os }}-pip-
31
+
32
+ - name: Install dependencies
33
+ run: |
34
+ python -m pip install --upgrade pip
35
+ pip install -e ".[dev]"
36
+
37
+ - name: Run tests
38
+ run: |
39
+ python -m pytest tests/ -v
40
+
41
+ - name: Run tests with coverage (only on Python 3.12)
42
+ if: matrix.python-version == '3.12'
43
+ run: |
44
+ python -m pytest tests/ -v --cov=clawdiney --cov-report=xml --cov-report=term-missing
45
+
46
+ - name: Upload coverage to Codecov
47
+ if: matrix.python-version == '3.12'
48
+ uses: codecov/codecov-action@v4
49
+ with:
50
+ files: ./coverage.xml
51
+ fail_ci_if_error: false
52
+
53
+ lint:
54
+ runs-on: ubuntu-latest
55
+
56
+ steps:
57
+ - uses: actions/checkout@v4
58
+
59
+ - name: Set up Python
60
+ uses: actions/setup-python@v5
61
+ with:
62
+ python-version: "3.12"
63
+
64
+ - name: Install ruff
65
+ run: pip install ruff
66
+
67
+ - name: Run ruff linter
68
+ run: ruff check src/clawdiney/ tests/
69
+
70
+ - name: Run ruff formatter
71
+ run: ruff format --check src/clawdiney/ tests/
72
+
73
+ type-check:
74
+ runs-on: ubuntu-latest
75
+
76
+ steps:
77
+ - uses: actions/checkout@v4
78
+
79
+ - name: Set up Python
80
+ uses: actions/setup-python@v5
81
+ with:
82
+ python-version: "3.12"
83
+
84
+ - name: Install dependencies
85
+ run: |
86
+ python -m pip install --upgrade pip
87
+ pip install -e ".[dev]"
88
+
89
+ - name: Run mypy
90
+ run: |
91
+ pip install types-requests
92
+ mypy src/clawdiney/ --ignore-missing-imports --no-strict-optional
@@ -0,0 +1,50 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ build:
9
+ runs-on: ubuntu-latest
10
+
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ with:
14
+ fetch-depth: 0 # full history + tags, required by setuptools_scm
15
+
16
+ - name: Set up Python
17
+ uses: actions/setup-python@v5
18
+ with:
19
+ python-version: "3.12"
20
+
21
+ - name: Install build tool
22
+ run: python -m pip install --upgrade build
23
+
24
+ - name: Build sdist and wheel
25
+ run: python -m build
26
+
27
+ - name: Upload build artifacts
28
+ uses: actions/upload-artifact@v4
29
+ with:
30
+ name: dist
31
+ path: dist/
32
+
33
+ publish:
34
+ needs: build
35
+ runs-on: ubuntu-latest
36
+ environment:
37
+ name: pypi
38
+ url: https://pypi.org/p/clawdiney
39
+ permissions:
40
+ id-token: write # required for Trusted Publishing (OIDC), no API token needed
41
+
42
+ steps:
43
+ - name: Download build artifacts
44
+ uses: actions/download-artifact@v4
45
+ with:
46
+ name: dist
47
+ path: dist/
48
+
49
+ - name: Publish to PyPI
50
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,57 @@
1
+ # Python
2
+ venv/
3
+ __pycache__/
4
+ *.pyc
5
+ *.pyo
6
+ *.pyd
7
+ .pytest_cache/
8
+ .mypy_cache/
9
+ .ruff_cache/
10
+ .coverage
11
+ htmlcov/
12
+
13
+ # Environment Variables (SENSITIVE)
14
+ .env
15
+
16
+ # Database Files (regenerated on index)
17
+ chroma_db/
18
+ neo4j_data/
19
+ chroma_data/
20
+
21
+ # Generated by setuptools_scm
22
+ src/clawdiney/_version.py
23
+
24
+ # State files
25
+ .clawdiney_state.json
26
+
27
+ # OS Files
28
+ .DS_Store
29
+ Thumbs.db
30
+
31
+ # Logs
32
+ *.log
33
+ logs/
34
+
35
+ # Agent artifacts (planning, evidence, drafts)
36
+ .sisyphus/
37
+
38
+ # Backups
39
+ .env.backup*
40
+
41
+ # IDE
42
+ .vscode/
43
+ .idea/
44
+ redis_data/
45
+ src/clawdiney.egg-info/
46
+ dist/
47
+ build/
48
+
49
+ # Antigravity CLI
50
+ .antigravitycli/
51
+
52
+ # Local AI agent tool configs
53
+ .agent/
54
+ .claude/
55
+ .gemini/
56
+ .omc/
57
+ .opencode/
@@ -0,0 +1,150 @@
1
+ # AGENTS.md
2
+
3
+ This file provides guidance to Codex (Codex.ai/code) when working with code in this repository.
4
+
5
+ ## Repository Overview
6
+
7
+ Clawdiney is a hybrid Vector + Graph system that transforms an Obsidian Vault into a living knowledge source for AI coding agents. The system enables semantic search and knowledge graph navigation of SOPs, design systems, architectural patterns, and documentation.
8
+
9
+ ## Architecture
10
+
11
+ The system is fully embedded (v0.2.0) — a single SQLite database (`brain.db`) holds everything:
12
+
13
+ 1. **sqlite-vec** - Vector KNN search (embeddings via Ollama `bge-m3`)
14
+ 2. **FTS5** - BM25 full-text search (exact terms, acronyms, identifiers)
15
+ 3. **Graph tables** (`entities`, `relations`) - Note relationships via WikiLinks and shared tags
16
+ 4. **MCP Server** - Provides integration with Codex via Model Context Protocol
17
+
18
+ Data flow:
19
+ Obsidian Vault → `src/clawdiney/indexer.py` → `brain.db` (via `storage.py`) → `src/clawdiney/mcp_server.py` → Codex
20
+
21
+ **No Docker services required.** Only Ollama must be running (embeddings). The database lives at `BRAIN_DB_PATH` (default `~/.clawdiney/brain.db`).
22
+
23
+ ## Common Development Commands
24
+
25
+ ### Running the System
26
+
27
+ No infrastructure to start — storage is an embedded SQLite file. Ensure Ollama is running with the `bge-m3` model pulled.
28
+
29
+ Index/re-index the Obsidian vault:
30
+ ```bash
31
+ ./venv/bin/python3 -m clawdiney.indexer
32
+ ```
33
+
34
+ Start the MCP server for Codex integration:
35
+ ```bash
36
+ ./venv/bin/python3 -m clawdiney.mcp_server
37
+ ```
38
+
39
+ Test queries from command line:
40
+ ```bash
41
+ ./scripts/ask_brain.sh "your query here"
42
+ ```
43
+
44
+ Or directly with Python:
45
+ ```bash
46
+ ./venv/bin/python3 -m clawdiney.query_engine "your query here"
47
+ ```
48
+
49
+ ### Development Environment Setup
50
+
51
+ Initial setup (installs dependencies, indexes vault):
52
+ ```bash
53
+ chmod +x scripts/setup_brain.sh
54
+ ./scripts/setup_brain.sh
55
+ ```
56
+
57
+ Manual dependency installation:
58
+ ```bash
59
+ python3 -m venv venv
60
+ ./venv/bin/pip install -e .
61
+ ```
62
+
63
+ ### Testing
64
+
65
+ Run a test query to verify the system is working:
66
+ ```bash
67
+ ./venv/bin/python3 -m clawdiney.query_engine "test query"
68
+ ```
69
+
70
+ Run unit tests:
71
+ ```bash
72
+ ./scripts/run_tests.sh
73
+ ```
74
+
75
+ Or run tests directly with pytest:
76
+ ```bash
77
+ ./venv/bin/python3 -m pytest tests/ -v
78
+ ```
79
+
80
+ Use the MCP `health_check` tool (or open `brain.db` with any SQLite client) for troubleshooting.
81
+
82
+ ## Key Files and Components
83
+
84
+ - `src/clawdiney/mcp_server.py` - Main MCP server that integrates with Codex
85
+ - `src/clawdiney/query_engine.py` - Hybrid retrieval (BM25 + vector + RRF) + rerank + graph expansion
86
+ - `src/clawdiney/storage.py` - Single gateway to `brain.db` (schema, hybrid search SQL, graph queries)
87
+ - `src/clawdiney/indexer.py` - Full indexing of Obsidian vault into `brain.db`
88
+ - `src/clawdiney/config.py` - Centralized configuration management
89
+ - `scripts/setup_brain.sh` - Automated setup script for new installations
90
+ - `.env` - Configuration file for paths and settings
91
+
92
+ ## Integration with MCP Clients
93
+
94
+ The system integrates via the Model Context Protocol (MCP). When properly configured, the agent has access to **read and write** tools:
95
+
96
+ ### Read Tools (Discovery)
97
+
98
+ 1. `search_brain(query)` - Search for architectural patterns, SOPs, and design system components
99
+ 2. `explore_graph(note_name)` - Find notes related to a specific topic via WikiLinks and shared tags
100
+ 3. `resolve_note(name)` - Resolve ambiguous note names to canonical vault-relative paths
101
+ 4. `get_note_chunks(path)` - List chunk headers for a note (structured preview)
102
+ 5. `get_project_card(name)` - Full project card (Purpose, Stack, Architecture, Interfaces)
103
+ 6. `how_do_projects_relate(a, b)` - Graph paths between two projects
104
+ 7. `health_check()` - Check health status of `brain.db` and Ollama
105
+
106
+ ### Write Tools (Knowledge Capture)
107
+
108
+ 8. `write_note(path, content, mode)` - Create or update a note at any vault location
109
+ - `mode`: "create" (fail if exists), "overwrite" (replace), "append" (add to end)
110
+ 9. `append_to_daily(content)` - Append content to today's daily note (50_Daily/YYYY-MM-DD.md)
111
+ 10. `add_learning(topic, content, area)` - Save learnings to appropriate folder
112
+ - `area`: "SOPs", "Architecture", "DesignSystem", "Projects", "Areas", "Learnings"
113
+ 11. `delete_note(path)` - Delete a note and remove from index
114
+
115
+ ### Example Workflow
116
+
117
+ ```python
118
+ # 1. Search for existing patterns
119
+ search_brain("backend API deployment")
120
+
121
+ # 2. If found, update the SOP
122
+ write_note("30_Resources/SOPs/SOP_Deploy.md", updated_content, mode="append")
123
+
124
+ # 3. If not found, create new learning
125
+ add_learning("Backend_API_Deploy", "# SOP\\n\\nDeployment pattern...", area="SOPs")
126
+
127
+ # 4. Document daily learnings
128
+ append_to_daily("## Learnings\\n- Discovered X about the architecture")
129
+ ```
130
+
131
+ ### Configuration Example
132
+
133
+ ```json
134
+ {
135
+ "projects": {
136
+ "/path/to/projects": {
137
+ "mcpServers": {
138
+ "clawdiney": {
139
+ "command": "/path/to/clawdiney/venv/bin/python3",
140
+ "args": ["-m", "clawdiney.mcp_server"]
141
+ }
142
+ }
143
+ }
144
+ }
145
+ }
146
+ ```
147
+
148
+ ## Recent Improvements
149
+
150
+ See [CLAUDE.md](CLAUDE.md) "Recent Improvements" for the full history of the embedded storage migration (v0.2.0) and project knowledge graph features.
@@ -0,0 +1,46 @@
1
+ # Changelog
2
+
3
+ ## [1.2.0] - 2026-04-20
4
+
5
+ ### Added
6
+ - `resolve_note(name)` and `get_note_chunks(path)` as the canonical MCP drill-down workflow
7
+ - explicit `main()` and pure indexing helpers in `brain_indexer.py`
8
+ - reranker fallback to preserve vector results when reranking fails
9
+
10
+ ### Changed
11
+ - standardized on `BrainQueryEngine` as the active engine abstraction
12
+ - moved note identity toward canonical vault-relative `path`
13
+ - updated tests and examples to match the retrieval-first contract
14
+ - kept full-file reading outside the MCP surface
15
+
16
+ ### Removed
17
+ - broken `read_full_note` MCP flow
18
+ - stale `BrainEngine` references from active code paths
19
+
20
+ ## [1.1.0] - 2026-04-19
21
+
22
+ ### Added
23
+ - Centralized configuration management with `config.py`
24
+ - Support for both HTTP and Persistent ChromaDB clients via `CHROMA_CLIENT_TYPE` environment variable
25
+ - Proper connection closing for BrainEngine to prevent connection leaks
26
+ - Enhanced error handling in BrainEngine initialization
27
+ - Improved file resolution in `read_note` method to handle duplicate filenames
28
+ - Unit tests for configuration and engine classes
29
+ - Test runner script (`run_tests.sh`)
30
+
31
+ ### Changed
32
+ - Fixed hardcoded path in `CHROMA_PATH` configuration
33
+ - Standardized ChromaDB client usage across all modules
34
+ - Improved error messages and handling throughout the codebase
35
+ - Updated `.env` file with new configuration options
36
+ - Updated documentation in `CLAUDE.md`
37
+
38
+ ### Fixed
39
+ - Inconsistent ChromaDB client usage between modules
40
+ - Missing `close()` method in BrainEngine
41
+ - Fragile file lookup in `read_note` method
42
+ - Lack of error handling in BrainEngine initialization
43
+ - Missing unit tests
44
+
45
+ ### Security
46
+ - Removed personal path information from default configuration