chunkhound 2.4.2__tar.gz → 2.4.4__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 (172) hide show
  1. {chunkhound-2.4.2 → chunkhound-2.4.4}/CHANGELOG.md +14 -1
  2. {chunkhound-2.4.2 → chunkhound-2.4.4}/PKG-INFO +125 -8
  3. {chunkhound-2.4.2 → chunkhound-2.4.4}/README.md +124 -7
  4. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/api/cli/commands/mcp.py +21 -6
  5. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/config/config.py +5 -0
  6. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/mcp_server.py +1 -4
  7. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/periodic_indexer.py +21 -2
  8. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/version.py +1 -1
  9. {chunkhound-2.4.2 → chunkhound-2.4.4}/mcp_launcher.py +3 -5
  10. {chunkhound-2.4.2 → chunkhound-2.4.4}/pyproject.toml +1 -1
  11. chunkhound-2.4.4/tickets/closed/2025-07-09T20:36:38+03:00-bug-mcp-server-taskgroup-error-different-directory.md +97 -0
  12. chunkhound-2.4.4/tickets/closed/2025-07-09T21:03:35+03:00-bug-mcp-positional-path-incomplete-project-scope.md +131 -0
  13. {chunkhound-2.4.2 → chunkhound-2.4.4}/uv.lock +1 -1
  14. {chunkhound-2.4.2 → chunkhound-2.4.4}/.claude/commands/qa.md +0 -0
  15. {chunkhound-2.4.2 → chunkhound-2.4.4}/.dockerignore +0 -0
  16. {chunkhound-2.4.2 → chunkhound-2.4.4}/.github/workflows/cross-platform-build.yml +0 -0
  17. {chunkhound-2.4.2 → chunkhound-2.4.4}/.github/workflows/test-windows-only.yml +0 -0
  18. {chunkhound-2.4.2 → chunkhound-2.4.4}/.github/workflows/test-windows.yml +0 -0
  19. {chunkhound-2.4.2 → chunkhound-2.4.4}/.gitignore +0 -0
  20. {chunkhound-2.4.2 → chunkhound-2.4.4}/CLAUDE.md +0 -0
  21. {chunkhound-2.4.2 → chunkhound-2.4.4}/Dockerfile +0 -0
  22. {chunkhound-2.4.2 → chunkhound-2.4.4}/Dockerfile.ubuntu20 +0 -0
  23. {chunkhound-2.4.2 → chunkhound-2.4.4}/IDE-SETUP.md +0 -0
  24. {chunkhound-2.4.2 → chunkhound-2.4.4}/LICENSE +0 -0
  25. {chunkhound-2.4.2 → chunkhound-2.4.4}/MIGRATION_GUIDE.md +0 -0
  26. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/__init__.py +0 -0
  27. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/api/__init__.py +0 -0
  28. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/api/cli/__init__.py +0 -0
  29. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/api/cli/commands/__init__.py +0 -0
  30. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/api/cli/commands/run.py +0 -0
  31. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/api/cli/main.py +0 -0
  32. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/api/cli/parsers/__init__.py +0 -0
  33. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/api/cli/parsers/main_parser.py +0 -0
  34. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/api/cli/parsers/mcp_parser.py +0 -0
  35. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/api/cli/parsers/run_parser.py +0 -0
  36. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/api/cli/utils/__init__.py +0 -0
  37. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/api/cli/utils/config_helpers.py +0 -0
  38. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/api/cli/utils/output.py +0 -0
  39. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/api/cli/utils/validation.py +0 -0
  40. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/chunker.py +0 -0
  41. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/__init__.py +0 -0
  42. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/config/__init__.py +0 -0
  43. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/config/database_config.py +0 -0
  44. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/config/embedding_config.py +0 -0
  45. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/config/embedding_factory.py +0 -0
  46. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/config/indexing_config.py +0 -0
  47. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/config/mcp_config.py +0 -0
  48. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/config/settings_sources.py +0 -0
  49. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/config/unified_config.py +0 -0
  50. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/exceptions/__init__.py +0 -0
  51. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/exceptions/core.py +0 -0
  52. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/models/__init__.py +0 -0
  53. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/models/chunk.py +0 -0
  54. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/models/embedding.py +0 -0
  55. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/models/file.py +0 -0
  56. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/types/__init__.py +0 -0
  57. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/core/types/common.py +0 -0
  58. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/database.py +0 -0
  59. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/database_factory.py +0 -0
  60. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/embeddings.py +0 -0
  61. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/file_discovery_cache.py +0 -0
  62. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/file_watcher.py +0 -0
  63. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/interfaces/__init__.py +0 -0
  64. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/interfaces/database_provider.py +0 -0
  65. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/interfaces/embedding_provider.py +0 -0
  66. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/interfaces/language_parser.py +0 -0
  67. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/mcp_entry.py +0 -0
  68. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/parser.py +0 -0
  69. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/process_detection.py +0 -0
  70. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/__init__.py +0 -0
  71. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/database/__init__.py +0 -0
  72. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/database/duckdb/__init__.py +0 -0
  73. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/database/duckdb/chunk_repository.py +0 -0
  74. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/database/duckdb/connection_manager.py +0 -0
  75. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/database/duckdb/embedding_repository.py +0 -0
  76. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/database/duckdb/file_repository.py +0 -0
  77. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/database/duckdb_provider.py +0 -0
  78. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/database/lancedb_provider.py +0 -0
  79. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/database/serial_database_provider.py +0 -0
  80. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/database/serial_executor.py +0 -0
  81. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/embeddings/README.md +0 -0
  82. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/embeddings/__init__.py +0 -0
  83. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/embeddings/batch_utils.py +0 -0
  84. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/embeddings/openai_provider.py +0 -0
  85. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/__init__.py +0 -0
  86. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/base_parser.py +0 -0
  87. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/bash_parser.py +0 -0
  88. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/c_parser.py +0 -0
  89. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/cpp_parser.py +0 -0
  90. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/csharp_parser.py +0 -0
  91. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/go_parser.py +0 -0
  92. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/groovy_parser.py +0 -0
  93. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/java_parser.py +0 -0
  94. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/javascript_parser.py +0 -0
  95. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/kotlin_parser.py +0 -0
  96. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/makefile_parser.py +0 -0
  97. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/markdown_parser.py +0 -0
  98. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/matlab_parser.py +0 -0
  99. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/python_parser.py +0 -0
  100. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/rust_parser.py +0 -0
  101. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/text_parser.py +0 -0
  102. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/toml_parser.py +0 -0
  103. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/providers/parsing/typescript_parser.py +0 -0
  104. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/py.typed +0 -0
  105. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/registry/__init__.py +0 -0
  106. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/services/__init__.py +0 -0
  107. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/services/base_service.py +0 -0
  108. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/services/chunk_cache_service.py +0 -0
  109. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/services/embedding_service.py +0 -0
  110. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/services/indexing_coordinator.py +0 -0
  111. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/services/search_service.py +0 -0
  112. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/signal_coordinator.py +0 -0
  113. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/task_coordinator.py +0 -0
  114. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/tree_cache.py +0 -0
  115. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/utils/__init__.py +0 -0
  116. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound/utils/project_detection.py +0 -0
  117. {chunkhound-2.4.2 → chunkhound-2.4.4}/chunkhound-fast +0 -0
  118. {chunkhound-2.4.2 → chunkhound-2.4.4}/cli_wrapper.py +0 -0
  119. {chunkhound-2.4.2 → chunkhound-2.4.4}/docker-compose.build.yml +0 -0
  120. {chunkhound-2.4.2 → chunkhound-2.4.4}/docs/ARCHITECTURE.md +0 -0
  121. {chunkhound-2.4.2 → chunkhound-2.4.4}/docs/CROSS_PLATFORM_BUILD.md +0 -0
  122. {chunkhound-2.4.2 → chunkhound-2.4.4}/docs/DOCKER_BUILD.md +0 -0
  123. {chunkhound-2.4.2 → chunkhound-2.4.4}/docs/PHASE3_CICD_OPTIMIZATION.md +0 -0
  124. {chunkhound-2.4.2 → chunkhound-2.4.4}/docs/STANDALONE_BUILD.md +0 -0
  125. {chunkhound-2.4.2 → chunkhound-2.4.4}/docs/VERSION_MANAGEMENT.md +0 -0
  126. {chunkhound-2.4.2 → chunkhound-2.4.4}/examples/README.md +0 -0
  127. {chunkhound-2.4.2 → chunkhound-2.4.4}/examples/bge_icl_performance_benchmark.py +0 -0
  128. {chunkhound-2.4.2 → chunkhound-2.4.4}/examples/bge_in_icl_phase3_demo.py +0 -0
  129. {chunkhound-2.4.2 → chunkhound-2.4.4}/examples/csharp_example.cs +0 -0
  130. {chunkhound-2.4.2 → chunkhound-2.4.4}/examples/path_filtering_demo.py +0 -0
  131. {chunkhound-2.4.2 → chunkhound-2.4.4}/requirements-dev.txt +0 -0
  132. {chunkhound-2.4.2 → chunkhound-2.4.4}/requirements-lock.txt +0 -0
  133. {chunkhound-2.4.2 → chunkhound-2.4.4}/requirements.txt +0 -0
  134. {chunkhound-2.4.2 → chunkhound-2.4.4}/scripts/backup/build-all-platforms.sh +0 -0
  135. {chunkhound-2.4.2 → chunkhound-2.4.4}/scripts/backup/docker-build-all.sh +0 -0
  136. {chunkhound-2.4.2 → chunkhound-2.4.4}/scripts/build.sh +0 -0
  137. {chunkhound-2.4.2 → chunkhound-2.4.4}/scripts/dev-setup.sh +0 -0
  138. {chunkhound-2.4.2 → chunkhound-2.4.4}/scripts/mcp-server.sh +0 -0
  139. {chunkhound-2.4.2 → chunkhound-2.4.4}/scripts/prepare_release.sh +0 -0
  140. {chunkhound-2.4.2 → chunkhound-2.4.4}/scripts/setup.sh +0 -0
  141. {chunkhound-2.4.2 → chunkhound-2.4.4}/scripts/sync_version.py +0 -0
  142. {chunkhound-2.4.2 → chunkhound-2.4.4}/scripts/test-examples.sh +0 -0
  143. {chunkhound-2.4.2 → chunkhound-2.4.4}/scripts/update_version.py +0 -0
  144. {chunkhound-2.4.2 → chunkhound-2.4.4}/scripts/validate.sh +0 -0
  145. {chunkhound-2.4.2 → chunkhound-2.4.4}/spec.md +0 -0
  146. {chunkhound-2.4.2 → chunkhound-2.4.4}/tests/__init__.py +0 -0
  147. {chunkhound-2.4.2 → chunkhound-2.4.4}/tests/fixtures/cpp/Sample.cpp +0 -0
  148. {chunkhound-2.4.2 → chunkhound-2.4.4}/tests/fixtures/cpp/Sample.hpp +0 -0
  149. {chunkhound-2.4.2 → chunkhound-2.4.4}/tests/fixtures/csharp/Sample.cs +0 -0
  150. {chunkhound-2.4.2 → chunkhound-2.4.4}/tests/fixtures/java/Sample.java +0 -0
  151. {chunkhound-2.4.2 → chunkhound-2.4.4}/tests/fixtures/kotlin/Sample.kt +0 -0
  152. {chunkhound-2.4.2 → chunkhound-2.4.4}/tests/manual_test_modification.py +0 -0
  153. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/2025/2025-07-03-chunkhound-json-complete-config-storage.md +0 -0
  154. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/2025/2025-07-03-cli-info-command.md +0 -0
  155. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/2025/2025-07-03-consolidate-embedding-provider-creation.md +0 -0
  156. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/2025-01-09-consolidate-package-structure.md +0 -0
  157. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/2025-07-07-refactor-configuration-system.md +0 -0
  158. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/2025-07-08-bug-mcp-server-stderr-vscode-ubuntu.md +0 -0
  159. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/CLAUDE.md +0 -0
  160. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/closed/02-serialize-duckdb-operations.md +0 -0
  161. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/closed/03-consolidate-connection-management.md +0 -0
  162. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/closed/04-service-layer-pattern-override-architectural-violation.md +0 -0
  163. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/closed/07-duckdb-foreign-key-constraint-transaction-bug.md +0 -0
  164. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/closed/2025-01-07-duckdb-thread-safety-violation-freeze.md +0 -0
  165. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/closed/2025-01-07-lancedb-path-normalization-fix.md +0 -0
  166. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/closed/2025-01-07-lancedb-serial-executor-alignment.md +0 -0
  167. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/closed/2025-01-09-lancedb-storage-growth-no-garbage-collection.md +0 -0
  168. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/closed/2025-01-09-mcp-server-import-structure-fix.md +0 -0
  169. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/closed/2025-07-02-parser-architecture-inconsistencies.md +0 -0
  170. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/closed/2025-08-01-mcp-server-database-duplication-root-cause.md +0 -0
  171. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/closed/python-parser-cli-mcp-divergence.md +0 -0
  172. {chunkhound-2.4.2 → chunkhound-2.4.4}/tickets/closed/refactor-database-serial-executor.md +0 -0
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.4.4] - 2025-01-09
11
+
12
+ ### Fixed
13
+ - Ubuntu TaskGroup crash fixed by removing problematic directory change in MCP launcher
14
+
15
+ ## [2.4.3] - 2025-01-09
16
+
17
+ ### Fixed
18
+ - MCP server now works correctly when launched from any directory, not just the project root
19
+ - Fixed path resolution inconsistencies that caused TaskGroup errors on Ubuntu deployments
20
+
10
21
  ## [2.4.2] - 2025-01-09
