codespine 1.0.8__tar.gz → 1.0.10__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 (78) hide show
  1. {codespine-1.0.8 → codespine-1.0.10}/PKG-INFO +35 -10
  2. {codespine-1.0.8 → codespine-1.0.10}/README.md +33 -9
  3. {codespine-1.0.8 → codespine-1.0.10}/codespine/__init__.py +1 -1
  4. {codespine-1.0.8 → codespine-1.0.10}/codespine/cli.py +624 -29
  5. {codespine-1.0.8 → codespine-1.0.10}/codespine/config.py +5 -2
  6. {codespine-1.0.8 → codespine-1.0.10}/codespine/db/_cypher_compat.py +65 -12
  7. {codespine-1.0.8 → codespine-1.0.10}/codespine/db/duckdb_store.py +21 -11
  8. codespine-1.0.10/codespine/health.py +123 -0
  9. {codespine-1.0.8 → codespine-1.0.10}/codespine/indexer/call_resolver.py +6 -0
  10. {codespine-1.0.8 → codespine-1.0.10}/codespine/indexer/engine.py +66 -38
  11. {codespine-1.0.8 → codespine-1.0.10}/codespine/mcp/server.py +17 -2
  12. codespine-1.0.10/codespine/tasks.py +137 -0
  13. {codespine-1.0.8 → codespine-1.0.10}/codespine.egg-info/PKG-INFO +35 -10
  14. {codespine-1.0.8 → codespine-1.0.10}/codespine.egg-info/SOURCES.txt +5 -1
  15. {codespine-1.0.8 → codespine-1.0.10}/codespine.egg-info/requires.txt +2 -0
  16. {codespine-1.0.8 → codespine-1.0.10}/pyproject.toml +5 -1
  17. {codespine-1.0.8 → codespine-1.0.10}/tests/test_call_resolver.py +34 -0
  18. {codespine-1.0.8 → codespine-1.0.10}/tests/test_cypher_compat.py +25 -2
  19. codespine-1.0.10/tests/test_health.py +77 -0
  20. codespine-1.0.10/tests/test_tasks.py +34 -0
  21. {codespine-1.0.8 → codespine-1.0.10}/LICENSE +0 -0
  22. {codespine-1.0.8 → codespine-1.0.10}/codespine/analysis/__init__.py +0 -0
  23. {codespine-1.0.8 → codespine-1.0.10}/codespine/analysis/community.py +0 -0
  24. {codespine-1.0.8 → codespine-1.0.10}/codespine/analysis/context.py +0 -0
  25. {codespine-1.0.8 → codespine-1.0.10}/codespine/analysis/coupling.py +0 -0
  26. {codespine-1.0.8 → codespine-1.0.10}/codespine/analysis/crossmodule.py +0 -0
  27. {codespine-1.0.8 → codespine-1.0.10}/codespine/analysis/deadcode.py +0 -0
  28. {codespine-1.0.8 → codespine-1.0.10}/codespine/analysis/flow.py +0 -0
  29. {codespine-1.0.8 → codespine-1.0.10}/codespine/analysis/impact.py +0 -0
  30. {codespine-1.0.8 → codespine-1.0.10}/codespine/cache/__init__.py +0 -0
  31. {codespine-1.0.8 → codespine-1.0.10}/codespine/cache/result_cache.py +0 -0
  32. {codespine-1.0.8 → codespine-1.0.10}/codespine/db/__init__.py +0 -0
  33. {codespine-1.0.8 → codespine-1.0.10}/codespine/db/schema.py +0 -0
  34. {codespine-1.0.8 → codespine-1.0.10}/codespine/db/store.py +0 -0
  35. {codespine-1.0.8 → codespine-1.0.10}/codespine/diff/__init__.py +0 -0
  36. {codespine-1.0.8 → codespine-1.0.10}/codespine/diff/branch_diff.py +0 -0
  37. {codespine-1.0.8 → codespine-1.0.10}/codespine/guide.py +0 -0
  38. {codespine-1.0.8 → codespine-1.0.10}/codespine/indexer/__init__.py +0 -0
  39. {codespine-1.0.8 → codespine-1.0.10}/codespine/indexer/di_resolver.py +0 -0
  40. {codespine-1.0.8 → codespine-1.0.10}/codespine/indexer/java_parser.py +0 -0
  41. {codespine-1.0.8 → codespine-1.0.10}/codespine/indexer/symbol_builder.py +0 -0
  42. {codespine-1.0.8 → codespine-1.0.10}/codespine/mcp/__init__.py +0 -0
  43. {codespine-1.0.8 → codespine-1.0.10}/codespine/noise/__init__.py +0 -0
  44. {codespine-1.0.8 → codespine-1.0.10}/codespine/noise/blocklist.py +0 -0
  45. {codespine-1.0.8 → codespine-1.0.10}/codespine/overlay/__init__.py +0 -0
  46. {codespine-1.0.8 → codespine-1.0.10}/codespine/overlay/git_state.py +0 -0
  47. {codespine-1.0.8 → codespine-1.0.10}/codespine/overlay/merge.py +0 -0
  48. {codespine-1.0.8 → codespine-1.0.10}/codespine/overlay/store.py +0 -0
  49. {codespine-1.0.8 → codespine-1.0.10}/codespine/search/__init__.py +0 -0
  50. {codespine-1.0.8 → codespine-1.0.10}/codespine/search/bm25.py +0 -0
  51. {codespine-1.0.8 → codespine-1.0.10}/codespine/search/fuzzy.py +0 -0
  52. {codespine-1.0.8 → codespine-1.0.10}/codespine/search/hybrid.py +0 -0
  53. {codespine-1.0.8 → codespine-1.0.10}/codespine/search/rrf.py +0 -0
  54. {codespine-1.0.8 → codespine-1.0.10}/codespine/search/vector.py +0 -0
  55. {codespine-1.0.8 → codespine-1.0.10}/codespine/sharding/__init__.py +0 -0
  56. {codespine-1.0.8 → codespine-1.0.10}/codespine/sharding/router.py +0 -0
  57. {codespine-1.0.8 → codespine-1.0.10}/codespine/sharding/store.py +0 -0
  58. {codespine-1.0.8 → codespine-1.0.10}/codespine/watch/__init__.py +0 -0
  59. {codespine-1.0.8 → codespine-1.0.10}/codespine/watch/git_hook.py +0 -0
  60. {codespine-1.0.8 → codespine-1.0.10}/codespine/watch/watcher.py +0 -0
  61. {codespine-1.0.8 → codespine-1.0.10}/codespine.egg-info/dependency_links.txt +0 -0
  62. {codespine-1.0.8 → codespine-1.0.10}/codespine.egg-info/entry_points.txt +0 -0
  63. {codespine-1.0.8 → codespine-1.0.10}/codespine.egg-info/top_level.txt +0 -0
  64. {codespine-1.0.8 → codespine-1.0.10}/gindex.py +0 -0
  65. {codespine-1.0.8 → codespine-1.0.10}/setup.cfg +0 -0
  66. {codespine-1.0.8 → codespine-1.0.10}/tests/test_branch_diff_normalize.py +0 -0
  67. {codespine-1.0.8 → codespine-1.0.10}/tests/test_community_detection.py +0 -0
  68. {codespine-1.0.8 → codespine-1.0.10}/tests/test_deadcode.py +0 -0
  69. {codespine-1.0.8 → codespine-1.0.10}/tests/test_duckdb_store.py +0 -0
  70. {codespine-1.0.8 → codespine-1.0.10}/tests/test_index_and_hybrid.py +0 -0
  71. {codespine-1.0.8 → codespine-1.0.10}/tests/test_java_parser.py +0 -0
  72. {codespine-1.0.8 → codespine-1.0.10}/tests/test_multimodule_index.py +0 -0
  73. {codespine-1.0.8 → codespine-1.0.10}/tests/test_overlay.py +0 -0
  74. {codespine-1.0.8 → codespine-1.0.10}/tests/test_parse_resilience.py +0 -0
  75. {codespine-1.0.8 → codespine-1.0.10}/tests/test_result_cache.py +0 -0
  76. {codespine-1.0.8 → codespine-1.0.10}/tests/test_search_ranking.py +0 -0
  77. {codespine-1.0.8 → codespine-1.0.10}/tests/test_sharding.py +0 -0
  78. {codespine-1.0.8 → codespine-1.0.10}/tests/test_store_recovery.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codespine
