coderadar-rs 0.9.0__tar.gz → 0.9.2__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 (181) hide show
  1. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/Cargo.lock +1 -1
  2. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/Cargo.toml +1 -1
  3. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/PKG-INFO +25 -7
  4. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/README.md +23 -5
  5. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/fs/git.rs +8 -13
  6. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/module_resolution.rs +74 -5
  7. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/projection_ops.rs +2 -5
  8. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/lib.rs +4 -7
  9. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/__init__.py +98 -90
  10. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/agent/graphrag.py +14 -15
  11. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/cli.py +28 -24
  12. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/coldstart.py +7 -8
  13. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/config.py +10 -11
  14. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/embedding/__init__.py +14 -5
  15. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/embedding/dedup.py +7 -8
  16. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/excludes.py +3 -3
  17. coderadar_rs-0.9.2/py_agent/src/coderadar/lsp/__init__.py +4 -0
  18. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/lsp/pool.py +16 -16
  19. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/mcp/__init__.py +2 -2
  20. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/mcp/lazy.py +8 -10
  21. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/mcp/lifecycle.py +10 -9
  22. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/mcp/roots.py +13 -13
  23. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/mcp/server.py +112 -95
  24. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/mcp/startup.py +13 -11
  25. coderadar_rs-0.9.2/py_agent/src/coderadar/mutation/__init__.py +4 -0
  26. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/mutation/tool_router.py +6 -5
  27. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/project_state.py +4 -5
  28. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/query/cache.py +6 -5
  29. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/query/executor.py +19 -20
  30. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/query/planner.py +2 -2
  31. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/actix.py +7 -15
  32. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/aspnet.py +17 -22
  33. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/base.py +7 -7
  34. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/django.py +24 -28
  35. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/exports.py +11 -11
  36. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/express.py +15 -23
  37. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/fastapi.py +26 -25
  38. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/flask.py +27 -26
  39. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/go.py +11 -22
  40. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/laravel.py +11 -14
  41. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/nestjs.py +9 -13
  42. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/rails.py +6 -14
  43. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/reactrouter.py +8 -13
  44. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/resolution.py +11 -11
  45. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/springboot.py +21 -20
  46. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/vuerouter.py +9 -15
  47. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/visualizers/__init__.py +8 -4
  48. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/visualizers/call_graph.py +6 -6
  49. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/visualizers/graphviz_viz.py +22 -23
  50. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/visualizers/mermaid.py +12 -14
  51. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/pyproject.toml +9 -2
  52. coderadar_rs-0.9.0/py_agent/src/coderadar/lsp/__init__.py +0 -4
  53. coderadar_rs-0.9.0/py_agent/src/coderadar/mutation/__init__.py +0 -4
  54. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/LICENSE +0 -0
  55. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/Cargo.toml +0 -0
  56. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/bash.scm +0 -0
  57. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/c.scm +0 -0
  58. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/clojure.scm +0 -0
  59. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/cmake.scm +0 -0
  60. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/cpp.scm +0 -0
  61. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/csharp.scm +0 -0
  62. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/dart.scm +0 -0
  63. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/dockerfile.scm +0 -0
  64. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/elisp.scm +0 -0
  65. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/elixir.scm +0 -0
  66. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/erlang.scm +0 -0
  67. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/fsharp.scm +0 -0
  68. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/go.scm +0 -0
  69. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/graphql.scm +0 -0
  70. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/groovy.scm +0 -0
  71. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/haskell.scm +0 -0
  72. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/hcl.scm +0 -0
  73. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/java.scm +0 -0
  74. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/javascript.scm +0 -0
  75. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/julia.scm +0 -0
  76. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/kotlin.scm +0 -0
  77. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/lua.scm +0 -0
  78. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/nix.scm +0 -0
  79. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/objc.scm +0 -0
  80. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/ocaml.scm +0 -0
  81. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/perl.scm +0 -0
  82. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/php.scm +0 -0
  83. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/powershell.scm +0 -0
  84. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/protobuf.scm +0 -0
  85. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/python.scm +0 -0
  86. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/r.scm +0 -0
  87. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/ruby.scm +0 -0
  88. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/rust.scm +0 -0
  89. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/scala.scm +0 -0
  90. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/shell.scm +0 -0
  91. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/sql.scm +0 -0
  92. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/swift.scm +0 -0
  93. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/systemverilog.scm +0 -0
  94. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/typescript.scm +0 -0
  95. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/verilog.scm +0 -0
  96. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/queries/zig.scm +0 -0
  97. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/clones/apted.rs +0 -0
  98. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/clones/lsh_index.rs +0 -0
  99. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/clones/minhash.rs +0 -0
  100. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/clones/mod.rs +0 -0
  101. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/clones/tokens.rs +0 -0
  102. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/extract/decorators.rs +0 -0
  103. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/extract/docstring.rs +0 -0
  104. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/extract/mod.rs +0 -0
  105. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/extract/single_pass.rs +0 -0
  106. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/extract/spans.rs +0 -0
  107. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/extract/tagger.rs +0 -0
  108. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/extract/walker.rs +0 -0
  109. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/fs/mod.rs +0 -0
  110. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/fs/watcher.rs +0 -0
  111. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/call_graph.rs +0 -0
  112. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/centrality.rs +0 -0
  113. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/cfg.rs +0 -0
  114. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/cold_start.rs +0 -0
  115. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/config.rs +0 -0
  116. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/deadcode/entry_points.rs +0 -0
  117. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/deadcode/mod.rs +0 -0
  118. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/deadcode/reachability.rs +0 -0
  119. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/embeddings.rs +0 -0
  120. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/import_graph.rs +0 -0
  121. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/indexing.rs +0 -0
  122. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/inheritance.rs +0 -0
  123. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/mod.rs +0 -0
  124. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/mro.rs +0 -0
  125. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/persistence.rs +0 -0
  126. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/resolve_calls.rs +0 -0
  127. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/rta_lite.rs +0 -0
  128. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/call_graph_tests.rs +0 -0
  129. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/embedding_tests.rs +0 -0
  130. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/import_graph_tests.rs +0 -0
  131. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/indexing_tests.rs +0 -0
  132. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/inheritance_tests.rs +0 -0
  133. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/mod.rs +0 -0
  134. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/mro_tests.rs +0 -0
  135. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/persistence_tests.rs +0 -0
  136. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/projection_tests.rs +0 -0
  137. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/query_compile_tests.rs +0 -0
  138. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/tests/traversal_tests.rs +0 -0
  139. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/graph/traversal.rs +0 -0
  140. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/mutation/edit.rs +0 -0
  141. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/mutation/indent.rs +0 -0
  142. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/mutation/mod.rs +0 -0
  143. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/mutation/write_guard.rs +0 -0
  144. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/query/exec.rs +0 -0
  145. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/query/grammar.pest +0 -0
  146. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/query/grammar.rs +0 -0
  147. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/query/mod.rs +0 -0
  148. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/resolve/cache.rs +0 -0
  149. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/resolve/import_graph.rs +0 -0
  150. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/resolve/mod.rs +0 -0
  151. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/resolve/orchestrator.rs +0 -0
  152. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/resolve/signature.rs +0 -0
  153. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/scaffold/mod.rs +0 -0
  154. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/scaffold/secrets.rs +0 -0
  155. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/scoring/mod.rs +0 -0
  156. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/const_eval.rs +0 -0
  157. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/engine.rs +0 -0
  158. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/metrics.rs +0 -0
  159. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/mod.rs +0 -0
  160. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/profile.rs +0 -0
  161. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rule.rs +0 -0
  162. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/brain_method.rs +0 -0
  163. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/data_class.rs +0 -0
  164. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/dead_branch.rs +0 -0
  165. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/dead_code.rs +0 -0
  166. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/deep_nesting.rs +0 -0
  167. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/excessive_returns.rs +0 -0
  168. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/god_class.rs +0 -0
  169. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/high_cyclomatic_complexity.rs +0 -0
  170. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/intra_dead_statements.rs +0 -0
  171. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/long_method.rs +0 -0
  172. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/long_parameter_list.rs +0 -0
  173. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/mod.rs +0 -0
  174. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/rules/too_many_fields.rs +0 -0
  175. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/smells/types.rs +0 -0
  176. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/storage.rs +0 -0
  177. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/types.rs +0 -0
  178. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/core_indexer/src/update/wal.rs +0 -0
  179. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/agent/__init__.py +4 -4
  180. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/query/__init__.py +5 -5
  181. {coderadar_rs-0.9.0 → coderadar_rs-0.9.2}/py_agent/src/coderadar/resolvers/__init__.py +21 -21