11
22
 
12
23
  ### Added
@@ -260,7 +271,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
260
271
 
261
272
  For more information, visit: https://github.com/chunkhound/chunkhound
262
273
 
263
- [Unreleased]: https://github.com/chunkhound/chunkhound/compare/v2.4.2...HEAD
274
+ [Unreleased]: https://github.com/chunkhound/chunkhound/compare/v2.4.4...HEAD
275
+ [2.4.4]: https://github.com/chunkhound/chunkhound/compare/v2.4.3...v2.4.4
276
+ [2.4.3]: https://github.com/chunkhound/chunkhound/compare/v2.4.2...v2.4.3
264
277
  [2.4.2]: https://github.com/chunkhound/chunkhound/compare/v2.4.1...v2.4.2
265
278
  [2.4.1]: https://github.com/chunkhound/chunkhound/compare/v2.4.0...v2.4.1
266
279
  [2.4.0]: https://github.com/chunkhound/chunkhound/compare/v2.3.1...v2.4.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chunkhound
3
- Version: 2.4.2
3
+ Version: 2.4.4
4
4
  Summary: Local-first semantic code search with vector and regex capabilities for AI assistants via MCP
5
5
  Project-URL: Homepage, https://github.com/chunkhound/chunkhound
6
6
  Project-URL: Repository, https://github.com/chunkhound/chunkhound
