codespine 0.5.7__tar.gz → 0.5.8__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 (59) hide show
  1. {codespine-0.5.7 → codespine-0.5.8}/PKG-INFO +29 -3
  2. {codespine-0.5.7 → codespine-0.5.8}/README.md +28 -2
  3. {codespine-0.5.7 → codespine-0.5.8}/codespine/__init__.py +1 -1
  4. {codespine-0.5.7 → codespine-0.5.8}/codespine.egg-info/PKG-INFO +29 -3
  5. {codespine-0.5.7 → codespine-0.5.8}/pyproject.toml +1 -1
  6. {codespine-0.5.7 → codespine-0.5.8}/LICENSE +0 -0
  7. {codespine-0.5.7 → codespine-0.5.8}/codespine/analysis/__init__.py +0 -0
  8. {codespine-0.5.7 → codespine-0.5.8}/codespine/analysis/community.py +0 -0
  9. {codespine-0.5.7 → codespine-0.5.8}/codespine/analysis/context.py +0 -0
  10. {codespine-0.5.7 → codespine-0.5.8}/codespine/analysis/coupling.py +0 -0
  11. {codespine-0.5.7 → codespine-0.5.8}/codespine/analysis/crossmodule.py +0 -0
  12. {codespine-0.5.7 → codespine-0.5.8}/codespine/analysis/deadcode.py +0 -0
  13. {codespine-0.5.7 → codespine-0.5.8}/codespine/analysis/flow.py +0 -0
  14. {codespine-0.5.7 → codespine-0.5.8}/codespine/analysis/impact.py +0 -0
  15. {codespine-0.5.7 → codespine-0.5.8}/codespine/cli.py +0 -0
  16. {codespine-0.5.7 → codespine-0.5.8}/codespine/config.py +0 -0
  17. {codespine-0.5.7 → codespine-0.5.8}/codespine/db/__init__.py +0 -0
  18. {codespine-0.5.7 → codespine-0.5.8}/codespine/db/schema.py +0 -0
  19. {codespine-0.5.7 → codespine-0.5.8}/codespine/db/store.py +0 -0
  20. {codespine-0.5.7 → codespine-0.5.8}/codespine/diff/__init__.py +0 -0
  21. {codespine-0.5.7 → codespine-0.5.8}/codespine/diff/branch_diff.py +0 -0
  22. {codespine-0.5.7 → codespine-0.5.8}/codespine/indexer/__init__.py +0 -0
  23. {codespine-0.5.7 → codespine-0.5.8}/codespine/indexer/call_resolver.py +0 -0
  24. {codespine-0.5.7 → codespine-0.5.8}/codespine/indexer/engine.py +0 -0
  25. {codespine-0.5.7 → codespine-0.5.8}/codespine/indexer/java_parser.py +0 -0
  26. {codespine-0.5.7 → codespine-0.5.8}/codespine/indexer/symbol_builder.py +0 -0
  27. {codespine-0.5.7 → codespine-0.5.8}/codespine/mcp/__init__.py +0 -0
  28. {codespine-0.5.7 → codespine-0.5.8}/codespine/mcp/server.py +0 -0
  29. {codespine-0.5.7 → codespine-0.5.8}/codespine/noise/__init__.py +0 -0
  30. {codespine-0.5.7 → codespine-0.5.8}/codespine/noise/blocklist.py +0 -0
  31. {codespine-0.5.7 → codespine-0.5.8}/codespine/overlay/__init__.py +0 -0
  32. {codespine-0.5.7 → codespine-0.5.8}/codespine/overlay/git_state.py +0 -0
  33. {codespine-0.5.7 → codespine-0.5.8}/codespine/overlay/merge.py +0 -0
  34. {codespine-0.5.7 → codespine-0.5.8}/codespine/overlay/store.py +0 -0
  35. {codespine-0.5.7 → codespine-0.5.8}/codespine/search/__init__.py +0 -0
  36. {codespine-0.5.7 → codespine-0.5.8}/codespine/search/bm25.py +0 -0
  37. {codespine-0.5.7 → codespine-0.5.8}/codespine/search/fuzzy.py +0 -0
  38. {codespine-0.5.7 → codespine-0.5.8}/codespine/search/hybrid.py +0 -0
  39. {codespine-0.5.7 → codespine-0.5.8}/codespine/search/rrf.py +0 -0
  40. {codespine-0.5.7 → codespine-0.5.8}/codespine/search/vector.py +0 -0
  41. {codespine-0.5.7 → codespine-0.5.8}/codespine/watch/__init__.py +0 -0
  42. {codespine-0.5.7 → codespine-0.5.8}/codespine/watch/watcher.py +0 -0
  43. {codespine-0.5.7 → codespine-0.5.8}/codespine.egg-info/SOURCES.txt +0 -0
  44. {codespine-0.5.7 → codespine-0.5.8}/codespine.egg-info/dependency_links.txt +0 -0
  45. {codespine-0.5.7 → codespine-0.5.8}/codespine.egg-info/entry_points.txt +0 -0
  46. {codespine-0.5.7 → codespine-0.5.8}/codespine.egg-info/requires.txt +0 -0
  47. {codespine-0.5.7 → codespine-0.5.8}/codespine.egg-info/top_level.txt +0 -0
  48. {codespine-0.5.7 → codespine-0.5.8}/gindex.py +0 -0
  49. {codespine-0.5.7 → codespine-0.5.8}/setup.cfg +0 -0
  50. {codespine-0.5.7 → codespine-0.5.8}/tests/test_branch_diff_normalize.py +0 -0
  51. {codespine-0.5.7 → codespine-0.5.8}/tests/test_call_resolver.py +0 -0
  52. {codespine-0.5.7 → codespine-0.5.8}/tests/test_community_detection.py +0 -0
  53. {codespine-0.5.7 → codespine-0.5.8}/tests/test_deadcode.py +0 -0
  54. {codespine-0.5.7 → codespine-0.5.8}/tests/test_index_and_hybrid.py +0 -0
  55. {codespine-0.5.7 → codespine-0.5.8}/tests/test_java_parser.py +0 -0
  56. {codespine-0.5.7 → codespine-0.5.8}/tests/test_multimodule_index.py +0 -0
  57. {codespine-0.5.7 → codespine-0.5.8}/tests/test_overlay.py +0 -0
  58. {codespine-0.5.7 → codespine-0.5.8}/tests/test_search_ranking.py +0 -0
  59. {codespine-0.5.7 → codespine-0.5.8}/tests/test_store_recovery.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codespine
