java-codebase-rag 0.11.1__py3-none-any.whl → 0.12.0__py3-none-any.whl

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 (38) hide show
  1. java_codebase_rag/_deprecation.py +103 -0
  2. java_codebase_rag/_version.py +2 -2
  3. java_codebase_rag/ast/ast_java.py +22 -0
  4. java_codebase_rag/ast/ast_kotlin.py +1794 -0
  5. java_codebase_rag/ast/chunk_heuristics.py +26 -5
  6. java_codebase_rag/ast/language.py +117 -0
  7. java_codebase_rag/cli.py +17 -17
  8. java_codebase_rag/cli_dispatch.py +251 -0
  9. java_codebase_rag/config.py +8 -8
  10. java_codebase_rag/eval/runner.py +3 -3
  11. java_codebase_rag/graph/build_ast_graph.py +130 -8
  12. java_codebase_rag/graph/graph_enrich.py +8 -5
  13. java_codebase_rag/graph/ladybug_queries.py +1 -1
  14. java_codebase_rag/graph/path_filtering.py +39 -7
  15. java_codebase_rag/index/java_index_flow_lancedb.py +160 -15
  16. java_codebase_rag/install_data/agents/explorer-rag-cli.md +7 -5
  17. java_codebase_rag/install_data/agents/explorer-rag-enhanced.md +4 -4
  18. java_codebase_rag/install_data/skills/explore-codebase/SKILL.md +4 -4
  19. java_codebase_rag/install_data/skills/explore-codebase-cli/SKILL.md +6 -6
  20. java_codebase_rag/installer.py +15 -15
  21. java_codebase_rag/jrag.py +27 -11
  22. java_codebase_rag/lance_optimize.py +7 -7
  23. java_codebase_rag/mcp/mcp_v2.py +2 -2
  24. java_codebase_rag/mcp/server.py +6 -4
  25. java_codebase_rag/pipeline.py +4 -4
  26. java_codebase_rag/progress.py +1 -1
  27. java_codebase_rag/search/search_lexical.py +1 -1
  28. java_codebase_rag/search/search_scoring.py +19 -5
  29. java_codebase_rag/watch/daemon.py +40 -12
  30. java_codebase_rag/watch/lock.py +1 -1
  31. java_codebase_rag/watch/watcher.py +73 -31
  32. {java_codebase_rag-0.11.1.dist-info → java_codebase_rag-0.12.0.dist-info}/METADATA +31 -22
  33. {java_codebase_rag-0.11.1.dist-info → java_codebase_rag-0.12.0.dist-info}/RECORD +37 -33
  34. java_codebase_rag-0.12.0.dist-info/entry_points.txt +5 -0
  35. java_codebase_rag-0.11.1.dist-info/entry_points.txt +0 -4
  36. {java_codebase_rag-0.11.1.dist-info → java_codebase_rag-0.12.0.dist-info}/WHEEL +0 -0
  37. {java_codebase_rag-0.11.1.dist-info → java_codebase_rag-0.12.0.dist-info}/licenses/LICENSE +0 -0
  38. {java_codebase_rag-0.11.1.dist-info → java_codebase_rag-0.12.0.dist-info}/top_level.txt +0 -0
@@ -15,8 +15,12 @@ Lifecycle (``run_foreground``):
15
15
 
16
16
  1. Acquire the project lock. Held elsewhere -> stderr line + ``return 2``.
17
17
  Unsupported platform -> stderr line + ``return 2``.
18
- 2. EAGERLY warm the embedding model so a load failure fails fast (stderr +
19
- ``on_event("error", …)`` + lock release + ``return 2``).
18
+ 2. EAGERLY warm the embedding model — but ONLY when the vector stack is
19
+ installed — so a load failure fails fast (stderr + ``on_event("error", …)``
20
+ + lock release + ``return 2``). On graph-only installs (macOS Intel: PEP
21
+ 508 excludes sentence_transformers/lancedb) this step is skipped and the
22
+ daemon serves warm lexical/graph-only search instead; the read path
23
+ (``mcp_v2.search_v2``) degrades to lexical on its own.
20
24
  3. Install SIGINT/SIGTERM handlers that set a stop flag.
21
25
  4. ``server.start()`` then ``watcher.start()``.
22
26
  5. Write the state file (``paths.state_path``) so ``--status``/``--stop`` from
@@ -42,6 +46,7 @@ import threading
42
46
  import time
43
47
  from typing import TYPE_CHECKING, Any
44
48
 
49
+ from java_codebase_rag.pipeline import vector_stack_installed
45
50
  from java_codebase_rag.watch import paths