@@ -105,6 +105,12 @@ uv run chunkhound index
105
105
  # 2. Start MCP server for AI assistants (auto-watches for changes)
106
106
  uv run chunkhound mcp
107
107
 
108
+ # Work with any project directory - complete project scope control
109
+ uv run chunkhound mcp /path/to/your/project
110
+ # This sets database to /path/to/your/project/.chunkhound/db
111
+ # Searches for config at /path/to/your/project/.chunkhound.json
112
+ # Watches /path/to/your/project for changes
113
+
108
114
  # Optional: Set OpenAI API key for semantic search
109
115
  export CHUNKHOUND_EMBEDDING__API_KEY="sk-your-key-here"
110
116
 
@@ -114,17 +120,28 @@ uv run chunkhound index --config /path/to/different-config.json
114
120
 
115
121
  ### Automatic Configuration Detection
116
122
 
117
- When you run `chunkhound index` in any directory, ChunkHound automatically:
118
- 1. Looks for `.chunkhound.json` in that directory
119
- 2. Loads it if found (no `--config` flag needed)
120
- 3. Uses those settings for indexing
123
+ ChunkHound automatically detects and uses project configurations:
121
124
 
122
- Example:
125
+ **For `index` command:**
123
126
  ```bash
124
127
  cd /my/project # Has .chunkhound.json
125
128
  uv run chunkhound index # Automatically uses /my/project/.chunkhound.json
126
129
  ```
