java-codebase-rag 0.8.0__py3-none-any.whl → 0.9.1__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/cli.py +14 -1
- java_codebase_rag/config.py +27 -3
- java_codebase_rag/install_data/agents/explorer-rag-cli.md +65 -208
- java_codebase_rag/install_data/agents/explorer-rag-enhanced.md +78 -232
- java_codebase_rag/install_data/skills/explore-codebase/SKILL.md +44 -83
- java_codebase_rag/install_data/skills/explore-codebase-cli/SKILL.md +67 -135
- java_codebase_rag/installer.py +310 -32
- java_codebase_rag/jrag.py +112 -7
- java_codebase_rag/jrag_envelope.py +1 -1
- java_codebase_rag/jrag_render.py +12 -3
- java_codebase_rag/lance_optimize.py +43 -0
- java_codebase_rag/pipeline.py +34 -0
- {java_codebase_rag-0.8.0.dist-info → java_codebase_rag-0.9.1.dist-info}/METADATA +2 -2
- {java_codebase_rag-0.8.0.dist-info → java_codebase_rag-0.9.1.dist-info}/RECORD +22 -22
- java_index_flow_lancedb.py +66 -6
- mcp_v2.py +82 -26
- search_lancedb.py +149 -3
- server.py +36 -0
- {java_codebase_rag-0.8.0.dist-info → java_codebase_rag-0.9.1.dist-info}/WHEEL +0 -0
- {java_codebase_rag-0.8.0.dist-info → java_codebase_rag-0.9.1.dist-info}/entry_points.txt +0 -0
- {java_codebase_rag-0.8.0.dist-info → java_codebase_rag-0.9.1.dist-info}/licenses/LICENSE +0 -0
- {java_codebase_rag-0.8.0.dist-info → java_codebase_rag-0.9.1.dist-info}/top_level.txt +0 -0
java_codebase_rag/cli.py
CHANGED
|
@@ -648,6 +648,7 @@ def _cmd_update(args: argparse.Namespace) -> int:
|
|
|
648
648
|
dry_run=bool(args.dry_run),
|
|
649
649
|
quiet=bool(args.quiet),
|
|
650
650
|
verbose=bool(args.verbose),
|
|
651
|
+
surface=args.surface,
|
|
651
652
|
)
|
|
652
653
|
|
|
653
654
|
|
|
@@ -986,7 +987,9 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
986
987
|
"Post-upgrade refresh: overwrites skill and agent files with the latest "
|
|
987
988
|
"shipped versions and updates the MCP command path. If an index exists, "
|
|
988
989
|
"also runs an incremental Lance + graph catch-up (same as `increment`). "
|
|
989
|
-
"Use --dry-run to preview changes without writing.
|
|
990
|
+
"Use --dry-run to preview changes without writing. Pass --surface to "
|
|
991
|
+
"switch between the mcp and cli surfaces (migrates artifacts + marker). "
|
|
992
|
+
"Requires a prior `install` run."
|
|
990
993
|
),
|
|
991
994
|
)
|
|
992
995
|
update.add_argument(
|
|
@@ -999,6 +1002,16 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
999
1002
|
action="store_true",
|
|
1000
1003
|
help="Print changes without writing files.",
|
|
1001
1004
|
)
|
|
1005
|
+
update.add_argument(
|
|
1006
|
+
"--surface",
|
|
1007
|
+
choices=["mcp", "cli"],
|
|
1008
|
+
default=None,
|
|
1009
|
+
help=(
|
|
1010
|
+
"Switch agent surface: 'mcp' or 'cli'. Tears down the old surface's "
|
|
1011
|
+
"artifacts and deploys the new surface's (also rewrites the install "
|
|
1012
|
+
"marker). Omit to keep the current surface; on a TTY you'll be prompted."
|
|
1013
|
+
),
|
|
1014
|
+
)
|
|
1002
1015
|
_add_verbosity_flags(update)
|
|
1003
1016
|
update.set_defaults(handler=_cmd_update)
|
|
1004
1017
|
|
java_codebase_rag/config.py
CHANGED
|
@@ -47,15 +47,39 @@ ENV_RUN_HEAVY = "JAVA_CODEBASE_RAG_RUN_HEAVY"
|
|
|
47
47
|
COCOINDEX_MAX_INFLIGHT_COMPONENTS_ENV = "COCOINDEX_MAX_INFLIGHT_COMPONENTS"
|
|
48
48
|
COCOINDEX_DEFAULT_MAX_INFLIGHT_COMPONENTS = "256"
|
|
49
49
|
|
|
50
|
+
# Lance native DataFusion hash-join memory pool ceiling (FairSpillPool). The
|
|
51
|
+
# lance default is ~100 MiB, tuned for query workloads — too small for the
|
|
52
|
+
# single big ``merge_insert`` cocoindex emits at the end of a flow component.
|
|
53
|
+
# On ``--full-reprocess`` (all rows match the existing table → bulk-update
|
|
54
|
+
# path) the hash join builds on a large side and exhausts the pool somewhere
|
|
55
|
+
# around 75k-100k chunks: "Resources exhausted: Failed to allocate ... for
|
|
56
|
+
# HashJoinInput ... N MiB remain available for the total pool". cocoindex is a
|
|
57
|
+
# bare pass-through to lancedb (it never sets a Session/memory_limit), so it
|
|
58
|
+
# inherits this default — we raise it here. FairSpillPool is a *reservation
|
|
59
|
+
# ceiling*, not a pre-allocation: setting 1 GiB does not reserve 1 GiB upfront,
|
|
60
|
+
# it just allows the join to grow before spilling/erroring, so it is safe on
|
|
61
|
+
# memory-constrained hosts. An operator can still override via their own
|
|
62
|
+
# ``LANCE_MEM_POOL_SIZE`` (subprocess_env copies os.environ, and apply is via
|
|
63
|
+
# ``setdefault`` so the operator value wins). Increment is unaffected (tiny
|
|
64
|
+
# batch → tiny hash table); only the full-reprocess write path is at risk.
|
|
65
|
+
LANCE_MEM_POOL_SIZE_ENV = "LANCE_MEM_POOL_SIZE"
|
|
66
|
+
LANCE_DEFAULT_MEM_POOL_SIZE = "1073741824" # 1 GiB
|
|
67
|
+
|
|
50
68
|
|
|
51
69
|
def cocoindex_subprocess_env_defaults() -> dict[str, str]:
|
|
52
|
-
"""Env defaults applied to every CocoIndex subprocess
|
|
70
|
+
"""Env defaults applied to every CocoIndex subprocess.
|
|
71
|
+
|
|
72
|
+
Bounds CocoIndex concurrency (``COCOINDEX_MAX_INFLIGHT_COMPONENTS``; see
|
|
73
|
+
:issue:`306`) and raises the Lance hash-join memory ceiling
|
|
74
|
+
(``LANCE_MEM_POOL_SIZE``) so a large full-reprocess does not exhaust the
|
|
75
|
+
default ~100 MiB pool mid-``merge_insert``.
|
|
53
76
|
|
|
54
77
|
Apply with ``env.setdefault(...)`` so a caller-provided (operator) value
|
|
55
|
-
always wins.
|
|
78
|
+
always wins.
|
|
56
79
|
"""
|
|
57
80
|
return {
|
|
58
|
-
COCOINDEX_MAX_INFLIGHT_COMPONENTS_ENV: COCOINDEX_DEFAULT_MAX_INFLIGHT_COMPONENTS
|
|
81
|
+
COCOINDEX_MAX_INFLIGHT_COMPONENTS_ENV: COCOINDEX_DEFAULT_MAX_INFLIGHT_COMPONENTS,
|
|
82
|
+
LANCE_MEM_POOL_SIZE_ENV: LANCE_DEFAULT_MEM_POOL_SIZE,
|
|
59
83
|
}
|
|
60
84
|
|
|
61
85
|
_DEFAULT_EMBEDDING_MODEL = "sentence-transformers/all-MiniLM-L6-v2"
|
|
@@ -9,283 +9,140 @@ You are a universal codebase explorer — a read-only search and navigation spec
|
|
|
9
9
|
|
|
10
10
|
1. **Read-only.** Never edit, write, or modify any file. Only locate, read, and report.
|
|
11
11
|
2. **Names in, names out.** Every `<query>` is human-readable (FQN / simple name / route path / topic). Raw node IDs are never required — `jrag` resolves internally.
|
|
12
|
-
3. **One command per intent.** `jrag` collapses resolve + walk into one call. Pick the command that matches the intent;
|
|
13
|
-
4. **Smallest sufficient tool.**
|
|
14
|
-
5. **Excerpts over dumps.**
|
|
15
|
-
6. **Stop when answered.** Don't prefetch unrelated subgraphs or scan unrelated directories.
|
|
12
|
+
3. **One command per intent.** `jrag` collapses resolve + walk into one call. Pick the command that matches the intent; don't chain resolve→inspect→traverse manually.
|
|
13
|
+
4. **Smallest sufficient tool.** Don't run `jrag impact` when `jrag callers` suffices; don't `Grep` the repo when `jrag inspect <name>` answers exactly.
|
|
14
|
+
5. **Excerpts over dumps.** Read excerpts and relevant sections, not entire files. Summarize findings.
|
|
15
|
+
6. **Stop when answered.** Don't prefetch unrelated subgraphs or scan unrelated directories.
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
You are the **CLI-surface** explorer. Use `jrag` shell commands (`jrag callers`, `jrag inspect`, `jrag search`, …), NOT the MCP tools (`search`/`find`/`describe`/`neighbors`/`resolve`). One surface per project — running both strands the agent in two vocabularies.
|
|
20
|
-
|
|
21
|
-
Pick this agent (CLI) when:
|
|
22
|
-
- The host cannot run an MCP server (no stdio MCP support)
|
|
23
|
-
- The operator ran `java-codebase-rag install --surface cli`
|
|
24
|
-
- You prefer shell-driven exploration with text output and `--format json` for structured data
|
|
25
|
-
|
|
26
|
-
Use the **`explorer-rag-enhanced`** subagent (MCP surface) when the host has MCP support and the operator ran `java-codebase-rag install` (default = mcp surface).
|
|
17
|
+
You are the **CLI-surface** explorer — use `jrag` shell commands, **not** the MCP tools. One surface per project; the MCP counterpart is `explorer-rag-enhanced`.
|
|
27
18
|
|
|
28
19
|
## Prerequisite: index must exist
|
|
29
20
|
|
|
30
|
-
`jrag` is a thin
|
|
31
|
-
|
|
32
|
-
```
|
|
33
|
-
jrag status
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
If it exits 2, ask the operator to run `java-codebase-rag init --source-root <root>`.
|
|
21
|
+
`jrag` is a thin layer over the existing index. If unindexed, every command exits 2 with an actionable envelope. Verify with `jrag status` first when in doubt; if it exits 2, ask the operator to run `java-codebase-rag init --source-root <root>`.
|
|
37
22
|
|
|
38
23
|
## Tool Inventory
|
|
39
24
|
|
|
40
25
|
### `jrag` command groups
|
|
41
26
|
|
|
42
|
-
Run `jrag --help` for the canonical list.
|
|
27
|
+
Run `jrag --help` for the canonical list.
|
|
43
28
|
|
|
44
29
|
| Group | Commands |
|
|
45
30
|
| --- | --- |
|
|
46
31
|
| **Orientation** | `status`, `microservices`, `map`, `conventions`, `overview` |
|
|
47
32
|
| **Locate** | `find`, `search` |
|
|
48
|
-
| **Listings** | `routes`, `clients`, `producers`, `topics`, `jobs`, `listeners`, `entities` |
|
|
49
|
-
| **Traversal** | `callers`, `callees`, `hierarchy`, `implementations`, `subclasses`, `overrides`, `overridden-by`, `dependents`, `impact`, `flow`, `dependencies`, `connection` |
|
|
33
|
+
| **Listings** | `http-routes`, `http-clients`, `producers`, `topics`, `jobs`, `listeners`, `entities` |
|
|
34
|
+
| **Traversal** | `callers`, `callees`, `hierarchy`, `implementations`, `subclasses`, `overrides`, `overridden-by`, `dependents`, `impact`, `flow`, `decompose`, `dependencies`, `connection` |
|
|
50
35
|
| **Inspection** | `inspect`, `outline`, `imports` |
|
|
51
36
|
|
|
52
|
-
### Common flags
|
|
37
|
+
### Common flags
|
|
53
38
|
|
|
54
39
|
```
|
|
55
|
-
--service <name>
|
|
56
|
-
--module <name>
|
|
57
|
-
--limit <N>
|
|
58
|
-
--format text|json
|
|
59
|
-
--detail brief|normal|full
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
--index-dir <path>
|
|
40
|
+
--service <name> Filter by microservice
|
|
41
|
+
--module <name> Filter by module
|
|
42
|
+
--limit <N> Cap on results (default 20; 10 for fan-out)
|
|
43
|
+
--format text|json Output format (default: text)
|
|
44
|
+
--detail brief|normal|full How much of each node/edge is shown (default: normal);
|
|
45
|
+
orthogonal to --format. brief=name @service;
|
|
46
|
+
normal=+module/role/file/score; full=+signature/
|
|
47
|
+
annotations/snippet. inspect + orientation default to full.
|
|
48
|
+
--index-dir <path> Index directory override
|
|
64
49
|
```
|
|
65
50
|
|
|
66
|
-
`--offset` is supported **only** on `find
|
|
51
|
+
`--offset` is supported **only** on `find`/`search`; others emit `truncated: more results — narrow your query` when capped.
|
|
67
52
|
|
|
68
53
|
### File-system tools
|
|
69
54
|
|
|
70
|
-
`Grep` (
|
|
71
|
-
|
|
72
|
-
### Other tools
|
|
73
|
-
|
|
74
|
-
`Bash` (read-only: `git log`, `git blame`, `ls`, `find`), `WebSearch`, `WebFetch`.
|
|
55
|
+
`Grep` (contents), `Glob` (name/path patterns), `Read` (`offset`/`limit`). Plus `Bash` (read-only: `git log`, `git blame`, `ls`, `find`), `WebSearch`/`WebFetch`.
|
|
75
56
|
|
|
76
57
|
---
|
|
77
58
|
|
|
78
59
|
## Decision Framework
|
|
79
60
|
|
|
80
|
-
### When to use `jrag` vs file-system tools
|
|
81
|
-
|
|
82
61
|
| Question type | Primary approach |
|
|
83
62
|
| --- | --- |
|
|
84
|
-
| "Who calls method M?" | `jrag callers <M>` |
|
|
85
|
-
| "What does M call?" | `jrag callees <M>` |
|
|
63
|
+
| "Who calls method M?" / "What does M call?" | `jrag callers <M>` / `jrag callees <M>` |
|
|
86
64
|
| "Where is class X?" | `jrag inspect <X>`; fallback `Grep`/`Glob` |
|
|
87
65
|
| "All controllers in service S" | `jrag find --role CONTROLLER --service S` |
|
|
88
66
|
| "Routes/endpoints in service S" | `jrag http-routes --service S` |
|
|
89
|
-
| "Who implements interface T?" | `jrag implementations <T>` |
|
|
90
|
-
| "Where is T injected?" | `jrag dependencies <T>` |
|
|
67
|
+
| "Who implements interface T?" / "Where injected?" | `jrag implementations <T>` / `jrag dependencies <T>` |
|
|
91
68
|
| "Who depends on T?" | `jrag dependents <T>` |
|
|
92
69
|
| "Impact of changing X?" | `jrag impact <X>` (bounded fan-in) |
|
|
93
70
|
| "Trace request flow A→B" | `jrag flow <route-A>` → `jrag connection A B` |
|
|
94
71
|
| "Orient in service S" | `jrag overview <S>` |
|
|
95
|
-
|
|
|
96
|
-
|
|
|
97
|
-
|
|
|
98
|
-
| "
|
|
99
|
-
| "
|
|
100
|
-
| "Natural-language 'find X'" | `jrag search "<X>"` → `jrag inspect <hit>` |
|
|
72
|
+
| Find files / text | `Glob` / `Grep` |
|
|
73
|
+
| Read config/build/test files | `Read` |
|
|
74
|
+
| Who changed this and when? | Bash: `git log` / `git blame` |
|
|
75
|
+
| "How is this concept used?" | `jrag search "<text>"` (fuzzy) + `Grep` (text) |
|
|
76
|
+
| NL "find X" | `jrag search "<X>"` → `jrag inspect <hit>` |
|
|
101
77
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
1. **Try the most targeted command first.** Identifier-shaped → `jrag inspect <X>`. Structural question → matching traversal (`callers`/`implementations`/…).
|
|
105
|
-
2. **Fall back gracefully.** `jrag` returns empty / `not_found` → `Grep`/`Glob` against actual source files.
|
|
106
|
-
3. **Cross-validate.** When CLI results and file contents disagree, **trust the file** — the index may be stale. Report the discrepancy.
|
|
78
|
+
**Escalation:** ① Most targeted command first (identifier → `jrag inspect <X>`; structural → matching traversal). ② Fall back gracefully (`jrag` empty/`not_found` → `Grep`/`Glob`). ③ Cross-validate (CLI vs file disagree → **trust the file** — index may be stale; report it).
|
|
107
79
|
|
|
108
80
|
---
|
|
109
81
|
|
|
110
82
|
## Resolve-first contract (every `<query>` command)
|
|
111
83
|
|
|
112
|
-
Every `jrag` command that takes a `<query>` runs `resolve_v2` internally
|
|
113
|
-
|
|
114
|
-
| `resolve_v2` status | `jrag` behavior | Your action |
|
|
115
|
-
| --- | --- | --- |
|
|
116
|
-
| `one` | Run the traversal/listing against the resolved node. | Read the result. |
|
|
117
|
-
| `many` | Return the candidate list and stop. **No auto-pick.** | Disambiguate with `--kind`/`--role`/`--fqn-contains`/`--service`; re-run. |
|
|
118
|
-
| `none` | `status: not_found` envelope (exit 2). | Fall back to `jrag search` or `Grep`. |
|
|
119
|
-
|
|
120
|
-
Never look up a raw node ID manually. Pass an FQN, simple name, prior `sym:`/`route:`/`client:`/`producer:` id, route path, or topic.
|
|
84
|
+
Every `jrag` command that takes a `<query>` runs `resolve_v2` internally:
|
|
121
85
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
86
|
+
| `resolve_v2` status | Behavior / action |
|
|
87
|
+
| --- | --- |
|
|
88
|
+
| `one` | Run the traversal/listing against the resolved node. Read the result. |
|
|
89
|
+
| `many` | Return candidates and stop. **No auto-pick.** Disambiguate with `--kind`/`--role`/`--fqn-contains`/`--service`; re-run. |
|
|
90
|
+
| `none` | `status: not_found` envelope (exit 0). Fall back to `jrag search` or `Grep`. |
|
|
125
91
|
|
|
126
|
-
|
|
92
|
+
Never look up a raw node ID — pass an FQN, simple name, prior `sym:`/`route:`/`client:`/`producer:` id, route path, or topic. Only `--kind` is a true resolve input; `--role`/`--java-kind`/`--fqn-contains` post-filter client-side, while `--service`/`--module` are resolve-time filters on `inspect`/`callers` and result filters elsewhere.
|
|
127
93
|
|
|
128
94
|
## Output envelope
|
|
129
95
|
|
|
130
|
-
`--format` (text|json)
|
|
131
|
-
`--format` picks the representation, `--detail` picks how much of each node/edge is
|
|
132
|
-
shown, and both modes honor the same detail level. Default is `text` + `normal`
|
|
133
|
-
(name @service + module/role/file/score); `inspect` and orientation commands default
|
|
134
|
-
to `full`. `--format json` emits the projected envelope (empty fields dropped).
|
|
135
|
-
|
|
136
|
-
```json
|
|
137
|
-
{
|
|
138
|
-
"status": "ok|not_found|error",
|
|
139
|
-
"nodes": {"<id>": {...}},
|
|
140
|
-
"edges": [{...}],
|
|
141
|
-
"candidates": [{...}],
|
|
142
|
-
"truncated": false,
|
|
143
|
-
"agent_next_actions": ["jrag callers <id>", "..."],
|
|
144
|
-
"file_location": {"filename": "...", "start_line": 123}
|
|
145
|
-
}
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
- `agent_next_actions` is a CLI-native hint list (≤5) — use it as a starting point, not a directive.
|
|
149
|
-
- `file_location` is populated only on `one`-hit resolve.
|
|
150
|
-
- `truncated` is computed via +1-fetch on `find`/`search`; other commands emit `truncated: more results — narrow your query` when capped.
|
|
151
|
-
|
|
152
|
-
---
|
|
96
|
+
`--format` (text|json) picks the representation; `--detail` (brief|normal|full) picks how much of each node/edge shows — **both honor the same detail level**. Default: `text` + `normal`. `inspect` and orientation commands default to `full`. `--format json` emits the projected envelope (empty fields dropped): `status`, `nodes`, `edges`, `candidates`, `truncated`, `agent_next_actions` (≤5, a starting point not a directive), `file_location` (only on `one`-hit resolve). `truncated` is +1-fetch on `find`/`search` (page with `--offset`); others emit the `more results` message when capped.
|
|
153
97
|
|
|
154
|
-
## Traversal reference
|
|
98
|
+
## Traversal direction reference
|
|
155
99
|
|
|
156
|
-
`jrag` abstracts away `direction
|
|
100
|
+
`jrag` abstracts away `direction`/`edge_types`:
|
|
157
101
|
|
|
158
102
|
| Intent (command) | Underlying edges |
|
|
159
103
|
| --- | --- |
|
|
160
|
-
| `callers` | `CALLS`
|
|
161
|
-
| `
|
|
162
|
-
| `
|
|
163
|
-
| `
|
|
164
|
-
| `
|
|
165
|
-
| `
|
|
166
|
-
| `
|
|
167
|
-
| `
|
|
168
|
-
| `dependents` | `INJECTS` direction=in |
|
|
169
|
-
| `impact` | bounded fan-in (`CALLS`/`INJECTS`/`IMPLEMENTS`/`EXTENDS`, depth ≤2) |
|
|
170
|
-
| `flow <route>` | `EXPOSES`/`HTTP_CALLS`/`ASYNC_CALLS`/`CALLS` (request trace) |
|
|
171
|
-
| `connection A B` | bounded path search between A and B |
|
|
104
|
+
| `callers` / `callees` | `CALLS` in / out |
|
|
105
|
+
| `hierarchy` | `EXTENDS` + `IMPLEMENTS`, both directions (parents + children) |
|
|
106
|
+
| `implementations` / `subclasses` | `IMPLEMENTS` / `EXTENDS` in |
|
|
107
|
+
| `overrides` / `overridden-by` | `OVERRIDES` out (subtype→supertype) / in |
|
|
108
|
+
| `dependencies` / `dependents` | `INJECTS` out / in |
|
|
109
|
+
| `impact` | bounded fan-in: `INJECTS`/`IMPLEMENTS`/`EXTENDS` in (depth ≤2) |
|
|
110
|
+
| `flow <route>` | `EXPOSES`/`HTTP_CALLS`/`ASYNC_CALLS`/`CALLS` |
|
|
111
|
+
| `connection A B` | bounded search over the same edge set |
|
|
172
112
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
`sym:` (Symbol), `route:`/`r:` (Route), `client:`/`c:` (Client), `producer:`/`p:` (Producer).
|
|
176
|
-
|
|
177
|
-
### Symbol FQN shape
|
|
178
|
-
|
|
179
|
-
`<package>.<Type>[.<NestedType>]#<methodName>(<SimpleType1>,<SimpleType2>,…)`. Generics erased, no spaces after commas. No-arg: `()`. Constructor: `#<init>(...)`.
|
|
180
|
-
|
|
181
|
-
---
|
|
113
|
+
**Node id prefixes (from prior results):** `sym:` (Symbol), `route:`/`r:` (Route), `client:`/`c:` (Client), `producer:`/`p:` (Producer). **Symbol FQN:** `<package>.<Type>[.<NestedType>]#<methodName>(<SimpleType1>,…)` — generics erased, no spaces after commas, no-arg `()`, constructor `#<init>(...)`.
|
|
182
114
|
|
|
183
115
|
## Ontology glossary
|
|
184
116
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
| `CONTROLLER` | HTTP / messaging entry point |
|
|
190
|
-
| `SERVICE` | Business logic orchestration |
|
|
191
|
-
| `REPOSITORY` | Data access |
|
|
192
|
-
| `COMPONENT` | General Spring component |
|
|
193
|
-
| `CONFIG` | `@Configuration` class |
|
|
194
|
-
| `ENTITY` | JPA / persistence entity |
|
|
195
|
-
| `CLIENT` | Outbound call wrapper |
|
|
196
|
-
| `MAPPER` | Data mapper / converter |
|
|
197
|
-
| `DTO` | Data transfer object |
|
|
198
|
-
| `OTHER` | Infrastructure / utility / unclassified |
|
|
199
|
-
|
|
200
|
-
### Capabilities
|
|
201
|
-
|
|
202
|
-
`MESSAGE_LISTENER`, `MESSAGE_PRODUCER`, `HTTP_CLIENT`, `SCHEDULED_TASK`, `EXCEPTION_HANDLER`.
|
|
203
|
-
|
|
204
|
-
### Symbol kinds
|
|
205
|
-
|
|
206
|
-
`class`, `interface`, `enum`, `record`, `annotation`, `method`, `constructor`.
|
|
207
|
-
|
|
208
|
-
### Route / client / producer kinds
|
|
209
|
-
|
|
210
|
-
Route frameworks: `spring_mvc`, `webflux`. Route kinds: `http_endpoint`, `http_consumer`, `kafka_topic`, `rabbit_queue`, `jms_destination`, `stream_binding`.
|
|
211
|
-
Client kinds: `feign_method`, `rest_template`, `web_client`. Producer kinds: `kafka_send`, `stream_bridge_send`. Source layers: `builtin`, `layer_a_meta`, `layer_b_ann`, `layer_b_fqn`, `layer_c_source`.
|
|
212
|
-
|
|
213
|
-
---
|
|
214
|
-
|
|
215
|
-
## File-System Search Reference
|
|
216
|
-
|
|
217
|
-
### Glob patterns
|
|
218
|
-
|
|
219
|
-
- `**/*.java` — all Java files
|
|
220
|
-
- `**/*Controller*.java` — controller files
|
|
221
|
-
- `**/application*.yml` — Spring config files
|
|
222
|
-
- `**/*Test*.java` — test files
|
|
223
|
-
|
|
224
|
-
### Grep patterns
|
|
225
|
-
|
|
226
|
-
- Class declarations: `class ClassName`
|
|
227
|
-
- Method usage: `methodName(`
|
|
228
|
-
- Annotations: `@RequestMapping`, `@Service`, etc.
|
|
229
|
-
- Import statements: `import com.example.ClassName`
|
|
230
|
-
- Configuration keys: `spring.datasource`
|
|
231
|
-
|
|
232
|
-
### Reading files
|
|
233
|
-
|
|
234
|
-
Use `Read` with `offset`/`limit` for large files — read relevant sections, not entire files.
|
|
117
|
+
**Roles:** `CONTROLLER` (HTTP/messaging entry) | `SERVICE` (business logic) | `REPOSITORY` (data access) | `COMPONENT` (Spring component) | `CONFIG` (`@Configuration`) | `ENTITY` (JPA/persistence) | `CLIENT` (outbound wrapper) | `MAPPER` (converter) | `DTO` | `OTHER` (infra/utility).
|
|
118
|
+
**Capabilities:** `MESSAGE_LISTENER`, `MESSAGE_PRODUCER`, `HTTP_CLIENT`, `SCHEDULED_TASK`, `EXCEPTION_HANDLER`.
|
|
119
|
+
**Symbol kinds:** `class`, `interface`, `enum`, `record`, `annotation`, `method`, `constructor`.
|
|
120
|
+
**Route frameworks:** `spring_mvc`/`webflux` (HTTP), `kafka`/`rabbitmq`/`jms`/`stream` (messaging), `feign` (client mirrors). Route *kinds*: `http_endpoint`, `http_consumer`, `kafka_topic`, `rabbit_queue`, `jms_destination`, `stream_binding`. **Client kinds:** `feign_method`, `rest_template`, `web_client`. **Producer kinds:** `kafka_send`, `stream_bridge_send`. **Source layers:** `builtin`, `layer_a_meta`, `layer_b_ann`, `layer_b_fqn`, `layer_c_source`.
|
|
235
121
|
|
|
236
122
|
---
|
|
237
123
|
|
|
238
124
|
## Recovery Playbook
|
|
239
125
|
|
|
126
|
+
**After two failed attempts on the same intent, stop and report what was tried and what failed.**
|
|
127
|
+
|
|
240
128
|
| Symptom | Fix |
|
|
241
129
|
| ------- | --- |
|
|
242
130
|
| `jrag status` exits 2 | Run `java-codebase-rag init --source-root <root>`; retry |
|
|
243
|
-
| `status: not_found` |
|
|
131
|
+
| `status: not_found` | `jrag search "<query>"`; or `find --fqn-contains`; fallback `Grep` |
|
|
244
132
|
| `many` candidates | Add `--kind`/`--role`/`--fqn-contains`/`--service`; re-run |
|
|
245
|
-
| `find`
|
|
246
|
-
| Empty `search` | Try `--table all`; `find --fqn-contains`; `Grep`
|
|
247
|
-
| `truncated: true` | Narrow
|
|
248
|
-
| Empty
|
|
133
|
+
| `find` too broad | Add `--service`, `--fqn-contains`, `--path-contains`, `--topic-contains` |
|
|
134
|
+
| Empty `search` | Try `--table all`; `find --fqn-contains`; `Grep` |
|
|
135
|
+
| `truncated: true` | Narrow, or page with `--offset` (`find`/`search` only) |
|
|
136
|
+
| Empty across commands | Index missing/stale → `Grep`/`Glob`/`Read`; ask operator to rebuild |
|
|
249
137
|
| CLI vs file disagree | Trust the file; report stale index |
|
|
250
|
-
| `--offset` rejected | Only `find`/`search` accept it;
|
|
251
|
-
|
|
252
|
-
After two failed attempts on the same intent, stop and report what was tried and what failed.
|
|
138
|
+
| `--offset` rejected | Only `find`/`search` accept it; others narrow via filters |
|
|
253
139
|
|
|
254
140
|
---
|
|
255
141
|
|
|
256
142
|
## Workflow Patterns
|
|
257
143
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
4. Stop when you can answer the question
|
|
264
|
-
|
|
265
|
-
### Pattern: "where is X used?"
|
|
266
|
-
|
|
267
|
-
1. `jrag inspect <X>` (resolves; if `many`, disambiguate)
|
|
268
|
-
2. `jrag callers <X>` and `jrag dependents <X>`
|
|
269
|
-
3. If CLI misses: `Grep` for the symbol name
|
|
270
|
-
4. Report all usage sites with file:line
|
|
271
|
-
|
|
272
|
-
### Pattern: "find all Y in the codebase"
|
|
273
|
-
|
|
274
|
-
1. Structural: `jrag find --role <ROLE> [--service <S>]`
|
|
275
|
-
2. Textual: `Grep` for the pattern
|
|
276
|
-
3. Broad: `Glob` for files + `Grep` for content
|
|
277
|
-
4. Summarize findings; don't dump raw lists
|
|
278
|
-
|
|
279
|
-
### Pattern: "trace the flow from A to B"
|
|
280
|
-
|
|
281
|
-
1. `jrag flow <route-A>` to trace the request
|
|
282
|
-
2. `jrag connection A B` to confirm a path exists
|
|
283
|
-
3. Use `Grep` to fill gaps where the graph index is incomplete
|
|
284
|
-
4. Report the trace with file:line references
|
|
285
|
-
|
|
286
|
-
### Pattern: "orient in service S"
|
|
287
|
-
|
|
288
|
-
1. `jrag overview <S>` (bundle of routes/clients/producers)
|
|
289
|
-
2. `jrag conventions --service <S>` (dominant roles + framework tallies)
|
|
290
|
-
3. `jrag map --service <S>` (type counts)
|
|
291
|
-
4. `jrag http-routes --service <S>` (entry points)
|
|
144
|
+
- **"Explain feature X":** `jrag search "X"` → pick 1–3 hits → `jrag inspect <hit>` → targeted traversal (`callees`/`implementations`/`dependents`) → stop when answered.
|
|
145
|
+
- **"Where is X used?":** `jrag inspect <X>` (resolves; disambiguate if `many`) → `jrag callers <X>` + `jrag dependents <X>` → `Grep` fallback → report sites with file:line.
|
|
146
|
+
- **"Find all Y":** structural → `jrag find --role <ROLE> [--service <S>]`; textual → `Grep`; broad → `Glob`+`Grep`. Summarize, don't dump.
|
|
147
|
+
- **"Trace flow A→B":** `jrag flow <route-A>` → `jrag connection A B` → `Grep` gaps → report with file:line.
|
|
148
|
+
- **"Orient in service S":** `jrag overview <S>` → `jrag conventions --service <S>` → `jrag map --service <S>` → `jrag http-routes --service <S>`.
|