java-codebase-rag 0.9.5__tar.gz → 0.9.7__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 (145) hide show
  1. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7}/PKG-INFO +1 -1
  2. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7}/pyproject.toml +4 -29
  3. java_codebase_rag-0.9.7/src/java_codebase_rag/absence/__init__.py +0 -0
  4. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/absence}/absence_diagnosis.py +4 -4
  5. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/absence}/absence_types.py +1 -1
  6. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/absence}/absence_vocab.py +11 -6
  7. java_codebase_rag-0.9.7/src/java_codebase_rag/analysis/__init__.py +0 -0
  8. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/analysis}/pr_analysis.py +1 -1
  9. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/analysis}/resolve_service.py +7 -7
  10. java_codebase_rag-0.9.7/src/java_codebase_rag/ast/__init__.py +0 -0
  11. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/ast}/ast_java.py +4 -4
  12. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/cli.py +12 -12
  13. java_codebase_rag-0.9.7/src/java_codebase_rag/graph/__init__.py +0 -0
  14. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/graph}/build_ast_graph.py +6 -6
  15. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/graph}/graph_enrich.py +3 -3
  16. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/graph}/graph_types.py +2 -2
  17. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/graph}/java_ontology.py +1 -1
  18. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/graph}/ladybug_queries.py +2 -2
  19. java_codebase_rag-0.9.7/src/java_codebase_rag/index/__init__.py +0 -0
  20. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/index}/java_index_flow_lancedb.py +4 -4
  21. java_codebase_rag-0.9.7/src/java_codebase_rag/install_data/__init__.py +0 -0
  22. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/jrag.py +18 -18
  23. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/jrag_envelope.py +17 -4
  24. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/jrag_hints.py +1 -1
  25. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/jrag_render.py +1 -1
  26. java_codebase_rag-0.9.7/src/java_codebase_rag/mcp/__init__.py +0 -0
  27. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/mcp}/mcp_hints.py +1 -1
  28. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/mcp}/mcp_v2.py +26 -12
  29. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/mcp}/server.py +40 -23
  30. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/pipeline.py +15 -6
  31. java_codebase_rag-0.9.7/src/java_codebase_rag/search/__init__.py +0 -0
  32. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/search}/search_lancedb.py +4 -4
  33. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/search}/search_lexical.py +3 -3
  34. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag.egg-info/PKG-INFO +1 -1
  35. java_codebase_rag-0.9.7/src/java_codebase_rag.egg-info/SOURCES.txt +60 -0
  36. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag.egg-info/entry_points.txt +1 -1
  37. java_codebase_rag-0.9.7/src/java_codebase_rag.egg-info/top_level.txt +1 -0
  38. java_codebase_rag-0.9.5/java_codebase_rag.egg-info/SOURCES.txt +0 -133
  39. java_codebase_rag-0.9.5/java_codebase_rag.egg-info/top_level.txt +0 -24
  40. java_codebase_rag-0.9.5/tests/test_absence_diagnosis.py +0 -615
  41. java_codebase_rag-0.9.5/tests/test_absence_mcp_integration.py +0 -218
  42. java_codebase_rag-0.9.5/tests/test_absence_types.py +0 -240
  43. java_codebase_rag-0.9.5/tests/test_absence_vocab.py +0 -375
  44. java_codebase_rag-0.9.5/tests/test_agent_skills_static.py +0 -279
  45. java_codebase_rag-0.9.5/tests/test_assign_endpoint_client_extraction.py +0 -198
  46. java_codebase_rag-0.9.5/tests/test_ast_graph_build.py +0 -707
  47. java_codebase_rag-0.9.5/tests/test_ast_java_calls.py +0 -351
  48. java_codebase_rag-0.9.5/tests/test_ast_java_capabilities.py +0 -150
  49. java_codebase_rag-0.9.5/tests/test_ast_java_thread_safety.py +0 -66
  50. java_codebase_rag-0.9.5/tests/test_bank_chat_brownfield_integration.py +0 -95
  51. java_codebase_rag-0.9.5/tests/test_brownfield_clients.py +0 -374
  52. java_codebase_rag-0.9.5/tests/test_brownfield_events.py +0 -56
  53. java_codebase_rag-0.9.5/tests/test_brownfield_overrides.py +0 -592
  54. java_codebase_rag-0.9.5/tests/test_brownfield_routes.py +0 -344
  55. java_codebase_rag-0.9.5/tests/test_call_edge_matching.py +0 -121
  56. java_codebase_rag-0.9.5/tests/test_call_edges_e2e.py +0 -209
  57. java_codebase_rag-0.9.5/tests/test_call_graph_receiver_resolution.py +0 -159
  58. java_codebase_rag-0.9.5/tests/test_call_graph_smoke_roundtrip.py +0 -366
  59. java_codebase_rag-0.9.5/tests/test_call_invariant.py +0 -34
  60. java_codebase_rag-0.9.5/tests/test_cli_progress_stdout_invariant.py +0 -296
  61. java_codebase_rag-0.9.5/tests/test_cli_quiet_parity.py +0 -172
  62. java_codebase_rag-0.9.5/tests/test_client_hint_recovery.py +0 -126
  63. java_codebase_rag-0.9.5/tests/test_client_node_extraction.py +0 -254
  64. java_codebase_rag-0.9.5/tests/test_client_role_rename.py +0 -158
  65. java_codebase_rag-0.9.5/tests/test_config.py +0 -781
  66. java_codebase_rag-0.9.5/tests/test_cross_service_resolution_flag.py +0 -263
  67. java_codebase_rag-0.9.5/tests/test_edge_navigation_doc.py +0 -34
  68. java_codebase_rag-0.9.5/tests/test_fd_limit.py +0 -90
  69. java_codebase_rag-0.9.5/tests/test_feign_not_exposer.py +0 -164
  70. java_codebase_rag-0.9.5/tests/test_generated_detection.py +0 -218
  71. java_codebase_rag-0.9.5/tests/test_generated_filter.py +0 -247
  72. java_codebase_rag-0.9.5/tests/test_generated_surface.py +0 -291
  73. java_codebase_rag-0.9.5/tests/test_graph_enrich.py +0 -117
  74. java_codebase_rag-0.9.5/tests/test_graph_generated_node.py +0 -204
  75. java_codebase_rag-0.9.5/tests/test_graph_only_boot.py +0 -161
  76. java_codebase_rag-0.9.5/tests/test_incremental_graph.py +0 -1684
  77. java_codebase_rag-0.9.5/tests/test_install_data_sync.py +0 -249
  78. java_codebase_rag-0.9.5/tests/test_installer.py +0 -1784
  79. java_codebase_rag-0.9.5/tests/test_installer_integration.py +0 -135
  80. java_codebase_rag-0.9.5/tests/test_installer_surface.py +0 -911
  81. java_codebase_rag-0.9.5/tests/test_java_codebase_rag_cli.py +0 -1631
  82. java_codebase_rag-0.9.5/tests/test_jrag_auto_scope.py +0 -271
  83. java_codebase_rag-0.9.5/tests/test_jrag_enum_choices.py +0 -76
  84. java_codebase_rag-0.9.5/tests/test_jrag_envelope.py +0 -711
  85. java_codebase_rag-0.9.5/tests/test_jrag_envelope_absence.py +0 -305
  86. java_codebase_rag-0.9.5/tests/test_jrag_listing.py +0 -458
  87. java_codebase_rag-0.9.5/tests/test_jrag_locate.py +0 -515
  88. java_codebase_rag-0.9.5/tests/test_jrag_orientation.py +0 -1129
  89. java_codebase_rag-0.9.5/tests/test_jrag_render.py +0 -854
  90. java_codebase_rag-0.9.5/tests/test_jrag_status.py +0 -218
  91. java_codebase_rag-0.9.5/tests/test_jrag_token_budget.py +0 -127
  92. java_codebase_rag-0.9.5/tests/test_jrag_traversal_compose.py +0 -727
  93. java_codebase_rag-0.9.5/tests/test_jrag_traversal_direct.py +0 -1000
  94. java_codebase_rag-0.9.5/tests/test_ladybug_queries.py +0 -576
  95. java_codebase_rag-0.9.5/tests/test_lance_optimize.py +0 -281
  96. java_codebase_rag-0.9.5/tests/test_lancedb_e2e.py +0 -388
  97. java_codebase_rag-0.9.5/tests/test_lancedb_generated_column.py +0 -143
  98. java_codebase_rag-0.9.5/tests/test_mcp_hints.py +0 -1322
  99. java_codebase_rag-0.9.5/tests/test_mcp_server_project_root.py +0 -126
  100. java_codebase_rag-0.9.5/tests/test_mcp_tools.py +0 -113
  101. java_codebase_rag-0.9.5/tests/test_mcp_v2.py +0 -2022
  102. java_codebase_rag-0.9.5/tests/test_mcp_v2_compose.py +0 -996
  103. java_codebase_rag-0.9.5/tests/test_meta_chain_core.py +0 -74
  104. java_codebase_rag-0.9.5/tests/test_microservice_scope.py +0 -270
  105. java_codebase_rag-0.9.5/tests/test_outgoing_call_extraction.py +0 -196
  106. java_codebase_rag-0.9.5/tests/test_packaging_metadata.py +0 -52
  107. java_codebase_rag-0.9.5/tests/test_path_filtering.py +0 -356
  108. java_codebase_rag-0.9.5/tests/test_pipeline.py +0 -103
  109. java_codebase_rag-0.9.5/tests/test_pr_analysis.py +0 -415
  110. java_codebase_rag-0.9.5/tests/test_progress.py +0 -463
  111. java_codebase_rag-0.9.5/tests/test_resolve_routes_messaging_layer_c.py +0 -102
  112. java_codebase_rag-0.9.5/tests/test_resolve_service.py +0 -220
  113. java_codebase_rag-0.9.5/tests/test_route_extraction.py +0 -415
  114. java_codebase_rag-0.9.5/tests/test_schema_consistency.py +0 -111
  115. java_codebase_rag-0.9.5/tests/test_search_lancedb.py +0 -558
  116. java_codebase_rag-0.9.5/tests/test_search_lancedb_capability.py +0 -127
  117. java_codebase_rag-0.9.5/tests/test_search_lexical.py +0 -339
  118. java_codebase_rag-0.9.5/tests/test_string_value_atoms.py +0 -23
  119. java_codebase_rag-0.9.5/tests/test_vectors_progress.py +0 -349
  120. java_codebase_rag-0.9.5/tests/test_version_flag.py +0 -39
  121. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7}/LICENSE +0 -0
  122. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7}/README.md +0 -0
  123. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7}/setup.cfg +0 -0
  124. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/__init__.py +0 -0
  125. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/_fdlimit.py +0 -0
  126. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/_stdio.py +0 -0
  127. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/_version.py +0 -0
  128. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/ast}/brownfield_events.py +0 -0
  129. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/ast}/chunk_heuristics.py +0 -0
  130. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/cli_format.py +0 -0
  131. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/cli_progress.py +0 -0
  132. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/config.py +0 -0
  133. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/graph}/path_filtering.py +0 -0
  134. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/index}/java_index_v1_common.py +0 -0
  135. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/install_data/agents/explorer-rag-cli.md +0 -0
  136. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/install_data/agents/explorer-rag-enhanced.md +0 -0
  137. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/install_data/skills/explore-codebase/SKILL.md +0 -0
  138. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/install_data/skills/explore-codebase-cli/SKILL.md +0 -0
  139. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/installer.py +0 -0
  140. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/lance_optimize.py +0 -0
  141. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag/progress.py +0 -0
  142. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/search}/index_common.py +0 -0
  143. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src/java_codebase_rag/search}/search_scoring.py +0 -0
  144. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag.egg-info/dependency_links.txt +0 -0
  145. {java_codebase_rag-0.9.5 → java_codebase_rag-0.9.7/src}/java_codebase_rag.egg-info/requires.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: java-codebase-rag