127
130
 
131
+ **For `mcp` command with positional path:**
132
+ ```bash
133
+ uv run chunkhound mcp /my/project
134
+ # Automatically uses /my/project/.chunkhound.json
135
+ # Sets database to /my/project/.chunkhound/db
136
+ # Watches /my/project for changes
137
+ ```
138
+
139
+ **For `mcp` command without path:**
140
+ ```bash
141
+ cd /my/project # Has .chunkhound.json
142
+ uv run chunkhound mcp # Automatically uses /my/project/.chunkhound.json
143
+ ```
144
+
128
145
  ## Features
129
146
 
130
147
  **Always Available:**
@@ -157,6 +174,18 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
157
174
  }
158
175
  }
159
176
  ```
177
+
178
+ **For specific project directories:**
179
+ ```json
180
+ {
181
+ "mcpServers": {
182
+ "chunkhound": {
183
+ "command": "uv",
184
+ "args": ["run", "chunkhound", "mcp", "/path/to/your/project"]
185
+ }
186
+ }
187
+ }
188
+ ```
160
189
  </details>
161
190
 
162
191
  <details>
@@ -173,6 +202,18 @@ Add to `~/.claude.json`:
173
202
  }
174
203
  }
175
204
  ```
205
+
206
+ **For specific project directories:**
207
+ ```json
208
+ {
209
+ "mcpServers": {
210
+ "chunkhound": {
211
+ "command": "uv",
212
+ "args": ["run", "chunkhound", "mcp", "/path/to/your/project"]
213
+ }
214
+ }
215
+ }
216
+ ```
176
217
  </details>
177
218
 
178
219
  <details>
@@ -189,6 +230,18 @@ Add to `.vscode/mcp.json` in your project:
189
230
  }
190
231
  }
191
232
  ```
233
+
234
+ **For specific project directories:**
235
+ ```json
236
+ {
237
+ "servers": {
238
+ "chunkhound": {
239
+ "command": "uv",
240
+ "args": ["run", "chunkhound", "mcp", "/path/to/your/project"]
241
+ }
242
+ }
243
+ }
244
+ ```
192
245
  </details>
193
246
 
194
247
  <details>
@@ -205,6 +258,18 @@ Add to `.cursor/mcp.json` in your project:
205
258
  }
206
259
  }
207
260
  ```
