codingest 0.2.23__tar.gz → 0.2.25__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 (111) hide show
  1. {codingest-0.2.23 → codingest-0.2.25}/Cargo.lock +29 -10
  2. {codingest-0.2.23 → codingest-0.2.25}/Cargo.toml +80 -4
  3. {codingest-0.2.23 → codingest-0.2.25}/PKG-INFO +5 -5
  4. {codingest-0.2.23 → codingest-0.2.25}/README.md +3 -3
  5. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/Cargo.toml +1 -1
  6. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/docs/mod.rs +13 -4
  7. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-cli/Cargo.toml +1 -1
  8. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-cli/skills/codingest-code-review/SKILL.md +1 -1
  9. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-cli/skills/codingest-code-review/references/mcp-upgrade.md +1 -1
  10. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-mcp/Cargo.toml +1 -1
  11. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-mcp/tests/response_contract.rs +1 -1
  12. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-py/Cargo.toml +3 -3
  13. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-py/src/lib.rs +1 -1
  14. {codingest-0.2.23 → codingest-0.2.25}/pyproject.toml +2 -2
  15. {codingest-0.2.23 → codingest-0.2.25}/LICENSE +0 -0
  16. {codingest-0.2.23 → codingest-0.2.25}/codingest/__init__.py +0 -0
  17. {codingest-0.2.23 → codingest-0.2.25}/codingest/__init__.pyi +0 -0
  18. {codingest-0.2.23 → codingest-0.2.25}/codingest/cli.py +0 -0
  19. {codingest-0.2.23 → codingest-0.2.25}/codingest/mcp_server.py +0 -0
  20. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/assets/code_review/recipes.json +0 -0
  21. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/assets/code_review/skill.md +0 -0
  22. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/bin/codingest_bench.rs +0 -0
  23. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/bin/codingest_stats.rs +0 -0
  24. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/builder/call_edges.rs +0 -0
  25. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/builder/js_workspace.rs +0 -0
  26. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/builder/load/edge_frames.rs +0 -0
  27. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/builder/load/entity_frames.rs +0 -0
  28. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/builder/load.rs +0 -0
  29. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/builder/mod.rs +0 -0
  30. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/builder/other_edges.rs +0 -0
  31. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/builder/routes/django.rs +0 -0
  32. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/builder/routes/fastapi.rs +0 -0
  33. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/builder/routes/flask.rs +0 -0
  34. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/builder/routes/mod.rs +0 -0
  35. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/builder/semantic_edges.rs +0 -0
  36. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/builder/type_edges.rs +0 -0
  37. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/cross_lang.rs +0 -0
  38. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/docs/rst.rs +0 -0
  39. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/lib.rs +0 -0
  40. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/manifest/mod.rs +0 -0
  41. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/methodology.rs +0 -0
  42. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/models.rs +0 -0
  43. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/agc.rs +0 -0
  44. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/cpp.rs +0 -0
  45. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/csharp.rs +0 -0
  46. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/css.rs +0 -0
  47. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/dart.rs +0 -0
  48. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/go.rs +0 -0
  49. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/html.rs +0 -0
  50. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/java.rs +0 -0
  51. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/julia.rs +0 -0
  52. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/mod.rs +0 -0
  53. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/php.rs +0 -0
  54. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/python.rs +0 -0
  55. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/r.rs +0 -0
  56. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/registry.rs +0 -0
  57. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/rust_lang.rs +0 -0
  58. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/shared.rs +0 -0
  59. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/swift.rs +0 -0
  60. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/parsers/typescript.rs +0 -0
  61. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/repo.rs +0 -0
  62. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/src/rev.rs +0 -0
  63. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/agc_apollo.rs +0 -0
  64. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/README.md +0 -0
  65. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/agc_basic.sha256 +0 -0
  66. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/cpp_extern_c.sha256 +0 -0
  67. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/cpp_include.sha256 +0 -0
  68. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/cross_ts_py.sha256 +0 -0
  69. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/csharp_using_alias.sha256 +0 -0
  70. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/dart_import.sha256 +0 -0
  71. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/dart_part_of.sha256 +0 -0
  72. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/docs_ext_collide.sha256 +0 -0
  73. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/docs_mdx.sha256 +0 -0
  74. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/dup_minified_assets.sha256 +0 -0
  75. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/go_interface.sha256 +0 -0
  76. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/html_js_lang_group.sha256 +0 -0
  77. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/java_javadoc.sha256 +0 -0
  78. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/julia_basic.sha256 +0 -0
  79. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/php_group_use.sha256 +0 -0
  80. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/py_basic.sha256 +0 -0
  81. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/py_import.sha256 +0 -0
  82. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/py_inheritance.sha256 +0 -0
  83. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/py_nested_defs.sha256 +0 -0
  84. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/py_routes_dup.sha256 +0 -0
  85. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/py_src_layout.sha256 +0 -0
  86. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/r_basic.sha256 +0 -0
  87. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/rust_import.sha256 +0 -0
  88. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/rust_inline_mod.sha256 +0 -0
  89. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/rust_xfile.sha256 +0 -0
  90. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/swift_basic.sha256 +0 -0
  91. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/ts_callback.sha256 +0 -0
  92. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/ts_closure_scope.sha256 +0 -0
  93. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/ts_hof_binding.sha256 +0 -0
  94. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/ts_monorepo.sha256 +0 -0
  95. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/goldens/web_served_root.sha256 +0 -0
  96. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/grammar_kinds.rs +0 -0
  97. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/parity.rs +0 -0
  98. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest/tests/traversal_semantics.rs +0 -0
  99. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-cli/skills/codingest-code-review/references/public-repositories.md +0 -0
  100. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-cli/skills/codingest-code-review/references/queries.md +0 -0
  101. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-cli/src/code_tree_cli.rs +0 -0
  102. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-cli/src/lib.rs +0 -0
  103. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-cli/src/main.rs +0 -0
  104. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-cli/src/query.rs +0 -0
  105. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-cli/src/skill.rs +0 -0
  106. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-cli/src/skill_assets.rs +0 -0
  107. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-cli/tests/embed_skills.rs +0 -0
  108. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-cli/tests/exit_codes.rs +0 -0
  109. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-cli/tests/skill_recipes.rs +0 -0
  110. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-mcp/src/lib.rs +0 -0
  111. {codingest-0.2.23 → codingest-0.2.25}/crates/codingest-mcp/src/main.rs +0 -0
