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.
- java_codebase_rag/_deprecation.py +103 -0
- java_codebase_rag/_version.py +2 -2
- java_codebase_rag/ast/ast_java.py +22 -0
- java_codebase_rag/ast/ast_kotlin.py +1794 -0
- java_codebase_rag/ast/chunk_heuristics.py +26 -5
- java_codebase_rag/ast/language.py +117 -0
- java_codebase_rag/cli.py +17 -17
- java_codebase_rag/cli_dispatch.py +251 -0
- java_codebase_rag/config.py +8 -8
- java_codebase_rag/eval/runner.py +3 -3
- java_codebase_rag/graph/build_ast_graph.py +130 -8
- java_codebase_rag/graph/graph_enrich.py +8 -5
- java_codebase_rag/graph/ladybug_queries.py +1 -1
- java_codebase_rag/graph/path_filtering.py +39 -7
- java_codebase_rag/index/java_index_flow_lancedb.py +160 -15
- java_codebase_rag/install_data/agents/explorer-rag-cli.md +7 -5
- java_codebase_rag/install_data/agents/explorer-rag-enhanced.md +4 -4
- java_codebase_rag/install_data/skills/explore-codebase/SKILL.md +4 -4
- java_codebase_rag/install_data/skills/explore-codebase-cli/SKILL.md +6 -6
- java_codebase_rag/installer.py +15 -15
- java_codebase_rag/jrag.py +27 -11
- java_codebase_rag/lance_optimize.py +7 -7
- java_codebase_rag/mcp/mcp_v2.py +2 -2
- java_codebase_rag/mcp/server.py +6 -4
- java_codebase_rag/pipeline.py +4 -4
- java_codebase_rag/progress.py +1 -1
- java_codebase_rag/search/search_lexical.py +1 -1
- java_codebase_rag/search/search_scoring.py +19 -5
- java_codebase_rag/watch/daemon.py +40 -12
- java_codebase_rag/watch/lock.py +1 -1
- java_codebase_rag/watch/watcher.py +73 -31
- {java_codebase_rag-0.11.1.dist-info → java_codebase_rag-0.12.0.dist-info}/METADATA +31 -22
- {java_codebase_rag-0.11.1.dist-info → java_codebase_rag-0.12.0.dist-info}/RECORD +37 -33
- java_codebase_rag-0.12.0.dist-info/entry_points.txt +5 -0
- java_codebase_rag-0.11.1.dist-info/entry_points.txt +0 -4
- {java_codebase_rag-0.11.1.dist-info → java_codebase_rag-0.12.0.dist-info}/WHEEL +0 -0
- {java_codebase_rag-0.11.1.dist-info → java_codebase_rag-0.12.0.dist-info}/licenses/LICENSE +0 -0
- {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
|
|
19
|
-
``on_event("error", …)``
|
|
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
|
|
132
|
-
# server accepts a single query)
|
|
133
|
-
#
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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")
|
java_codebase_rag/watch/lock.py
CHANGED
|
@@ -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
|
-
``
|
|
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
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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 (``
|
|
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
|
|
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
|
|
52
|
-
#
|
|
53
|
-
|
|
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
|
|
203
|
-
#
|
|
204
|
-
#
|
|
205
|
-
#
|
|
206
|
-
#
|
|
207
|
-
#
|
|
208
|
-
#
|
|
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
|
|
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
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
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
|
|
310
|
-
#
|
|
311
|
-
#
|
|
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.
|
|
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/
|
|
8
|
-
Project-URL: Repository, https://github.com/HumanBean17/
|
|
9
|
-
Project-URL: Issues, https://github.com/HumanBean17/
|
|
10
|
-
Keywords:
|
|
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
|
-
#
|
|
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
|
|
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
|
|
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 `
|
|
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
|
-
|
|
107
|
+
jrag install
|
|
105
108
|
|
|
106
109
|
# Non-interactive mode (for CI/automation)
|
|
107
|
-
|
|
110
|
+
jrag install --non-interactive --agent claude-code
|
|
108
111
|
```
|
|
109
112
|
|
|
110
|
-
After `pip install --upgrade
|
|
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/
|
|
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 (`
|
|
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 `
|
|
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
|
|
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:
|
|
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/
|
|
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/
|
|
316
|
-
cd
|
|
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
|
|
5
|
-
java_codebase_rag/cli.py,sha256=
|
|
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=
|
|
9
|
-
java_codebase_rag/installer.py,sha256=
|
|
10
|
-
java_codebase_rag/jrag.py,sha256=
|
|
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=
|
|
15
|
-
java_codebase_rag/pipeline.py,sha256=
|
|
16
|
-
java_codebase_rag/progress.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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
|
|
35
|
-
java_codebase_rag/graph/graph_enrich.py,sha256=
|
|
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=
|
|
39
|
-
java_codebase_rag/graph/path_filtering.py,sha256=
|
|
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=
|
|
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=
|
|
45
|
-
java_codebase_rag/install_data/agents/explorer-rag-enhanced.md,sha256=
|
|
46
|
-
java_codebase_rag/install_data/skills/explore-codebase/SKILL.md,sha256=
|
|
47
|
-
java_codebase_rag/install_data/skills/explore-codebase-cli/SKILL.md,sha256=
|
|
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=
|
|
51
|
-
java_codebase_rag/mcp/server.py,sha256=
|
|
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=
|
|
56
|
-
java_codebase_rag/search/search_scoring.py,sha256=
|
|
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=
|
|
60
|
-
java_codebase_rag/watch/lock.py,sha256
|
|
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=
|
|
66
|
-
java_codebase_rag-0.
|
|
67
|
-
java_codebase_rag-0.
|
|
68
|
-
java_codebase_rag-0.
|
|
69
|
-
java_codebase_rag-0.
|
|
70
|
-
java_codebase_rag-0.
|
|
71
|
-
java_codebase_rag-0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|