261
+
262
+ **For specific project directories:**
263
+ ```json
264
+ {
265
+ "mcpServers": {
266
+ "chunkhound": {
267
+ "command": "uv",
268
+ "args": ["run", "chunkhound", "mcp", "/path/to/your/project"]
269
+ }
270
+ }
271
+ }
272
+ ```
208
273
  </details>
209
274
 
210
275
  <details>
@@ -221,6 +286,18 @@ Add to `~/.codeium/windsurf/mcp_config.json`:
221
286
  }
222
287
  }
223
288
  ```
289
+
290
+ **For specific project directories:**
291
+ ```json
292
+ {
293
+ "mcpServers": {
294
+ "chunkhound": {
295
+ "command": "uv",
296
+ "args": ["run", "chunkhound", "mcp", "/path/to/your/project"]
297
+ }
298
+ }
299
+ }
300
+ ```
224
301
  </details>
225
302
 
226
303
  <details>
@@ -240,6 +317,21 @@ Add to settings.json (Preferences > Open Settings):
240
317
  }
241
318
  }
242
319
  ```
320
+
321
+ **For specific project directories:**
322
+ ```json
323
+ {
324
+ "context_servers": {
325
+ "chunkhound": {
326
+ "source": "custom",
327
+ "command": {
328
+ "path": "uv",
329
+ "args": ["run", "chunkhound", "mcp", "/path/to/your/project"]
330
+ }
331
+ }
332
+ }
333
+ }
334
+ ```
243
335
  </details>
244
336
 
245
337
  <details>
@@ -250,6 +342,12 @@ Go to Settings > Tools > AI Assistant > Model Context Protocol (MCP) and add:
250
342
  - **Command**: uv
251
343
  - **Arguments**: run chunkhound mcp
252
344
  - **Working Directory**: (leave empty or set to project root)
345
+
346
+ **For specific project directories:**
347
+ - **Name**: chunkhound
348
+ - **Command**: uv
349
+ - **Arguments**: run chunkhound mcp /path/to/your/project
350
+ - **Working Directory**: (leave empty)
253
351
  </details>
254
352
 
255
353
  </details>
@@ -285,10 +383,24 @@ ChunkHound loads configuration in this order (highest priority first):
285
383
 
286
384
  ### Database Location
287
385
 
288
- By default, ChunkHound creates `.chunkhound.db` in your current directory. Customize with:
386
+ ChunkHound automatically determines the database location based on project scope:
289
387
 
290
- - **Config file**: Add to `.chunkhound.json`: `{"database": {"path": "/path/to/.chunkhound.db"}}`
388
+ **With positional path argument:**
389
+ ```bash
390
+ uv run chunkhound mcp /my/project
391
+ # Database automatically created at: /my/project/.chunkhound/db
392
+ ```
393
+
394
+ **Without positional path (current directory):**
395
+ ```bash
396
+ cd /my/project
397
+ uv run chunkhound mcp
398
+ # Database created at: /my/project/.chunkhound/db
399
+ ```
400
+
401
+ **Manual overrides** (in priority order):
291
402
  - **Command line**: `--database-path /path/to/my-chunks`
403
+ - **Config file**: Add to `.chunkhound.json`: `{"database": {"path": "/path/to/.chunkhound.db"}}`
292
404
  - **Environment variable**: `CHUNKHOUND_DATABASE__PATH="/path/to/.chunkhound.db"`
293
405
 
294
406
  ### Configuration File Format
@@ -571,6 +683,11 @@ ChunkHound indexes your codebase in three layers:
571
683
  2. **Background scan** - MCP server checks for changes every 5 minutes
572
684
  3. **Real-time updates** - File system events trigger immediate updates
573
685
 
686
+ **Project Scope Control:**
687
+ - `chunkhound mcp` - Uses current directory as project root
688
+ - `chunkhound mcp /path/to/project` - Uses specified path as project root
689
+ - Database, config, and watch paths all scoped to project root
690
+
574
691
  **Processing pipeline:**
575
692
  Scan → Parse → Index → Embed → Search
576
693
 
@@ -45,6 +45,12 @@ uv run chunkhound index
45
45
  # 2. Start MCP server for AI assistants (auto-watches for changes)
46
46
  uv run chunkhound mcp
47
47
 
48
+ # Work with any project directory - complete project scope control
49
+ uv run chunkhound mcp /path/to/your/project
50
+ # This sets database to /path/to/your/project/.chunkhound/db
51
+ # Searches for config at /path/to/your/project/.chunkhound.json
52
+ # Watches /path/to/your/project for changes
53
+
48
54
  # Optional: Set OpenAI API key for semantic search
