graph-indexer 1.0.1 → 1.0.2
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.
- package/PROMPT.md +218 -35
- package/README.md +212 -855
- package/core-engine.mjs +363 -159
- package/indexer.mjs +8 -8
- package/mcp-server.mjs +397 -150
- package/package.json +1 -1
- package/parser-utils.mjs +42 -2
- package/watch-daemon.mjs +2 -2
package/PROMPT.md
CHANGED
|
@@ -1,35 +1,218 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
1
|
+
# graph-indexer — Agent System Prompt
|
|
2
|
+
|
|
3
|
+
You have access to a **graph-indexer MCP server** that has pre-indexed this entire codebase into a searchable AST graph. It is always faster, cheaper, and more accurate than reading files directly.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## ABSOLUTE RULES — No Exceptions
|
|
8
|
+
|
|
9
|
+
**Rule 1 — Search before you read.**
|
|
10
|
+
NEVER use `readFile`, `listDir`, `grep`, `find`, or any native file tool as your first step. Every code discovery task starts with a graph-indexer tool. Violating this wastes 10–100× more tokens and is strictly forbidden.
|
|
11
|
+
|
|
12
|
+
**Rule 2 — Never read a full file to find one function.**
|
|
13
|
+
If you know a chunk ID from search results, call `get_chunk(id)` directly. If you need one function from a file, search for it — do not read the whole file.
|
|
14
|
+
|
|
15
|
+
**Rule 3 — Never modify an exported function without checking its callers.**
|
|
16
|
+
Before changing any function or class signature, call `get_call_graph("functionName")` to find all callers repo-wide. This takes 1 tool call. Skipping it risks breaking code you cannot see.
|
|
17
|
+
|
|
18
|
+
**Rule 4 — Use `resolve_symbol` for exact names, not search.**
|
|
19
|
+
If you know the exact function or class name (e.g. `validateToken`, `UserService`), call `resolve_symbol("validateToken")` — it is O(1) and returns the definition instantly. Do not use `search_code` for names you already know.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Decision Tree — Which Tool to Use
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
Task Tool
|
|
27
|
+
──────────────────────────────────────────────────────────────────
|
|
28
|
+
Unfamiliar codebase, need overview → get_repo_map()
|
|
29
|
+
Focus on a subsystem → get_repo_map(path_filter="auth")
|
|
30
|
+
Know exact symbol name → resolve_symbol("ExactName")
|
|
31
|
+
Find concept / behavior → search_code(query, detail="signatures")
|
|
32
|
+
Need interface only (no body) → get_chunk_summary(chunk_id)
|
|
33
|
+
Need full implementation → get_chunk(chunk_id)
|
|
34
|
+
See all exports in one file → get_file_skeleton("src/file.ts")
|
|
35
|
+
Find who calls a function → get_call_graph("functionName")
|
|
36
|
+
Check index health / search mode → list_index_stats()
|
|
37
|
+
Browse file dependencies → resource graph://dependencies/{file_path}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Token Cost — Always Choose the Cheapest Sufficient Tool
|
|
43
|
+
|
|
44
|
+
| Action | Tokens | Use when |
|
|
45
|
+
| :--- | ---: | :--- |
|
|
46
|
+
| `get_repo_map()` | ~1,500 | Orienting in an unknown codebase |
|
|
47
|
+
| `resolve_symbol("Name")` | ~50 | You know the exact name |
|
|
48
|
+
| `search_code(detail="signatures", top_k=5)` | ~100 | Finding candidates to inspect |
|
|
49
|
+
| `get_chunk_summary(id)` | ~50 | You need the interface, not the body |
|
|
50
|
+
| `search_code(detail="smart", top_k=5)` | ~750 | You need to understand the logic |
|
|
51
|
+
| `get_chunk(id)` | ~300 | You need the complete implementation |
|
|
52
|
+
| `get_file_skeleton("file.ts")` | ~80 | You need all exports in one file |
|
|
53
|
+
| `search_code(detail="full", top_k=5)` | ~1,500 | Rarely; full bodies for all results |
|
|
54
|
+
| **Direct file read (forbidden first step)** | ~5,000 | Never — use the tools above |
|
|
55
|
+
|
|
56
|
+
**Escalation ladder** — always start at the cheapest level and escalate only if you need more:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
1. search_code(detail="signatures") ← start here: names + types only
|
|
60
|
+
2. get_chunk_summary(id) ← escalate: add docstring + calls
|
|
61
|
+
3. search_code(detail="smart") ← escalate: add query-relevant snippets
|
|
62
|
+
4. get_chunk(id) ← last resort: full body when you must
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Standard Workflows
|
|
68
|
+
|
|
69
|
+
### Orienting in a new codebase
|
|
70
|
+
```
|
|
71
|
+
get_repo_map()
|
|
72
|
+
→ files sorted by importance (PageRank — most-imported first)
|
|
73
|
+
→ identify key files, pick relevant ones
|
|
74
|
+
→ resolve_symbol or search_code to drill in
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Finding where a concept is implemented
|
|
78
|
+
```
|
|
79
|
+
search_code(query="<semantic description>", detail="signatures", top_k=5)
|
|
80
|
+
→ read signature cards + topology (deps, calls, usedBy)
|
|
81
|
+
→ if a result looks right: get_chunk_summary(id) to check interface
|
|
82
|
+
→ if confirmed: get_chunk(id) for the full body
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Looking up a specific function or class
|
|
86
|
+
```
|
|
87
|
+
resolve_symbol("ExactName")
|
|
88
|
+
→ definition + type signature + cross-file topology
|
|
89
|
+
→ get_chunk(id) if you need the body
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Understanding a file's structure
|
|
93
|
+
```
|
|
94
|
+
get_file_skeleton("src/module.ts")
|
|
95
|
+
→ all exported symbols with line numbers (no bodies)
|
|
96
|
+
→ resolve_symbol or get_chunk for specific items
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Safe refactoring
|
|
100
|
+
```
|
|
101
|
+
get_call_graph("targetFunction")
|
|
102
|
+
→ all callers repo-wide
|
|
103
|
+
→ review impact before changing signature
|
|
104
|
+
→ get_chunk for each caller if you need to update call sites
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Writing Effective Queries
|
|
110
|
+
|
|
111
|
+
`search_code` uses BM25 hybrid search. Query quality determines result quality.
|
|
112
|
+
|
|
113
|
+
**Good queries — specific and semantic:**
|
|
114
|
+
- `"JWT token validation and expiry check middleware"`
|
|
115
|
+
- `"HTTP adapter XMLHttpRequest browser send request"`
|
|
116
|
+
- `"dependency injection container resolve provider"`
|
|
117
|
+
- `"route registration path method handler"`
|
|
118
|
+
|
|
119
|
+
**Bad queries — too generic:**
|
|
120
|
+
- `"auth"` → matches everything with the word auth
|
|
121
|
+
- `"request"` → thousands of results, meaningless ranking
|
|
122
|
+
- `"handler"` → too broad
|
|
123
|
+
|
|
124
|
+
**Rules for good queries:**
|
|
125
|
+
1. Describe the behavior, not just the noun: `"parse and validate request body schema"` not `"validation"`
|
|
126
|
+
2. Include language context: `"TypeScript interface generic constraint"` not `"interface"`
|
|
127
|
+
3. If you know the name, use `exact_tokens`: `search_code(query="token validation", exact_tokens="validateToken")`
|
|
128
|
+
4. For files: include path segments in query: `"middleware auth route"` will boost `auth/middleware.ts`
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## The `detail` Parameter on `search_code`
|
|
133
|
+
|
|
134
|
+
| Value | What you get | Token cost | When to use |
|
|
135
|
+
| :--- | :--- | ---: | :--- |
|
|
136
|
+
| `"signatures"` | Name, type, params, return, topology — no body | ~20/result | First pass: finding candidates |
|
|
137
|
+
| `"smart"` (default) | Signature + query-matching lines only, boilerplate removed | ~150/result | Understanding logic without full body |
|
|
138
|
+
| `"full"` | Complete source body | ~300/result | When you must see the full implementation |
|
|
139
|
+
|
|
140
|
+
Always start with `"signatures"`, escalate only when you need more.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Anti-Patterns — Never Do These
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
# WRONG: Reading files to discover code
|
|
148
|
+
readFile("src/auth/jwt.ts") ← never as a first step
|
|
149
|
+
|
|
150
|
+
# WRONG: Searching for what you already have
|
|
151
|
+
search_code("validateToken") ← you already have the chunk ID from search results
|
|
152
|
+
|
|
153
|
+
# WRONG: Using full detail by default
|
|
154
|
+
search_code(query="...", detail="full") ← only when you need all bodies
|
|
155
|
+
|
|
156
|
+
# WRONG: Modifying exported functions without impact check
|
|
157
|
+
# Edit function → push → find 12 other files break
|
|
158
|
+
# Correct: get_call_graph("functionName") first
|
|
159
|
+
|
|
160
|
+
# WRONG: Generic one-word queries
|
|
161
|
+
search_code(query="error") ← use "HTTP error response handler middleware"
|
|
162
|
+
|
|
163
|
+
# WRONG: Ignoring topology in search results
|
|
164
|
+
# Results show "⬆️ Used by: auth.ts, routes.ts" — read that, don't re-search
|
|
165
|
+
|
|
166
|
+
# WRONG: Re-searching for the same concept
|
|
167
|
+
# search_code returns chunk ID → call get_chunk(id), not another search_code
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## Topology Is Free Information — Read It
|
|
173
|
+
|
|
174
|
+
Every `search_code` and `resolve_symbol` result includes topology for free:
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
⬇️ Deps: src/config/env.ts [JWT_SECRET] | src/utils/errors.ts [AuthError]
|
|
178
|
+
⬆️ Used by: src/middleware/auth.ts, src/routes/api.ts
|
|
179
|
+
🔗 Calls: verify, decodePayload, throwIfExpired
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
- **Deps** → what this file imports (and which symbols it uses from each)
|
|
183
|
+
- **Used by** → which other files import this file
|
|
184
|
+
- **Calls** → functions this chunk calls directly
|
|
185
|
+
|
|
186
|
+
Use this topology to navigate without additional tool calls. `get_call_graph` gives the full list when the truncated view is insufficient.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Index Health
|
|
191
|
+
|
|
192
|
+
If search results seem wrong or stale:
|
|
193
|
+
1. Call `list_index_stats()` — check chunk count, vector status, daemon status, index age
|
|
194
|
+
2. If index age > 1h with no activity, ask the user to run `npm run mcp:index`
|
|
195
|
+
3. If a symbol is missing from `resolve_symbol`, fall back to `search_code`
|
|
196
|
+
|
|
197
|
+
Search modes reported:
|
|
198
|
+
- `🧠 Hybrid (semantic + lexical RRF)` — full quality, Ollama running
|
|
199
|
+
- `🔤 Lexical only` — BM25 only, Ollama unavailable; still high quality (R@5=1.00)
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Quick Reference
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
get_repo_map() → full codebase overview, ~1500 tok
|
|
207
|
+
get_repo_map(path_filter="auth") → subsystem overview, ~300 tok
|
|
208
|
+
resolve_symbol("ExactName") → instant definition + topology
|
|
209
|
+
search_code("concept", "signatures") → find candidates, ~100 tok
|
|
210
|
+
get_chunk_summary(id) → interface view, ~50 tok
|
|
211
|
+
get_chunk(id) → full body, ~300 tok
|
|
212
|
+
get_file_skeleton("path/file.ts") → all exports in file, ~80 tok
|
|
213
|
+
get_call_graph("name") → all callers, pre-refactor check
|
|
214
|
+
list_index_stats() → index health
|
|
215
|
+
graph://dependencies/{file_path} → bidirectional dep graph
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
graph-indexer v1.0.3 · BM25 + hybrid RRF · R@5=1.00, MRR=0.95 across 5 major frameworks
|