rbtr 2026.6.2.dev0__tar.gz → 2026.9.0.dev0__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 (148) hide show
  1. rbtr-2026.9.0.dev0/PKG-INFO +79 -0
  2. rbtr-2026.9.0.dev0/pyproject.toml +160 -0
  3. rbtr-2026.9.0.dev0/pyproject.toml.orig +134 -0
  4. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/cli/__init__.py +65 -11
  5. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/cli/output.py +146 -111
  6. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/config.py +7 -1
  7. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/daemon/client.py +24 -5
  8. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/daemon/dto.py +18 -2
  9. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/daemon/handlers.py +66 -22
  10. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/daemon/messages.py +45 -14
  11. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/daemon/server.py +57 -27
  12. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/daemon/watcher.py +19 -19
  13. rbtr-2026.9.0.dev0/src/rbtr/domain/__init__.py +5 -0
  14. {rbtr-2026.6.2.dev0/src/rbtr/index → rbtr-2026.9.0.dev0/src/rbtr/domain}/models.py +40 -36
  15. rbtr-2026.9.0.dev0/src/rbtr/errors.py +73 -0
  16. rbtr-2026.9.0.dev0/src/rbtr/index/build.py +308 -0
  17. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/classify.py +3 -3
  18. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/constants.py +2 -2
  19. rbtr-2026.9.0.dev0/src/rbtr/index/embed.py +84 -0
  20. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/embeddings.py +0 -2
  21. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/gc.py +36 -19
  22. rbtr-2026.9.0.dev0/src/rbtr/index/progress.py +16 -0
  23. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/reranker.py +1 -3
  24. rbtr-2026.9.0.dev0/src/rbtr/index/results.py +276 -0
  25. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/search.py +10 -14
  26. rbtr-2026.9.0.dev0/src/rbtr/index/sql/blob_is_current.sql +24 -0
  27. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/count_chunks.sql +2 -2
  28. rbtr-2026.9.0.dev0/src/rbtr/index/sql/count_edges.sql +3 -0
  29. rbtr-2026.9.0.dev0/src/rbtr/index/sql/count_file_snapshots.sql +3 -0
  30. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/count_gc_chunk_split.sql +2 -2
  31. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/count_unembedded.sql +2 -2
  32. rbtr-2026.9.0.dev0/src/rbtr/index/sql/data_size_bytes.sql +2 -0
  33. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/delete_chunks_for_blobs.sql +1 -1
  34. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/delete_edges.sql +1 -1
  35. rbtr-2026.9.0.dev0/src/rbtr/index/sql/delete_indexed_snapshots_for_repo.sql +2 -0
  36. rbtr-2026.9.0.dev0/src/rbtr/index/sql/delete_snapshots.sql +2 -0
  37. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/diff_symbols.sql +2 -2
  38. rbtr-2026.9.0.dev0/src/rbtr/index/sql/distinct_chunk_languages.sql +8 -0
  39. rbtr-2026.9.0.dev0/src/rbtr/index/sql/drop_fts_index.sql +4 -0
  40. rbtr-2026.9.0.dev0/src/rbtr/index/sql/drop_snapshot.sql +3 -0
  41. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/get_chunks.sql +2 -2
  42. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/get_edges.sql +2 -2
  43. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/get_snapshot_language.sql +1 -1
  44. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/get_unembedded_chunks.sql +2 -2
  45. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/has_any_indexed.sql +1 -1
  46. rbtr-2026.9.0.dev0/src/rbtr/index/sql/has_indexed.sql +3 -0
  47. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/inbound_degree.sql +2 -2
  48. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/inbound_refs.sql +2 -2
  49. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/insert_edges.sql +1 -1
  50. rbtr-2026.6.2.dev0/src/rbtr/index/sql/list_indexed_commits.sql → rbtr-2026.9.0.dev0/src/rbtr/index/sql/list_indexed_snapshots.sql +2 -2
  51. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/mark_indexed.sql +3 -3
  52. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/orphan_repo_ids.sql +3 -3
  53. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/prune_edges.sql +2 -2
  54. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/schema.sql +20 -11
  55. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/search_by_name.sql +2 -2
  56. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/search_fulltext.sql +3 -3
  57. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/search_similar.sql +2 -2
  58. rbtr-2026.9.0.dev0/src/rbtr/index/sql/sweep_orphan_edges.sql +11 -0
  59. rbtr-2026.9.0.dev0/src/rbtr/index/sql/sweep_orphan_snapshots.sql +12 -0
  60. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/upsert_chunks.sql +2 -2
  61. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/upsert_snapshots.sql +1 -1
  62. rbtr-2026.9.0.dev0/src/rbtr/index/sql/wipe_schema.sql +14 -0
  63. rbtr-2026.9.0.dev0/src/rbtr/index/staging.py +162 -0
  64. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/store.py +297 -219
  65. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/writer.py +149 -38
  66. rbtr-2026.9.0.dev0/src/rbtr/languages/__init__.py +12 -0
  67. rbtr-2026.9.0.dev0/src/rbtr/languages/_resolvers.py +104 -0
  68. {rbtr-2026.6.2.dev0/src/rbtr/index → rbtr-2026.9.0.dev0/src/rbtr/languages}/chunks.py +26 -2
  69. {rbtr-2026.6.2.dev0/src/rbtr/index → rbtr-2026.9.0.dev0/src/rbtr/languages}/edges.py +11 -197
  70. rbtr-2026.9.0.dev0/src/rbtr/languages/extract.py +213 -0
  71. rbtr-2026.9.0.dev0/src/rbtr/languages/manager.py +227 -0
  72. rbtr-2026.9.0.dev0/src/rbtr/languages/registration.py +512 -0
  73. rbtr-2026.9.0.dev0/src/rbtr/languages/treesitter.py +469 -0
  74. rbtr-2026.9.0.dev0/src/rbtr/testing.py +79 -0
  75. rbtr-2026.6.2.dev0/PKG-INFO +0 -41
  76. rbtr-2026.6.2.dev0/pyproject.toml +0 -70
  77. rbtr-2026.6.2.dev0/src/rbtr/errors.py +0 -32
  78. rbtr-2026.6.2.dev0/src/rbtr/index/_llama_cpp_compat.py +0 -50
  79. rbtr-2026.6.2.dev0/src/rbtr/index/frames.py +0 -406
  80. rbtr-2026.6.2.dev0/src/rbtr/index/orchestrator.py +0 -418
  81. rbtr-2026.6.2.dev0/src/rbtr/index/sql/count_edges_for_commit.sql +0 -3
  82. rbtr-2026.6.2.dev0/src/rbtr/index/sql/count_snapshots_for_commit.sql +0 -3
  83. rbtr-2026.6.2.dev0/src/rbtr/index/sql/delete_indexed_commits_for_repo.sql +0 -2
  84. rbtr-2026.6.2.dev0/src/rbtr/index/sql/delete_snapshots.sql +0 -2
  85. rbtr-2026.6.2.dev0/src/rbtr/index/sql/drop_commit.sql +0 -3
  86. rbtr-2026.6.2.dev0/src/rbtr/index/sql/has_blob.sql +0 -10
  87. rbtr-2026.6.2.dev0/src/rbtr/index/sql/has_indexed.sql +0 -3
  88. rbtr-2026.6.2.dev0/src/rbtr/index/sql/sweep_orphan_edges.sql +0 -11
  89. rbtr-2026.6.2.dev0/src/rbtr/index/sql/sweep_orphan_snapshots.sql +0 -12
  90. rbtr-2026.6.2.dev0/src/rbtr/index/treesitter.py +0 -494
  91. rbtr-2026.6.2.dev0/src/rbtr/languages/__init__.py +0 -326
  92. rbtr-2026.6.2.dev0/src/rbtr/languages/bash.py +0 -76
  93. rbtr-2026.6.2.dev0/src/rbtr/languages/c.py +0 -73
  94. rbtr-2026.6.2.dev0/src/rbtr/languages/cpp.py +0 -85
  95. rbtr-2026.6.2.dev0/src/rbtr/languages/css.py +0 -51
  96. rbtr-2026.6.2.dev0/src/rbtr/languages/go.py +0 -90
  97. rbtr-2026.6.2.dev0/src/rbtr/languages/hcl.py +0 -88
  98. rbtr-2026.6.2.dev0/src/rbtr/languages/hookspec.py +0 -471
  99. rbtr-2026.6.2.dev0/src/rbtr/languages/html.py +0 -226
  100. rbtr-2026.6.2.dev0/src/rbtr/languages/java.py +0 -66
  101. rbtr-2026.6.2.dev0/src/rbtr/languages/javascript.py +0 -251
  102. rbtr-2026.6.2.dev0/src/rbtr/languages/json.py +0 -38
  103. rbtr-2026.6.2.dev0/src/rbtr/languages/markdown.py +0 -253
  104. rbtr-2026.6.2.dev0/src/rbtr/languages/python.py +0 -178
  105. rbtr-2026.6.2.dev0/src/rbtr/languages/rst.py +0 -350
  106. rbtr-2026.6.2.dev0/src/rbtr/languages/ruby.py +0 -120
  107. rbtr-2026.6.2.dev0/src/rbtr/languages/rust.py +0 -177
  108. rbtr-2026.6.2.dev0/src/rbtr/languages/sql.py +0 -141
  109. rbtr-2026.6.2.dev0/src/rbtr/languages/toml.py +0 -85
  110. rbtr-2026.6.2.dev0/src/rbtr/languages/yaml.py +0 -107
  111. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/__init__.py +0 -0
  112. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/__main__.py +0 -0
  113. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/daemon/__init__.py +0 -0
  114. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/daemon/pidfile.py +0 -0
  115. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/daemon/status.py +0 -0
  116. {rbtr-2026.6.2.dev0/src/rbtr/index → rbtr-2026.9.0.dev0/src/rbtr/domain}/identity.py +0 -0
  117. {rbtr-2026.6.2.dev0/src/rbtr/index → rbtr-2026.9.0.dev0/src/rbtr/domain}/tokenise.py +0 -0
  118. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/git.py +0 -0
  119. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/__init__.py +0 -0
  120. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/_gpu_model.py +0 -0
  121. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/clear_all_embeddings.sql +0 -0
  122. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/count_embeddings.sql +0 -0
  123. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/count_orphan_chunks.sql +0 -0
  124. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/create_fts_index.sql +0 -0
  125. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/delete_edges_for_repo.sql +0 -0
  126. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/delete_repo.sql +0 -0
  127. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/delete_snapshots_for_repo.sql +0 -0
  128. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/delete_watched_refs.sql +0 -0
  129. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/delete_watched_refs_for_repo.sql +0 -0
  130. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/get_chunk_paths.sql +0 -0
  131. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/get_embedding_meta.sql +0 -0
  132. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/get_repo.sql +0 -0
  133. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/get_schema_version.sql +0 -0
  134. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/has_fts_index.sql +0 -0
  135. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/insert_watched_refs.sql +0 -0
  136. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/list_repos.sql +0 -0
  137. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/list_watched_refs.sql +0 -0
  138. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/neutralise_fts_idf.sql +0 -0
  139. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/prune_chunks.sql +0 -0
  140. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/register_repo.sql +0 -0
  141. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/set_embedding_model.sql +0 -0
  142. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/set_embedding_version.sql +0 -0
  143. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/set_schema_version.sql +0 -0
  144. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/sweep_orphan_chunks.sql +0 -0
  145. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/index/sql/update_embeddings.sql +0 -0
  146. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/logging.py +0 -0
  147. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/py.typed +0 -0
  148. {rbtr-2026.6.2.dev0 → rbtr-2026.9.0.dev0}/src/rbtr/rbtrignore.py +0 -0