3
- Version: 1.0.8
3
+ Version: 1.0.10
4
4
  Summary: Local Java code intelligence indexer backed by a graph database
5
5
  Author: CodeSpine contributors
6
6
  License: MIT License
@@ -56,6 +56,7 @@ Requires-Dist: numpy; extra == "ml"
56
56
  Provides-Extra: community
57
57
  Requires-Dist: igraph; extra == "community"
58
58
  Requires-Dist: leidenalg; extra == "community"
59
+ Provides-Extra: ui
59
60
  Provides-Extra: full
60
61
  Requires-Dist: sentence-transformers; extra == "full"
61
62
  Requires-Dist: numpy; extra == "full"
@@ -65,7 +66,7 @@ Dynamic: license-file
65
66
 
66
67
  # CodeSpine
67
68
 
68
- **v1.0.0** — Local Java code intelligence for coding agents, backed by a graph database.
69
+ **v1.0.10** — Local Java code intelligence for coding agents, backed by a graph database.
69
70
 
70
71
  CodeSpine cuts token burn for coding agents working on Java codebases.
71
72
 
@@ -95,12 +96,22 @@ File changes are written directly to the graph and are immediately queryable —
95
96
  pip install codespine
96
97
  ```
97
98
 
99
+ Default install includes the CLI, MCP server, Java indexer, watch mode, health checks, background task tracking, and graph/search commands.
100
+
98
101
  Optional semantic search (sentence-transformers):
99
102
 
100
103
  ```bash