49
55
  export CHUNKHOUND_EMBEDDING__API_KEY="sk-your-key-here"
50
56
 
@@ -54,17 +60,28 @@ uv run chunkhound index --config /path/to/different-config.json
54
60
 
55
61
  ### Automatic Configuration Detection
56
62
 
57
- When you run `chunkhound index` in any directory, ChunkHound automatically:
58
- 1. Looks for `.chunkhound.json` in that directory
59
- 2. Loads it if found (no `--config` flag needed)
60
- 3. Uses those settings for indexing
63
+ ChunkHound automatically detects and uses project configurations:
61
64
 
62
- Example:
65
+ **For `index` command:**
63
66
  ```bash
64
67
  cd /my/project # Has .chunkhound.json
65
68
  uv run chunkhound index # Automatically uses /my/project/.chunkhound.json
66
69
  ```
67
70
 
71
+ **For `mcp` command with positional path:**
72
+ ```bash
73
+ uv run chunkhound mcp /my/project
74
+ # Automatically uses /my/project/.chunkhound.json
75
+ # Sets database to /my/project/.chunkhound/db
76
+ # Watches /my/project for changes
77
+ ```
78
+
79
+ **For `mcp` command without path:**
80
+ ```bash
81
+ cd /my/project # Has .chunkhound.json
82
+ uv run chunkhound mcp # Automatically uses /my/project/.chunkhound.json
83
+ ```
84
+
68
85
  ## Features
69
86
 
70
87
  **Always Available:**
@@ -97,6 +114,18 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
97
114
  }
98
115
  }
99
116
  ```
117
+
118
+ **For specific project directories:**
119
+ ```json
120
+ {
121
+ "mcpServers": {
122
+ "chunkhound": {
123
+ "command": "uv",
124
+ "args": ["run", "chunkhound", "mcp", "/path/to/your/project"]
125
+ }
126
+ }
127
+ }
128
+ ```
100
129
  </details>
101
130
 
102
131
  <details>
@@ -113,6 +142,18 @@ Add to `~/.claude.json`:
113
142
  }
114
143
  }
115
144
  ```
145
+
146
+ **For specific project directories:**
147
+ ```json
148
+ {
149
+ "mcpServers": {
150
+ "chunkhound": {
151
+ "command": "uv",
152
+ "args": ["run", "chunkhound", "mcp", "/path/to/your/project"]
153
+ }
154
+ }
155
+ }
156
+ ```
116
157
  </details>
117
158
 
118
159
  <details>
@@ -129,6 +170,18 @@ Add to `.vscode/mcp.json` in your project:
129
170
  }
130
171
  }
131
172
  ```
173
+
174
+ **For specific project directories:**
175
+ ```json
176
+ {
177
+ "servers": {
178
+ "chunkhound": {
179
+ "command": "uv",
180
+ "args": ["run", "chunkhound", "mcp", "/path/to/your/project"]
181
+ }
182
+ }
183
+ }
184
+ ```
132
185
  </details>
133
186
 
134
187
  <details>
@@ -145,6 +198,18 @@ Add to `.cursor/mcp.json` in your project:
145
198
  }
146
199
  }
147
200
  ```
201
+
202
+ **For specific project directories:**
203
+ ```json
204
+ {
205
+ "mcpServers": {
206
+ "chunkhound": {
207
+ "command": "uv",
208
+ "args": ["run", "chunkhound", "mcp", "/path/to/your/project"]
209
+ }
210
+ }
211
+ }
212
+ ```
148
213
  </details>
149
214
 
150
215
  <details>
@@ -161,6 +226,18 @@ Add to `~/.codeium/windsurf/mcp_config.json`:
161
226
  }
162
227
  }
163
228
  ```
229
+
230
+ **For specific project directories:**
231
+ ```json
232
+ {
233
+ "mcpServers": {
234
+ "chunkhound": {
235
+ "command": "uv",
236
+ "args": ["run", "chunkhound", "mcp", "/path/to/your/project"]
237
+ }
238
+ }
239
+ }
240
+ ```
164
241
  </details>
165
242
 
166
243
  <details>
@@ -180,6 +257,21 @@ Add to settings.json (Preferences > Open Settings):
180
257
  }
181
258
  }
182
259
  ```
260
+
261
+ **For specific project directories:**
262
+ ```json
263
+ {
264
+ "context_servers": {
265
+ "chunkhound": {
266
+ "source": "custom",
267
+ "command": {
268
+ "path": "uv",
269
+ "args": ["run", "chunkhound", "mcp", "/path/to/your/project"]
270
+ }
271
+ }
272
+ }
273
+ }
274
+ ```
183
275
  </details>
184
276
 