46
51
  from java_codebase_rag.watch.lock import (
47
52
  LockHeldError,
@@ -75,6 +80,10 @@ class WatchDaemon:
75
80
 
76
81
  def __init__(self, cfg: "ResolvedOperatorConfig") -> None:
77
82
  self.cfg = cfg
83
+ # Probed once (cheap: 3x importlib.util.find_spec). When False (graph-only
84
+ # install — macOS Intel), the daemon skips the embedding-model warm-up and
85
+ # the cocoindex vectors reindex; the read path degrades to lexical on its own.
86
+ self._vector_enabled = vector_stack_installed()
78
87
  self.lock = ProjectLock(cfg.index_dir)
79
88
  self.warm = WarmResources(cfg)
80
89
  self.server = WatchServer(self.warm, cfg)
@@ -94,6 +103,13 @@ class WatchDaemon:
94
103
  "started_at": None,
95
104
  "pid": None,
96
105
  "socket": str(paths.socket_path(cfg.index_dir)),
106
+ # Display label derived from the install-time probe above, NOT a live
107
+ # search-capability check — the read path's actual lexical/vector choice
108
+ # is mcp_v2's (``_ensure_vector_backend``). The two agree under the PEP
109
+ # 508 markers (the vector trio is present or absent together). Surfaced
110
+ # in the status panel and ``jrag watch --status``; omitted from display
111
+ # on the normal (vector) path to avoid noise.
112
+ "mode": "lexical" if not self._vector_enabled else "vector",
97
113
  "last_reindex_at": None,
98
114
  "last_reindex_kind": None,
99
115
  "reindex_count": 0,
@@ -128,16 +144,26 @@ class WatchDaemon:
128
144
  print("jrag watch: watch mode requires macOS/Linux", file=sys.stderr)
129
145
  return 2
130
146
 
131
- # 2. Eagerly warm the model so a load failure fails fast (before the
132
- # server accepts a single query). The model is the only heavy,
133
- # failure-prone resource that is not lazy on the read path.
134
- try:
135
- self.warm.model()
136
- except Exception as exc: # noqa: BLE001 — report any load failure, then bail
137
- print(f"jrag watch: failed to load embedding model: {exc}", file=sys.stderr)
138
- self._record("error", {"phase": "model_load", "error": repr(exc)})
139
- self.lock.release()
140
- return 2
147
+ # 2. Eagerly warm the embedding model so a load failure fails fast (before
148
+ # the server accepts a single query) — but ONLY when the vector stack is
149
+ # installed. The model is the only heavy, failure-prone resource that is
150
+ # not lazy on the read path. On a graph-only install (macOS Intel) there
151
+ # is no vector stack to warm; the daemon serves lexical/graph-only search
152
+ # and ``mcp_v2.search_v2`` degrades on its own, so we skip straight to
153
+ # serving rather than failing on a missing ``sentence_transformers``.
154
+ if self._vector_enabled:
155
+ try:
156
+ self.warm.model()
157
+ except Exception as exc: # noqa: BLE001 — report any load failure, then bail
158
+ print(f"jrag watch: failed to load embedding model: {exc}", file=sys.stderr)
159
+ self._record("error", {"phase": "model_load", "error": repr(exc)})
160
+ self.lock.release()
161
+ return 2
162
+ else:
163
+ print(
164
+ "jrag watch: vector stack unavailable — serving lexical (graph-only) search",
165
+ file=sys.stderr,
166
+ )
141
167
 
142
168
  # 3. Install stop-signal handlers (main thread only).
143
169
  signal.signal(signal.SIGINT, self._on_signal)
@@ -279,6 +305,8 @@ class WatchDaemon:
279
305
  state = dict(self._state)
280
306
  table = Table(title=f"jrag watch (pid {os.getpid()})", show_header=False, box=None)
281
307
  table.add_row("socket", str(state.get("socket")))
308
+ if state.get("mode") == "lexical":
309
+ table.add_row("mode", "lexical (graph-only)")
282
310
  table.add_row("reindex count", str(state.get("reindex_count", 0)))
283
311
  last_kind = state.get("last_reindex_kind")
284
312
  last_at = state.get("last_reindex_at")
@@ -2,7 +2,7 @@
2
2
 
3
3
  ``ProjectLock`` is the single-writer primitive the watch daemon (Task 11)
4
4
  acquires so that at most one watcher — and no concurrent manual
5
- ``java-codebase-rag increment`` — runs per project.
5
+ ``jrag increment`` — runs per project.
6
6
 
7
7
  The lock is keyed on the project's index dir: the pidfile path comes from
8
8
  ``paths.pid_path(index_dir)`` (Task 3). We hold an advisory exclusive flock on
@@ -3,10 +3,11 @@
3
3
  ``SourceWatcher`` observes the project source tree and, after a debounce window,
4
4
  re-runs the minimal reindex for the changed file types:
5
5
 
6
- * a ``.java`` change -> vectors THEN graph. The graph reindex runs as a
7
- subprocess under a copy-on-write snapshot (design §4.7) so concurrent graph
8
- reads keep being served from a sidecar copy while the single-writer
9
- subprocess overwrites the original. ``ladybug`` has no transactions and is
6
+ * a source-language change (``.java``; ``.kt`` when the kotlin grammar is
7
+ importable) -> vectors THEN graph. The graph reindex runs as a subprocess
8
+ under a copy-on-write snapshot (design §4.7) so concurrent graph reads keep
9
+ being served from a sidecar copy while the single-writer subprocess
10
+ overwrites the original. ``ladybug`` has no transactions and is
10
11
  single-writer, which is why graph builds are subprocesses and reads are
11
12
  served from a copy.
12
13
  * a matching ``.sql`` / ``.yml`` / ``.yaml`` resource change -> vectors only
@@ -20,7 +21,8 @@ the watchdog observer thread is never blocked.
20
21
  The cocoindex flow indexes three sets (``**/*.java``,
21
22
  ``**/src/main/resources/db/migration/*.sql``,
22
23
  ``**/src/main/resources/application*.yml``/``.yaml``). There is NO shared
23
- iterator (``iter_java_source_files`` yields ``.java`` only), so the watcher
24
+ iterator (``iter_source_files`` yields the registered source suffixes —
25
+ ``.java`` and ``.kt`` when the Kotlin grammar is installed), so the watcher
24
26
  defines this UNION and classifies each event path into a reindex kind.
25
27
 
26
28
  All status is reported via ``on_event(kind, detail)`` callbacks (kinds:
@@ -39,8 +41,13 @@ from watchdog.events import FileSystemEventHandler
39
41
  from watchdog.observers import Observer
40
42
  from watchdog.observers.polling import PollingObserver
41
43
 
44
+ from java_codebase_rag.ast.language import LANG_BACKENDS, backend_for
42
45
  from java_codebase_rag.graph.path_filtering import LayeredIgnore
43
- from java_codebase_rag.pipeline import run_cocoindex_update, run_incremental_graph
46
+ from java_codebase_rag.pipeline import (
47
+ run_cocoindex_update,
48
+ run_incremental_graph,
49
+ vector_stack_installed,
50
+ )
44
51
 
45
52
  if TYPE_CHECKING:
46
53
  from java_codebase_rag.config import ResolvedOperatorConfig
@@ -48,9 +55,19 @@ if TYPE_CHECKING:
48
55
 
49
56
  log = logging.getLogger(__name__)
50
57
 
51
- # Suffixes the watcher treats as java sources. The non-java resource types are
52
- # matched by the glob helpers below (the cocoindex set has no shared iterator).
53
- INDEXED_SUFFIXES: tuple[str, ...] = (".java",)
58
+ # Suffixes the watcher treats as source files — derived from the language
59
+ # backend registry so this never drifts from what the graph builder parses.
60
+ # ``(".java", ".kt")`` when the kotlin grammar is importable; just
61
+ # ``(".java",)`` on a grammar-absent (e.g. graph-only) install. The non-source
62
+ # resource types (sql/yaml) are matched by the glob helpers below (the cocoindex
63
+ # set has no shared iterator).
64
+ INDEXED_SUFFIXES: tuple[str, ...] = tuple(
65
+ suffix for backend in LANG_BACKENDS.values() for suffix in backend.suffixes
66
+ )
67
+ # Reindex kinds that trigger a graph rebuild. The graph indexes every registered
68
+ # source language (java today, kotlin too when its grammar imports), so this is
69
+ # the set of backend ``language_id``s. sql/yaml are vectors-only (no graph row).
70
+ _GRAPH_INDEXED_KINDS: frozenset[str] = frozenset(LANG_BACKENDS.keys())
54
71
  _YAML_SUFFIXES: tuple[str, ...] = (".yml", ".yaml")
55
72
 
56
73
  # Project-relative anchored prefixes for the two non-java resource globs:
@@ -126,6 +143,10 @@ class SourceWatcher:
126
143
  ) -> None:
127
144
  self.cfg = cfg
128
145
  self.warm = warm
146
+ # Probed once: when False (graph-only install — macOS Intel) the vectors
147
+ # (cocoindex) reindex step is skipped entirely, so the graph reindex still
148
+ # completes and fires ``indexing_done`` instead of bailing on a 127 stub.
149
+ self._vector_enabled = vector_stack_installed()
129
150
  self._debounce_s = max(int(debounce_ms), 1) / 1000.0
130
151
  self._backend = backend
131
152
  # watchdog's PollingObserver takes a float timeout in SECONDS (it flows
@@ -199,13 +220,15 @@ class SourceWatcher:
199
220
 
200
221
  # -- event classification (observer thread) ------------------------------
201
222
  #
202
- # The watcher fires on exactly the cocoindex-indexed set (``.java`` plus the
203
- # SQL/YAML resource patterns below) filtered through ``LayeredIgnore``.
204
- # ``target/generated-sources/**/*.java`` therefore correctly fires: generated
205
- # sources are first-class, cocoindex does NOT exclude ``target/``, so the
206
- # watcher must fire to keep them fresh. ``LayeredIgnore.is_ignored`` does NOT
207
- # prune build-output dirs (``target/``/``build``/``out``) -- that pruning lives
208
- # in ``iter_java_source_files``'s ``os.walk`` (``_is_build_output_dir``), used
223
+ # The watcher fires on exactly the indexed set: the source languages claimed
224
+ # by ``LANG_BACKENDS`` (``.java``; ``.kt`` when the kotlin grammar imports)
225
+ # plus the SQL/YAML resource patterns below, filtered through
226
+ # ``LayeredIgnore``. ``target/generated-sources/**/*.java`` therefore
227
+ # correctly fires: generated sources are first-class, cocoindex does NOT
228
+ # exclude ``target/``, so the watcher must fire to keep them fresh.
229
+ # ``LayeredIgnore.is_ignored`` does NOT prune build-output dirs
230
+ # (``target/``/``build``/``out``) -- that pruning lives in
231
+ # ``iter_source_files``'s ``os.walk`` (``_is_build_output_dir``), used
209
232
  # by the graph builder, not by cocoindex. (Compiled ``.class`` output under
210
233
  # ``target/`` doesn't match the ``.java`` suffix anyway.)
211
234
 
@@ -230,9 +253,16 @@ class SourceWatcher:
230
253
  rel = path.resolve().relative_to(self._source_root_resolved).as_posix()
231
254
  except ValueError:
232
255
  return set()
256
+ # Source languages (.java, .kt when registered) dispatch via the backend
257
+ # registry: a change yields its backend's ``language_id`` reindex kind,
258
+ # which triggers the graph rebuild (the subprocess graph builder re-walks
259
+ # the tree and parses each file through ``backend_for`` — so a ``.kt``
260
+ # change reprocesses via KotlinBackend). Unknown suffixes are not source
261
+ # files and fall through to the resource-glob checks below.
262
+ backend = backend_for(path)
263
+ if backend is not None:
264
+ return {backend.language_id}
233
265
  suffix = path.suffix.lower()
234
- if suffix == ".java":
235
- return {"java"}
236
266
  if suffix == ".sql":
237
267
  return {"sql"} if _is_migration_sql(rel) else set()
238
268
  if suffix in _YAML_SUFFIXES:
@@ -281,7 +311,8 @@ class SourceWatcher:
281
311
  # -- reindex (runs on the debounce worker thread) ------------------------
282
312
 
283
313
  def reindex(self, kinds: set[str]) -> None:
284
- """Run one debounced reindex: vectors always; graph only when java changed.
314
+ """Run one debounced reindex: vectors always (when installed); graph only when a
315
+ registered source language (java/kotlin) changed.
285
316
 
286
317
  COW lifecycle (design §4.7): the graph subprocess writes the ORIGINAL
287
318
  graph while reads are served from a sidecar copy. ``begin_graph_snapshot``
@@ -290,25 +321,36 @@ class SourceWatcher:
290
321
  graph failure the existing ``.graph_increment_in_progress`` crash marker
291
322
  drives the next full rebuild. Lance needs no snapshot (commits are atomic
292
323
  per version; fresh per-query reads are fine).
324
+
325
+ Graph-only installs (macOS Intel) have no vector stack: the cocoindex
326
+ step is skipped (``vres=None``) so the graph reindex completes and fires
327
+ ``indexing_done`` instead of bailing on a 127 cocoindex-not-found stub.
293
328
  """
294
329
  if not kinds:
295
330
  return
296
331
  kind_list = sorted(kinds)
297
332
  self._emit("indexing_started", {"kinds": kind_list})
298
333
  try:
299
- # Vectors run for every indexed type (java/sql/yaml all flow through cocoindex).
300
- self._emit("vectors", {"kinds": kind_list})
301
- vres = run_cocoindex_update(
302
- self.cfg.subprocess_env(),
303
- full_reprocess=False,
304
- quiet=True,
305
- verbose=False,
306
- )
334
+ # Vectors run for every indexed type (java/sql/yaml all flow through
335
+ # cocoindex) — but only when the vector stack is installed. On a
336
+ # graph-only install cocoindex is absent and the call would return a
337
+ # 127 stub; skipping it keeps ``indexing_done`` reachable.
338
+ if self._vector_enabled:
339
+ self._emit("vectors", {"kinds": kind_list})
340
+ vres = run_cocoindex_update(
341
+ self.cfg.subprocess_env(),
342
+ full_reprocess=False,
343
+ quiet=True,
344
+ verbose=False,
345
+ )
346
+ else:
347
+ vres = None
307
348
 
308
349
  graph_rc = 0
309
- if "java" in kinds:
310
- # Graph indexes java only; reindex under a COW snapshot so graph
311
- # reads continue (from the sidecar) during the subprocess write.
350
+ if kinds & _GRAPH_INDEXED_KINDS:
351
+ # The graph indexes every registered source language (java,
352
+ # kotlin when its grammar imports); reindex under a COW snapshot
353
+ # so graph reads continue (from the sidecar) during the write.
312
354
  self._emit("graph", {"kinds": kind_list})
313
355
  try:
314
356
  # begin/commit paired in this try/finally. begin_graph_snapshot
@@ -328,7 +370,7 @@ class SourceWatcher:
328
370
  # is never left dangling. No-ops when no snapshot is active.
329
371
  self.warm.commit_graph_snapshot()
330
372
 
331
- if vres.returncode != 0:
373
+ if vres is not None and vres.returncode != 0:
332
374
  self._emit("error", {"phase": "vectors", "returncode": vres.returncode})
333
375
  return
334
376
  if graph_rc != 0:
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: java-codebase-rag
3
- Version: 0.11.1
4
- Summary: MCP server for semantic + structural search over Java codebases
3
+ Version: 0.12.0
4
+ Summary: jrag (formerly java-codebase-rag) — MCP server + jrag CLI for semantic + structural search over Java/Kotlin codebases
5
5
  Author: HumanBean17
6
6
  License-Expression: MIT
7
- Project-URL: Homepage, https://github.com/HumanBean17/java-codebase-rag
8
- Project-URL: Repository, https://github.com/HumanBean17/java-codebase-rag
9
- Project-URL: Issues, https://github.com/HumanBean17/java-codebase-rag/issues
10
- Keywords: mcp,java,rag,code-search,graph,lancedb,ladybug
7
+ Project-URL: Homepage, https://github.com/HumanBean17/jrag
8
+ Project-URL: Repository, https://github.com/HumanBean17/jrag
9
+ Project-URL: Issues, https://github.com/HumanBean17/jrag/issues
10
+ Keywords: jrag,java,mcp,rag,code-search,graph,lancedb,ladybug
11
11
  Classifier: Development Status :: 3 - Alpha
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: Programming Language :: Python :: 3
@@ -35,6 +35,7 @@ Requires-Dist: rich<16,>=14
35
35
  Requires-Dist: sentence-transformers<6,>=5.4.0; sys_platform != "darwin" or platform_machine != "x86_64"
36
36
  Requires-Dist: tree-sitter<0.26,>=0.25.2
37
37
  Requires-Dist: tree-sitter-java<0.24,>=0.23.5
38
+ Requires-Dist: tree-sitter-kotlin<2,>=1.1.0
38
39
  Requires-Dist: unidiff<1,>=0.7.3
39
40
  Requires-Dist: watchdog<7,>=6
40
41
  Provides-Extra: dev
@@ -44,7 +45,7 @@ Requires-Dist: pytest-xdist>=3; extra == "dev"
44
45
  Requires-Dist: ruff>=0.4; extra == "dev"
45
46
  Dynamic: license-file
46
47
 
47
- # java-codebase-rag
48
+ # jrag
48
49
 
49
50
  A graph-native code intelligence layer for Java microservice estates, surfaced through the **`jrag` CLI** — one command per engineering intent. A **legacy MCP server** (`search` / `find` / `describe` / `neighbors` / `resolve`) is also available for existing setups. Both are thin surfaces over the same **AST Graph**: a deterministic property graph extracted from Java source with tree-sitter, stored **locally** in **LadybugDB** (graph) alongside a **LanceDB** vector index (chunks). There is no server to host and no cloud round-trip — the index lives on your disk and your source never leaves the machine. Both surfaces collapse onto three primitive operations: **locate**, **inspect**, **walk**.
50
51
 
@@ -82,15 +83,17 @@ The rest of this README is the install, the tool/command orientation, and the re
82
83
  ## Install
83
84
 
84
85
  ```bash
85
- pip install java-codebase-rag
86
+ pip install jrag-cli
86
87
  ```
87
88
 
88
- Python **3.11+** required, on **Linux, macOS, and Windows**. On Linux, Windows, and **Apple Silicon** Macs every native dependency (LanceDB, LadybugDB, CocoIndex) ships a wheel and you get the full semantic + graph search. **Intel Macs (x86_64) install graph-only**: PyTorch ≥2.3 and LanceDB ≥0.26 dropped macOS Intel wheels, so the vector stack is auto-excluded via PEP 508 markers — `pip install java-codebase-rag` works out of the box, the graph layer (`find` / `describe` / `neighbors` / `resolve`) is fully usable, and the `search` tool falls back to **lexical search** over the symbol graph — BM25-ranked over a LadybugDB full-text index (same tool contract, keyword-ranked instead of semantic; an advisory notes the mode). Semantic/vector search needs Apple Silicon, Linux, or Windows. After install, `java-codebase-rag --help` should print the CLI groups.
89
+ Python **3.11+** required, on **Linux, macOS, and Windows**. On Linux, Windows, and **Apple Silicon** Macs every native dependency (LanceDB, LadybugDB, CocoIndex) ships a wheel and you get the full semantic + graph search. **Intel Macs (x86_64) install graph-only**: PyTorch ≥2.3 and LanceDB ≥0.26 dropped macOS Intel wheels, so the vector stack is auto-excluded via PEP 508 markers — `pip install jrag-cli` works out of the box, the graph layer (`find` / `describe` / `neighbors` / `resolve`) is fully usable, and the `search` tool falls back to **lexical search** over the symbol graph — BM25-ranked over a LadybugDB full-text index (same tool contract, keyword-ranked instead of semantic; an advisory notes the mode). Semantic/vector search needs Apple Silicon, Linux, or Windows. After install, `jrag --help` should print the CLI groups.
89
90
  The package includes the CocoIndex lifecycle dependency used by `init`, `increment`, `reprocess`, and `erase` on platforms that have it (it is absent on Intel Mac).
90
91
 
92
+ **Kotlin (`.kt`) is indexed alongside Java (`.java`)** — both feed one merged AST graph (a Kotlin class can implement a Java interface and vice versa). Kotlin parsing requires the `tree-sitter-kotlin` grammar; if it fails to import, `.kt` files are skipped and Java-only indexing proceeds. **Intel Mac note:** `tree-sitter-kotlin` currently ships a macOS x86_64 wheel, so Kotlin indexing works there today; if a future release drops that wheel, Kotlin indexing degrades off on Intel Mac while the Java graph keeps working. See `docs/CODEBASE_REQUIREMENTS.md` A.1 for the v1 Kotlin limitations (extension-function calls unresolved; non-Spring frameworks out of scope; generated-code classification Java-only).
93
+
91
94
  ### Interactive setup (recommended)
92
95
 
93
- Run `java-codebase-rag install` from your Java project root to launch an interactive setup wizard that:
96
+ Run `jrag install` from your Java project root to launch an interactive setup wizard that:
94
97
 
95
98
  1. Detects Java source directories (Maven/Gradle modules)
96
99
  2. Configures the embedding model (auto-downloads ~90MB or uses a local path)
@@ -101,19 +104,19 @@ Run `java-codebase-rag install` from your Java project root to launch an interac
101
104
 
102
105
  ```bash
103
106
  # Interactive mode
104
- java-codebase-rag install
107
+ jrag install
105
108
 
106
109
  # Non-interactive mode (for CI/automation)
107
- java-codebase-rag install --non-interactive --agent claude-code
110
+ jrag install --non-interactive --agent claude-code
108
111
  ```
109
112
 
110
- After `pip install --upgrade java-codebase-rag`, run `java-codebase-rag update` to refresh shipped artifacts and catch up the index (Lance + graph).
113
+ After `pip install --upgrade jrag-cli`, run `jrag update` to refresh shipped artifacts and catch up the index (Lance + graph).
111
114
 
112
115
  All indexing lifecycle commands (`init`, `increment`, `reprocess`, `install`, `update`) show a unified `Vectors → Optimize → Graph` progress bar on stderr during the index build (powered by `rich`); pass `--quiet` to suppress it.
113
116
 
114
117
  ### Manual registration
115
118
 
116
- If you prefer manual configuration, see [`docs/JAVA-CODEBASE-RAG-CLI.md`](./docs/JAVA-CODEBASE-RAG-CLI.md) for the full CLI reference.
119
+ If you prefer manual configuration, see [`docs/JRAG-CLI.md`](./docs/JRAG-CLI.md) for the full CLI reference.
117
120
 
118
121
  > **Stability disclaimer.** This package does **not** promise backward compatibility. MCP tool contracts, env vars, Lance/LadybugDB schemas, config files, and Python APIs may change without a deprecation period. Track `main` and rebuild indexes when ontology or embedding settings change.
119
122
 
@@ -121,7 +124,7 @@ If you prefer manual configuration, see [`docs/JAVA-CODEBASE-RAG-CLI.md`](./docs
121
124
 
122
125
  ## Tools & commands at a glance
123
126
 
124
- `jrag` is the default and recommended surface (`java-codebase-rag install --surface cli`). The **MCP server** (`--surface mcp`) is kept as a **legacy** option for existing setups. Both surfaces walk the same LanceDB vectors + LadybugDB **AST Graph**. Switch an existing install later with `java-codebase-rag update --surface mcp|cli`.
127
+ `jrag` is the default and recommended surface (`jrag install --surface cli`). The **MCP server** (`--surface mcp`) is kept as a **legacy** option for existing setups. Both surfaces walk the same LanceDB vectors + LadybugDB **AST Graph**. Switch an existing install later with `jrag update --surface mcp|cli`.
125
128
 
126
129
  **CLI surface — `jrag`, one command per engineering intent**
127
130
 
@@ -213,7 +216,7 @@ The operator-facing surface is small: pick an index dir, pick an embedding model
213
216
 
214
217
  ## CLI cheat sheet
215
218
 
216
- Run `java-codebase-rag --help` to list grouped subcommands. Operator playbook with workflows, exit codes, and env alignment lives in [`docs/JAVA-CODEBASE-RAG-CLI.md`](./docs/JAVA-CODEBASE-RAG-CLI.md).
219
+ Run `jrag --help` to list grouped subcommands. Operator playbook with workflows, exit codes, and env alignment lives in [`docs/JRAG-CLI.md`](./docs/JRAG-CLI.md).
217
220
 
218
221
  | Group | Subcommand | What it does |
219
222
  |---|---|---|
@@ -230,8 +233,8 @@ Run `java-codebase-rag --help` to list grouped subcommands. Operator playbook wi
230
233
 
231
234
  ## jrag — agent CLI
232
235
 
233
- `jrag` is a separate console script (alongside `java-codebase-rag`) built for AI
234
- coding agents. It gives the agent **one command per engineering intent** and
236
+ `jrag` is the unified console script (operator + agent verbs) built for AI
237
+ coding agents and operators alike. It gives the agent **one command per engineering intent** and
235
238
  takes human-readable identifiers (FQN / simple name / route path / topic) —
236
239
  never raw node IDs. Every `<query>` command resolves the identifier via
237
240
  `resolve_v2` as the first step; on `many` it returns candidates and stops, on
@@ -285,7 +288,7 @@ A missing or stale index produces an actionable `status: error` envelope (exit
285
288
  2) rather than a traceback:
286
289
 
287
290
  ```
288
- error: No index at /path/to/code_graph.lbug. Run: java-codebase-rag init --source-root <root>
291
+ error: No index at /path/to/code_graph.lbug. Run: jrag init --source-root <root>
289
292
  ```
290
293
 
291
294
  See [`plans/active/PLAN-JRAG-CLI.md`](./plans/active/PLAN-JRAG-CLI.md) for the
@@ -300,7 +303,7 @@ full design and per-PR breakdown.
300
303
  | [`docs/paper/paper.pdf`](./docs/paper/paper.pdf) | Architecture report — design rationale, GPS metaphor, three-layer architecture, design principles, future work. |
301
304
  | [`docs/AGENT-GUIDE.md`](./docs/AGENT-GUIDE.md) | Agent-facing guide. Copy-paste into `QWEN.md` / `CLAUDE.md` / `AGENTS.md`. |
302
305
  | [`docs/CONFIGURATION.md`](./docs/CONFIGURATION.md) | Environment variables, project YAML, graph ontology, brownfield overrides, ignore patterns. |
303
- | [`docs/JAVA-CODEBASE-RAG-CLI.md`](./docs/JAVA-CODEBASE-RAG-CLI.md) | CLI operator playbook: workflows, exit codes, env alignment. |
306
+ | [`docs/JRAG-CLI.md`](./docs/JRAG-CLI.md) | CLI operator playbook: workflows, exit codes, env alignment. |
304
307
  | [`docs/EDGE-NAVIGATION.md`](./docs/EDGE-NAVIGATION.md) | MCP-traversable edges, directions, dot-key composition. |
305
308
  | [`skills/`](./skills/) | `/explore-codebase-cli` (CLI surface) + `/explore-codebase` (legacy MCP surface) skills — operating manuals for hosts with skill discovery (alternative to copy-pasting AGENT-GUIDE). See [`skills/README.md`](./skills/README.md). |
306
309
  | [`docs/MANUAL-VERIFICATION-CHECKLIST.md`](./docs/MANUAL-VERIFICATION-CHECKLIST.md) | 7-phase agent-driven verification after indexing your project. |
@@ -312,8 +315,8 @@ full design and per-PR breakdown.
312
315
  ## Install from source (contributors)
313
316
 
314
317
  ```bash
315
- git clone https://github.com/HumanBean17/java-codebase-rag
316
- cd java-codebase-rag
318
+ git clone https://github.com/HumanBean17/jrag
319
+ cd jrag
317
320
  python3 -m venv .venv
318
321
  .venv/bin/pip install -e ".[dev]"
319
322
  ```
@@ -329,3 +332,9 @@ The default embedding model is `sentence-transformers/all-MiniLM-L6-v2` (downloa
329
332
  - `get_service_topology` — microservice-level summary aggregating `HTTP_CALLS` / `ASYNC_CALLS`.
330
333
  - Agentic routing layer (query classifier → vector / graph / both).
331
334
  - Optional `codegraph_nodes` LanceDB table embedding symbol summaries so the graph itself is vector-searchable.
335
+
336
+ ---
337
+
338
+ ## Built on
339
+
340
+ The indexing pipeline runs on [**CocoIndex**](https://github.com/cocoindex-io/cocoindex) — an open-source data indexing framework that powers the vector store lifecycle (`init`, `increment`, `reprocess`, `erase`) behind every `jrag` index.
@@ -1,19 +1,21 @@
1
1
  java_codebase_rag/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
2
+ java_codebase_rag/_deprecation.py,sha256=qOxHM4AYUUBQPIgTMXODPmnxjrpMoYweMzjOoqBkQKc,4196
2
3
  java_codebase_rag/_fdlimit.py,sha256=vkwjsPbZfxzZ2DZTPWO5DxtuNlLzOADzIq07iYX7GCU,2465
3
4
  java_codebase_rag/_stdio.py,sha256=TDNbpt2EP0_Zd622ihdlKwlMfxkKHWOfgLVcU6TcNbo,1458
4
- java_codebase_rag/_version.py,sha256=Dnoh_a-c13fqPQ-HV9CsSPbFUkihUJl_z5CACW4qDyA,1365
5
- java_codebase_rag/cli.py,sha256=Sf5HWQ607cg8LoZ-xlNpKKK-RslOjj5DDDsZDpHnUj8,47721
5
+ java_codebase_rag/_version.py,sha256=-6MchHEyRglldb52uN12r226NUEVAmks9PTK8U1t_Yc,1347
6
+ java_codebase_rag/cli.py,sha256=nLBnGbbZhNNB6aO85LpnKdLJ9pBrWjaPhQcY1-kEb_I,47500
7
+ java_codebase_rag/cli_dispatch.py,sha256=hYBVV5KAiftcdF9Kh3E_tIYBaeFfWAnr0ATQvxH01Ok,9690
6
8
  java_codebase_rag/cli_format.py,sha256=CT7-xdwZ0bMCdP68_UOwkvm-mnLluU3LutlM-mDNk60,1839
7
9
  java_codebase_rag/cli_progress.py,sha256=q6Wh97yzLGs1B8UFk_WAKivfQu7Y5RnUUE-T2YHWkIs,3237
8
- java_codebase_rag/config.py,sha256=4rlRQUj0gFM-StUvhMD61uB2hZd2zqVHeNNBRXJMfN4,33283
9
- java_codebase_rag/installer.py,sha256=c-_tR1Ct_O3yhmruFRnDoM1Wilz-igD9qdkDPsNqLMI,79934
10
- java_codebase_rag/jrag.py,sha256=0_Cne1LUGo6MmmiZEaOGSKGPXmHx5P-jC3gLBcrXTJA,197527
10
+ java_codebase_rag/config.py,sha256=Snlj6z8pJD6OYZL8pz6bATunulyhJLpVymUORY2QUjA,33179
11
+ java_codebase_rag/installer.py,sha256=efxkNxbcoxKFzqTe9-IeVlRlMxlcsYZY9Kve_HPxJO4,79734
12
+ java_codebase_rag/jrag.py,sha256=t_QXmh-jmw1P7T7XaIydARNnxd12mpL6_5xSv0uWaSI,198220
11
13
  java_codebase_rag/jrag_envelope.py,sha256=I5q7E3DmuJBnDl1iv7bW2NucPJ2YxlmNEtM2dau18Vw,48730
12
14
  java_codebase_rag/jrag_hints.py,sha256=aazBRI3pOeyq2IjQuoMzDkA-1cB_tTGbVcguX3BzOiQ,9286
13
15
  java_codebase_rag/jrag_render.py,sha256=xYK-0YmUMwEb4w4o6rjkrn-maHhY2oEqKgLqKQqaliE,42829
14
- java_codebase_rag/lance_optimize.py,sha256=zLAJzWaLc4CONyure5_Bw5WhEgXF5tlQgYMJmFN3zrg,11970
15
- java_codebase_rag/pipeline.py,sha256=e8IzuAsSglqWyfRXqAqq0u23oH9l_kWsZbk5j929KQA,21419
16
- java_codebase_rag/progress.py,sha256=2IxdMALDM0wAQCyJrrfZ975zM_85C-4BfHxf4AtYifE,23212
16
+ java_codebase_rag/lance_optimize.py,sha256=0yaCEgLc6MiBJpG2N1cNXQIEtKvBz2fSHQjDDRf9B-4,11879
17
+ java_codebase_rag/pipeline.py,sha256=fwTAuIsMBGUGBWnp2xi9brlY8zTzJ1Szh6bztQ4jKg8,21367
18
+ java_codebase_rag/progress.py,sha256=73uuL-wZYcdkkKCgRwdzVturT5FH1Ek2-PdxYHKg7ZI,23199
17
19
  java_codebase_rag/read_payloads.py,sha256=CCNdFYp_JDRQGnQh3mm9POUq4jG_FL2YsVARITsgsaU,31711
18
20
  java_codebase_rag/absence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
21
  java_codebase_rag/absence/absence_diagnosis.py,sha256=RJNlycQY28fL5h1e7Kupaff-xabLzfzbbXLM-VSReBc,27631
@@ -23,49 +25,51 @@ java_codebase_rag/analysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
23
25
  java_codebase_rag/analysis/pr_analysis.py,sha256=A-nE5sftlcg02esQ-ZQxZvvepEUy07zbVUG-b-bgJlo,19711
24
26
  java_codebase_rag/analysis/resolve_service.py,sha256=vVnCRXDQlFhQfIZljh4Jk5lL63IXC7lEArRWk0Hcs34,28715
25
27
  java_codebase_rag/ast/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- java_codebase_rag/ast/ast_java.py,sha256=ikMDBZGMYe0E2Doe6nf-Zw3k4MnwoNYvLqg3xsnfxmI,99614
28
+ java_codebase_rag/ast/ast_java.py,sha256=UZtCtbt9DcC9QpDu4kThxWgALKyveyiBrbmxZCbWjlE,100738
29
+ java_codebase_rag/ast/ast_kotlin.py,sha256=qDyqvdE5ORO9nJ2gXe_13ZJFI88IHpkoe52OK6R3vdA,70564
27
30
  java_codebase_rag/ast/brownfield_events.py,sha256=yxXkKDgMb3VPtaiakGzncHM_EGnda8xIue6w90yYp8s,2055
28
- java_codebase_rag/ast/chunk_heuristics.py,sha256=aQk2NOKxzUdqoUAJUO3G3LE0MN_bYZWNLQ0tkmj5uts,1813
31
+ java_codebase_rag/ast/chunk_heuristics.py,sha256=sn0SvGPkXChM_Dxn7bIRZOWPfCAUviPntRa8t-U894s,2992
32
+ java_codebase_rag/ast/language.py,sha256=6WssjRjYsqXX_64QVca65g_qMqVr5OPjUtHDjKmMy1Y,4259
29
33
  java_codebase_rag/eval/__init__.py,sha256=V49SsVzkfHmVhRGMl9KbzMlxDSI8aHZA1YmxzgzNtYo,30
30
34
  java_codebase_rag/eval/ground_truth.py,sha256=q0gzsCF6hqR-NcMRNDDMUlvOA13RCcGcVLWWqlA4syY,3246
31
35
  java_codebase_rag/eval/metrics.py,sha256=nEDbN3VjYLUwyAvNcd8w4Kmjm0PlgX_Mt6cfOmH7f9k,3118
32
- java_codebase_rag/eval/runner.py,sha256=k_A5TLi16qeqT8WQ2lGqtioDXBlSzjsj0mLv-7Tml1o,20193
36
+ java_codebase_rag/eval/runner.py,sha256=6RzoWcYcf2ZHmytzq8wXEUqogkx580kqFW7BNmWSjWk,20154
33
37
  java_codebase_rag/graph/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
- java_codebase_rag/graph/build_ast_graph.py,sha256=-MitMiz23HjiRHTt9MDA39Q9gLTCE07QoFxGa2Xl4uI,181704
35
- java_codebase_rag/graph/graph_enrich.py,sha256=51Q8aE0Mw09SVYBESd3H57IftsOpfkwgJV2ibt0RzwE,72598
38
+ java_codebase_rag/graph/build_ast_graph.py,sha256=U1JRR9PMmM9-oLttmYBsDrNVuA6KY58tDsl_TZhu0Bc,189081
39
+ java_codebase_rag/graph/graph_enrich.py,sha256=GxptfAhc3Gd7liXtrn7m3rYQNMD57HFflRMPRrvDsQE,72725
36
40
  java_codebase_rag/graph/graph_types.py,sha256=VKTnJZL1_J4bsLGdXIKCsD0FkW6uvqoG8oJfvChm_SI,9057
37
41
  java_codebase_rag/graph/java_ontology.py,sha256=Fa6iCsrBLPc2lCl-6VR2qHN4Q9Ix8Gps3thQhIEGjrM,17241
38
- java_codebase_rag/graph/ladybug_queries.py,sha256=3P5DVMacylxC9OQp_--v0EHMmaKN4LZx7DesxptizIg,103063
39
- java_codebase_rag/graph/path_filtering.py,sha256=R--XzI51LXBu5IBKMCnJWbkNr6I5d-SDmltyQQnWco0,17674
42
+ java_codebase_rag/graph/ladybug_queries.py,sha256=qdneNIYtJvNkMBfWub4hsB7iemXnfdiVbaZoWakplgk,103050
43
+ java_codebase_rag/graph/path_filtering.py,sha256=odOH1lZXh3_uumcc8gvpE96ffUpGkRmUFDUL_vwaFVc,19099
40
44
  java_codebase_rag/index/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- java_codebase_rag/index/java_index_flow_lancedb.py,sha256=4uLZ6nbtbGy0RM5nrTLfVzakPs1VGaJAmS1WqV-Wsy8,29381
45
+ java_codebase_rag/index/java_index_flow_lancedb.py,sha256=NnZkVhka_Ubbndv-rhvosyXZHxD028yDxsa7xTYFb_M,36159
42
46
  java_codebase_rag/index/java_index_v1_common.py,sha256=nF1KrSqboF_RRvWerG9knRRFmWwsrG_CvhgnsoZ8KqA,1154
43
47
  java_codebase_rag/install_data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
- java_codebase_rag/install_data/agents/explorer-rag-cli.md,sha256=dTZMbJ1XzTqDyBvGObGx5he5D8_9_nC9EjfYPbTzrds,11118
45
- java_codebase_rag/install_data/agents/explorer-rag-enhanced.md,sha256=gZsNFbuK0lSnOIlplbbS_muz2ozokJqvFUv65QM0NDM,10406
46
- java_codebase_rag/install_data/skills/explore-codebase/SKILL.md,sha256=A-v2dueVnxwBzBlxoRjZ2zOJk8DranLQ1TElwn94h0s,11529
47
- java_codebase_rag/install_data/skills/explore-codebase-cli/SKILL.md,sha256=Svih9hBctiUFFZa6EuOt-tsuILmXC8aU-ZfEneGNDTU,10885
48
+ java_codebase_rag/install_data/agents/explorer-rag-cli.md,sha256=wWhK4gJkxBlW6gTB1mSdUpMqfGHrnNoEqNakPBkZLEg,11683
49
+ java_codebase_rag/install_data/agents/explorer-rag-enhanced.md,sha256=q3tOSGHpnqYr06w48V9rMZxPAqGEDnvgio2Ih8JC0fY,10354
50
+ java_codebase_rag/install_data/skills/explore-codebase/SKILL.md,sha256=uDz1eIDENx9nF-8qzHjktqVS7G8G9BiN2pX7cYTsfmg,11477
51
+ java_codebase_rag/install_data/skills/explore-codebase-cli/SKILL.md,sha256=b-Ot3e0J4wv-RyJ6eevjrj7arY_R-Wzb-DSghneQxMU,11244
48
52
  java_codebase_rag/mcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
53
  java_codebase_rag/mcp/mcp_hints.py,sha256=eJzm_HpfaEKblT4-FW_9bgvDemZYs3E6exGeznflrXM,42536
50
- java_codebase_rag/mcp/mcp_v2.py,sha256=q6FInC0gu9snU_4Rm2fNjrJx0uzF0RVPKJz4_hPqur8,80448
51
- java_codebase_rag/mcp/server.py,sha256=DJGlx8U5SD4Pe6Ro71OeFHi6HsYZ4r4uINn7R7uSKk4,40935
54
+ java_codebase_rag/mcp/mcp_v2.py,sha256=70POeJ_O5U_Jjf0SGH9lyK1f5XCIRl25KRSrDxkUZuk,80422
55
+ java_codebase_rag/mcp/server.py,sha256=w7q6z_yIbaFYd83KjSkY5XIR6-jL0_7Q-qWjMF31D-Y,40980
52
56
  java_codebase_rag/search/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
57
  java_codebase_rag/search/index_common.py,sha256=HT6FKHFJ084eFvd3fR1j8z8gf4eWoPHVW8GXLpw464I,285
54
58
  java_codebase_rag/search/search_lancedb.py,sha256=MxfTivzeMbScmYIf9s8nKSGCmNr5gMGDXldZotAfW-8,49368
55
- java_codebase_rag/search/search_lexical.py,sha256=iVui6KneEiVA1TRkA5UhO8XI9toayMDOCU-tXYjwRe8,19961
56
- java_codebase_rag/search/search_scoring.py,sha256=OsaX6zWyl4BIcqB7nRJRjp3SBEatmGAQ5EZEtQDaww0,20804
59
+ java_codebase_rag/search/search_lexical.py,sha256=wVG4tZ2pc7zX4vWewqj9ONMoZ0cZRJkcMZa3fEKUw6o,19935
60
+ java_codebase_rag/search/search_scoring.py,sha256=SaLYiZP_udyAYUSfLhehX4J1Do8uA8kSlFoiLWYle6s,21374
57
61
  java_codebase_rag/watch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
62
  java_codebase_rag/watch/client.py,sha256=PO1uyllGZWoYgYYgm6vToCvaILkp0coXfXCEitzWXMU,9258
59
- java_codebase_rag/watch/daemon.py,sha256=ZgQrhUkfAJaExCaMqP8QfnNWxLQaoJyxes-FUo-qr78,15698
60
- java_codebase_rag/watch/lock.py,sha256=E4WuEO_yGWpU1AeOOU91A9d1k4j71iIG9IMHfzorYPo,7564
63
+ java_codebase_rag/watch/daemon.py,sha256=JusMIL_cWxnJXaC0Ix4pOhl-GKMH7Cj5ZBH9CSJtGyo,17633
64
+ java_codebase_rag/watch/lock.py,sha256=-TlYIeXSOqxFKvPxFT9LH1aka5-YRNd5BHnJ1s9V9-M,7551
61
65
  java_codebase_rag/watch/paths.py,sha256=UXmw19O2ILr0_yWgeyd-j6Qn2y0MO4ejspfLBcLol0w,2368
62
66
  java_codebase_rag/watch/protocol.py,sha256=Vj16d0d0eA7XiLFX6o7JMY-I-mGva9VRxC41ZSbDVy4,3061
63
67
  java_codebase_rag/watch/server.py,sha256=GUyCDmbl30wm9GhWTBh-K_BEhFSCHiM2kahmncMGf5E,11168
64
68
  java_codebase_rag/watch/warm.py,sha256=EN_39jVV1Kohsq8OI2LqGdTz_X-OCy4s4GWykiDAK7k,5113
65
- java_codebase_rag/watch/watcher.py,sha256=flD17vjPYuUjae6eWzSYcN-lsZnJUWVoXXvywDD1J24,15272
66
- java_codebase_rag-0.11.1.dist-info/licenses/LICENSE,sha256=gxvtiHtuviR_q8ZAjWw-QTcF3DyPzg6ZY-lQrr8OPpw,1068
67
- java_codebase_rag-0.11.1.dist-info/METADATA,sha256=-04PA-7KnhvSYMQMTTpWMrlsdecPcD433pfbCDIHMqg,20573
68
- java_codebase_rag-0.11.1.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
69
- java_codebase_rag-0.11.1.dist-info/entry_points.txt,sha256=pa6yYHbHG7ZZ7G9ZJgYK1Fz6eR9okldPLo7qLY2THuo,190
70
- java_codebase_rag-0.11.1.dist-info/top_level.txt,sha256=u2i_IKLLOkYyNE32m4TIED0vtKtQDdPEVqRtNuhC1Hk,18
71
- java_codebase_rag-0.11.1.dist-info/RECORD,,
69
+ java_codebase_rag/watch/watcher.py,sha256=M9MKBI2P8w3Os2I9JM_0oElk5eeJ-DCC5vB3aAoRrdQ,17827
70
+ java_codebase_rag-0.12.0.dist-info/licenses/LICENSE,sha256=gxvtiHtuviR_q8ZAjWw-QTcF3DyPzg6ZY-lQrr8OPpw,1068
71
+ java_codebase_rag-0.12.0.dist-info/METADATA,sha256=Q4UEAjZ79KdVbd21YblRK0vmkgWmEZwREJ-OfE8P_YM,21365
72
+ java_codebase_rag-0.12.0.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
73
+ java_codebase_rag-0.12.0.dist-info/entry_points.txt,sha256=S7ng8YydbGe97wugiCOgfI8xu04aKuLzSioSNH1rmcQ,252
74
+ java_codebase_rag-0.12.0.dist-info/top_level.txt,sha256=u2i_IKLLOkYyNE32m4TIED0vtKtQDdPEVqRtNuhC1Hk,18
75
+ java_codebase_rag-0.12.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ [console_scripts]
2
+ java-codebase-rag = java_codebase_rag.cli_dispatch:_console_script_main
3
+ java-codebase-rag-mcp = java_codebase_rag.mcp.server:main
4
+ jrag = java_codebase_rag.cli_dispatch:_console_script_main
5
+ jrag-mcp = java_codebase_rag.mcp.server:main
@@ -1,4 +0,0 @@
1
- [console_scripts]
2
- java-codebase-rag = java_codebase_rag.cli:_console_script_main
3
- java-codebase-rag-mcp = java_codebase_rag.mcp.server:main
4
- jrag = java_codebase_rag.jrag:_console_script_main