@@ -0,0 +1,79 @@
1
+ Metadata-Version: 2.4
2
+ Name: rbtr
3
+ Version: 2026.9.0.dev0
4
+ Summary: rbtr — structural code index
5
+ License-Expression: MIT
6
+ Requires-Dist: duckdb>=1.0
7
+ Requires-Dist: dataframely>=2.9.1
8
+ Requires-Dist: huggingface-hub
9
+ Requires-Dist: llama-cpp-python>=0.3.24
10
+ Requires-Dist: pathspec>=1.0.4
11
+ Requires-Dist: platformdirs>=4.0
12
+ Requires-Dist: pyarrow>=17.0
13
+ Requires-Dist: pydantic>=2.12
14
+ Requires-Dist: pydantic-settings[toml]>=2.12
15
+ Requires-Dist: pygit2
16
+ Requires-Dist: pyzmq>=27.1.0
17
+ Requires-Dist: rich>=13.0
18
+ Requires-Dist: rich-argparse>=1.7.2
19
+ Requires-Dist: structlog>=24.1
20
+ Requires-Dist: rbtr-lang-bash
21
+ Requires-Dist: rbtr-lang-c
22
+ Requires-Dist: rbtr-lang-cpp
23
+ Requires-Dist: rbtr-lang-html
24
+ Requires-Dist: rbtr-lang-javascript
25
+ Requires-Dist: rbtr-lang-markdown
26
+ Requires-Dist: rbtr-lang-python
27
+ Requires-Dist: rbtr-lang-rst
28
+ Requires-Dist: tree-sitter>=0.24
29
+ Requires-Dist: rbtr-lang-css ; extra == 'all'
30
+ Requires-Dist: rbtr-lang-scss ; extra == 'all'
31
+ Requires-Dist: rbtr-lang-less ; extra == 'all'
32
+ Requires-Dist: rbtr-lang-json ; extra == 'all'
33
+ Requires-Dist: rbtr-lang-toml ; extra == 'all'
34
+ Requires-Dist: rbtr-lang-yaml ; extra == 'all'
35
+ Requires-Dist: rbtr-lang-hcl ; extra == 'all'
36
+ Requires-Dist: rbtr-lang-go ; extra == 'all'
37
+ Requires-Dist: rbtr-lang-java ; extra == 'all'
38
+ Requires-Dist: rbtr-lang-ruby ; extra == 'all'
39
+ Requires-Dist: rbtr-lang-rust ; extra == 'all'
40
+ Requires-Dist: rbtr-lang-sql ; extra == 'all'
41
+ Requires-Dist: rbtr-lang-tree-sitter-query ; extra == 'all'
42
+ Requires-Dist: rbtr-lang-svelte ; extra == 'all'
43
+ Requires-Dist: rbtr-lang-vue ; extra == 'all'
44
+ Requires-Dist: rbtr-lang-css ; extra == 'css'
45
+ Requires-Dist: rbtr-lang-go ; extra == 'go'
46
+ Requires-Dist: rbtr-lang-hcl ; extra == 'hcl'
47
+ Requires-Dist: rbtr-lang-java ; extra == 'java'
48
+ Requires-Dist: rbtr-lang-json ; extra == 'json'
49
+ Requires-Dist: rbtr-lang-less ; extra == 'less'
50
+ Requires-Dist: rbtr-lang-ruby ; extra == 'ruby'
51
+ Requires-Dist: rbtr-lang-rust ; extra == 'rust'
52
+ Requires-Dist: rbtr-lang-scss ; extra == 'scss'
53
+ Requires-Dist: rbtr-lang-sql ; extra == 'sql'
54
+ Requires-Dist: rbtr-lang-svelte ; extra == 'svelte'
55
+ Requires-Dist: pytest<9.1 ; extra == 'test'
56
+ Requires-Dist: pytest-cases>=3.10.1 ; extra == 'test'
57
+ Requires-Dist: syrupy>=5.3.4 ; extra == 'test'
58
+ Requires-Dist: rbtr-lang-toml ; extra == 'toml'
59
+ Requires-Dist: rbtr-lang-tree-sitter-query ; extra == 'tree-sitter-query'
60
+ Requires-Dist: rbtr-lang-vue ; extra == 'vue'
61
+ Requires-Dist: rbtr-lang-yaml ; extra == 'yaml'
62
+ Requires-Python: >=3.13
63
+ Provides-Extra: all
64
+ Provides-Extra: css
65
+ Provides-Extra: go
66
+ Provides-Extra: hcl
67
+ Provides-Extra: java
68
+ Provides-Extra: json
69
+ Provides-Extra: less
70
+ Provides-Extra: ruby
71
+ Provides-Extra: rust
72
+ Provides-Extra: scss
73
+ Provides-Extra: sql
74
+ Provides-Extra: svelte
75
+ Provides-Extra: test
76
+ Provides-Extra: toml
77
+ Provides-Extra: tree-sitter-query
78
+ Provides-Extra: vue
79
+ Provides-Extra: yaml
@@ -0,0 +1,160 @@
1
+ [build-system]
2
+ requires = ["uv_build>=0.11.26,<1"]
3
+ build-backend = "uv_build"
4
+
5
+ [tool.uv.build-backend]
6
+ source-exclude = ["**/tests"]
7
+
8
+ [tool.uv.sources.rbtr-lang-bash]
9
+ workspace = true
10
+
11
+ [tool.uv.sources.rbtr-lang-c]
12
+ workspace = true
13
+
14
+ [tool.uv.sources.rbtr-lang-cpp]
15
+ workspace = true
16
+
17
+ [tool.uv.sources.rbtr-lang-css]
18
+ workspace = true
19
+
20
+ [tool.uv.sources.rbtr-lang-go]
21
+ workspace = true
22
+
23
+ [tool.uv.sources.rbtr-lang-hcl]
24
+ workspace = true
25
+
26
+ [tool.uv.sources.rbtr-lang-html]
27
+ workspace = true
28
+
29
+ [tool.uv.sources.rbtr-lang-java]
30
+ workspace = true
31
+
32
+ [tool.uv.sources.rbtr-lang-javascript]
33
+ workspace = true
34
+
35
+ [tool.uv.sources.rbtr-lang-json]
36
+ workspace = true
37
+
38
+ [tool.uv.sources.rbtr-lang-less]
39
+ workspace = true
40
+
41
+ [tool.uv.sources.rbtr-lang-markdown]
42
+ workspace = true
43
+
44
+ [tool.uv.sources.rbtr-lang-python]
45
+ workspace = true
46
+
47
+ [tool.uv.sources.rbtr-lang-rst]
48
+ workspace = true
49
+
50
+ [tool.uv.sources.rbtr-lang-ruby]
51
+ workspace = true
52
+
53
+ [tool.uv.sources.rbtr-lang-rust]
54
+ workspace = true
55
+
56
+ [tool.uv.sources.rbtr-lang-scss]
57
+ workspace = true
58
+
59
+ [tool.uv.sources.rbtr-lang-sql]
60
+ workspace = true
61
+
62
+ [tool.uv.sources.rbtr-lang-svelte]
63
+ workspace = true
64
+
65
+ [tool.uv.sources.rbtr-lang-toml]
66
+ workspace = true
67
+
68
+ [tool.uv.sources.rbtr-lang-tree-sitter-query]
69
+ workspace = true
70
+
71
+ [tool.uv.sources.rbtr-lang-vue]
72
+ workspace = true
73
+
74
+ [tool.uv.sources.rbtr-lang-yaml]
75
+ workspace = true
76
+
77
+ [project]
78
+ name = "rbtr"
79
+ version = "2026.9.0-dev0"
80
+ description = "rbtr — structural code index"
81
+ license = "MIT"
82
+ requires-python = ">=3.13"
83
+ dependencies = [
84
+ "duckdb>=1.0",
85
+ "dataframely>=2.9.1",
86
+ "huggingface-hub",
87
+ "llama-cpp-python>=0.3.24",
88
+ "pathspec>=1.0.4",
89
+ "platformdirs>=4.0",
90
+ "pyarrow>=17.0",
91
+ "pydantic>=2.12",
92
+ "pydantic-settings[toml]>=2.12",
93
+ "pygit2",
94
+ "pyzmq>=27.1.0",
95
+ "rich>=13.0",
96
+ "rich-argparse>=1.7.2",
97
+ "structlog>=24.1",
98
+ "rbtr-lang-bash",
99
+ "rbtr-lang-c",
100
+ "rbtr-lang-cpp",
101
+ "rbtr-lang-html",
102
+ "rbtr-lang-javascript",
103
+ "rbtr-lang-markdown",
104
+ "rbtr-lang-python",
105
+ "rbtr-lang-rst",
106
+ "tree-sitter>=0.24",
107
+ ]
108
+
109
+ [project.scripts]
110
+ rbtr = "rbtr.cli:main"
111
+
112
+ [project.entry-points.pytest11]
113
+ rbtr = "rbtr.testing"
114
+
115
+ [project.optional-dependencies]
116
+ css = ["rbtr-lang-css"]
117
+ go = ["rbtr-lang-go"]
118
+ hcl = ["rbtr-lang-hcl"]
119
+ java = ["rbtr-lang-java"]
120
+ json = ["rbtr-lang-json"]
121
+ less = ["rbtr-lang-less"]
122
+ ruby = ["rbtr-lang-ruby"]
123
+ rust = ["rbtr-lang-rust"]
124
+ scss = ["rbtr-lang-scss"]
125
+ sql = ["rbtr-lang-sql"]
126
+ svelte = ["rbtr-lang-svelte"]
127
+ toml = ["rbtr-lang-toml"]
128
+ tree_sitter_query = ["rbtr-lang-tree-sitter-query"]
129
+ vue = ["rbtr-lang-vue"]
130
+ yaml = ["rbtr-lang-yaml"]
131
+ all = [
132
+ "rbtr-lang-css",
133
+ "rbtr-lang-scss",
134
+ "rbtr-lang-less",
135
+ "rbtr-lang-json",
136
+ "rbtr-lang-toml",
137
+ "rbtr-lang-yaml",
138
+ "rbtr-lang-hcl",
139
+ "rbtr-lang-go",
140
+ "rbtr-lang-java",
141
+ "rbtr-lang-ruby",
142
+ "rbtr-lang-rust",
143
+ "rbtr-lang-sql",
144
+ "rbtr-lang-tree-sitter-query",
145
+ "rbtr-lang-svelte",
146
+ "rbtr-lang-vue",
147
+ ]
148
+ test = [
149
+ "pytest<9.1",
150
+ "pytest-cases>=3.10.1",
151
+ "syrupy>=5.3.4",
152
+ ]
153
+
154
+ [dependency-groups]
155
+ dev = [
156
+ "pyinstrument>=5.0",
157
+ "pytest-mock",
158
+ "pytest-xdist>=3.8.0",
159
+ "rbtr[test]",
160
+ ]
@@ -0,0 +1,134 @@
1
+ [build-system]
2
+ requires = ["uv_build>=0.11.26,<1"]
3
+ build-backend = "uv_build"
4
+
5
+ [tool.uv.build-backend]
6
+ source-exclude = ["**/tests"]
7
+
8
+ [project]
9
+ name = "rbtr"
10
+ version = "2026.9.0-dev0"
11
+ description = "rbtr — structural code index"
12
+ license = "MIT"
13
+ requires-python = ">=3.13"
14
+ dependencies = [
15
+ "duckdb>=1.0",
16
+ "dataframely>=2.9.1",
17
+ "huggingface-hub",
18
+ "llama-cpp-python>=0.3.24",
19
+ "pathspec>=1.0.4",
20
+ "platformdirs>=4.0",
21
+ "pyarrow>=17.0",
22
+ "pydantic>=2.12",
23
+ "pydantic-settings[toml]>=2.12",
24
+ "pygit2",
25
+ "pyzmq>=27.1.0",
26
+ "rich>=13.0",
27
+ "rich-argparse>=1.7.2",
28
+ "structlog>=24.1",
29
+
30
+ # Default language plugins (required — ship with core).
31
+ "rbtr-lang-bash",
32
+ "rbtr-lang-c",
33
+ "rbtr-lang-cpp",
34
+ "rbtr-lang-html",
35
+ "rbtr-lang-javascript",
36
+ "rbtr-lang-markdown",
37
+ "rbtr-lang-python",
38
+ "rbtr-lang-rst",
39
+
40
+ # tree-sitter — one grammar per built-in (not-yet-packaged) language
41
+ "tree-sitter>=0.24",
42
+ ]
43
+
44
+ [project.scripts]
45
+ rbtr = "rbtr.cli:main"
46
+
47
+ # Ships the `snapshot_json` fixture (from the shared test harness) to every
48
+ # plugin test suite with no per-package conftest boilerplate.
49
+ [project.entry-points.pytest11]
50
+ rbtr = "rbtr.testing"
51
+
52
+ # Optional language plugins are wired here as extras during the
53
+ # language-plugin-packaging migration.
54
+ [project.optional-dependencies]
55
+ css = ["rbtr-lang-css"]
56
+ go = ["rbtr-lang-go"]
57
+ hcl = ["rbtr-lang-hcl"]
58
+ java = ["rbtr-lang-java"]
59
+ json = ["rbtr-lang-json"]
60
+ less = ["rbtr-lang-less"]
61
+ ruby = ["rbtr-lang-ruby"]
62
+ rust = ["rbtr-lang-rust"]
63
+ scss = ["rbtr-lang-scss"]
64
+ sql = ["rbtr-lang-sql"]
65
+ svelte = ["rbtr-lang-svelte"]
66
+ toml = ["rbtr-lang-toml"]
67
+ tree_sitter_query = ["rbtr-lang-tree-sitter-query"]
68
+ vue = ["rbtr-lang-vue"]
69
+ yaml = ["rbtr-lang-yaml"]
70
+ # Convenience aggregate: `all` pulls every optional plugin (the defaults are
71
+ # already required deps, so `rbtr[all]` installs every language). No `web`
72
+ # grouping — html and javascript are defaults, so it would only add css.
73
+ all = [
74
+ "rbtr-lang-css",
75
+ "rbtr-lang-scss",
76
+ "rbtr-lang-less",
77
+ "rbtr-lang-json",
78
+ "rbtr-lang-toml",
79
+ "rbtr-lang-yaml",
80
+ "rbtr-lang-hcl",
81
+ "rbtr-lang-go",
82
+ "rbtr-lang-java",
83
+ "rbtr-lang-ruby",
84
+ "rbtr-lang-rust",
85
+ "rbtr-lang-sql",
86
+ "rbtr-lang-tree-sitter-query",
87
+ "rbtr-lang-svelte",
88
+ "rbtr-lang-vue",
89
+ ]
90
+ # Test-support extra for `rbtr.testing`: what a plugin package
91
+ # needs to run its extraction/snapshot tests against the shared harness.
92
+ # The pytest bound lives here (not just in `dev`) so that a plugin whose
93
+ # only test dep is `rbtr[test]` still gets it.
94
+ test = [
95
+ # Held below 9.1: pytest-cases 3.10.1 breaks on pytest 9.1's changed
96
+ # IdMaker signature. Drop the bound once pytest-cases is compatible.
97
+ "pytest<9.1",
98
+ "pytest-cases>=3.10.1",
99
+ "syrupy>=5.3.4",
100
+ ]
101
+
102
+ # Language-plugin packages resolve to their workspace members.
103
+ [tool.uv.sources]
104
+ rbtr-lang-bash = { workspace = true }
105
+ rbtr-lang-c = { workspace = true }
106
+ rbtr-lang-cpp = { workspace = true }
107
+ rbtr-lang-css = { workspace = true }
108
+ rbtr-lang-go = { workspace = true }
109
+ rbtr-lang-hcl = { workspace = true }
110
+ rbtr-lang-html = { workspace = true }
111
+ rbtr-lang-java = { workspace = true }
112
+ rbtr-lang-javascript = { workspace = true }
113
+ rbtr-lang-json = { workspace = true }
114
+ rbtr-lang-less = { workspace = true }
115
+ rbtr-lang-markdown = { workspace = true }
116
+ rbtr-lang-python = { workspace = true }
117
+ rbtr-lang-rst = { workspace = true }
118
+ rbtr-lang-ruby = { workspace = true }
119
+ rbtr-lang-rust = { workspace = true }
120
+ rbtr-lang-scss = { workspace = true }
121
+ rbtr-lang-sql = { workspace = true }
122
+ rbtr-lang-svelte = { workspace = true }
123
+ rbtr-lang-toml = { workspace = true }
124
+ rbtr-lang-tree-sitter-query = { workspace = true }
125
+ rbtr-lang-vue = { workspace = true }
126
+ rbtr-lang-yaml = { workspace = true }
127
+
128
+ [dependency-groups]
129
+ dev = [
130
+ "pyinstrument>=5.0",
131
+ "pytest-mock",
132
+ "pytest-xdist>=3.8.0",
133
+ "rbtr[test]",
134
+ ]
@@ -42,7 +42,6 @@ from rbtr.cli.output import (
42
42
  print_err,
43
43
  print_json_schema,
44
44
  progress_reporter,
45
- render_config,
46
45
  )