101
104
  pip install "codespine[ml]"
102
105
  ```
103
106
 
107
+ Add the local index explorer UI:
108
+
109
+ ```bash
110
+ pip install "codespine[ui]"
111
+ ```
112
+
113
+ The current lite UI is dependency-free and served locally by CodeSpine; the `ui` extra is the stable add-on install target for the browser explorer.
114
+
104
115
  Everything at once (ml + community detection):
105
116
 
106
117
  ```bash
@@ -124,8 +135,7 @@ Downloads and caches the embedding model. Only needed once. After this, `--embed
124
135
  codespine analyse /path/to/java-project
125
136
 
126
137
  # 2. (Optional) Run the expensive deep passes: communities, flows, dead code, coupling
127
- # Auto-enabled for repos with ≤ 3,000 files; use --deep to force on larger repos.
128
- codespine analyse /path/to/java-project --deep
138
+ codespine analyse /path/to/java-project --complete --deep
129
139
 
130
140
  # 3. (Optional) Add semantic embeddings for concept-level search
131
141
  codespine analyse /path/to/java-project --embed
@@ -150,6 +160,8 @@ Detecting execution flows... 34 processes found
150
160
  Finding dead code... 12 unreachable symbols
151
161
  Analyzing git history... 18 coupled file pairs
152
162
  Generating embeddings... 623 vectors stored
163
+ Index self-test... passed
164
+ Index health... no anomalies
153
165
 
154
166
  Done in 4.2s — 623 symbols, 1,847 edges, 8 clusters, 34 flows
155
167
  Publishing read replica... MCP will reload automatically
@@ -313,10 +325,17 @@ Higher-level tools designed to answer full agent questions in a single call, wit
313
325
  # Indexing
314
326
  codespine analyse <path> # incremental index (default)
315
327
  codespine analyse <path> --full # full re-index from scratch
316
- codespine analyse <path> --deep # + communities, flows, dead code, coupling
317
- codespine analyse <path> --incremental-deep # incremental index + force deep passes
328
+ codespine analyse <path> --budget 90 # fast index with a resolver deadline
329
+ codespine analyse <path> --complete --deep # + communities, flows, dead code, coupling
330
+ codespine analyse <path> --complete --incremental-deep
318
331
  codespine analyse <path> --embed # + vector embeddings
319
332
 
333
+ # Background jobs and local UI
334
+ codespine background # background task progress
335
+ codespine tasks # running/recent background work
336
+ codespine ui # local read-only index explorer
337
+ codespine ui --open # open http://127.0.0.1:8765
338
+
320
339
  # Live watch
321
340
  codespine watch --path . # file-save-triggered direct-to-graph writes
322
341
  codespine watch --path . --install-hook # also install post-commit git hook
@@ -334,6 +353,8 @@ codespine diff main..feature # symbol-level branch diff
334
353
 
335
354
  # Status & Info
336
355
  codespine stats # per-project stats (--shards for shard layout)
356
+ codespine health # index coverage and anomaly dashboard
357
+ codespine self-test # smoke queries for schema/translator checks
337
358
  codespine list # indexed projects
338
359
  codespine status # service and database status
339
360
  codespine guide # tool catalog and workflows
@@ -360,7 +381,7 @@ codespine force-reset # emergency: delete all data files
360
381
 
361
382
  `analyse` defaults to incremental mode. Repeat runs only process changed files and are fast.
362
383
 
363
- Deep analysis (`--deep`) now runs automatically for repos with 3,000 files. For larger repos, pass `--deep` explicitly. Use `--incremental-deep` when you want a fast file-only update but still want communities, flows, dead code, and coupling refreshed.
384
+ `analyse` runs in fast mode by default: it indexes the core graph, publishes that read replica from a detached process, then continues communities, flows, dead code, coupling, and cross-module enrichment in the background. Use `codespine tasks` or `codespine ui` to watch that work. Use `--complete --deep` when you want those passes refreshed before the command returns.
364
385
 
365
386
  ---
366
387
 
@@ -546,12 +567,16 @@ The deep analysis phase covers four passes that are expensive but optional:
546
567
  | Dead code | Finds methods with no callers (Java-aware exemptions) | Cleanup audits |
547
568
  | Change coupling | Analyses git history for co-changed file pairs | `get_change_coupling`, `related` |
548
569
 
549
- **Auto-threshold:** deep analysis runs automatically when the project has 3,000 Java files. Larger repos get lightweight flow/dead-code passes; full deep analysis requires `--deep`.
570
+ **Fast default:** `codespine analyse` prioritizes a queryable core index. Communities, flows, dead-code, git coupling, and cross-module links are queued in a detached background enrichment job unless you use `--complete`.
571
+
572
+ **Health checks:** every analyse run now performs a small self-test query suite and reports index anomalies such as large projects with zero call edges. Use `codespine health` for the terminal dashboard or `codespine self-test --json` in CI.
573
+
574
+ **Background visibility:** `codespine background` shows running background job progress in the terminal, and `codespine tasks` remains available as the shorter registry view. `codespine ui` serves a local read-only index explorer with project counts, index health, and the same background task state at `http://127.0.0.1:8765`.
550
575
 