3
- Version: 0.5.7
3
+ Version: 0.5.8
4
4
  Summary: Local Java code intelligence indexer backed by a graph database
5
5
  Author: CodeSpine contributors
6
6
  License: MIT License
@@ -72,6 +72,8 @@ It indexes classes, methods, calls, type relationships, cross-module links, git
72
72
 
73
73
  It also keeps a separate dirty overlay for uncommitted Java edits, so agents can query current work-in-progress without forcing the committed base index to churn on every save.
74
74
 
75
+ The MCP daemon and the indexer run independently. Querying while a full re-index is running no longer causes crashes or memory contention — reads go to an isolated snapshot that is atomically updated when indexing completes.
76
+
75
77
  ## Why It Saves Tokens
76
78
 
77
79
  - One MCP call can replace many file opens. `get_symbol_context("PaymentService")` returns a resolved neighborhood instead of forcing the agent to read every caller and callee file manually.
@@ -101,6 +103,8 @@ pip install "codespine[ml]"
101
103
  - Community detection: structural clusters for architectural context
102
104
  - Change coupling: git-history-based file relationships
103
105
  - Multi-project and multi-module indexing: workspaces, Maven modules, Gradle subprojects
106
+ - Cross-module call linking: signature-based detection of calls between Maven/Gradle modules
107
+ - Concurrent read/write isolation: MCP queries run against a read replica; the indexer writes separately, with no memory contention
104
108
  - MCP server: structured tools for Claude, Cursor, Cline, Copilot, and similar clients
105
109
 
106
110
  ## Editing Without Stale Indexes
@@ -159,15 +163,23 @@ Parsing code... 8/8
159
163
  Tracing calls... 847 calls resolved
160
164
  Analyzing types... 234 type relationships
161
165
  Cross-module linking... skipped (single module)
166
+ Detecting communities... loading symbols
167
+ Detecting communities... 623 symbols, 1204 structural edges
168
+ Detecting communities... persisting 8/8 clusters
162
169
  Detecting communities... 8 clusters found
170
+ Detecting execution flows... 34 entry points, tracing
163
171
  Detecting execution flows... 34 processes found
164
172
  Finding dead code... 12 unreachable symbols
173
+ Analyzing git history... 18 commits, computing co-changes
165
174
  Analyzing git history... 18 coupled file pairs
166
175
  Generating embeddings... 0 vectors stored
167
176
 
168
177
  Done in 4.2s - 623 symbols, 1847 edges, 8 clusters, 34 flows (no embeddings; rerun with --embed for semantic search)
