codingest 0.2.2__tar.gz → 0.2.3__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 (97) hide show
  1. {codingest-0.2.2 → codingest-0.2.3}/Cargo.lock +30 -8
  2. {codingest-0.2.2 → codingest-0.2.3}/Cargo.toml +24 -8
  3. {codingest-0.2.2 → codingest-0.2.3}/PKG-INFO +10 -9
  4. {codingest-0.2.2 → codingest-0.2.3}/README.md +8 -7
  5. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/Cargo.toml +6 -1
  6. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/bin/codingest_stats.rs +2 -2
  7. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/builder/load.rs +17 -1
  8. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/builder/mod.rs +289 -26
  9. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/builder/other_edges.rs +729 -12
  10. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/builder/routes/fastapi.rs +19 -9
  11. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/builder/routes/flask.rs +20 -9
  12. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/builder/routes/mod.rs +144 -9
  13. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/cross_lang.rs +2 -2
  14. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/docs/mod.rs +8 -8
  15. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/agc.rs +2 -2
  16. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/cpp.rs +40 -5
  17. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/csharp.rs +1 -4
  18. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/dart.rs +119 -22
  19. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/go.rs +5 -2
  20. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/java.rs +4 -1
  21. codingest-0.2.3/crates/codingest/src/parsers/julia.rs +1094 -0
  22. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/mod.rs +2 -0
  23. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/python.rs +195 -21
  24. codingest-0.2.3/crates/codingest/src/parsers/r.rs +827 -0
  25. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/registry.rs +74 -3
  26. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/rust_lang.rs +73 -11
  27. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/shared.rs +21 -1
  28. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/typescript.rs +1 -4
  29. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/rev.rs +32 -16
  30. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/tests/goldens/README.md +38 -0
  31. codingest-0.2.3/crates/codingest/tests/goldens/cpp_include.sha256 +1 -0
  32. codingest-0.2.3/crates/codingest/tests/goldens/cross_ts_py.sha256 +1 -0
  33. codingest-0.2.3/crates/codingest/tests/goldens/dart_import.sha256 +1 -0
  34. codingest-0.2.3/crates/codingest/tests/goldens/julia_basic.sha256 +1 -0
  35. codingest-0.2.3/crates/codingest/tests/goldens/py_import.sha256 +1 -0
  36. codingest-0.2.3/crates/codingest/tests/goldens/py_nested_defs.sha256 +1 -0
  37. codingest-0.2.3/crates/codingest/tests/goldens/py_routes_dup.sha256 +1 -0
  38. codingest-0.2.3/crates/codingest/tests/goldens/r_basic.sha256 +1 -0
  39. codingest-0.2.3/crates/codingest/tests/goldens/rust_import.sha256 +1 -0
  40. codingest-0.2.3/crates/codingest/tests/grammar_kinds.rs +180 -0
  41. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/tests/parity.rs +82 -4
  42. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-cli/Cargo.toml +1 -1
  43. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-cli/src/code_tree_cli.rs +25 -0
  44. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-cli/tests/exit_codes.rs +34 -0
  45. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-mcp/Cargo.toml +1 -1
  46. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-py/Cargo.toml +3 -3
  47. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-py/src/lib.rs +9 -3
  48. {codingest-0.2.2 → codingest-0.2.3}/pyproject.toml +2 -2
  49. codingest-0.2.2/crates/codingest/tests/goldens/cross_ts_py.sha256 +0 -1
  50. codingest-0.2.2/crates/codingest/tests/goldens/py_nested_defs.sha256 +0 -1
  51. codingest-0.2.2/crates/codingest/tests/goldens/py_routes_dup.sha256 +0 -1
  52. {codingest-0.2.2 → codingest-0.2.3}/LICENSE +0 -0
  53. {codingest-0.2.2 → codingest-0.2.3}/codingest/__init__.py +0 -0
  54. {codingest-0.2.2 → codingest-0.2.3}/codingest/__init__.pyi +0 -0
  55. {codingest-0.2.2 → codingest-0.2.3}/codingest/cli.py +0 -0
  56. {codingest-0.2.2 → codingest-0.2.3}/codingest/mcp_server.py +0 -0
  57. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/bin/codingest_bench.rs +0 -0
  58. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/builder/call_edges.rs +0 -0
  59. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/builder/js_workspace.rs +0 -0
  60. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/builder/load/edge_frames.rs +0 -0
  61. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/builder/load/entity_frames.rs +0 -0
  62. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/builder/routes/django.rs +0 -0
  63. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/builder/semantic_edges.rs +0 -0
  64. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/builder/type_edges.rs +0 -0
  65. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/docs/rst.rs +0 -0
  66. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/lib.rs +0 -0
  67. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/manifest/mod.rs +0 -0
  68. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/models.rs +0 -0
  69. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/css.rs +0 -0
  70. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/html.rs +0 -0
  71. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/php.rs +0 -0
  72. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/parsers/swift.rs +0 -0
  73. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/src/repo.rs +0 -0
  74. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/tests/agc_apollo.rs +0 -0
  75. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/tests/goldens/agc_basic.sha256 +0 -0
  76. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/tests/goldens/docs_ext_collide.sha256 +0 -0
  77. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/tests/goldens/docs_mdx.sha256 +0 -0
  78. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/tests/goldens/dup_minified_assets.sha256 +0 -0
  79. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/tests/goldens/html_js_lang_group.sha256 +0 -0
  80. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/tests/goldens/py_basic.sha256 +0 -0
  81. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/tests/goldens/py_inheritance.sha256 +0 -0
  82. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/tests/goldens/rust_xfile.sha256 +0 -0
  83. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/tests/goldens/ts_callback.sha256 +0 -0
  84. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/tests/goldens/ts_closure_scope.sha256 +0 -0
  85. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/tests/goldens/ts_hof_binding.sha256 +0 -0
  86. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest/tests/goldens/ts_monorepo.sha256 +0 -0
  87. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-cli/skills/codingest-code-review/SKILL.md +0 -0
  88. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-cli/skills/codingest-code-review/references/mcp-upgrade.md +0 -0
  89. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-cli/skills/codingest-code-review/references/public-repositories.md +0 -0
  90. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-cli/skills/codingest-code-review/references/queries.md +0 -0
  91. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-cli/src/lib.rs +0 -0
  92. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-cli/src/main.rs +0 -0
  93. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-cli/src/query.rs +0 -0
  94. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-cli/src/skill.rs +0 -0
  95. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-cli/src/skill_assets.rs +0 -0
  96. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-mcp/src/lib.rs +0 -0
  97. {codingest-0.2.2 → codingest-0.2.3}/crates/codingest-mcp/src/main.rs +0 -0