3
- Version: 0.9.5
3
+ Version: 0.9.7
4
4
  Summary: MCP server for semantic + structural search over Java codebases
5
5
  Author: HumanBean17
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "java-codebase-rag"
7
- version = "0.9.5"
7
+ version = "0.9.7"
8
8
  description = "MCP server for semantic + structural search over Java codebases"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -64,36 +64,11 @@ Issues = "https://github.com/HumanBean17/java-codebase-rag/issues"
64
64
 
65
65
  [project.scripts]
66
66
  java-codebase-rag = "java_codebase_rag.cli:_console_script_main"
67
- java-codebase-rag-mcp = "server:main"
67
+ java-codebase-rag-mcp = "java_codebase_rag.mcp.server:main"
68
68
  jrag = "java_codebase_rag.jrag:_console_script_main"
69
69
 
70
- [tool.setuptools]
71
- packages = ["java_codebase_rag"]
72
- py-modules = [
73
- "absence_types",
74
- "absence_vocab",
75
- "absence_diagnosis",
76
- "ast_java",
77
- "brownfield_events",
78
- "build_ast_graph",
79
- "chunk_heuristics",
80
- "graph_enrich",
81
- "graph_types",
82
- "index_common",
83
- "java_index_flow_lancedb",
84
- "java_index_v1_common",
85
- "java_ontology",
86
- "ladybug_queries",
87
- "mcp_hints",
88
- "mcp_v2",
89
- "path_filtering",
90
- "pr_analysis",
91
- "resolve_service",
92
- "search_lancedb",
93
- "search_lexical",
94
- "search_scoring",
95
- "server",
96
- ]
70
+ [tool.setuptools.packages.find]
71
+ where = ["src"]
97
72
 