47
46
  from rbtr.config import Config, WeightTriple, config
48
47
  from rbtr.daemon.client import (
@@ -54,6 +53,7 @@ from rbtr.daemon.client import (
54
53
  )
55
54
  from rbtr.daemon.handlers import (
56
55
  handle_changed_symbols,
56
+ handle_daemon_config,
57
57
  handle_find_refs,
58
58
  handle_forget,
59
59
  handle_gc,
@@ -67,12 +67,13 @@ from rbtr.daemon.messages import (
67
67
  BuildIndexResponse,
68
68
  ChangedSymbolsRequest,
69
69
  ChangedSymbolsResponse,
70
+ DaemonConfigRequest,
71
+ DaemonConfigResponse,
70
72
  ErrorResponse,
71
73
  FindRefsRequest,
72
74
  FindRefsResponse,
73
75
  ForgetRequest,
74
76
  ForgetResponse,
75
- GcMode,
76
77
  GcRequest,
77
78
  GcResponse,
78
79
  ListSymbolsRequest,
@@ -89,12 +90,15 @@ from rbtr.daemon.messages import (
89
90
  )
90
91
  from rbtr.daemon.server import DaemonServer
91
92
  from rbtr.daemon.status import DaemonStatusReport, uptime_seconds as _uptime_seconds
93
+ from rbtr.domain.models import GcMode
92
94
  from rbtr.errors import RbtrError
93
95
  from rbtr.git import HEAD_REF, normalise_repo_path, resolve_ref
96
+ from rbtr.index.build import build_index
97
+ from rbtr.index.embed import embed_index
94
98
  from rbtr.index.embeddings import Embedder
95
- from rbtr.index.orchestrator import build_index, embed_index
96
99
  from rbtr.index.reranker import Reranker
97
100
  from rbtr.index.store import IndexStore
101
+ from rbtr.languages.manager import get_manager
98
102
  from rbtr.logging import configure_logging
99
103
 
100
104
  log = structlog.get_logger(__name__)
@@ -117,6 +121,11 @@ ScopeField = Annotated[Scope, BeforeValidator(_normalise_scope)]
117
121
  class DaemonServe(BaseModel):
118
122
  """Internal: run the daemon server (spawned by `daemon start`)."""
119
123
 
124
+ allow_missing_plugins: bool = Field(
125
+ False,
126
+ description="Serve even if the index has languages this rbtr cannot load",
127
+ )
128
+
120
129
  def cli_cmd(self) -> None:
121
130
  # The daemon's sole log sink is the rotating JSON file; the
122
131
  # parent no longer redirects the child's stderr here.
@@ -124,8 +133,17 @@ class DaemonServe(BaseModel):
124
133
 
125
134
  config.runtime_dir.mkdir(parents=True, exist_ok=True)
126
135
  print_banner()
127
- store = IndexStore.from_config(writable=True)
128
- server = DaemonServer(config.runtime_dir, store)
136
+ try:
137
+ store = IndexStore.from_config(writable=True)
138
+ except RbtrError:
139
+ # The parent redirects our stderr to DEVNULL, so record why
140
+ # the daemon couldn't open the index (e.g. a schema refuse)
141
+ # in the log the parent points the user at.
142
+ log.exception("daemon_store_open_failed")
143
+ raise
144
+ server = DaemonServer(
145
+ config.runtime_dir, store, allow_missing_plugins=self.allow_missing_plugins
146
+ )
129
147
  asyncio.run(server.serve())
130
148
 
131
149
 
@@ -135,6 +153,11 @@ class DaemonServe(BaseModel):
135
153
  class DaemonStart(BaseModel):
136
154
  """Start the daemon in the background."""
137
155
 
156
+ allow_missing_plugins: bool = Field(
157
+ False,
158
+ description="Serve even if the index has languages this rbtr cannot load",
159
+ )
160
+
138
161
  def cli_cmd(self) -> None:
139
162
  if is_daemon_running():
140
163
  s = _status()
@@ -142,7 +165,7 @@ class DaemonStart(BaseModel):
142
165
  return
143
166
 
144
167
  try:
145
- start_daemon()
168
+ start_daemon(allow_missing_plugins=self.allow_missing_plugins)
146
169
  except RbtrError as exc:
147
170
  print_err(f"[red]error:[/] {exc}")
148
171
  sys.exit(1)
@@ -231,6 +254,10 @@ class Index(BaseModel):
231
254
  )
232
255
  daemon: bool = Field(True, description="Use the daemon (disable with --no-daemon)")
233
256
  embed: bool = Field(True, description="Compute embeddings (disable with --no-embed)")
257
+ allow_missing_plugins: bool = Field(
258
+ False,
259
+ description="Build even if the index has languages this rbtr cannot load",
260
+ )
234
261
 
235
262
  def cli_cmd(self) -> None:
236
263
  # Forgetting vanished repos needs no current repo — handle it before
@@ -438,6 +465,12 @@ class Index(BaseModel):
438
465
  ) -> None:
439
466
  """Run indexing inline (blocking)."""
440
467
  store = IndexStore.from_config(writable=True)
468
+ # Refuse to rebuild languages whose plugin isn't loaded -- that
469
+ # would re-extract raw chunks and churn embeddings -- unless the
470
+ # caller overrides with --allow-missing-plugins.
471
+ get_manager().require_languages_loaded(
472
+ store.distinct_chunk_languages(), allow_missing=self.allow_missing_plugins
473
+ )
441
474
  with store.session() as ws:
442
475
  repo_id = ws.register_repo(resolved_repo)
443
476
  embedder = Embedder(idle_timeout=config.embed_idle_timeout)
@@ -455,7 +488,6 @@ class Index(BaseModel):
455
488
  resolved_repo,
456
489
  resolved_refs[0],
457
490
  store,
458
- repo_id=repo_id,
459
491
  on_progress=on_progress,
460
492
  )