@@ -302,7 +302,7 @@ dependencies = [
302
302
 
303
303
  [[package]]
304
304
  name = "codingest"
305
- version = "0.2.23"
305
+ version = "0.2.25"
306
306
  dependencies = [
307
307
  "aho-corasick",
308
308
  "base64 0.22.1",
@@ -338,7 +338,7 @@ dependencies = [
338
338
 
339
339
  [[package]]
340
340
  name = "codingest-cli"
341
- version = "0.2.23"
341
+ version = "0.2.25"
342
342
  dependencies = [
343
343
  "anyhow",
344
344
  "clap",
@@ -350,7 +350,7 @@ dependencies = [
350
350
 
351
351
  [[package]]
352
352
  name = "codingest-mcp"
353
- version = "0.2.23"
353
+ version = "0.2.25"
354
354
  dependencies = [
355
355
  "anyhow",
356
356
  "codingest",
@@ -361,7 +361,7 @@ dependencies = [
361
361
 
362
362
  [[package]]
363
363
  name = "codingest-py"
364
- version = "0.2.23"
364
+ version = "0.2.25"
365
365
  dependencies = [
366
366
  "codingest",
367
367
  "codingest-cli",
@@ -1368,9 +1368,9 @@ dependencies = [
1368
1368
 
1369
1369
  [[package]]
1370
1370
  name = "kglite"
1371
- version = "0.17.7"
1371
+ version = "0.17.10"
1372
1372
  source = "registry+https://github.com/rust-lang/crates.io-index"
1373
- checksum = "e59bdace8eb48e7db04cdc5c066956f494bbcc6fdddb661b4f09764a49428c4e"
1373
+ checksum = "e14ff39495529815519e61ed78e7cac6aaaa37b5641b79e78693bf7ae0befa98"
1374
1374
  dependencies = [
1375
1375
  "bzip2",
1376
1376
  "chrono",
@@ -1386,6 +1386,7 @@ dependencies = [
1386
1386
  "memmap2",
1387
1387
  "petgraph",
1388
1388
  "postcard",
1389
+ "pulldown-cmark",
1389
1390
  "rayon",
1390
1391
  "regex",
1391
1392
  "rstar 0.13.0",
@@ -1404,11 +1405,12 @@ dependencies = [
1404
1405
 
1405
1406
  [[package]]
1406
1407
  name = "kglite-mcp-server"
1407
- version = "0.17.7"
1408
+ version = "0.17.10"
1408
1409
  source = "registry+https://github.com/rust-lang/crates.io-index"
1409
- checksum = "57a37838e2d50d16363c4dc28d7d9a791d9f7edd374660ddbece6578f5c7601b"
1410
+ checksum = "4fb67310c835576a085fb0f35c6a7e70bfbe2bde663809d9b1d1bbcc55986b00"
1410
1411
  dependencies = [
1411
1412
  "anyhow",
1413
+ "base64 0.22.1",
1412
1414
  "bytes",
1413
1415
  "chrono",
1414
1416
  "clap",
@@ -1510,9 +1512,9 @@ dependencies = [
1510
1512
 
1511
1513
  [[package]]
1512
1514
  name = "mcp-methods"
1513
- version = "0.4.11"
1515
+ version = "0.4.12"
1514
1516
  source = "registry+https://github.com/rust-lang/crates.io-index"
1515
- checksum = "31c5a17334897b67053e843235be8c66610d0c6684c845bea30e70ecff9dd204"
1517
+ checksum = "5bcc5fdac2ffd82893fbc640b569785bdc63ead7f3c6c3d695685b692ddf2d1a"
1516
1518
  dependencies = [
1517
1519
  "anyhow",
1518
1520
  "clap",
@@ -1742,6 +1744,17 @@ dependencies = [
1742
1744
  "cc",
1743
1745
  ]
1744
1746
 
1747
+ [[package]]
1748
+ name = "pulldown-cmark"
1749
+ version = "0.13.4"
1750
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1751
+ checksum = "e9f068eba8e7071c5f9511831b44f32c740d5adf574e990f946ddb53db2f314e"
1752
+ dependencies = [
1753
+ "bitflags",
1754
+ "memchr",
1755
+ "unicase",
1756
+ ]
1757
+
1745
1758
  [[package]]
1746
1759
  name = "pyo3"
1747
1760
  version = "0.29.0"
@@ -2792,6 +2805,12 @@ version = "1.20.1"
2792
2805
  source = "registry+https://github.com/rust-lang/crates.io-index"
2793
2806
  checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
2794
2807
 
2808
+ [[package]]
2809
+ name = "unicase"
2810
+ version = "2.9.0"
2811
+ source = "registry+https://github.com/rust-lang/crates.io-index"
2812
+ checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142"
2813
+
2795
2814
  [[package]]
2796
2815
  name = "unicode-ident"
2797
2816
  version = "1.0.24"
@@ -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.23"
6
+ version = "0.2.25"
7
7
  edition = "2021"
8
8
  rust-version = "1.88"
9
9
  license = "MIT"
@@ -12,7 +12,83 @@ 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.17.7
15
+ # kglite engine + MCP server — imported as crates.io libraries. The 0.17.10
16
+ # floor is a pure Cypher-executor fix release: `cargo semver-checks` reports no
17
+ # API change across 196 checks, and codingest needs no source edit for it. It
18
+ # moves anyway because both fixes were SILENT wrong answers on the query
19
+ # surface `codingest query` and the embedded `codingest-mcp` server expose —
20
+ # the class of defect a floor exists to keep users off:
21
+ # * a non-aggregating `WITH` is a scope barrier again. It projected the row's
22
+ # values but left the node / edge / path *identity* bindings in place, so a
23
+ # name the projection dropped stayed silently bound: a later `MATCH` on
24
+ # that name anchored the stale node instead of scanning, `count(*)` behind
25
+ # the barrier counted 1 instead of the label, and `CREATE` / `SET` /
26
+ # `MERGE` / `FOREACH` after such a `WITH` acted on nothing with no error.
27
+ # `WITH n AS m` now frees `n`; `WITH *` and a projected `WITH n` keep their
28
+ # bindings as before. An *aggregating* `WITH` rebuilds its rows from the
29
+ # projection and was correct throughout, which is why this survived.
30
+ # * `*` written beside another projection item now expands. Alone it always
31
+ # did; alongside anything else it was projected as an ordinary expression —
32
+ # a column literally named `*` holding `1` — and every value-carrying name
33
+ # in scope was dropped, so `UNWIND [1] AS a WITH *, a + 1 AS b RETURN a, b`
34
+ # answered `{a: null, b: 2}`. Two spellings lost whole rows: `WITH *,
35
+ # count(*) AS c` grouped by that constant, and `WITH DISTINCT *, 1 AS k`
36
+ # deduplicated every row down to one. `RETURN *` now also lists a path
37
+ # variable, and where `*` and an explicit item would project the same name
38
+ # the explicit item wins.
39
+ # Neither reaches codingest's own Cypher. The builder writes graphs and never
40
+ # queries them, and the shipped code-review recipe catalogue and skill
41
+ # examples contain no `WITH` clause and no `*` projection at all
42
+ # (grep-verified across `assets/code_review/recipes.json`, both `skills/`
43
+ # trees, `query.rs` and the CLI/MCP tests). Optimized and unoptimized plans
44
+ # agreed on every old wrong answer, so these were invisible to kglite's
45
+ # optimizer-differential corpus and are now pinned there by absolute goldens.
46
+ # Zero source changes here; every frozen golden byte-identical.
47
+ # The preceding 0.17.9
48
+ # floor covers two same-day releases, 0.17.8 (the Obsidian vault format) and
49
+ # 0.17.9 (the vault structure profile). Both land almost entirely on
50
+ # `dialect="obsidian"`, which codingest never selects — but they rebuilt the
51
+ # `kglite::okf` *type* surface underneath our docs pass, so this is the first
52
+ # kglite bump since 0.16.x that needs a source change:
53
+ # * `okf::BuildOptions` gained `profile` (a `Profile` the parser reads for
54
+ # its conventions) and lost `embed` (a field the loader never read — it
55
+ # embedded nothing in any dialect, so removing it changes no behaviour),
56
+ # and `okf::walk::DiscoveredFile` gained `size` / `mtime`. Our docs pass
57
+ # built both as exhaustive struct literals. `BuildOptions` is now
58
+ # constructed through `BuildOptions::for_dialect(Dialect::Okf)` with only
59
+ # the two fields we deliberately differ on overridden — a `Profile` cannot
60
+ # be a struct literal outside kglite any more, and `for_dialect` is the
61
+ # constructor that keeps a future field at its dialect default instead of
62
+ # failing the build a third time. `size`/`mtime` are `0`/`None`: they feed
63
+ # only `okf::fingerprint` and the vault's attachment nodes, and
64
+ # `parse_concepts` — the one entry point we call — reads neither.
65
+ # * The rest of the breaking set does not reach us: `okf::build` now returns
66
+ # `BuildOutput { graph, report }`, `links::extract_links` and
67
+ # `walk::discover` take the options/profile instead of a `Dialect` /
68
+ # `skip_dirs` slice, `Dialect` gained `Obsidian`, `Link` lost
69
+ # `is_wikilink`, and `ExportOptions` / `ExportReport` gained
70
+ # `edge_tables` / `warnings`. codingest calls none of them (grep: zero
71
+ # hits outside `docs/mod.rs`) — we use `okf::parse_concepts` and nothing
72
+ # else, and we read only `concept_id` / `file_path` / `title` / `body` /
73
+ # `props` off each `ConceptDoc`, never its links.
74
+ # * Behaviour under `Dialect::Okf` is the old behaviour by construction:
75
+ # `Profile::default()` is the OKF-bundle profile with every vault feature
76
+ # (wikilinks, embeds, inline tags, frontmatter edges, aliases, folder
77
+ # notes, attachments, `structure:`) off, which is what the parser hardcoded
78
+ # before. The one 0.17.8 parser fix that is dialect-independent and lands
79
+ # on a value we store is the heading rule: a line starting with `#` is a
80
+ # heading only when one to six `#` are followed by a space, a tab, or the
81
+ # line end, so an inline-tag line like `#project see …` is no longer read
82
+ # as an `# H1`. That feeds our `:Doc` title fallback. The 31 frozen
83
+ # goldens are the gate on it, and they are byte-identical across this move.
84
+ # * kglite-mcp-server: `--vault` mode and the vault-authoring skill are new
85
+ # surface we do not register, and the bundled skill set is now gated by
86
+ # graph shape — the four code-graph skills bundle only where the graph
87
+ # carries `Function` / `Class`, which is exactly a codingest graph, so the
88
+ # skills an agent reaches through `codingest-mcp` are unchanged while a
89
+ # document deployment stops paying for ours. Our producer layer
90
+ # (`ServerExtensions::with_skills` / `with_recipes`) is untouched.
91
+ # The preceding 0.17.7
16
92
  # floor adds the producer-level methodology hook codingest asked for on
17
93
  # 2026-09-16: `ServerExtensions::with_skills` / `with_recipes` let the binary
18
94
  # embedding the server register its own skill layer and Cypher recipe
@@ -546,8 +622,8 @@ sha2 = "0.11"
546
622
  # and no disk storage. Neither 0.15.7 nor 0.15.8 changes the `kglite::api` we
547
623
  # call, graph output, property encoding, or `.kgl` serialization.
548
624
  # Keep both libraries aligned so the graph and server share one engine release.
549
- kglite = { version = "0.17.7", default-features = false }
550
- kglite-mcp-server = { version = "0.17.7", default-features = false }
625
+ kglite = { version = "0.17.10", default-features = false }
626
+ kglite-mcp-server = { version = "0.17.10", default-features = false }
551
627
 
552
628
  # Dependency debuginfo capped at line tables (kglite coordination, 2026-08-31,
553
629
  # after unbounded debug trees filled the build-cache disk to zero): a
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: codingest
3
- Version: 0.2.23
3
+ Version: 0.2.25
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.17.7,<0.18
15
+ Requires-Dist: kglite>=0.17.10,<0.18
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
@@ -194,7 +194,7 @@ codingest skill install # code-review Agent Skill
194
194
  ```
195
195
 
196
196
  The wheel bundles every grammar plus the `codingest` and `codingest-mcp`
197
- commands. KGLite ≥0.17.7 is installed automatically as the query/storage
197
+ commands. KGLite ≥0.17.10 is installed automatically as the query/storage
198
198
  engine; its MCP server and the transitive `mcp-methods` framework power the
199
199
  builder-aware Codingest server. Nothing else needs to be installed.
200
200
 
@@ -207,7 +207,7 @@ Python prerequisites.
207
207
  ```toml
208
208
  [dependencies]
209
209
  codingest = "0.2"
210
- kglite = "0.17.7"
210
+ kglite = "0.17.10"
211
211
  ```
212
212
 
213
213
  ```rust
@@ -279,7 +279,7 @@ diagnostic.
279
279
  ## Dependency policy
280
280
 
281
281
  `kglite` and `kglite-mcp-server` use matching crates.io requirements with a
282
- 0.17.7 minimum and a shared lockfile. This keeps the builder, persistence
282
+ 0.17.10 minimum and a shared lockfile. This keeps the builder, persistence
283
283
  handoff, and embedded MCP server on one compatible engine patch line.
284
284
 
285
285
  ## Parity with the (now-removed) in-tree component
@@ -167,7 +167,7 @@ codingest skill install # code-review Agent Skill
167
167
  ```
168
168
 
169
169
  The wheel bundles every grammar plus the `codingest` and `codingest-mcp`
170
- commands. KGLite ≥0.17.7 is installed automatically as the query/storage
170
+ commands. KGLite ≥0.17.10 is installed automatically as the query/storage
171
171
  engine; its MCP server and the transitive `mcp-methods` framework power the
172
172
  builder-aware Codingest server. Nothing else needs to be installed.
173
173
 
@@ -180,7 +180,7 @@ Python prerequisites.
180
180
  ```toml
181
181
  [dependencies]
182
182
  codingest = "0.2"
183
- kglite = "0.17.7"
183
+ kglite = "0.17.10"
184
184
  ```
185
185
 
186
186
  ```rust
@@ -252,7 +252,7 @@ diagnostic.
252
252
  ## Dependency policy
253
253
 
254
254
  `kglite` and `kglite-mcp-server` use matching crates.io requirements with a
255
- 0.17.7 minimum and a shared lockfile. This keeps the builder, persistence
255
+ 0.17.10 minimum and a shared lockfile. This keeps the builder, persistence
256
256
  handoff, and embedded MCP server on one compatible engine patch line.
257
257
 
258
258
  ## 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 engine floor (0.17.7).
13
+ # workspace pins the current engine floor (0.17.10).
14
14
 
15
15
  [lib]
16
16
  name = "codingest"
@@ -249,20 +249,29 @@ fn discover_and_parse(root: &Path) -> Result<Vec<DocEntry>, String> {
249
249
  // computes titles from frontmatter / first heading, honors `kg_skip`,
250
250
  // flattens frontmatter). We bypass `okf::walk` so `.rst` shares one traversal and so
251
251
  // `index.md` is kept (the docs pass builds no Folder hierarchy).
252
+ // `for_dialect` rather than a struct literal: it carries the dialect's
253
+ // `Profile` (the conventions the parser reads — id scheme, reserved keys,
254
+ // wikilinks, collection encoding), which a literal cannot construct from
255
+ // outside kglite and which a bare `dialect:` assignment would leave at the
256
+ // wrong dialect's defaults. Only the two fields the docs pass deliberately
257
+ // differs on are overridden: every `.md` is admitted (a repo's docs carry
258
+ // no frontmatter) and the body is stored (the `:Doc` node's prose).
252
259
  let md_opts = okf::BuildOptions {
253
- dialect: okf::Dialect::Okf,
254
260
  require_frontmatter: false,
255
- respect_skip: true,
256
- skip_dirs: Vec::new(),
257
261
  with_body: true,
258
- embed: false,
262
+ ..okf::BuildOptions::for_dialect(okf::Dialect::Okf)
259
263
  };
264
+ // `size` / `mtime` feed only `okf::fingerprint` and the attachment nodes,
265
+ // neither of which the docs pass reaches — `parse_concepts` reads nothing
266
+ // but the two paths — so the walk does not stat a second time to fill them.
260
267
  let md_files: Vec<okf::walk::DiscoveredFile> = found
261
268
  .iter()
262
269
  .filter(|d| d.format == DocFormat::Markdown)
263
270
  .map(|d| okf::walk::DiscoveredFile {
264
271
  rel_path: d.rel_path.clone(),
265
272
  abs_path: d.abs_path.clone(),
273
+ size: 0,
274
+ mtime: None,
266
275
  })
267
276
  .collect();
268
277
  let mut docs: Vec<DocEntry> = okf::parse_concepts(&md_files, &md_opts)
@@ -14,7 +14,7 @@ name = "codingest"
14
14
  path = "src/main.rs"
15
15
 
16
16
  [dependencies]
17
- codingest = { version = "0.2.23", path = "../codingest" }
17
+ codingest = { version = "0.2.25", path = "../codingest" }
18
18
  kglite = { workspace = true }
19
19
  anyhow = "1.0.104"
20
20
  clap = { version = "4.6.4", features = ["derive"] }
@@ -14,7 +14,7 @@ git diff, source reading, and literal-text search; it does not replace them.
14
14
  > codingest` also provides the builder-aware `codingest-mcp` server and a
15
15
  > compatible graph engine. Rust-only environments can alternatively use Cargo.
16
16
  > Examples that invoke the external `kglite` CLI require a compatible
17
- > `kglite>=0.17.7,<0.18`; verify `kglite --version` before using its
17
+ > `kglite>=0.17.10,<0.18`; verify `kglite --version` before using its
18
18
  > agent-response features.
19
19
 
20
20
  Inspect the diff and repository guidance first. Identify changed symbols and
@@ -54,7 +54,7 @@ preconditions are still current.
54
54
  ## External CLI agent output is optional
55
55
 
56
56
  The examples below require an external `kglite` CLI satisfying
57
- `>=0.17.7,<0.18`:
57
+ `>=0.17.10,<0.18`:
58
58
 
59
59
  ```console
60
60
  kglite --version
@@ -14,7 +14,7 @@ name = "codingest-mcp"
14
14
  path = "src/main.rs"
15
15
 
16
16
  [dependencies]
17
- codingest = { version = "0.2.23", path = "../codingest" }
17
+ codingest = { version = "0.2.25", path = "../codingest" }
18
18
  kglite-mcp-server = { workspace = true }
19
19
  anyhow = "1.0.104"
20
20
 
@@ -802,7 +802,7 @@ fn graph_overview_schema_refreshes_after_root_switch() {
802
802
  // ── Producer methodology (kglite 0.17.7 `with_skills` / `with_recipes`) ────
803
803
  //
804
804
  // The fixture manifest never mentions `skills:`, which is the shape every
805
- // codingest-mcp deployment ships in. Under kglite 0.17.7 that means the
805
+ // codingest-mcp deployment ships in. Under kglite 0.17.10 that means the
806
806
  // server serves kglite's bundled methodology plus codingest's own layer —
807
807
  // the `code_review` skill and the `code_review/*` recipe catalogue — in every
808
808
  // mode, including this manifest-driven workspace boot.
@@ -42,7 +42,7 @@ doctest = false
42
42
  pyo3 = { version = "0.29" }
43
43
  # The engine-free builder (parsers, call/type/route edges, rev merge, repo
44
44
  # clone, manifest reader). Docs pass gated by this crate's `docs` feature.
45
- codingest = { version = "0.2.23", path = "../codingest", default-features = false }
45
+ codingest = { version = "0.2.25", path = "../codingest", default-features = false }
46
46
  # `.kgl` persistence (`kglite::api::io::save_graph`) for the serialize half of
47
47
  # the build-then-load handoff, plus the `DirGraph` type the builder returns.
48
48
  kglite = { workspace = true }
@@ -53,9 +53,9 @@ tempfile = "3.27.0"
53
53
  # through `_run_cli`, so `pip install codingest` also installs the `codingest`
54
54
  # command without a second wheel or a duplicated builder build. Mirrors
55
55
  # kglite-py's `kglite-cli` bundling.
56
- codingest-cli = { version = "0.2.23", path = "../codingest-cli" }
56
+ codingest-cli = { version = "0.2.25", path = "../codingest-cli" }
57
57
  # Source-building MCP composition. The graph server and generic MCP lifecycle
58
58
  # remain owned by its existing kglite-mcp-server -> mcp-methods Rust dependency
59
59
  # chain; linking this thin library into the extension gives pip users the same
60
60
  # builder-aware server as the standalone `codingest-mcp` binary.
61
- codingest-mcp = { version = "0.2.23", path = "../codingest-mcp" }
61
+ codingest-mcp = { version = "0.2.25", path = "../codingest-mcp" }
@@ -86,7 +86,7 @@ fn load_via_kglite(py: Python<'_>, path: &Path) -> PyResult<Py<PyAny>> {
86
86
  PyRuntimeError::new_err(format!(
87
87
  "codingest.build() returns a kglite.KnowledgeGraph, but importing \
88
88
  `kglite` failed ({e}). Install it: `pip install \
89
- 'kglite>=0.17.7,<0.18'`."
89
+ 'kglite>=0.17.10,<0.18'`."
90
90
  ))
91
91
  })?;
92
92
  let graph = kglite.call_method1("load", (path.to_string_lossy().as_ref(),))?;
@@ -42,9 +42,9 @@ dynamic = ["version"]
42
42
  # minor releases (e.g. the v3->v4 break, which refuses old files outright), so
43
43
  # pip must never be free to pair our writer with a reader from a different
44
44
  # minor. This range therefore mirrors the Cargo semver range for the pin above
45
- # (`version = "0.17.7"` == `>=0.17.7,<0.18.0`) exactly — bump both together.
45
+ # (`version = "0.17.10"` == `>=0.17.10,<0.18.0`) exactly — bump both together.
46
46
  dependencies = [
47
- "kglite>=0.17.7,<0.18",
47
+ "kglite>=0.17.10,<0.18",
48
48
  ]
49
49
 
50
50
  [project.urls]
File without changes
File without changes