178
+ Publishing read replica... MCP will reload automatically
169
179
  ```
170
180
 
181
+ Each analysis phase streams live progress in place. The final step publishes a read replica so the MCP daemon picks up the new index without restarting.
182
+
171
183
  Search the index:
172
184
 
173
185
  ```bash
@@ -284,9 +296,22 @@ When a dirty overlay exists, deep-analysis results intentionally exclude those u
284
296
 
285
297
  `--embed` is also optional. Without it, CodeSpine still supports exact, keyword, and fuzzy search. Add embeddings when you need concept-level retrieval.
286
298
 
299
+ ## Concurrent Indexing and Querying
300
+
301
+ The indexer (write) and the MCP daemon (read) use separate database paths:
302
+
303
+ - The indexer writes to `~/.codespine_db` with a 512 MB buffer pool.
304
+ - When indexing completes, `analyse` atomically copies the database to `~/.codespine_db_read` and touches a sentinel file.
305
+ - The MCP daemon and all read-only CLI commands open `~/.codespine_db_read` with a 128 MB buffer pool.
306
+ - The MCP daemon watches the sentinel file and silently reloads from the new snapshot on the next tool call — no restart needed.
307
+
308
+ Running `codespine analyse --deep --embed` on one project while querying a different one no longer causes buffer pool OOM or lock contention.
309
+
287
310
  ## Runtime Files
288
311
 
289
- - `~/.codespine_db` - graph database
312
+ - `~/.codespine_db` - graph database (write)
313
+ - `~/.codespine_db_read` - read replica used by MCP and CLI queries
314
+ - `~/.codespine_db_read.updated` - sentinel file; touched after each successful snapshot
290
315
  - `~/.codespine.pid` - MCP background server PID
291
316
  - `~/.codespine.log` - server log
292
317
  - `~/.codespine_embedding_cache.json` - embedding cache
@@ -297,8 +322,9 @@ When a dirty overlay exists, deep-analysis results intentionally exclude those u
297
322
 
298
323
  - `codespine start` launches a background MCP server. Most IDE MCP clients should use `codespine mcp` instead and manage the process themselves.
299
324
  - `codespine watch` updates the dirty overlay first; it does not rewrite the committed base index on every save.
300
- - `codespine clear-index` rebuilds the local index database from scratch.
325
+ - `codespine clear-index` rebuilds the local index database from scratch. This also removes the read replica; run `analyse` again to republish it.
301
326
  - For large Spring or JPA-heavy repos, dead-code results should still be reviewed before deletion. The tool is conservative, not authoritative.
327
+ - The first run after upgrading to v0.5.7 will not have a read replica yet. Run `codespine analyse` once to create it.
302
328
 
303
329
  ## Project Docs
304
330
 
@@ -8,6 +8,8 @@ It indexes classes, methods, calls, type relationships, cross-module links, git
8
8
 
9
9
  It also keeps a separate dirty overlay for uncommitted Java edits, so agents can query current work-in-progress without forcing the committed base index to churn on every save.
10
10
 
11
+ The MCP daemon and the indexer run independently. Querying while a full re-index is running no longer causes crashes or memory contention — reads go to an isolated snapshot that is atomically updated when indexing completes.
12
+
11
13
  ## Why It Saves Tokens
12
14
 
13
15
  - One MCP call can replace many file opens. `get_symbol_context("PaymentService")` returns a resolved neighborhood instead of forcing the agent to read every caller and callee file manually.
@@ -37,6 +39,8 @@ pip install "codespine[ml]"
37
39
  - Community detection: structural clusters for architectural context
38
40
  - Change coupling: git-history-based file relationships
39
41
  - Multi-project and multi-module indexing: workspaces, Maven modules, Gradle subprojects
42
+ - Cross-module call linking: signature-based detection of calls between Maven/Gradle modules
43
+ - Concurrent read/write isolation: MCP queries run against a read replica; the indexer writes separately, with no memory contention
40
44
  - MCP server: structured tools for Claude, Cursor, Cline, Copilot, and similar clients
41
45
 
42
46
  ## Editing Without Stale Indexes
@@ -95,15 +99,23 @@ Parsing code... 8/8
95
99
  Tracing calls... 847 calls resolved
96
100
  Analyzing types... 234 type relationships
97
101
  Cross-module linking... skipped (single module)
102
+ Detecting communities... loading symbols
103
+ Detecting communities... 623 symbols, 1204 structural edges
104
+ Detecting communities... persisting 8/8 clusters
98
105
  Detecting communities... 8 clusters found