551
- **Incremental deep:** `--incremental-deep` combines incremental file indexing with a forced full deep pass — useful after large refactors where you want the call graph refreshed quickly but also want updated communities and coupling.
576
+ **Complete deep:** `--complete --deep` runs the expensive enrichment passes before returning. `--complete --incremental-deep` combines incremental file indexing with a forced full deep pass.
552
577
 
553
578
  ```bash
554
- codespine analyse . --incremental-deep
579
+ codespine analyse . --complete --incremental-deep
555
580
  ```
556
581
 
557
582
  **Embeddings** (`--embed`) are independent of deep analysis. Without them, BM25 + fuzzy search still works. Add embeddings when you need concept-level retrieval ("find retry logic", "find payment processing").
@@ -1,6 +1,6 @@
1
1
  # CodeSpine
2
2
 
3
- **v1.0.0** — Local Java code intelligence for coding agents, backed by a graph database.
3
+ **v1.0.10** — Local Java code intelligence for coding agents, backed by a graph database.
4
4
 
5
5
  CodeSpine cuts token burn for coding agents working on Java codebases.
6
6
 
@@ -30,12 +30,22 @@ File changes are written directly to the graph and are immediately queryable —
30
30
  pip install codespine
31
31
  ```
32
32
 
33
+ Default install includes the CLI, MCP server, Java indexer, watch mode, health checks, background task tracking, and graph/search commands.
34
+
33
35
  Optional semantic search (sentence-transformers):
34
36
 
35
37
  ```bash
36
38
  pip install "codespine[ml]"
37
39
  ```
38
40
 
41
+ Add the local index explorer UI:
42
+
43
+ ```bash
44
+ pip install "codespine[ui]"
45
+ ```
46
+
47
+ The current lite UI is dependency-free and served locally by CodeSpine; the `ui` extra is the stable add-on install target for the browser explorer.
48
+
39
49
  Everything at once (ml + community detection):
40
50
 
41
51
  ```bash