98
73
  [tool.ruff]
99
74
  line-length = 100
@@ -30,7 +30,7 @@ from collections import Counter
30
30
  from difflib import SequenceMatcher
31
31
  from typing import Any, Literal
32
32
 
33
- from absence_types import (
33
+ from java_codebase_rag.absence.absence_types import (
34
34
  AbsenceDiagnosis,
35
35
  AbsenceProof,
36
36
  ExternalIdentity,
@@ -38,9 +38,9 @@ from absence_types import (
38
38
  FilterRelaxationDim,
39
39
  VocabularyContext,
40
40
  )
41
- from absence_vocab import SymbolRecord, VocabularyIndex, _normalize_name
42
- from graph_types import NodeRef
43
- from mcp_hints import _IDENTIFIER_FILTER_FIELDS
41
+ from java_codebase_rag.absence.absence_vocab import SymbolRecord, VocabularyIndex, _normalize_name
42
+ from java_codebase_rag.graph.graph_types import NodeRef
43
+ from java_codebase_rag.mcp.mcp_hints import _IDENTIFIER_FILTER_FIELDS
44
44
 
45
45
  log = logging.getLogger(__name__)
46
46
 
@@ -8,7 +8,7 @@ from typing import Literal
8
8
 
9
9
  from pydantic import BaseModel, Field
10
10
 
11
- from graph_types import NodeRef
11
+ from java_codebase_rag.graph.graph_types import NodeRef
12
12
 
13
13
  __all__ = [
14
14
  "AbsenceVerdict",
@@ -204,7 +204,7 @@ class VocabularyIndex:
204
204
  VocabIndexStale: If sidecar format_version or ontology_version
205
205
  doesn't match expected
206
206
  """
207
- from ast_java import ONTOLOGY_VERSION
207
+ from java_codebase_rag.ast.ast_java import ONTOLOGY_VERSION
208
208
 
209
209
  with open(path, encoding="utf-8") as f:
210
210
  data = json.load(f)
@@ -304,7 +304,7 @@ class VocabularyIndex:
304
304
  Returns:
305
305
  (is_external, reason) tuple
306
306
  """
307
- from ladybug_queries import _is_external_fqn, _EXTERNAL_PREFIXES
307
+ from java_codebase_rag.graph.ladybug_queries import _is_external_fqn, _EXTERNAL_PREFIXES
308
308
 
309
309
  # First, check if it's an external prefix (highest priority)
310
310
  if _is_external_fqn(name):
@@ -354,7 +354,7 @@ def get_vocabulary_index(graph: Any, cfg: Any) -> VocabularyIndex:
354
354
  Returns:
355
355
  VocabularyIndex (cached or newly built)
356
356
  """
357
- from ast_java import ONTOLOGY_VERSION
357
+ from java_codebase_rag.ast.ast_java import ONTOLOGY_VERSION
358
358
 
359
359
  # Determine graph db path for cache key
360
360
  db_path = graph.db_path if hasattr(graph, 'db_path') else str(cfg.ladybug_path)
@@ -375,8 +375,13 @@ def get_vocabulary_index(graph: Any, cfg: Any) -> VocabularyIndex:
375
375
  # (JSONDecodeError/KeyError) — all subsumed by Exception; rebuild.
376
376
  log.debug(f"Vocab index missing/stale/corrupt ({e}), rebuilding from graph")
377
377
 
378
- # Build from graph
379
- index = VocabularyIndex.build(graph, q=cfg.absence_ngram_q)
378
+ # Build from graph. Coerce q to int (mirror absence_diagnosis.py's
379
+ # int(getattr(cfg, ...)) pattern): a non-int cfg.absence_ngram_q (e.g. a
380
+ # MagicMock cfg from a leaked test mock, or a YAML string) would otherwise
381
+ # crash _qgrams at `len(text) < q` ('int < MagicMock'). Default 3 = the
382
+ # config default for absence_ngram_q.
383
+ q = int(getattr(cfg, "absence_ngram_q", 3) or 3)
384
+ index = VocabularyIndex.build(graph, q=q)
380
385
 
381
386
  # Save to sidecar (best-effort)
382
387
  try:
@@ -403,7 +408,7 @@ def reset_cache() -> None:
403
408
 
404
409
  def _row_to_symbol_record(row: dict[str, Any]) -> SymbolRecord:
405
410
  """Convert a Ladybug row to a SymbolRecord."""
406
- from ladybug_queries import _type_part_fqn
411
+ from java_codebase_rag.graph.ladybug_queries import _type_part_fqn
407
412
 
408
413
  fqn = row.get("fqn") or ""
409
414
  name = row.get("name") or ""
@@ -12,7 +12,7 @@ from typing import Any
12
12
  from unidiff import PatchSet
13
13
  from unidiff.errors import UnidiffParseError
14
14
 
15
- from ladybug_queries import SymbolHit, find_symbols_in_file_range, _row_to_symbol
15
+ from java_codebase_rag.graph.ladybug_queries import SymbolHit, find_symbols_in_file_range, _row_to_symbol
16
16
 
17
17
 
18
18
  @dataclass
@@ -10,10 +10,10 @@ from typing import Any, Literal
10
10
 
11
11
  from pydantic import BaseModel, ConfigDict, Field
12
12
 
13
- from absence_types import AbsenceDiagnosis
14
- from absence_diagnosis import diagnose
15
- from absence_vocab import get_vocabulary_index
16
- from graph_types import (
13
+ from java_codebase_rag.absence.absence_types import AbsenceDiagnosis
14
+ from java_codebase_rag.absence.absence_diagnosis import diagnose
15
+ from java_codebase_rag.absence.absence_vocab import get_vocabulary_index
16
+ from java_codebase_rag.graph.graph_types import (
17
17
  NodeRef,
18
18
  StructuredHint,
19
19
  _hints_or_skip,
@@ -21,9 +21,9 @@ from graph_types import (
21
21
  _to_structured_hints,
22
22
  set_hints_enabled,
23
23
  )
24
- from java_ontology import ResolveReason
25
- from ladybug_queries import LadybugGraph
26
- from mcp_hints import MCP_HINTS_STRUCTURED_FIELD_DESCRIPTION
24
+ from java_codebase_rag.graph.java_ontology import ResolveReason
25
+ from java_codebase_rag.graph.ladybug_queries import LadybugGraph
26
+ from java_codebase_rag.mcp.mcp_hints import MCP_HINTS_STRUCTURED_FIELD_DESCRIPTION
27
27
 
28
28
  __all__ = [
29
29
  "resolve_v2",
@@ -20,7 +20,7 @@ from typing import Iterable
20
20
 
21
21
  import tree_sitter_java as _ts_java
22
22
 
23
- from brownfield_events import (
23
+ from java_codebase_rag.ast.brownfield_events import (
24
24
  emit_brownfield_exclusivity_shadowing,
25
25
  emit_brownfield_method_string_literal,
26
26
  )
@@ -1617,7 +1617,7 @@ def _parse_codebase_http_client_annotation(
1617
1617
  val, vkind = _annotation_value(pairs["clientKind"], src)
1618
1618
  if val and vkind == "enum":
1619
1619
  kind_val = str(val)
1620
- from java_ontology import VALID_CLIENT_KINDS # deferred: java_ontology imports ast_java
1620
+ from java_codebase_rag.graph.java_ontology import VALID_CLIENT_KINDS # deferred: java_ontology imports ast_java
1621
1621
  if kind_val in VALID_CLIENT_KINDS:
1622
1622
  client_kind = kind_val
1623
1623
  else:
@@ -1697,7 +1697,7 @@ def _parse_codebase_producer_annotation(
1697
1697
  val, vkind = _annotation_value(kind_node, src)
1698
1698
  if val and vkind == "enum":
1699
1699
  kind_val = str(val)
1700
- from java_ontology import VALID_PRODUCER_KINDS # deferred: java_ontology imports ast_java
1700
+ from java_codebase_rag.graph.java_ontology import VALID_PRODUCER_KINDS # deferred: java_ontology imports ast_java
1701
1701
  if kind_val in VALID_PRODUCER_KINDS:
1702
1702
  client_kind = kind_val
1703
1703
  else:
@@ -1868,7 +1868,7 @@ def _collect_outgoing_calls(
1868
1868
  file_rel: str,
1869
1869
  ) -> list[OutgoingCallDecl]:
1870
1870
  del project_root
1871
- from java_ontology import ( # deferred: java_ontology imports ast_java
1871
+ from java_codebase_rag.graph.java_ontology import ( # deferred: java_ontology imports ast_java
1872
1872
  CLIENT_KIND_FEIGN_METHOD,
1873
1873
  CLIENT_KIND_REST_TEMPLATE,
1874
1874
  CLIENT_KIND_WEB_CLIENT,
@@ -36,7 +36,7 @@ from java_codebase_rag.pipeline import (
36
36
  run_cocoindex_update,
37
37
  run_incremental_graph,
38
38
  )
39
- from java_ontology import VALID_UNRESOLVED_CALL_REASONS
39
+ from java_codebase_rag.graph.java_ontology import VALID_UNRESOLVED_CALL_REASONS
40
40
 
41
41
  LADYBUG_INCREMENTAL_TRACKING_ISSUE_URL = "https://github.com/HumanBean17/java-codebase-rag/issues/73"
42
42
 
@@ -602,7 +602,7 @@ def _cmd_reprocess(args: argparse.Namespace) -> int:
602
602
  _emit_reprocess_outcome(payload, selective_tty_mode="graph" if ok else None)
603
603
  return _reprocess_exit_code(payload)
604
604
 
605
- import server # lazy: pulls sentence_transformers/torch/lancedb/ladybug
605
+ from java_codebase_rag.mcp import server # lazy: pulls sentence_transformers/torch/lancedb/ladybug
606
606
 
607
607
  result = asyncio.run(
608
608
  server.run_refresh_pipeline(
@@ -677,7 +677,7 @@ def _cmd_erase(args: argparse.Namespace) -> int:
677
677
  # tree_sitter (~54ms), and these filenames are only needed on the erase path.
678
678
  # Keeping it out of the top-level import lets `java-codebase-rag --help` (and
679
679
  # every other command) stay fast -- see the lazy-import invariant atop this file.
680
- from build_ast_graph import BUILDER_OWNED_INDEX_FILES
680
+ from java_codebase_rag.graph.build_ast_graph import BUILDER_OWNED_INDEX_FILES
681
681
  builder_paths = [cfg.ladybug_path.parent / name for name in BUILDER_OWNED_INDEX_FILES]
682
682
  operator_paths = [cfg.index_dir / name for name in OPERATOR_OWNED_INDEX_FILES]
683
683
  to_describe: list[Path] = [
@@ -768,12 +768,12 @@ def _cmd_erase(args: argparse.Namespace) -> int:
768
768
 
769
769
 
770
770
  def _cmd_meta(args: argparse.Namespace) -> int:
771
- import server # lazy
771
+ from java_codebase_rag.mcp import server # lazy
772
772
 
773
773
  cfg = _resolved_from_ns(args)
774
774
  _startup_hints(cfg)
775
775
  cfg.apply_to_os_environ()
776
- from ladybug_queries import LadybugGraph # lazy
776
+ from java_codebase_rag.graph.ladybug_queries import LadybugGraph # lazy
777
777
 
778
778
  LadybugGraph._instance = None
779
779
  LadybugGraph._instance_path = None
@@ -792,7 +792,7 @@ def _cmd_meta(args: argparse.Namespace) -> int:
792
792
 
793
793
 
794
794
  def _cmd_tables(args: argparse.Namespace) -> int:
795
- import server # lazy
795
+ from java_codebase_rag.mcp import server # lazy
796
796
 
797
797
  cfg = _resolved_from_ns(args)
798
798
  _startup_hints(cfg)
@@ -803,8 +803,8 @@ def _cmd_tables(args: argparse.Namespace) -> int:
803
803
 
804
804
 
805
805
  def _cmd_diagnose_ignore(args: argparse.Namespace) -> int:
806
- import server # lazy
807
- from path_filtering import LayeredIgnore # lazy
806
+ from java_codebase_rag.mcp import server # lazy
807
+ from java_codebase_rag.graph.path_filtering import LayeredIgnore # lazy
808
808
 
809
809
  cfg = _resolved_from_ns(args)
810
810
  _startup_hints(cfg)
@@ -833,7 +833,7 @@ def _cmd_unresolved_calls_list(args: argparse.Namespace) -> int:
833
833
  cfg = _resolved_from_ns(args)
834
834
  _startup_hints(cfg)
835
835
  cfg.apply_to_os_environ()
836
- from ladybug_queries import LadybugGraph # lazy
836
+ from java_codebase_rag.graph.ladybug_queries import LadybugGraph # lazy
837
837
 
838
838
  if not LadybugGraph.exists():
839
839
  _emit({"success": False, "message": "LadybugDB graph not found"})
@@ -854,7 +854,7 @@ def _cmd_unresolved_calls_stats(args: argparse.Namespace) -> int:
854
854
  cfg = _resolved_from_ns(args)
855
855
  _startup_hints(cfg)
856
856
  cfg.apply_to_os_environ()
857
- from ladybug_queries import LadybugGraph # lazy
857
+ from java_codebase_rag.graph.ladybug_queries import LadybugGraph # lazy
858
858
 
859
859
  if not LadybugGraph.exists():
860
860
  _emit({"success": False, "message": "LadybugDB graph not found"})
@@ -878,8 +878,8 @@ def _cmd_analyze_pr(args: argparse.Namespace) -> int:
878
878
  if not diff_text.strip():
879
879
  _emit({"success": False, "message": "Diff is empty"})
880
880
  return 1
881
- import pr_analysis # lazy
882
- from ladybug_queries import LadybugGraph # lazy
881
+ from java_codebase_rag.analysis import pr_analysis # lazy
882
+ from java_codebase_rag.graph.ladybug_queries import LadybugGraph # lazy
883
883
 
884
884
  if not LadybugGraph.exists():
885
885
  _emit({"success": False, "message": "LadybugDB graph not found"})
@@ -41,7 +41,7 @@ from pathlib import Path
41
41
  import ladybug
42
42
  import pyarrow as pa
43
43
 
44
- from ast_java import (
44
+ from java_codebase_rag.ast.ast_java import (
45
45
  ONTOLOGY_VERSION,
46
46
  CallSite,
47
47
  JavaFileAst,
@@ -52,7 +52,7 @@ from ast_java import (
52
52
  lombok_required_args_annotations,
53
53
  parse_java,
54
54
  )
55
- from graph_enrich import (
55
+ from java_codebase_rag.graph.graph_enrich import (
56
56
  _load_config_cross_service_resolution,
57
57
  classify_java_file,
58
58
  collect_annotation_meta_chain,
@@ -67,8 +67,8 @@ from graph_enrich import (
67
67
  resolve_routes_for_method,
68
68
  symbol_id,
69
69
  )
70
- from path_filtering import LayeredIgnore, iter_java_source_files
71
- from java_ontology import (
70
+ from java_codebase_rag.graph.path_filtering import LayeredIgnore, iter_java_source_files
71
+ from java_codebase_rag.graph.java_ontology import (
72
72
  CLIENT_KIND_FEIGN_METHOD,
73
73
  CLIENT_KIND_REST_TEMPLATE,
74
74
  VALID_CLIENT_KINDS,
@@ -4256,8 +4256,8 @@ def _try_build_vocabulary_index(db_path: Path, source_root: Path, verbose: bool)
4256
4256
  verbose: Whether to emit verbose progress
4257
4257
  """
4258
4258
  try:
4259
- from absence_vocab import VocabularyIndex, VOCAB_INDEX_FILENAME
4260
- from ladybug_queries import LadybugGraph
4259
+ from java_codebase_rag.absence.absence_vocab import VocabularyIndex, VOCAB_INDEX_FILENAME
4260
+ from java_codebase_rag.graph.ladybug_queries import LadybugGraph
4261
4261
 
4262
4262
  t0 = time.time()
4263
4263
  if verbose:
@@ -25,7 +25,7 @@ from dataclasses import dataclass, field, replace
25
25
  from functools import lru_cache
26
26
  from pathlib import Path
27
27
  from typing import Any, TypeVar
28
- from ast_java import (
28
+ from java_codebase_rag.ast.ast_java import (
29
29
  AnnotationRef,
30
30
  JavaFileAst,
31
31
  MethodDecl,
@@ -43,7 +43,7 @@ from ast_java import (
43
43
  _METHOD_ANN_TO_CAPABILITY,
44
44
  _TYPE_ANN_TO_CAPABILITY,
45
45
  )
46
- from java_ontology import (
46
+ from java_codebase_rag.graph.java_ontology import (
47
47
  CLIENT_KIND_REST_TEMPLATE,
48
48
  VALID_CAPABILITIES,
49
49
  VALID_CLIENT_KINDS,
@@ -52,7 +52,7 @@ from java_ontology import (
52
52
  VALID_ROUTE_FRAMEWORKS,
53
53
  VALID_ROUTE_KINDS,
54
54
  )
55
- from path_filtering import LayeredIgnore, iter_java_source_files
55
+ from java_codebase_rag.graph.path_filtering import LayeredIgnore, iter_java_source_files
56
56
 
57
57
  __all__ = [
58
58
  "AnnotationDecl",
@@ -10,8 +10,8 @@ from typing import Any, Literal
10
10
 
11
11
  from pydantic import BaseModel
12
12
 
13
- from ladybug_queries import LadybugGraph
14
- from mcp_hints import generate_hints
13
+ from java_codebase_rag.graph.ladybug_queries import LadybugGraph
14
+ from java_codebase_rag.mcp.mcp_hints import generate_hints
15
15
 
16
16
  __all__ = [
17
17
  "NodeRef",
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  from dataclasses import dataclass
8
8
  from typing import Literal
9
9
 
10
- from ast_java import (
10
+ from java_codebase_rag.ast.ast_java import (
11
11
  ROLE_ANNOTATIONS,
12
12
  _INJECTED_TYPES_TO_CAPABILITY,
13
13
  _METHOD_ANN_TO_CAPABILITY,
@@ -6,7 +6,7 @@ so the MCP server can serialize them without further mapping.
6
6
  The Ladybug database is opened read-only and cached per-process. This module is
7
7
  intentionally dependency-light: nothing here imports LanceDB or sentence-transformers.
8
8
 
9
- Cypher pitfalls (see also ``AGENTS.md``): avoid ``label(e) IN $list`` in ``WHERE`` for
9
+ Cypher pitfalls (see also ``CLAUDE.md``): avoid ``label(e) IN $list`` in ``WHERE`` for
10
10
  relationship-type filters; use OR of ``label(e) = $param`` with bound parameters.
11
11
  Typed unions ``-[e:A|B]-`` require every ``RETURN`` column on ``e`` to exist on all
12
12
  listed rel types, or the binder may fail.
@@ -24,7 +24,7 @@ from typing import Any, Literal
24
24
 
25
25
  import ladybug
26
26
 
27
- from ast_java import ONTOLOGY_VERSION as _ONTOLOGY_VERSION
27
+ from java_codebase_rag.ast.ast_java import ONTOLOGY_VERSION as _ONTOLOGY_VERSION
28
28
 
29
29
  log = logging.getLogger(__name__)
30
30
 
@@ -41,7 +41,7 @@ from cocoindex.resources.file import PatternFilePathMatcher
41
41
 
42
42
  from java_codebase_rag.config import resolved_sbert_model_for_process_env
43
43
  from java_codebase_rag.lance_optimize import LANCE_TABLE_NAMES
44
- from java_index_v1_common import (
44
+ from java_codebase_rag.index.java_index_v1_common import (
45
45
  JAVA_CHUNK,
46
46
  SBERT_MODEL,
47
47
  SQL_CHUNK,
@@ -49,9 +49,9 @@ from java_index_v1_common import (
49
49
  chunk_key_range,
50
50
  position_to_json,
51
51
  )
52
- from path_filtering import LayeredIgnore
53
- from ast_java import ONTOLOGY_VERSION, parse_java
54
- from graph_enrich import (
52
+ from java_codebase_rag.graph.path_filtering import LayeredIgnore
53
+ from java_codebase_rag.ast.ast_java import ONTOLOGY_VERSION, parse_java
54
+ from java_codebase_rag.graph.graph_enrich import (
55
55
  classify_java_file,
56
56
  collect_annotation_meta_chain,
57
57
  enrich_chunk,
@@ -134,7 +134,7 @@ def _apply_auto_scope(args: argparse.Namespace, cfg, graph) -> None:
134
134
  source_root = cfg.source_root if cfg.source_root else None
135
135
  if not source_root:
136
136
  return
137
- from graph_enrich import detect_microservice_from_path
137
+ from java_codebase_rag.graph.graph_enrich import detect_microservice_from_path
138
138
 
139
139
  candidate = detect_microservice_from_path(Path.cwd(), Path(source_root))
140
140
  if not candidate:
@@ -1217,7 +1217,7 @@ def _load_graph(cfg): # type: ignore[no-untyped-def]
1217
1217
  * ontology-mismatch (``RuntimeError`` from ``LadybugGraph.get``) ->
1218
1218
  ``_IndexStale`` (caught in ``main`` -> envelope with a rebuild hint).
1219
1219
  """
1220
- from ladybug_queries import LadybugGraph
1220
+ from java_codebase_rag.graph.ladybug_queries import LadybugGraph
1221
1221
 
1222
1222
  ladybug_path = str(cfg.ladybug_path)
1223
1223
  if not LadybugGraph.exists(ladybug_path):
@@ -1233,8 +1233,8 @@ def _load_graph(cfg): # type: ignore[no-untyped-def]
1233
1233
 
1234
1234
  def _cmd_vocab_index(args: argparse.Namespace) -> int:
1235
1235
  """Rebuild the vocabulary index sidecar from the Ladybug graph."""
1236
- from ast_java import ONTOLOGY_VERSION
1237
- from absence_vocab import VocabularyIndex, VOCAB_INDEX_FILENAME
1236
+ from java_codebase_rag.ast.ast_java import ONTOLOGY_VERSION
1237
+ from java_codebase_rag.absence.absence_vocab import VocabularyIndex, VOCAB_INDEX_FILENAME
1238
1238
 
1239
1239
  cfg = _resolve_cfg(args)
1240
1240
  try:
@@ -1565,7 +1565,7 @@ def _build_node_filter_or_error(filter_dict: dict):
1565
1565
  A bad enum (e.g. ``--role FOO``) should be a user-facing validation error,
1566
1566
  not an internal crash. Returns ``(node_filter, None)`` on success.
1567
1567
  """
1568
- import mcp_v2
1568
+ from java_codebase_rag.mcp import mcp_v2
1569
1569
 
1570
1570
  from java_codebase_rag.jrag_envelope import Envelope
1571
1571
  from pydantic import ValidationError
@@ -1591,7 +1591,7 @@ def _cmd_find_filter_mode(
1591
1591
  limit: int,
1592
1592
  ) -> int:
1593
1593
  """Find filter mode: build NodeFilter and call find_v2."""
1594
- import mcp_v2
1594
+ from java_codebase_rag.mcp import mcp_v2
1595
1595
 
1596
1596
  from java_codebase_rag.jrag_envelope import Envelope, next_actions_hook, normalize_enum, to_envelope_rows
1597
1597
  from java_codebase_rag.jrag_render import render
@@ -1674,7 +1674,7 @@ def _cmd_find_filter_mode(
1674
1674
 
1675
1675
 
1676
1676
  def _cmd_inspect(args: argparse.Namespace) -> int:
1677
- import mcp_v2
1677
+ from java_codebase_rag.mcp import mcp_v2
1678
1678
 
1679
1679
  from java_codebase_rag.jrag_envelope import Envelope, next_actions_hook, resolve_query
1680
1680
  from java_codebase_rag.jrag_render import render
@@ -2574,7 +2574,7 @@ def _cmd_callees(args: argparse.Namespace) -> int:
2574
2574
  # Producer root -> ASYNC_CALLS out (Producer -> :Route, the kafka_topic
2575
2575
  # Route this producer publishes to — NOT a :Producer node).
2576
2576
  if node.kind in ("client", "producer"):
2577
- import mcp_v2
2577
+ from java_codebase_rag.mcp import mcp_v2
2578
2578
 
2579
2579
  edge_types = ["HTTP_CALLS"] if node.kind == "client" else ["ASYNC_CALLS"]
2580
2580
  out = mcp_v2.neighbors_v2(
@@ -2710,7 +2710,7 @@ def _cmd_callees(args: argparse.Namespace) -> int:
2710
2710
 
2711
2711
 
2712
2712
  def _cmd_hierarchy(args: argparse.Namespace) -> int:
2713
- import mcp_v2
2713
+ from java_codebase_rag.mcp import mcp_v2
2714
2714
 
2715
2715
  cfg, graph, rc = _load_graph_or_error(args)
2716
2716
  if rc:
@@ -2863,7 +2863,7 @@ def _cmd_subclasses(args: argparse.Namespace) -> int:
2863
2863
 
2864
2864
 
2865
2865
  def _cmd_overrides(args: argparse.Namespace) -> int:
2866
- import mcp_v2
2866
+ from java_codebase_rag.mcp import mcp_v2
2867
2867
 
2868
2868
  cfg, graph, rc = _load_graph_or_error(args)
2869
2869
  if rc:
@@ -2916,7 +2916,7 @@ def _cmd_overrides(args: argparse.Namespace) -> int:
2916
2916
 
2917
2917
 
2918
2918
  def _cmd_overridden_by(args: argparse.Namespace) -> int:
2919
- import mcp_v2
2919
+ from java_codebase_rag.mcp import mcp_v2
2920
2920
 
2921
2921
  cfg, graph, rc = _load_graph_or_error(args)
2922
2922
  if rc:
@@ -3224,7 +3224,7 @@ def _cmd_flow(args: argparse.Namespace) -> int:
3224
3224
 
3225
3225
 
3226
3226
  def _cmd_dependencies(args: argparse.Namespace) -> int:
3227
- import mcp_v2
3227
+ from java_codebase_rag.mcp import mcp_v2
3228
3228
 
3229
3229
  cfg, graph, rc = _load_graph_or_error(args)
3230
3230
  if rc:
@@ -3559,7 +3559,7 @@ def _cmd_outline(args: argparse.Namespace) -> int:
3559
3559
  start_line<1). ``--limit`` caps the entry count (the file's symbol table
3560
3560
  is otherwise unbounded); ``truncated`` is set when more entries exist.
3561
3561
  """
3562
- from ladybug_queries import find_symbols_in_file_range
3562
+ from java_codebase_rag.graph.ladybug_queries import find_symbols_in_file_range
3563
3563
 
3564
3564
  from java_codebase_rag.jrag_envelope import Envelope, mark_truncated, next_actions_hook
3565
3565
  from java_codebase_rag.jrag_render import render
@@ -3629,8 +3629,8 @@ def _cmd_imports(args: argparse.Namespace) -> int:
3629
3629
  a node per import: resolved graph Symbol when resolve_v2 hits (status=one),
3630
3630
  or an unresolved placeholder carrying the raw FQN otherwise.
3631
3631
  """
3632
- from ast_java import parse_java
3633
- from resolve_service import resolve_v2
3632
+ from java_codebase_rag.ast.ast_java import parse_java
3633
+ from java_codebase_rag.analysis.resolve_service import resolve_v2
3634
3634
 
3635
3635
  from java_codebase_rag.jrag_envelope import Envelope, next_actions_hook
3636
3636
  from java_codebase_rag.jrag_render import render
@@ -4195,7 +4195,7 @@ def _zero_result_guidance(args: argparse.Namespace, graph) -> str | None:
4195
4195
  empty (truly no matches for this query), or the probe itself errored
4196
4196
  (non-fatal — the empty result still renders).
4197
4197
  """
4198
- import mcp_v2
4198
+ from java_codebase_rag.mcp import mcp_v2
4199
4199
  from collections import Counter
4200
4200
 
4201
4201
  from java_codebase_rag.jrag_envelope import normalize_enum
@@ -4250,7 +4250,7 @@ def _cmd_search(args: argparse.Namespace) -> int:
4250
4250
  truncation, and renders. --fuzzy is rejected IN-HANDLER (not argparse-exit)
4251
4251
  so the error carries the canonical envelope shape.
4252
4252
  """
4253
- import mcp_v2
4253
+ from java_codebase_rag.mcp import mcp_v2
4254
4254
 
4255
4255
  from java_codebase_rag.jrag_envelope import Envelope, mark_truncated, next_actions_hook, normalize_enum
4256
4256
  from java_codebase_rag.jrag_render import render
@@ -4375,7 +4375,7 @@ def _cmd_search(args: argparse.Namespace) -> int:
4375
4375
  # explain renderer from there would crash `jrag search ... --explain` on the
4376
4376
  # exact Intel install that runs the lexical path. search_scoring is
4377
4377
  # dependency-free and always installed, so the explain import works everywhere.
4378
- from search_scoring import explain_score_components
4378
+ from java_codebase_rag.search.search_scoring import explain_score_components
4379
4379
  comps = d.get("score_components")
4380
4380
  d["explain"] = explain_score_components(
4381
4381
  comps,
@@ -16,10 +16,11 @@ from __future__ import annotations
16
16
  import json
17
17
  import re
18
18
  from dataclasses import dataclass, field
19
+ from pathlib import Path
19
20
  from typing import Any, Literal
20
21
 
21
- from absence_types import AbsenceDiagnosis
22
- from graph_types import NodeRef
22
+ from java_codebase_rag.absence.absence_types import AbsenceDiagnosis
23
+ from java_codebase_rag.graph.graph_types import NodeRef
23
24
 
24
25
  __all__ = [
25
26
  "Envelope",
@@ -274,10 +275,22 @@ def simple_name(node_dict: dict[str, Any]) -> str:
274
275
 
275
276
  ``NodeRef`` carries no ``name`` field; the rendering layer derives a short
276
277
  label from the FQN on demand. Empty/missing FQN returns "".
278
+
279
+ File/package Symbol nodes are the exception: their ``fqn`` is a filesystem
280
+ path (e.g. ``chat-assign/.../AssignConfiguration.java``), so the dot-split
281
+ would yield the file *extension* (``java``) instead of a name. When the fqn
282
+ is a path (contains ``/`` — the indexer POSIX-normalizes via ``.as_posix()``
283
+ so backslashes don't occur) we return the basename. Route fqns
284
+ (``"GET /api/x"``) also contain ``/`` but carry a space, so they're excluded
285
+ here and stay on the dot-split path.
277
286
  """
278
287
  fqn = str(node_dict.get("fqn") or "")
279
288
  if not fqn:
280
289
  return ""
290
+ if "/" in fqn and " " not in fqn:
291
+ base = Path(fqn).name
292
+ if base:
293
+ return base
281
294
  return fqn.rsplit(".", 1)[-1]
282
295
 
283
296
 
@@ -532,10 +545,10 @@ def resolve_query(
532
545
  means ``--service`` disambiguates which microservice's route is selected.
533
546
  """
534
547
  # Lazy imports — keeps build_parser() / `jrag --help` free of resolve/ladybug.
535
- from resolve_service import resolve_v2
548
+ from java_codebase_rag.analysis.resolve_service import resolve_v2
536
549
 
537
550
  if graph is None:
538
- from ladybug_queries import LadybugGraph
551
+ from java_codebase_rag.graph.ladybug_queries import LadybugGraph
539
552
 
540
553
  graph = LadybugGraph.get(str(cfg.ladybug_path))
541
554
 
@@ -143,7 +143,7 @@ def next_actions(
143
143
  # EDGE_SCHEMA is the canonical label set; we use it to skip labels we don't
144
144
  # recognize (avoids emitting hints for spurious / future edge types the
145
145
  # command map doesn't cover).
146
- from java_ontology import EDGE_SCHEMA
146
+ from java_codebase_rag.graph.java_ontology import EDGE_SCHEMA
147
147
 
148
148
  # Known virtual labels not in EDGE_SCHEMA (describe-time rollup constructs).
149
149
  _VIRTUAL_LABELS = frozenset({"OVERRIDDEN_BY"})