185
277
  <details>
@@ -190,6 +282,12 @@ Go to Settings > Tools > AI Assistant > Model Context Protocol (MCP) and add:
190
282
  - **Command**: uv
191
283
  - **Arguments**: run chunkhound mcp
192
284
  - **Working Directory**: (leave empty or set to project root)
285
+
286
+ **For specific project directories:**
287
+ - **Name**: chunkhound
288
+ - **Command**: uv
289
+ - **Arguments**: run chunkhound mcp /path/to/your/project
290
+ - **Working Directory**: (leave empty)
193
291
  </details>
194
292
 
195
293
  </details>
@@ -225,10 +323,24 @@ ChunkHound loads configuration in this order (highest priority first):
225
323
 
226
324
  ### Database Location
227
325
 
228
- By default, ChunkHound creates `.chunkhound.db` in your current directory. Customize with:
326
+ ChunkHound automatically determines the database location based on project scope:
229
327
 
230
- - **Config file**: Add to `.chunkhound.json`: `{"database": {"path": "/path/to/.chunkhound.db"}}`
328
+ **With positional path argument:**
329
+ ```bash
330
+ uv run chunkhound mcp /my/project
331
+ # Database automatically created at: /my/project/.chunkhound/db
332
+ ```
333
+
334
+ **Without positional path (current directory):**
335
+ ```bash
336
+ cd /my/project
337
+ uv run chunkhound mcp
338
+ # Database created at: /my/project/.chunkhound/db
339
+ ```
340
+
341
+ **Manual overrides** (in priority order):
231
342
  - **Command line**: `--database-path /path/to/my-chunks`
343
+ - **Config file**: Add to `.chunkhound.json`: `{"database": {"path": "/path/to/.chunkhound.db"}}`
232
344
  - **Environment variable**: `CHUNKHOUND_DATABASE__PATH="/path/to/.chunkhound.db"`
233
345
 
234
346
  ### Configuration File Format
@@ -511,6 +623,11 @@ ChunkHound indexes your codebase in three layers:
511
623
  2. **Background scan** - MCP server checks for changes every 5 minutes
512
624
  3. **Real-time updates** - File system events trigger immediate updates
513
625
 
626
+ **Project Scope Control:**
627
+ - `chunkhound mcp` - Uses current directory as project root
628
+ - `chunkhound mcp /path/to/project` - Uses specified path as project root
629
+ - Database, config, and watch paths all scoped to project root
630
+
514
631
  **Processing pipeline:**
515
632
  Scan → Parse → Index → Embed → Search
516
633
 
@@ -21,16 +21,31 @@ def mcp_command(args: argparse.Namespace) -> None:
21
21
  )
22
22
  cmd = [sys.executable, str(mcp_launcher_path)]
23
23
 
24
- # Only pass --db argument if explicitly provided, otherwise let unified config handle it
25
- if args.db is not None:
26
- cmd.extend(["--db", str(args.db)])
27
-
28
- # Pass the path argument as watch-path if provided and not current directory
24
+ # Handle positional path argument for complete project scope control
29
25
  if hasattr(args, 'path') and args.path != Path("."):
30
- cmd.extend(["--watch-path", str(args.path.resolve())])
26
+ project_path = args.path.resolve()
27
+
28
+ # Set database path to <path>/.chunkhound/db if not explicitly provided
29
+ if args.db is None:
30
+ db_path = project_path / ".chunkhound" / "db"
31
+ cmd.extend(["--db", str(db_path)])
32
+ else:
33
+ cmd.extend(["--db", str(args.db)])
34
+
35
+ # Set watch path to the project directory
36
+ cmd.extend(["--watch-path", str(project_path)])
37
+
38
+ else:
39
+ # Only pass --db argument if explicitly provided, otherwise let unified config handle it
40
+ if args.db is not None:
41
+ cmd.extend(["--db", str(args.db)])
31
42
 
32
43
  # Inherit current environment - the centralized config will handle API keys
33
44
  env = os.environ.copy()
45
+
46
+ # Set environment variable for config file search in project directory if path provided
47
+ if hasattr(args, 'path') and args.path != Path("."):
48
+ env["CHUNKHOUND_PROJECT_ROOT"] = str(args.path.resolve())
34
49
 
