codespine 0.5.7__tar.gz → 0.5.9__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.
- {codespine-0.5.7 → codespine-0.5.9}/PKG-INFO +29 -3
- {codespine-0.5.7 → codespine-0.5.9}/README.md +28 -2
- {codespine-0.5.7 → codespine-0.5.9}/codespine/__init__.py +1 -1
- {codespine-0.5.7 → codespine-0.5.9}/codespine/db/store.py +16 -4
- {codespine-0.5.7 → codespine-0.5.9}/codespine.egg-info/PKG-INFO +29 -3
- {codespine-0.5.7 → codespine-0.5.9}/pyproject.toml +1 -1
- {codespine-0.5.7 → codespine-0.5.9}/LICENSE +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/analysis/__init__.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/analysis/community.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/analysis/context.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/analysis/coupling.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/analysis/crossmodule.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/analysis/deadcode.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/analysis/flow.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/analysis/impact.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/cli.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/config.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/db/__init__.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/db/schema.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/diff/__init__.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/diff/branch_diff.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/indexer/__init__.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/indexer/call_resolver.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/indexer/engine.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/indexer/java_parser.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/indexer/symbol_builder.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/mcp/__init__.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/mcp/server.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/noise/__init__.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/noise/blocklist.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/overlay/__init__.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/overlay/git_state.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/overlay/merge.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/overlay/store.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/search/__init__.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/search/bm25.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/search/fuzzy.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/search/hybrid.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/search/rrf.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/search/vector.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/watch/__init__.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine/watch/watcher.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine.egg-info/SOURCES.txt +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine.egg-info/dependency_links.txt +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine.egg-info/entry_points.txt +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine.egg-info/requires.txt +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/codespine.egg-info/top_level.txt +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/gindex.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/setup.cfg +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/tests/test_branch_diff_normalize.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/tests/test_call_resolver.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/tests/test_community_detection.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/tests/test_deadcode.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/tests/test_index_and_hybrid.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/tests/test_java_parser.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/tests/test_multimodule_index.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/tests/test_overlay.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/tests/test_search_ranking.py +0 -0
- {codespine-0.5.7 → codespine-0.5.9}/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.
|
|
3
|
+
Version: 0.5.9
|
|
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
|
|
|
@@ -28,6 +28,11 @@ _RECOVERABLE_DB_ERROR_MARKERS = (
|
|
|
28
28
|
"corrupt",
|
|
29
29
|
"corrupted",
|
|
30
30
|
"invalid database",
|
|
31
|
+
# Kuzu internal error: abrupt process termination (Ctrl+C) during a write
|
|
32
|
+
# leaves the WAL in an inconsistent state; Kuzu raises this as an
|
|
33
|
+
# IndexError from its internal unordered_map when re-opening the path.
|
|
34
|
+
"unordered_map",
|
|
35
|
+
"key not found",
|
|
31
36
|
)
|
|
32
37
|
|
|
33
38
|
|
|
@@ -500,14 +505,21 @@ class GraphStore:
|
|
|
500
505
|
def rebuild_empty_db(self) -> None:
|
|
501
506
|
self._recycle_conn()
|
|
502
507
|
path = SETTINGS.db_path
|
|
508
|
+
self._remove_db_path(path)
|
|
509
|
+
# Kuzu may retain stale internal state from a previous failed open of
|
|
510
|
+
# this path (e.g. after Ctrl+C mid-write). If re-opening the just-
|
|
511
|
+
# deleted path raises, fall back to a clean /tmp location so the
|
|
512
|
+
# command succeeds rather than leaving the user stuck.
|
|
503
513
|
try:
|
|
504
|
-
self.
|
|
505
|
-
except
|
|
514
|
+
self.db = self._open_db(path)
|
|
515
|
+
except Exception as exc:
|
|
506
516
|
fallback = os.path.join("/tmp", ".codespine_db")
|
|
517
|
+
LOGGER.warning(
|
|
518
|
+
"Could not open fresh DB at %s after rebuild (%s); falling back to %s",
|
|
519
|
+
path, exc, fallback,
|
|
520
|
+
)
|
|
507
521
|
self._remove_db_path(fallback)
|
|
508
522
|
self.db = self._open_db(fallback)
|
|
509
|
-
else:
|
|
510
|
-
self.db = self._open_db(path)
|
|
511
523
|
self._tls = threading.local()
|
|
512
524
|
ensure_schema(self._conn())
|
|
513
525
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codespine
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.9
|
|
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
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|