@@ -308,7 +308,7 @@ dependencies = [
308
308
 
309
309
  [[package]]
310
310
  name = "codingest"
311
- version = "0.2.2"
311
+ version = "0.2.3"
312
312
  dependencies = [
313
313
  "aho-corasick",
314
314
  "base64 0.22.1",
@@ -330,8 +330,10 @@ dependencies = [
330
330
  "tree-sitter-html",
331
331
  "tree-sitter-java",
332
332
  "tree-sitter-javascript",
333
+ "tree-sitter-julia",
333
334
  "tree-sitter-php",
334
335
  "tree-sitter-python",
336
+ "tree-sitter-r",
335
337
  "tree-sitter-rust",
336
338
  "tree-sitter-swift",
337
339
  "tree-sitter-typescript",
@@ -340,7 +342,7 @@ dependencies = [
340
342
 
341
343
  [[package]]
342
344
  name = "codingest-cli"
343
- version = "0.2.2"
345
+ version = "0.2.3"
344
346
  dependencies = [
345
347
  "anyhow",
346
348
  "clap",
@@ -352,7 +354,7 @@ dependencies = [
352
354
 
353
355
  [[package]]
354
356
  name = "codingest-mcp"
355
- version = "0.2.2"
357
+ version = "0.2.3"
356
358
  dependencies = [
357
359
  "anyhow",
358
360
  "codingest",
@@ -361,7 +363,7 @@ dependencies = [
361
363
 
362
364
  [[package]]
363
365
  name = "codingest-py"
364
- version = "0.2.2"
366
+ version = "0.2.3"
365
367
  dependencies = [
366
368
  "codingest",
367
369
  "codingest-cli",
@@ -1388,9 +1390,9 @@ dependencies = [
1388
1390
 
1389
1391
  [[package]]
1390
1392
  name = "kglite"
1391
- version = "0.15.13"
1393
+ version = "0.16.1"
1392
1394
  source = "registry+https://github.com/rust-lang/crates.io-index"
1393
- checksum = "30cb58ba44e467d5f0892ad1d2ccb70747b0b72c9e6264d3516fd179eb4e7d7c"
1395
+ checksum = "929b7d190017068c56ffd40e74f3f8eebd5ddf57c5da6f17d33ab4f5aa30bc10"
1394
1396
  dependencies = [
1395
1397
  "bzip2",
1396
1398
  "chrono",
@@ -1423,9 +1425,9 @@ dependencies = [
1423
1425
 
1424
1426
  [[package]]
1425
1427
  name = "kglite-mcp-server"
1426
- version = "0.15.13"
1428
+ version = "0.16.1"
1427
1429
  source = "registry+https://github.com/rust-lang/crates.io-index"
1428
- checksum = "7a5d069a5d728179b2b5e7045caa3e0e4ad1d81e6220d33d7b7de8d32b988334"
1430
+ checksum = "f2dc4bfa9bc451a1d9c18768216a7fe1d8a68f9bab6ed6375365ce75c90c163e"
1429
1431
  dependencies = [
1430
1432
  "anyhow",
1431
1433
  "bytes",
@@ -2739,6 +2741,16 @@ dependencies = [
2739
2741
  "tree-sitter-language",
2740
2742
  ]
2741
2743
 
2744
+ [[package]]
2745
+ name = "tree-sitter-julia"
2746
+ version = "0.23.1"
2747
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2748
+ checksum = "4144731a178812ee867619b1e98b3b91e54c1652304b26e5ebe3175b701de323"
2749
+ dependencies = [
2750
+ "cc",
2751
+ "tree-sitter-language",
2752
+ ]
2753
+
2742
2754
  [[package]]
2743
2755
  name = "tree-sitter-language"
2744
2756
  version = "0.1.7"
@@ -2765,6 +2777,16 @@ dependencies = [
2765
2777
  "tree-sitter-language",
2766
2778
  ]
2767
2779
 
2780
+ [[package]]
2781
+ name = "tree-sitter-r"
2782
+ version = "1.3.0"
2783
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2784
+ checksum = "ffc9954ec870dcad6cffdd302b405306c68cf031ed79a78cd9746f6740d9fe20"
2785
+ dependencies = [
2786
+ "cc",
2787
+ "tree-sitter-language",
2788
+ ]
2789
+
2768
2790
  [[package]]
2769
2791
  name = "tree-sitter-rust"
2770
2792
  version = "0.24.2"
@@ -3,7 +3,7 @@ members = ["crates/codingest", "crates/codingest-cli", "crates/codingest-mcp", "
3
3
  resolver = "2"
4
4
 
5
5
  [workspace.package]
6
- version = "0.2.2"
6
+ version = "0.2.3"
7
7
  edition = "2021"
8
8
  rust-version = "1.88"
9
9
  license = "MIT"
@@ -12,11 +12,27 @@ repository = "https://github.com/kkollsga/codingest"
12
12
  [workspace.dependencies]
13
13
  base64 = "0.22"
14
14
  sha2 = "0.11"
15
- # kglite engine + MCP server — imported as crates.io libraries. The 0.15.13
16
- # floor adds 0.15.13's planner fix for joins filtered on a type's title/id field
17
- # (anchored traversals 5.7-327x faster here; see BENCHMARKS.md 0.2.1) on top of
18
- # the 0.15.11 floor, which brought three things, only one of which changed what
19
- # we run:
15
+ # kglite engine + MCP server — imported as crates.io libraries. The 0.16.1
16
+ # floor picks up the wire-JSON break (kglite_value_to_json emits real JSON for
17
+ # nine variants our CLI renders through it, so expectations pin the NEW
18
+ # shapes and an older engine would fail them) on top of the 0.16.0
19
+ # base, which is a HARD floor, not a preference: 0.16.0 writes `.kgl` container v6,
20
+ # which kglite 0.15.14 and earlier refuse by version number. Because
21
+ # `codingest.build()` writes the bytes with the Rust engine compiled in here and
22
+ # reads them back through the separately-installed Python `kglite` wheel, the
23
+ # two sides must be on the same side of that break — hence `>=0.16.1,<0.17` in
24
+ # pyproject.toml, and hence a reader on 0.15.x is not "old but workable", it is
25
+ # a hard failure with `FileFormatError`.
26
+ # 0.16.0 also removed `DirGraph::enable_columnar` from the public API (every
27
+ # graph is columnar from its first node now); the two sites that open-coded
28
+ # `prepare_save` + `enable_columnar` before a `.kgl` write moved to the
29
+ # purpose-built `kglite::api::io::prepare_kgl_write`, which also keeps the
30
+ # graph's copy-on-write lineage across that mutation — our `Arc::make_mut`
31
+ # spelling did not.
32
+ # It sits on top of the 0.15.13 floor, which added a planner fix for joins
33
+ # filtered on a type's title/id field (anchored traversals 5.7-327x faster here;
34
+ # see BENCHMARKS.md 0.2.1), and the 0.15.11 floor before it, which brought three
35
+ # things, only one of which changed what we run:
20
36
  # * 0.15.10's `add_connections` resolves its edge-property columns once per
21
37
  # call instead of once per cell — upstream measured 66.7ms -> 30.4ms
22
38
  # (-54%) on 60k edges x 10 property columns. That is exactly the shape of
@@ -69,8 +85,8 @@ sha2 = "0.11"
69
85
  # and no disk storage. Neither 0.15.7 nor 0.15.8 changes the `kglite::api` we
70
86
  # call, graph output, property encoding, or `.kgl` serialization.
71
87
  # Keep both libraries aligned so the graph and server share one engine release.
72
- kglite = { version = "0.15.13", default-features = false }
73
- kglite-mcp-server = { version = "0.15.13", default-features = false }
88
+ kglite = { version = "0.16.1", default-features = false }
89
+ kglite-mcp-server = { version = "0.16.1", default-features = false }
74
90
 
75
91
  # Mirror KGLite's release codegen so the standalone builder has
76
92
  # performance parity with the in-tree component (see KGLite
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codingest
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Classifier: Development Status :: 3 - Alpha
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: Programming Language :: Python :: 3
@@ -12,7 +12,7 @@ Classifier: Programming Language :: Python :: 3.14
12
12
  Classifier: Programming Language :: Rust
13
13
  Classifier: Topic :: Software Development
14
14
  Classifier: Topic :: Software Development :: Libraries
15
- Requires-Dist: kglite>=0.15.13,<0.16
15
+ Requires-Dist: kglite>=0.16.1,<0.17
16
16
  License-File: LICENSE
17
17
  Summary: Build fast, queryable code graphs for AI agents, MCP code review, and local or GitHub repository analysis.
18
18
  Keywords: ai-agents,mcp,code-review,knowledge-graph,code-analysis,github,tree-sitter,cypher
@@ -53,7 +53,7 @@ graph.cypher("MATCH (f:Function) RETURN f.name LIMIT 10")
53
53
  ```
54
54
 
55
55
  No language servers, databases, or repository-specific build steps are
56
- required. The native Rust builder bundles parsers for 15 languages and returns
56
+ required. The native Rust builder bundles parsers for 17 languages and returns
57
57
  a real `kglite.KnowledgeGraph`, ready for Cypher queries.
58
58
 
59
59
  ## Built for agents and code analysis
@@ -69,8 +69,9 @@ a real `kglite.KnowledgeGraph`, ready for Cypher queries.
69
69
  - **Open-source intelligence:** clone and analyse a GitHub repository with one
70
70
  Python call, or let an agent manage cached public repositories through MCP.
71
71
  - **Polyglot by default:** one graph across Python, Rust, TypeScript,
72
- JavaScript, Java, Go, C/C++, C#, Swift, PHP, HTML, CSS, Dart, and AGC
73
- assembly.
72
+ JavaScript, Java, Go, C/C++, C#, Swift, PHP, HTML, CSS, Dart, Julia, R,
73
+ and AGC assembly — capabilities per language in
74
+ [docs/languages.md](docs/languages.md).
74
75
  - **Revision-aware:** analyse a tag, branch, commit, or multiple revisions in
75
76
  one graph and query what changed.
76
77
 
@@ -191,7 +192,7 @@ codingest skill install # code-review Agent Skill
191
192
  ```
192
193
 
193
194
  The wheel bundles every grammar plus the `codingest` and `codingest-mcp`
194
- commands. KGLite ≥0.15.13 is installed automatically as the query/storage
195
+ commands. KGLite ≥0.16.1 is installed automatically as the query/storage
195
196
  engine; its MCP server and the transitive `mcp-methods` framework power the
196
197
  builder-aware Codingest server. Nothing else needs to be installed.
197
198
 
@@ -203,8 +204,8 @@ Python prerequisites.
203
204
 
204
205
  ```toml
205
206
  [dependencies]
206
- codingest = "0.1"
207
- kglite = "0.15.13"
207
+ codingest = "0.2"
208
+ kglite = "0.16.1"
208
209
  ```
209
210
 
210
211
  ```rust
@@ -276,7 +277,7 @@ diagnostic.
276
277
  ## Dependency policy
277
278
 
278
279
  `kglite` and `kglite-mcp-server` use matching crates.io requirements with a
279
- 0.15.13 minimum and a shared lockfile. This keeps the builder, persistence
280
+ 0.16.1 minimum and a shared lockfile. This keeps the builder, persistence
280
281
  handoff, and embedded MCP server on one compatible engine patch line.
281
282
 
282
283
  ## Parity with the (now-removed) in-tree component
@@ -26,7 +26,7 @@ graph.cypher("MATCH (f:Function) RETURN f.name LIMIT 10")
26
26
  ```
27
27
 
28
28
  No language servers, databases, or repository-specific build steps are
29
- required. The native Rust builder bundles parsers for 15 languages and returns
29
+ required. The native Rust builder bundles parsers for 17 languages and returns
30
30
  a real `kglite.KnowledgeGraph`, ready for Cypher queries.
31
31
 
32
32
  ## Built for agents and code analysis
@@ -42,8 +42,9 @@ a real `kglite.KnowledgeGraph`, ready for Cypher queries.
42
42
  - **Open-source intelligence:** clone and analyse a GitHub repository with one
43
43
  Python call, or let an agent manage cached public repositories through MCP.
44
44
  - **Polyglot by default:** one graph across Python, Rust, TypeScript,
45
- JavaScript, Java, Go, C/C++, C#, Swift, PHP, HTML, CSS, Dart, and AGC
46
- assembly.
45
+ JavaScript, Java, Go, C/C++, C#, Swift, PHP, HTML, CSS, Dart, Julia, R,
46
+ and AGC assembly — capabilities per language in
47
+ [docs/languages.md](docs/languages.md).
47
48
  - **Revision-aware:** analyse a tag, branch, commit, or multiple revisions in
48
49
  one graph and query what changed.
49
50
 
@@ -164,7 +165,7 @@ codingest skill install # code-review Agent Skill
164
165
  ```
165
166
 
166
167
  The wheel bundles every grammar plus the `codingest` and `codingest-mcp`
167
- commands. KGLite ≥0.15.13 is installed automatically as the query/storage
168
+ commands. KGLite ≥0.16.1 is installed automatically as the query/storage
168
169
  engine; its MCP server and the transitive `mcp-methods` framework power the
169
170
  builder-aware Codingest server. Nothing else needs to be installed.
170
171
 
@@ -176,8 +177,8 @@ Python prerequisites.
176
177
 
177
178
  ```toml
178
179
  [dependencies]
179
- codingest = "0.1"
180
- kglite = "0.15.13"
180
+ codingest = "0.2"
181
+ kglite = "0.16.1"
181
182
  ```
182
183
 
183
184
  ```rust
@@ -249,7 +250,7 @@ diagnostic.
249
250
  ## Dependency policy
250
251
 
251
252
  `kglite` and `kglite-mcp-server` use matching crates.io requirements with a
252
- 0.15.13 minimum and a shared lockfile. This keeps the builder, persistence
253
+ 0.16.1 minimum and a shared lockfile. This keeps the builder, persistence
253
254
  handoff, and embedded MCP server on one compatible engine patch line.
254
255
 
255
256
  ## Parity with the (now-removed) in-tree component
@@ -10,7 +10,7 @@ keywords = ["knowledge-graph", "code-analysis", "tree-sitter", "cypher", "kglite
10
10
  categories = ["development-tools", "parser-implementations"]
11
11
 
12
12
  # Requires the kglite 0.15 engine API (`kglite::api::code_entities`); the
13
- # workspace pins the current 0.15 patch floor (0.15.13).
13
+ # workspace pins the current engine floor (0.16.1).
14
14
 
15
15
  [lib]
16
16
  name = "codingest"
@@ -63,6 +63,11 @@ tree-sitter-php = "0.24.2"
63
63
  tree-sitter-html = "0.23.2"
64
64
  tree-sitter-css = "0.25.0"
65
65
  tree-sitter-dart = "0.2.0"
66
+ tree-sitter-r = "1.3.0"
67
+ # 0.23.1 is the newest release (2024-09); it binds via tree-sitter-language
68
+ # 0.1 (runtime-agnostic LanguageFn), so it carries no tree-sitter runtime
69
+ # ceiling and links cleanly against tree-sitter 0.26.
70
+ tree-sitter-julia = "0.23.1"
66
71
  toml = "1.1.3"
67
72
  walkdir = "2.5.0"
68
73
  tempfile = "3.27.0"
@@ -132,7 +132,7 @@ fn edge_breakdown(graph: &DirGraph) -> BTreeMap<String, usize> {
132
132
  let Some((s, t)) = graph.graph.edge_endpoints(e) else {
133
133
  continue;
134
134
  };
135
- let (Some(sn), Some(tn)) = (graph.graph.node_weight(s), graph.graph.node_weight(t)) else {
135
+ let (Some(sn), Some(tn)) = (graph.node_view(s), graph.node_view(t)) else {
136
136
  continue;
137
137
  };
138
138
  let key = edge_breakdown_key(
@@ -577,7 +577,7 @@ mod tests {
577
577
  return None;
578
578
  }
579
579
  let (_, t) = graph.graph.edge_endpoints(e)?;
580
- Some(short_name(&id_string(graph.graph.node_weight(t)?.id())).to_string())
580
+ Some(short_name(&id_string(graph.node_view(t)?.id())).to_string())
581
581
  })
582
582
  .collect();
583
583
  assert!(all.len() > 1, "need several distinct callees to prove sort");
@@ -603,7 +603,7 @@ impl<'a> LoadPipeline<'a> {
603
603
  // detectors live under `builder/routes/`. Adding a new framework is
604
604
  // one new file in that directory plus a line in routes/mod.rs.
605
605
  let (route_nodes, route_edges) =
606
- super::routes::build_routes(&result.functions, &result.constants);
606
+ super::routes::build_routes(&result.files, &result.functions, &result.constants);
607
607
  if !route_nodes.is_empty() {
608
608
  maintain::add_nodes(
609
609
  graph,
@@ -1481,6 +1481,22 @@ mod tests {
1481
1481
  assert!(qnames.contains(&"Foo.Bar.V2"));
1482
1482
  }
1483
1483
 
1484
+ /// AGC's registry `module_sep` is `/` and that is LOAD-BEARING, not a
1485
+ /// typo: the AGC parser emits slash-shaped module paths
1486
+ /// (`"Comanche055/MAIN"`, see `parsers::agc::module_path`), and this is
1487
+ /// the string `build_modules` splits. Its *qualified names* are dotted
1488
+ /// (`"Comanche055.FIRST"`), but qnames never pass through the separator
1489
+ /// fields — they only informed the `LangGroup::PythonJava` placement.
1490
+ /// Switching the field to `.` would collapse the hierarchy below into a
1491
+ /// single unparented `Comanche055/MAIN` module.
1492
+ #[test]
1493
+ fn build_modules_splits_agc_paths_on_slash() {
1494
+ let files = vec![file_with_module("agc", "Comanche055/MAIN")];
1495
+ let modules = build_modules(&files);
1496
+ let qnames: Vec<&str> = modules.iter().map(|m| m.qualified_name.as_str()).collect();
1497
+ assert_eq!(qnames, vec!["Comanche055", "Comanche055/MAIN"]);
1498
+ }
1499
+
1484
1500
  #[test]
1485
1501
  fn is_numeric_segment_detection() {
1486
1502
  assert!(is_numeric_segment("0"));