35
50
  process = subprocess.run(
36
51
  cmd,
@@ -61,6 +61,11 @@ class Config(BaseModel):
61
61
  self._deep_merge(config_data, file_config)
62
62
 
63
63
  # 3. Check for .chunkhound.json in target directory
64
+ # First check CHUNKHOUND_PROJECT_ROOT if set (from positional path argument)
65
+ project_root = os.environ.get("CHUNKHOUND_PROJECT_ROOT")
66
+ if project_root:
67
+ target_dir = Path(project_root)
68
+
64
69
  if target_dir and target_dir.exists():
65
70
  local_config_path = target_dir / ".chunkhound.json"
66
71
  if local_config_path.exists():
@@ -385,18 +385,15 @@ async def server_lifespan(server: Server) -> AsyncIterator[dict]:
385
385
  # )
386
386
 
387
387
  pass
388
- # Get base directory from environment or use current working directory
389
- base_directory = Path(os.getcwd())
390
-
391
388
  # Use the SAME IndexingCoordinator instance from _database to ensure deduplication
392
389
  # This prevents duplicate entries by sharing the same ChunkCacheService state
393
390
  indexing_coordinator = _database._indexing_coordinator
394
391
 
395
392
  # Create periodic indexer with environment configuration
393
+ # Let from_environment() handle path resolution using the same logic as FileWatcherManager
396
394
  _periodic_indexer = PeriodicIndexManager.from_environment(
397
395
  indexing_coordinator=indexing_coordinator,
398
396
  task_coordinator=_task_coordinator,
399
- base_directory=base_directory,
400
397
  )
401
398
 
402
399
  # Start periodic indexer (immediate startup scan + periodic scans)
@@ -70,7 +70,7 @@ class PeriodicIndexManager:
70
70
  cls,
71
71
  indexing_coordinator,
72
72
  task_coordinator: TaskCoordinator,
73
- base_directory: Path,
73
+ base_directory: Path | None = None,
74
74
  ) -> "PeriodicIndexManager":
75
75
  """Create periodic index manager from environment variables.
76
76
 
@@ -78,11 +78,12 @@ class PeriodicIndexManager:
78
78
  CHUNKHOUND_PERIODIC_INDEX_INTERVAL: Scan interval in seconds (default: 300)
79
79
  CHUNKHOUND_PERIODIC_BATCH_SIZE: Files per batch (default: 10)
80
80
  CHUNKHOUND_PERIODIC_INDEX_ENABLED: Enable/disable (default: true)
81
+ CHUNKHOUND_WATCH_PATHS: Paths to watch (defaults to project root)
81
82
 
82
83
  Args:
83
84
  indexing_coordinator: IndexingCoordinator instance
84
85
  task_coordinator: TaskCoordinator instance
85
- base_directory: Base directory to scan
86
+ base_directory: Base directory to scan (defaults to same logic as FileWatcherManager)
86
87
 
87
88
  Returns:
88
89
  Configured PeriodicIndexManager instance
@@ -96,6 +97,24 @@ class PeriodicIndexManager:
96
97
  os.getenv("CHUNKHOUND_PERIODIC_INDEX_ENABLED", "true").lower() == "true"
97
98
  )
98
99
 
100
+ # Use the same path resolution logic as FileWatcherManager
101
+ if base_directory is None:
102
+ try:
103
+ from .utils.project_detection import get_project_watch_paths
104
+ watch_paths = get_project_watch_paths()
105
+ base_directory = watch_paths[0] if watch_paths else Path.cwd()
106
+ except ImportError:
107
+ # Fallback to environment variable check
108
+ paths_env = os.environ.get("CHUNKHOUND_WATCH_PATHS", "")
109
+ if paths_env:
110
+ path_strings = [p.strip() for p in paths_env.split(",") if p.strip()]
111
+ if path_strings:
112
+ base_directory = Path(path_strings[0]).resolve()
113
+ else:
114
+ base_directory = Path.cwd()
115
+ else:
116
+ base_directory = Path.cwd()
117
+
99
118
  return cls(
100
119
  indexing_coordinator=indexing_coordinator,
101
120
  task_coordinator=task_coordinator,
@@ -1,3 +1,3 @@
1
1
  """Single source of truth for ChunkHound version."""
2
2
 
3
- __version__ = "2.4.2"
3
+ __version__ = "2.4.4"
@@ -102,11 +102,9 @@ def main():
102
102
  # Set up watch paths for filesystem monitoring
103
103
  setup_watch_paths(args)
104
104
 
105
- # Change to the watch directory if specified
106
- if args.watch_path:
107
- watch_path = Path(args.watch_path).resolve()
108
- if watch_path.exists() and watch_path.is_dir():
109
- os.chdir(watch_path)
105
+ # Note: Removed os.chdir() to avoid breaking imports and permissions issues
106
+ # The watch path is already handled via CHUNKHOUND_WATCH_PATHS environment variable
107
+ # and all path operations should use absolute paths
110
108
 
111
109
  # Import and run the MCP entry point
112
110
  try:
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "chunkhound"
7
- version = "2.4.2"
7
+ version = "2.4.4"
8
8
  description = "Local-first semantic code search with vector and regex capabilities for AI assistants via MCP"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"