106
+ Detecting execution flows... 34 entry points, tracing
99
107
  Detecting execution flows... 34 processes found
100
108
  Finding dead code... 12 unreachable symbols
109
+ Analyzing git history... 18 commits, computing co-changes
101
110
  Analyzing git history... 18 coupled file pairs
102
111
  Generating embeddings... 0 vectors stored
103
112
 
104
113
  Done in 4.2s - 623 symbols, 1847 edges, 8 clusters, 34 flows (no embeddings; rerun with --embed for semantic search)
114
+ Publishing read replica... MCP will reload automatically
105
115
  ```
106
116
 
117
+ Each analysis phase streams live progress in place. The final step publishes a read replica so the MCP daemon picks up the new index without restarting.
118
+
107
119
  Search the index:
108
120
 
109
121
  ```bash
@@ -220,9 +232,22 @@ When a dirty overlay exists, deep-analysis results intentionally exclude those u
220
232
 
221
233
  `--embed` is also optional. Without it, CodeSpine still supports exact, keyword, and fuzzy search. Add embeddings when you need concept-level retrieval.
222
234
 
235
+ ## Concurrent Indexing and Querying
236
+
237
+ The indexer (write) and the MCP daemon (read) use separate database paths:
238
+
239
+ - The indexer writes to `~/.codespine_db` with a 512 MB buffer pool.
240
+ - When indexing completes, `analyse` atomically copies the database to `~/.codespine_db_read` and touches a sentinel file.
241
+ - The MCP daemon and all read-only CLI commands open `~/.codespine_db_read` with a 128 MB buffer pool.
242
+ - The MCP daemon watches the sentinel file and silently reloads from the new snapshot on the next tool call — no restart needed.
243
+
244
+ Running `codespine analyse --deep --embed` on one project while querying a different one no longer causes buffer pool OOM or lock contention.
245
+
223
246
  ## Runtime Files
224
247
 
225
- - `~/.codespine_db` - graph database
248
+ - `~/.codespine_db` - graph database (write)
249
+ - `~/.codespine_db_read` - read replica used by MCP and CLI queries
250
+ - `~/.codespine_db_read.updated` - sentinel file; touched after each successful snapshot
226
251
  - `~/.codespine.pid` - MCP background server PID
227
252
  - `~/.codespine.log` - server log
228
253
  - `~/.codespine_embedding_cache.json` - embedding cache
@@ -233,8 +258,9 @@ When a dirty overlay exists, deep-analysis results intentionally exclude those u
233
258
 
234
259
  - `codespine start` launches a background MCP server. Most IDE MCP clients should use `codespine mcp` instead and manage the process themselves.
235
260
  - `codespine watch` updates the dirty overlay first; it does not rewrite the committed base index on every save.
236
- - `codespine clear-index` rebuilds the local index database from scratch.
261
+ - `codespine clear-index` rebuilds the local index database from scratch. This also removes the read replica; run `analyse` again to republish it.
237
262
  - For large Spring or JPA-heavy repos, dead-code results should still be reviewed before deletion. The tool is conservative, not authoritative.
263
+ - The first run after upgrading to v0.5.7 will not have a read replica yet. Run `codespine analyse` once to create it.
238
264
 
239
265
  ## Project Docs
240
266
 
@@ -1,4 +1,4 @@
1
1
  """CodeSpine package."""
2
2
 
3
3
  __all__ = ["__version__"]
4
- __version__ = "0.5.7"
4
+ __version__ = "0.5.8"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codespine
3
- Version: 0.5.7
3
+ Version: 0.5.8
4
4
  Summary: Local Java code intelligence indexer backed by a graph database
5
5
  Author: CodeSpine contributors
6
6
  License: MIT License
@@ -72,6 +72,8 @@ It indexes classes, methods, calls, type relationships, cross-module links, git
72
72
 
73
73
  It also keeps a separate dirty overlay for uncommitted Java edits, so agents can query current work-in-progress without forcing the committed base index to churn on every save.
74
74
 
75
+ The MCP daemon and the indexer run independently. Querying while a full re-index is running no longer causes crashes or memory contention — reads go to an isolated snapshot that is atomically updated when indexing completes.
76
+
75
77
  ## Why It Saves Tokens
76
78
 
77
79
  - One MCP call can replace many file opens. `get_symbol_context("PaymentService")` returns a resolved neighborhood instead of forcing the agent to read every caller and callee file manually.