@@ -59,8 +69,7 @@ Downloads and caches the embedding model. Only needed once. After this, `--embed
59
69
  codespine analyse /path/to/java-project
60
70
 
61
71
  # 2. (Optional) Run the expensive deep passes: communities, flows, dead code, coupling
62
- # Auto-enabled for repos with ≤ 3,000 files; use --deep to force on larger repos.
63
- codespine analyse /path/to/java-project --deep
72
+ codespine analyse /path/to/java-project --complete --deep
64
73
 
65
74
  # 3. (Optional) Add semantic embeddings for concept-level search
66
75
  codespine analyse /path/to/java-project --embed
@@ -85,6 +94,8 @@ Detecting execution flows... 34 processes found
85
94
  Finding dead code... 12 unreachable symbols
86
95
  Analyzing git history... 18 coupled file pairs
87
96
  Generating embeddings... 623 vectors stored
97
+ Index self-test... passed
98
+ Index health... no anomalies
88
99
 
89
100
  Done in 4.2s — 623 symbols, 1,847 edges, 8 clusters, 34 flows
90
101
  Publishing read replica... MCP will reload automatically
@@ -248,10 +259,17 @@ Higher-level tools designed to answer full agent questions in a single call, wit
248
259
  # Indexing
249
260
  codespine analyse <path> # incremental index (default)
250
261
  codespine analyse <path> --full # full re-index from scratch
251
- codespine analyse <path> --deep # + communities, flows, dead code, coupling
252
- codespine analyse <path> --incremental-deep # incremental index + force deep passes
262
+ codespine analyse <path> --budget 90 # fast index with a resolver deadline
263
+ codespine analyse <path> --complete --deep # + communities, flows, dead code, coupling
264
+ codespine analyse <path> --complete --incremental-deep
253
265
  codespine analyse <path> --embed # + vector embeddings
254
266
 
267
+ # Background jobs and local UI
268
+ codespine background # background task progress
269
+ codespine tasks # running/recent background work
270
+ codespine ui # local read-only index explorer
271
+ codespine ui --open # open http://127.0.0.1:8765
272
+
255
273
  # Live watch
256
274
  codespine watch --path . # file-save-triggered direct-to-graph writes
257
275
  codespine watch --path . --install-hook # also install post-commit git hook
@@ -269,6 +287,8 @@ codespine diff main..feature # symbol-level branch diff
269
287
 
270
288
  # Status & Info
271
289
  codespine stats # per-project stats (--shards for shard layout)
290
+ codespine health # index coverage and anomaly dashboard
291
+ codespine self-test # smoke queries for schema/translator checks
272
292
  codespine list # indexed projects
273
293
  codespine status # service and database status
274
294
  codespine guide # tool catalog and workflows
@@ -295,7 +315,7 @@ codespine force-reset # emergency: delete all data files
295
315
 
296
316
  `analyse` defaults to incremental mode. Repeat runs only process changed files and are fast.
297
317
 
298
- Deep analysis (`--deep`) now runs automatically for repos with 3,000 files. For larger repos, pass `--deep` explicitly. Use `--incremental-deep` when you want a fast file-only update but still want communities, flows, dead code, and coupling refreshed.
318
+ `analyse` runs in fast mode by default: it indexes the core graph, publishes that read replica from a detached process, then continues communities, flows, dead code, coupling, and cross-module enrichment in the background. Use `codespine tasks` or `codespine ui` to watch that work. Use `--complete --deep` when you want those passes refreshed before the command returns.
299
319
 
300
320
  ---
301
321
 
@@ -481,12 +501,16 @@ The deep analysis phase covers four passes that are expensive but optional:
481
501
  | Dead code | Finds methods with no callers (Java-aware exemptions) | Cleanup audits |
482
502
  | Change coupling | Analyses git history for co-changed file pairs | `get_change_coupling`, `related` |
483
503
 
484
- **Auto-threshold:** deep analysis runs automatically when the project has 3,000 Java files. Larger repos get lightweight flow/dead-code passes; full deep analysis requires `--deep`.
504
+ **Fast default:** `codespine analyse` prioritizes a queryable core index. Communities, flows, dead-code, git coupling, and cross-module links are queued in a detached background enrichment job unless you use `--complete`.
505
+
506
+ **Health checks:** every analyse run now performs a small self-test query suite and reports index anomalies such as large projects with zero call edges. Use `codespine health` for the terminal dashboard or `codespine self-test --json` in CI.
507
+
508
+ **Background visibility:** `codespine background` shows running background job progress in the terminal, and `codespine tasks` remains available as the shorter registry view. `codespine ui` serves a local read-only index explorer with project counts, index health, and the same background task state at `http://127.0.0.1:8765`.
485
509
 
486
- **Incremental deep:** `--incremental-deep` combines incremental file indexing with a forced full deep pass — useful after large refactors where you want the call graph refreshed quickly but also want updated communities and coupling.
510
+ **Complete deep:** `--complete --deep` runs the expensive enrichment passes before returning. `--complete --incremental-deep` combines incremental file indexing with a forced full deep pass.
487
511
 
488
512
  ```bash
489
- codespine analyse . --incremental-deep
513
+ codespine analyse . --complete --incremental-deep
490
514
  ```
491
515
 
492
516
  **Embeddings** (`--embed`) are independent of deep analysis. Without them, BM25 + fuzzy search still works. Add embeddings when you need concept-level retrieval ("find retry logic", "find payment processing").
@@ -1,4 +1,4 @@
1
1
  """CodeSpine package."""
2
2
 
3
3
  __all__ = ["__version__"]
4
- __version__ = "1.0.8"
4
+ __version__ = "1.0.10"