461
493
  for ref in resolved_refs[1:]:
@@ -463,7 +495,6 @@ class Index(BaseModel):
463
495
  resolved_repo,
464
496
  ref,
465
497
  store,
466
- repo_id=repo_id,
467
498
  on_progress=on_progress,
468
499
  )
469
500
 
@@ -811,6 +842,10 @@ class Gc(BaseModel):
811
842
  description="Sweep crashed-build residue only; no commits dropped",
812
843
  )
813
844
  dry_run: bool = Field(False, description="Report what would be removed without writing")
845
+ compact: bool = Field(
846
+ True,
847
+ description="Rewrite the index to reclaim freed disk space (--no-compact to skip)",
848
+ )
814
849
 
815
850
  def cli_cmd(self) -> None:
816
851
  mode, refs = self._resolve_mode()
@@ -829,6 +864,7 @@ class Gc(BaseModel):
829
864
  mode=mode,
830
865
  refs=refs,
831
866
  dry_run=self.dry_run,
867
+ compact=self.compact,
832
868
  )
833
869
 
834
870
  match try_daemon(request):
@@ -838,10 +874,12 @@ class Gc(BaseModel):
838
874
  print_err(f"[red]error:[/] {msg}")
839
875
  sys.exit(1)
840
876
  case None:
877
+ # No daemon: this process holds DuckDB's exclusive lock, so
878
+ # compaction's connection swap is safe here (allow_compact).
841
879
  store = IndexStore.from_config(writable=True)
842
880
 
843
881
  try:
844
- emit(handle_gc(request, store))
882
+ emit(handle_gc(request, store, allow_compact=True))
845
883
  except RbtrError as exc:
846
884
  print_err(f"[red]error:[/] {exc}")
847
885
  sys.exit(1)
@@ -875,10 +913,26 @@ class SchemaDump(BaseModel):
875
913
 
876
914
 
877
915
  class ConfigCmd(BaseModel):
878
- """Show the rendered rbtr configuration."""
916
+ """Show the rbtr configuration and loaded language plugins.
917
+
918
+ Reports the running daemon's live config when one is up; otherwise
919
+ the locally resolved config (what a daemon would load), noted on
920
+ stderr.
921
+ """
879
922
 
880
923
  def cli_cmd(self) -> None:
881
- render_config()
924
+ match try_daemon(DaemonConfigRequest()):
925
+ case DaemonConfigResponse() as resp:
926
+ emit(resp)
927
+ case None:
928
+ print_err("[dim]daemon not running — showing local config[/]")
929
+ emit(handle_daemon_config(DaemonConfigRequest()))
930
+ case ErrorResponse(message=msg):
931
+ print_err(f"[red]error:[/] {msg}")
932
+ sys.exit(1)
933
+ case resp:
934
+ print_err(f"[red]error:[/] unexpected response: {resp}")
935
+ sys.exit(1)
882
936
 
883
937
 
884
938
  # ── Root command ─────────────────────────────────────────────────────