@@ -101,6 +103,8 @@ pip install "codespine[ml]"
101
103
  - Community detection: structural clusters for architectural context
102
104
  - Change coupling: git-history-based file relationships
103
105
  - Multi-project and multi-module indexing: workspaces, Maven modules, Gradle subprojects
106
+ - Cross-module call linking: signature-based detection of calls between Maven/Gradle modules
107
+ - Concurrent read/write isolation: MCP queries run against a read replica; the indexer writes separately, with no memory contention
104
108
  - MCP server: structured tools for Claude, Cursor, Cline, Copilot, and similar clients
105
109
 
106
110
  ## Editing Without Stale Indexes
@@ -159,15 +163,23 @@ Parsing code... 8/8
159
163
  Tracing calls... 847 calls resolved
160
164
  Analyzing types... 234 type relationships
161
165
  Cross-module linking... skipped (single module)
166
+ Detecting communities... loading symbols
167
+ Detecting communities... 623 symbols, 1204 structural edges
168
+ Detecting communities... persisting 8/8 clusters
162
169
  Detecting communities... 8 clusters found
170
+ Detecting execution flows... 34 entry points, tracing
163
171
  Detecting execution flows... 34 processes found
164
172
  Finding dead code... 12 unreachable symbols
173
+ Analyzing git history... 18 commits, computing co-changes
165
174
  Analyzing git history... 18 coupled file pairs
166
175
  Generating embeddings... 0 vectors stored
167
176
 
168
177
  Done in 4.2s - 623 symbols, 1847 edges, 8 clusters, 34 flows (no embeddings; rerun with --embed for semantic search)
178
+ Publishing read replica... MCP will reload automatically
169
179
  ```
170
180
 
181
+ Each analysis phase streams live progress in place. The final step publishes a read replica so the MCP daemon picks up the new index without restarting.
182
+
171
183
  Search the index:
172
184
 
173
185
  ```bash
@@ -284,9 +296,22 @@ When a dirty overlay exists, deep-analysis results intentionally exclude those u
284
296
 
285
297
  `--embed` is also optional. Without it, CodeSpine still supports exact, keyword, and fuzzy search. Add embeddings when you need concept-level retrieval.
286
298
 
299
+ ## Concurrent Indexing and Querying
300
+
301
+ The indexer (write) and the MCP daemon (read) use separate database paths:
302
+
303
+ - The indexer writes to `~/.codespine_db` with a 512 MB buffer pool.
304
+ - When indexing completes, `analyse` atomically copies the database to `~/.codespine_db_read` and touches a sentinel file.
305
+ - The MCP daemon and all read-only CLI commands open `~/.codespine_db_read` with a 128 MB buffer pool.
306
+ - The MCP daemon watches the sentinel file and silently reloads from the new snapshot on the next tool call — no restart needed.
307
+
308
+ Running `codespine analyse --deep --embed` on one project while querying a different one no longer causes buffer pool OOM or lock contention.
309
+
287
310
  ## Runtime Files
288
311
 
289
- - `~/.codespine_db` - graph database
312
+ - `~/.codespine_db` - graph database (write)
313
+ - `~/.codespine_db_read` - read replica used by MCP and CLI queries
314
+ - `~/.codespine_db_read.updated` - sentinel file; touched after each successful snapshot
290
315
  - `~/.codespine.pid` - MCP background server PID
291
316
  - `~/.codespine.log` - server log
292
317
  - `~/.codespine_embedding_cache.json` - embedding cache
@@ -297,8 +322,9 @@ When a dirty overlay exists, deep-analysis results intentionally exclude those u
297
322
 
298
323
  - `codespine start` launches a background MCP server. Most IDE MCP clients should use `codespine mcp` instead and manage the process themselves.
299
324
  - `codespine watch` updates the dirty overlay first; it does not rewrite the committed base index on every save.
300
- - `codespine clear-index` rebuilds the local index database from scratch.
325
+ - `codespine clear-index` rebuilds the local index database from scratch. This also removes the read replica; run `analyse` again to republish it.
301
326
  - For large Spring or JPA-heavy repos, dead-code results should still be reviewed before deletion. The tool is conservative, not authoritative.
327
+ - The first run after upgrading to v0.5.7 will not have a read replica yet. Run `codespine analyse` once to create it.
302
328
 
303
329
  ## Project Docs
304
330
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "codespine"
7
- version = "0.5.7"
7
+ version = "0.5.8"
8
8
  description = "Local Java code intelligence indexer backed by a graph database"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
File without changes
File without changes
File without changes
File without changes
File without changes