@@ -445,7 +445,7 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
445
445
 
446
446
  [[package]]
447
447
  name = "core_indexer"
448
- version = "0.9.0"
448
+ version = "0.9.2"
449
449
  dependencies = [
450
450
  "crossbeam-channel",
451
451
  "dashmap",
@@ -3,6 +3,6 @@ members = ["core_indexer"]
3
3
  resolver = "2"
4
4
 
5
5
  [workspace.package]
6
- version = "0.9.0"
6
+ version = "0.9.2"
7
7
  edition = "2021"
8
8
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coderadar-rs
3
- Version: 0.9.0
3
+ Version: 0.9.2
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -21,7 +21,7 @@ Requires-Dist: pytest>=7.0 ; extra == 'dev'
21
21
  Requires-Dist: pytest-asyncio>=0.21 ; extra == 'dev'
22
22
  Requires-Dist: hypothesis>=6.0 ; extra == 'dev'
23
23
  Requires-Dist: mypy>=1.0 ; extra == 'dev'
24
- Requires-Dist: ruff>=0.1 ; extra == 'dev'
24
+ Requires-Dist: ruff==0.16.5 ; extra == 'dev'
25
25
  Requires-Dist: graphviz>=0.20 ; extra == 'visualizers'
26
26
  Provides-Extra: dev
27
27
  Provides-Extra: visualizers
@@ -32,7 +32,7 @@ License: MIT
32
32
  Requires-Python: >=3.10
33
33
  Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
34
34
 
35
- # CodeRadar v0.9.0
35
+ # CodeRadar v0.9.2
36
36
 
37
37
  [![CI](https://github.com/opticsWolf/coderadar/actions/workflows/ci.yml/badge.svg)](https://github.com/opticsWolf/coderadar/actions/workflows/ci.yml)
38
38
  [![PyPI](https://img.shields.io/pypi/v/coderadar-rs?label=pypi)](https://pypi.org/project/coderadar-rs/)
@@ -89,7 +89,7 @@ Rust Core (ProjectedGraph, Tree-sitter 41-lang, Parallel Extraction,
89
89
  | Metric | Value |
90
90
  |--------|-------|
91
91
  | **Languages indexed** | 41 (12 Tier 1, 29 Tier 2, 330+ Tier 3) |
92
- | **Tests** | 1119 (368 Rust + 751 Python) |
92
+ | **Tests** | 1128 (369 Rust + 759 Python) |
93
93
  | **MCP Tools** | 22 — 17 `codegraph_*` (explore, search, node, affected, query, search_similar, compute_embeddings, module_children, as_of, traverse, get_smells, dead_code, find_clones, find_scaffolding, reindex, update_file, set_project) + 5 `coderadar_*` (resolve, replace_body, update_signature, rename, create_entity) |
94
94
  | **Query surface** | Pest structural + Macrame agent traversals + vector search |
95
95
  | **Frameworks** | Django, Flask, FastAPI, Go, Actix, Express, Spring Boot, Laravel, ASP.NET, Rails, NestJS, Vue Router, React Router |
@@ -264,7 +264,7 @@ not assume the cwd is the project:
264
264
  |------|-----------|------------|----------|
265
265
  | **Tier 1** | Python, TypeScript, JavaScript, Rust, Go, Java, C, C++, Ruby, PHP, C#, Kotlin | Import → Signature → Framework | Full tool suite |
266
266
  | **Tier 2** | Swift, Scala, Lua, Elixir, Zig, R, Bash, Dart, Protobuf, Dockerfile, SQL, HCL, CMake, GraphQL, Erlang, Haskell, **Nix, Shell, Groovy, Perl, SystemVerilog, OCaml, Clojure, F#, Verilog, Julia, PowerShell, Emacs Lisp, Objective-C** | Import → Signature | replace_body, create_entity |
267
- | **Tier 3** | Shell, SQL, HTML, CSS, YAML, TOML, JSON, Markdown + 280 more | Signature Match only | replace_body, create_entity |
267
+ | **Tier 3** | HTML, CSS, YAML, TOML, JSON, Markdown + 280 more | Signature Match only | replace_body, create_entity |
268
268
 
269
269
  ## Resolution Cascade
270
270
 
@@ -402,6 +402,24 @@ tracked finding with a battery anchor (see
402
402
  (`#[pyfunction]` never reached the graph before) with `#[pymodule]`
403
403
  added as a production root.
404
404
 
405
+ ## v0.9.1–v0.9.2 Highlights — CI reds closed + docs refresh
406
+
407
+ - **Temporal traversal on aliased roots (v0.9.1).** Windows CI failed
408
+ `test_as_of_temporal_traversal` 3/3 runs (`got []`) while local +
409
+ Ubuntu passed: GitHub runners set `TEMP` with an 8.3 short component
410
+ (`C:\Users\RUNNER~1\…`), the walk spells paths as passed while
411
+ `INDEXED_ROOT` is filesystem-canonicalized, the lexical strip missed,
412
+ ids fell back to absolute form, and analyze retired all 3 fixture
413
+ concepts as orphans in the same run. `canonical_file_form` now
414
+ FS-canonicalizes once on a strip miss and retries (mismatch path only),
415
+ with verbatim-alias (Windows) and symlink-alias (unix) regression tests.
416
+ - **Lint fully green.** The 951-error ruff backlog is cleaned to zero
417
+ against pinned `ruff@0.16.5` (fixture excludes, mechanical fixes,
418
+ per-site `noqa` where deliberate) — `cargo fmt` + clippy + ruff all pass.
419
+ - **This refresh (v0.9.2).** Test counts 1119 → 1128 (369 Rust + 759
420
+ Python), query files 18 → 41 (one per Tier-1/2 language), Shell/SQL
421
+ de-duplicated out of the Tier-3 row (both ship `.scm` files in Tier 2).
422
+
405
423
  ## v0.7.18 Feature Highlights — the fossil-mcp port
406
424
 
407
425
  v0.7.3 through v0.7.18 ported the best of fossil-mcp's detector suite onto CodeRadar's graph
@@ -639,7 +657,7 @@ truth, scaling, dead-code retirement, configuration, and the MCP layer.
639
657
 
640
658
  ```
641
659
  core_indexer/ # Rust core
642
- queries/ # 18 .scm query files (one per language)
660
+ queries/ # 41 .scm query files (one per Tier-1/2 language)
643
661
  src/
644
662
  extract/ # Tree-sitter: tagger (query cursor) + walker (hierarchy) + docstring + decorators
645
663
  update/ # Incremental diff + patch + WAL
@@ -676,7 +694,7 @@ py_agent/src/coderadar/ # Python layer
676
694
  visualizers/ # Mermaid + Graphviz (SCC cycle highlighting)
677
695
 
678
696
  docs/ # Specifications + code review + performance roadmap
679
- tests/ # 748 Python tests (E2E incl. dead-code/clones/scaffold/CFG/
697
+ tests/ # 759 Python tests (E2E incl. dead-code/clones/scaffold/CFG/
680
698
  # centrality/dead-branch/RTA goldens, mutation E2E, MCP,
681
699
  # framework resolvers, ingest parity, benchmarks)
682
700
  mcp/ # Root resolution, background init, lifecycle, project_path
@@ -1,4 +1,4 @@
1
- # CodeRadar v0.9.0
1
+ # CodeRadar v0.9.2
2
2
 
3
3
  [![CI](https://github.com/opticsWolf/coderadar/actions/workflows/ci.yml/badge.svg)](https://github.com/opticsWolf/coderadar/actions/workflows/ci.yml)
4
4
  [![PyPI](https://img.shields.io/pypi/v/coderadar-rs?label=pypi)](https://pypi.org/project/coderadar-rs/)
@@ -55,7 +55,7 @@ Rust Core (ProjectedGraph, Tree-sitter 41-lang, Parallel Extraction,
55
55
  | Metric | Value |
56
56
  |--------|-------|
57
57
  | **Languages indexed** | 41 (12 Tier 1, 29 Tier 2, 330+ Tier 3) |
58
- | **Tests** | 1119 (368 Rust + 751 Python) |
58
+ | **Tests** | 1128 (369 Rust + 759 Python) |
59
59
  | **MCP Tools** | 22 — 17 `codegraph_*` (explore, search, node, affected, query, search_similar, compute_embeddings, module_children, as_of, traverse, get_smells, dead_code, find_clones, find_scaffolding, reindex, update_file, set_project) + 5 `coderadar_*` (resolve, replace_body, update_signature, rename, create_entity) |
60
60
  | **Query surface** | Pest structural + Macrame agent traversals + vector search |
61
61
  | **Frameworks** | Django, Flask, FastAPI, Go, Actix, Express, Spring Boot, Laravel, ASP.NET, Rails, NestJS, Vue Router, React Router |
@@ -230,7 +230,7 @@ not assume the cwd is the project:
230
230
  |------|-----------|------------|----------|
231
231
  | **Tier 1** | Python, TypeScript, JavaScript, Rust, Go, Java, C, C++, Ruby, PHP, C#, Kotlin | Import → Signature → Framework | Full tool suite |
232
232
  | **Tier 2** | Swift, Scala, Lua, Elixir, Zig, R, Bash, Dart, Protobuf, Dockerfile, SQL, HCL, CMake, GraphQL, Erlang, Haskell, **Nix, Shell, Groovy, Perl, SystemVerilog, OCaml, Clojure, F#, Verilog, Julia, PowerShell, Emacs Lisp, Objective-C** | Import → Signature | replace_body, create_entity |
233
- | **Tier 3** | Shell, SQL, HTML, CSS, YAML, TOML, JSON, Markdown + 280 more | Signature Match only | replace_body, create_entity |
233
+ | **Tier 3** | HTML, CSS, YAML, TOML, JSON, Markdown + 280 more | Signature Match only | replace_body, create_entity |
234
234
 
235
235
  ## Resolution Cascade
236
236
 
@@ -368,6 +368,24 @@ tracked finding with a battery anchor (see
368
368
  (`#[pyfunction]` never reached the graph before) with `#[pymodule]`
369
369
  added as a production root.
370
370
 
371
+ ## v0.9.1–v0.9.2 Highlights — CI reds closed + docs refresh
372
+
373
+ - **Temporal traversal on aliased roots (v0.9.1).** Windows CI failed
374
+ `test_as_of_temporal_traversal` 3/3 runs (`got []`) while local +
375
+ Ubuntu passed: GitHub runners set `TEMP` with an 8.3 short component
376
+ (`C:\Users\RUNNER~1\…`), the walk spells paths as passed while
377
+ `INDEXED_ROOT` is filesystem-canonicalized, the lexical strip missed,
378
+ ids fell back to absolute form, and analyze retired all 3 fixture
379
+ concepts as orphans in the same run. `canonical_file_form` now
380
+ FS-canonicalizes once on a strip miss and retries (mismatch path only),
381
+ with verbatim-alias (Windows) and symlink-alias (unix) regression tests.
382
+ - **Lint fully green.** The 951-error ruff backlog is cleaned to zero
383
+ against pinned `ruff@0.16.5` (fixture excludes, mechanical fixes,
384
+ per-site `noqa` where deliberate) — `cargo fmt` + clippy + ruff all pass.
385
+ - **This refresh (v0.9.2).** Test counts 1119 → 1128 (369 Rust + 759
386
+ Python), query files 18 → 41 (one per Tier-1/2 language), Shell/SQL
387
+ de-duplicated out of the Tier-3 row (both ship `.scm` files in Tier 2).
388
+
371
389
  ## v0.7.18 Feature Highlights — the fossil-mcp port
372
390
 
373
391
  v0.7.3 through v0.7.18 ported the best of fossil-mcp's detector suite onto CodeRadar's graph
@@ -605,7 +623,7 @@ truth, scaling, dead-code retirement, configuration, and the MCP layer.
605
623
 
606
624
  ```
607
625
  core_indexer/ # Rust core
608
- queries/ # 18 .scm query files (one per language)
626
+ queries/ # 41 .scm query files (one per Tier-1/2 language)
609
627
  src/
610
628
  extract/ # Tree-sitter: tagger (query cursor) + walker (hierarchy) + docstring + decorators
611
629
  update/ # Incremental diff + patch + WAL
@@ -642,7 +660,7 @@ py_agent/src/coderadar/ # Python layer
642
660
  visualizers/ # Mermaid + Graphviz (SCC cycle highlighting)
643
661
 
644
662
  docs/ # Specifications + code review + performance roadmap
645
- tests/ # 748 Python tests (E2E incl. dead-code/clones/scaffold/CFG/
663
+ tests/ # 759 Python tests (E2E incl. dead-code/clones/scaffold/CFG/
646
664
  # centrality/dead-branch/RTA goldens, mutation E2E, MCP,
647
665
  # framework resolvers, ingest parity, benchmarks)
648
666
  mcp/ # Root resolution, background init, lifecycle, project_path
@@ -105,9 +105,7 @@ pub fn is_worktree_clean(repo_path: &str) -> Result<bool, GitError> {
105
105
  .recurse_untracked_dirs(true)
106
106
  .include_ignored(false)
107
107
  .recurse_ignored_dirs(false);
108
- let statuses = repo
109
- .statuses(Some(&mut opts))
110
- .map_err(GitError::Status)?;
108
+ let statuses = repo.statuses(Some(&mut opts)).map_err(GitError::Status)?;
111
109
  Ok(statuses.is_empty())
112
110
  }
113
111
 
@@ -135,12 +133,8 @@ mod tests {
135
133
  std::fs::write(dir.join(".gitignore"), ".coderadar/\n*.log\n").unwrap();
136
134
  let repo = git2::Repository::init(dir).unwrap();
137
135
  let mut index = repo.index().unwrap();
138
- index
139
- .add_path(std::path::Path::new("a.txt"))
140
- .unwrap();
141
- index
142
- .add_path(std::path::Path::new(".gitignore"))
143
- .unwrap();
136
+ index.add_path(std::path::Path::new("a.txt")).unwrap();
137
+ index.add_path(std::path::Path::new(".gitignore")).unwrap();
144
138
  index.write().unwrap();
145
139
  let tree_id = index.write_tree().unwrap();
146
140
  let tree = repo.find_tree(tree_id).unwrap();
@@ -156,7 +150,10 @@ mod tests {
156
150
  let dir = tempfile::tempdir().unwrap();
157
151
  init_commit_repo(dir.path());
158
152
  let root = dir.path().to_str().unwrap();
159
- assert!(is_worktree_clean(root).unwrap(), "committed base must be clean");
153
+ assert!(
154
+ is_worktree_clean(root).unwrap(),
155
+ "committed base must be clean"
156
+ );
160
157
 
161
158
  std::fs::write(dir.path().join("top.log"), "x\n").unwrap();
162
159
  std::fs::create_dir_all(dir.path().join(".coderadar/store")).unwrap();
@@ -187,9 +184,7 @@ mod revision_tests {
187
184
  std::fs::write(dir.join(name), "v\n").unwrap();
188
185
  let repo = Repository::open(dir).unwrap();
189
186
  let mut index = repo.index().unwrap();
190
- index
191
- .add_path(std::path::Path::new(name))
192
- .unwrap();
187
+ index.add_path(std::path::Path::new(name)).unwrap();
193
188
  index.write().unwrap();
194
189
  let tree_id = index.write_tree().unwrap();
195
190
  let tree = repo.find_tree(tree_id).unwrap();
@@ -46,23 +46,48 @@ fn clean_lexical(p: &std::path::Path) -> std::path::PathBuf {
46
46
  /// yield the same ids. Paths outside the indexed root keep absolute form
47
47
  /// (no worse than today; they never matched anything anyway).
48
48
  pub(crate) fn canonical_file_form(path: &str) -> String {
49
- let root = crate::indexed_root();
49
+ canonical_file_form_with_root(path, &crate::indexed_root())
50
+ }
51
+
52
+ /// Inner funnel with the root injectable (unit tests must not touch the
53
+ /// process-global `INDEXED_ROOT`; parallel tests share it).
54
+ fn canonical_file_form_with_root(path: &str, root: &std::path::Path) -> String {
50
55
  let cwd = std::env::current_dir().unwrap_or_else(|_| std::path::PathBuf::from("."));
51
56
  let p = std::path::Path::new(path);
52
57
  let abs = if p.is_absolute() {
53
58
  clean_lexical(p)
54
59
  } else {
55
60
  let via_cwd = clean_lexical(&cwd.join(p));
56
- if via_cwd.starts_with(&root) {
61
+ if via_cwd.starts_with(root) {
57
62
  via_cwd
58
63
  } else {
59
64
  clean_lexical(&root.join(p))
60
65
  }
61
66
  };
62
- let rel = match abs.strip_prefix(&root) {
67
+ let rel = match abs.strip_prefix(root) {
63
68
  Ok(r) if !r.as_os_str().is_empty() => r.to_path_buf(),
64
- // Outside the root (or the root itself): absolute form, as before.
65
- _ => return normalize_path_str(path),
69
+ // Aliased root: the walk spells the path as passed (8.3 short
70
+ // names like C:\Users\RUNNER~1\… on CI, symlinks, verbatim
71
+ // `\\?\` form, on-disk case) while INDEXED_ROOT is
72
+ // filesystem-canonicalized — a lexical strip can never match
73
+ // those. Resolve through the FS once (mismatch path only, never
74
+ // the hot path) and retry before falling back to absolute form,
75
+ // which `retire_noncanonical_concepts` would close as an orphan
76
+ // (Windows CI's `test_as_of_temporal_traversal`: 3 concepts
77
+ // retired, as_of reads []).
78
+ _ => match std::fs::canonicalize(&abs) {
79
+ Ok(canon) => {
80
+ let canon = crate::strip_verbatim_prefix(canon);
81
+ match canon.strip_prefix(root) {
82
+ Ok(r) if !r.as_os_str().is_empty() => r.to_path_buf(),
83
+ // Outside the root (or the root itself): absolute form.
84
+ _ => return normalize_path_str(path),
85
+ }
86
+ }
87
+ // Unresolvable (update_file mints ids for files that may not
88
+ // exist yet): absolute form, as before.
89
+ _ => return normalize_path_str(path),
90
+ },
66
91
  };
67
92
  let sep = std::path::MAIN_SEPARATOR;
68
93
  let joined = rel
@@ -389,6 +414,50 @@ mod canonical_form_tests {
389
414
  assert_eq!(canonical_file_form("some/dir/x.py"), c);
390
415
  }
391
416
 
417
+ /// Aliased root (Windows): the walk may spell a path verbatim
418
+ /// (`\\\\?\\C:\\…`) while INDEXED_ROOT is the stripped form — same
419
+ /// file, lexical mismatch. Models CI's 8.3 TEMP (`RUNNER~1`), which
420
+ /// retired all 3 concepts of `test_as_of_temporal_traversal`'s fixture
421
+ /// as "non-canonical" and made as_of read [].
422
+ #[cfg(windows)]
423
+ #[test]
424
+ fn verbatim_aliased_path_still_mints_relative_id() {
425
+ let base = std::env::temp_dir().join(format!("cr_alias_{}", std::process::id()));
426
+ let real = base.join("real");
427
+ std::fs::create_dir_all(&real).unwrap();
428
+ std::fs::write(real.join("a.py"), "x = 1\n").unwrap();
429
+ // What INDEXED_ROOT holds: canonicalized, verbatim stripped.
430
+ let root = crate::strip_verbatim_prefix(std::fs::canonicalize(&real).unwrap());
431
+ // What the walk may yield for the same file: verbatim spelling.
432
+ let verbatim = std::path::PathBuf::from(format!(r"\\?\{}", real.join("a.py").display()));
433
+ let got = canonical_file_form_with_root(&verbatim.to_string_lossy(), &root);
434
+ assert!(
435
+ got.starts_with(r".\"),
436
+ "aliased path must mint a canonical relative id, got {got:?}"
437
+ );
438
+ std::fs::remove_dir_all(&base).ok();
439
+ }
440
+
441
+ /// Aliased root (POSIX): same mismatch class via symlink — lexical
442
+ /// strip of the unresolved spelling fails, the FS fallback resolves.
443
+ #[cfg(unix)]
444
+ #[test]
445
+ fn symlinked_path_still_mints_relative_id() {
446
+ let base = std::env::temp_dir().join(format!("cr_alias_{}", std::process::id()));
447
+ let real = base.join("real");
448
+ std::fs::create_dir_all(&real).unwrap();
449
+ std::fs::write(real.join("a.py"), "x = 1\n").unwrap();
450
+ std::os::unix::fs::symlink(&real, base.join("alias")).unwrap();
451
+ let root = std::fs::canonicalize(&real).unwrap();
452
+ let via_alias = base.join("alias").join("a.py");
453
+ let got = canonical_file_form_with_root(&via_alias.to_string_lossy(), &root);
454
+ assert!(
455
+ got.starts_with("./"),
456
+ "aliased path must mint a canonical relative id, got {got:?}"
457
+ );
458
+ std::fs::remove_dir_all(&base).ok();
459
+ }
460
+
392
461
  #[test]
393
462
  fn canonical_head_predicate_sorts_all_three_historical_forms() {
394
463
  assert!(is_canonical_file_head(r".\tests\x.py"));
@@ -63,12 +63,9 @@ impl CodeGraph {
63
63
  // too, or this whole branch silently keeps everything. Collect
64
64
  // across ALL entity maps (functions/classes alone left
65
65
  // constants, aliases, imports and the module itself behind).
66
- let canon =
67
- super::module_resolution::canonical_file_form(file_path);
66
+ let canon = super::module_resolution::canonical_file_form(file_path);
68
67
  let prefixes = [format!("{}::", lookup), format!("{}::", canon)];
69
- let matches = |id: &str| {
70
- prefixes.iter().any(|p| id.starts_with(p.as_str()))
71
- };
68
+ let matches = |id: &str| prefixes.iter().any(|p| id.starts_with(p.as_str()));
72
69
  for (func_id, _) in projection.functions.iter() {
73
70
  if matches(func_id) && !removed.contains(func_id) {
74
71
  removed.insert(func_id.clone());
@@ -112,7 +112,7 @@ pub(crate) fn indexed_root() -> std::path::PathBuf {
112
112
 
113
113
  /// `std::fs::canonicalize` returns verbatim paths on Windows (`\\?\D:\…`),
114
114
  /// which defeat `starts_with`/`strip_prefix` against regular paths.
115
- fn strip_verbatim_prefix(p: std::path::PathBuf) -> std::path::PathBuf {
115
+ pub(crate) fn strip_verbatim_prefix(p: std::path::PathBuf) -> std::path::PathBuf {
116
116
  let s = p.to_string_lossy();
117
117
  if let Some(rest) = s.strip_prefix(r"\\?\UNC\") {
118
118
  return std::path::PathBuf::from(format!(r"\\{rest}"));
@@ -2039,8 +2039,8 @@ fn search_entities(
2039
2039
  with_graph(|_graph, snap| {
2040
2040
  let tokens = search_tokens(query);
2041
2041
  let mut results: Vec<(usize, PyObject)> = Vec::new(); // (score, dict)
2042
- // Issue 5 (schema enums): a garbage kind used to match nothing and
2043
- // read as "no results". Refuse loudly like Strictness::parse.
2042
+ // Issue 5 (schema enums): a garbage kind used to match nothing and
2043
+ // read as "no results". Refuse loudly like Strictness::parse.
2044
2044
  const KNOWN_KINDS: &[&str] = &[
2045
2045
  "function",
2046
2046
  "class",
@@ -3529,10 +3529,7 @@ mod tests {
3529
3529
  assert_eq!(unresolved_ref_kind("external::len"), "builtin");
3530
3530
  assert_eq!(unresolved_ref_kind("external::isinstance"), "builtin");
3531
3531
  assert_eq!(unresolved_ref_kind("external::combine"), "external");
3532
- assert_eq!(
3533
- unresolved_ref_kind("external::requests.get"),
3534
- "external"
3535
- );
3532
+ assert_eq!(unresolved_ref_kind("external::requests.get"), "external");
3536
3533
  assert_eq!(unresolved_ref_kind("Date::now"), "unresolved");
3537
3534
  assert_eq!(unresolved_ref_kind("C::run"), "unresolved");
3538
3535
  }