mincut-context 1.0.0 → 1.1.0
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/README.md +126 -28
- package/dist/adapters/cli/bin.js +16 -3
- package/dist/adapters/cli/bin.js.map +1 -1
- package/dist/adapters/mcp/index.js +1 -1
- package/dist/core/communities.d.ts +17 -0
- package/dist/core/communities.d.ts.map +1 -0
- package/dist/core/communities.js +54 -0
- package/dist/core/communities.js.map +1 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/select.d.ts +11 -0
- package/dist/core/select.d.ts.map +1 -1
- package/dist/core/select.js +23 -2
- package/dist/core/select.js.map +1 -1
- package/dist/index/builder.d.ts +9 -1
- package/dist/index/builder.d.ts.map +1 -1
- package/dist/index/builder.js +25 -1
- package/dist/index/builder.js.map +1 -1
- package/dist/index/cache.d.ts +31 -0
- package/dist/index/cache.d.ts.map +1 -0
- package/dist/index/cache.js +72 -0
- package/dist/index/cache.js.map +1 -0
- package/dist/select/pack.d.ts +11 -0
- package/dist/select/pack.d.ts.map +1 -1
- package/dist/select/pack.js +29 -4
- package/dist/select/pack.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -3,23 +3,58 @@
|
|
|
3
3
|
# `mincut-context`
|
|
4
4
|
|
|
5
5
|
**Token-minimal context selection for AI coding agents.**
|
|
6
|
-
A symbol graph of your repo + personalized PageRank + budget-constrained min-cut — picks the smallest provably-relevant context for any task.
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
A symbol graph of your repo + personalized PageRank + budget-constrained min-cut
|
|
8
|
+
— picks the smallest provably-relevant context for any task.
|
|
9
|
+
|
|
10
|
+
[](https://www.npmjs.com/package/mincut-context)
|
|
11
|
+
[](https://www.npmjs.com/package/mincut-context)
|
|
12
|
+
[](https://bundlephobia.com/package/mincut-context)
|
|
13
|
+
[](./src)
|
|
14
|
+
[](./package.json)
|
|
10
15
|
[](./tests)
|
|
11
|
-
[](./package.json)
|
|
16
|
+
[](./LICENSE)
|
|
13
17
|
|
|
14
18
|
</div>
|
|
15
19
|
|
|
16
20
|
<p align="center"><img src="docs/demo.gif" alt="mcx pack demo — keyword + semantic search on a real repo" width="900" /></p>
|
|
17
21
|
|
|
22
|
+
<div align="center">
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install -g mincut-context # global CLI: mcx
|
|
26
|
+
npx mincut-context pack "fix the login validation bug" --budget 4000
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
</div>
|
|
30
|
+
|
|
18
31
|
> One sentence: an agent that opens `mincut-context` first gets the minimum cohesive *region* of code its task depends on — not a grep hit, not a whole file, not the whole repo.
|
|
19
32
|
|
|
20
33
|
---
|
|
21
34
|
|
|
22
|
-
|
|
35
|
+
<details>
|
|
36
|
+
<summary><b>Table of contents</b></summary>
|
|
37
|
+
|
|
38
|
+
- [Why](#why)
|
|
39
|
+
- [The idea](#the-idea)
|
|
40
|
+
- [Install](#install)
|
|
41
|
+
- [Quick start](#quick-start)
|
|
42
|
+
- [Use it three ways](#use-it-three-ways) — [MCP server](#1-as-an-mcp-server--recommended-for-agents) · [CLI](#2-as-a-cli) · [Library](#3-as-a-library)
|
|
43
|
+
- [How it works](#how-it-works)
|
|
44
|
+
- [Real-world examples](#real-world-examples)
|
|
45
|
+
- [Languages](#languages)
|
|
46
|
+
- [CLI reference](#cli-reference)
|
|
47
|
+
- [How it compares](#how-it-compares)
|
|
48
|
+
- [Roadmap](#roadmap)
|
|
49
|
+
- [Tradeoffs (honest)](#tradeoffs-honest)
|
|
50
|
+
- [Contributing](#contributing)
|
|
51
|
+
- [License](#license)
|
|
52
|
+
|
|
53
|
+
</details>
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Why
|
|
23
58
|
|
|
24
59
|
AI coding agents waste your context window. Two failure modes:
|
|
25
60
|
|
|
@@ -47,16 +82,37 @@ The objective is **submodular**, so a greedy algorithm gives a `(1 - 1/e) ≈ 0.
|
|
|
47
82
|
## Install
|
|
48
83
|
|
|
49
84
|
```bash
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
85
|
+
# global CLI (recommended)
|
|
86
|
+
npm install -g mincut-context
|
|
87
|
+
|
|
88
|
+
# or per-project
|
|
89
|
+
npm install --save-dev mincut-context
|
|
90
|
+
|
|
91
|
+
# or one-shot, no install
|
|
92
|
+
npx mincut-context pack "your task" --budget 4000
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Requires **Node ≥ 18.17**. TypeScript types ship with the package.
|
|
96
|
+
|
|
97
|
+
## Quick start
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
# 1. Index any repo once (warms the cache)
|
|
101
|
+
mcx index .
|
|
102
|
+
|
|
103
|
+
# 2. Ask for context for a task
|
|
104
|
+
mcx pack "fix the login validation bug" --budget 4000
|
|
105
|
+
|
|
106
|
+
# 3. Pipe straight into your agent
|
|
107
|
+
mcx pack "..." --format markdown > context.md
|
|
108
|
+
mcx pack "..." --format json | jq '.files[].path'
|
|
53
109
|
```
|
|
54
110
|
|
|
55
|
-
|
|
111
|
+
---
|
|
56
112
|
|
|
57
113
|
## Use it three ways
|
|
58
114
|
|
|
59
|
-
### 1. As an MCP server —
|
|
115
|
+
### 1. As an MCP server — recommended for agents
|
|
60
116
|
|
|
61
117
|
Drop into Claude Code, Codex, Cursor, or any MCP-aware client:
|
|
62
118
|
|
|
@@ -109,10 +165,26 @@ for (const f of result.files) {
|
|
|
109
165
|
// → src/auth/session.ts 0.408 483 · attached (60%)
|
|
110
166
|
```
|
|
111
167
|
|
|
168
|
+
Full TypeScript types — `pack`, `indexRepo`, `SymbolGraph`, `personalizedPageRank`, `greedySelect` are all exported.
|
|
169
|
+
|
|
112
170
|
---
|
|
113
171
|
|
|
114
172
|
## How it works
|
|
115
173
|
|
|
174
|
+
```mermaid
|
|
175
|
+
flowchart LR
|
|
176
|
+
A[Repo files] -->|tree-sitter| B[Symbol graph<br/>V: functions/classes<br/>E: imports/calls]
|
|
177
|
+
T[Task string] -->|keyword IDF| S[Seeds S ⊆ V]
|
|
178
|
+
T -->|optional: --embed| S
|
|
179
|
+
B --> R[Personalized<br/>PageRank<br/>α=0.85]
|
|
180
|
+
S --> R
|
|
181
|
+
R --> C[Greedy<br/>budget min-cut<br/>1−1/e bound]
|
|
182
|
+
B --> C
|
|
183
|
+
C --> P[Packed context<br/>files + ranges<br/>+ per-node reason]
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
The five steps in pseudocode:
|
|
187
|
+
|
|
116
188
|
```text
|
|
117
189
|
pack(task, repo, budget):
|
|
118
190
|
1. graph = index(repo) # tree-sitter → symbol+edge graph
|
|
@@ -130,7 +202,7 @@ pack(task, repo, budget):
|
|
|
130
202
|
|
|
131
203
|
The "no isolated nodes" rule (`attach(v, T) > 0`) is what gives you the *cohesion guarantee* — adding a fully-detached node would strictly increase the cut without benefit, so the greedy refuses. That's why an "auth" task never drags in unrelated UI files even when budget permits.
|
|
132
204
|
|
|
133
|
-
###
|
|
205
|
+
### Semantic embeddings (optional)
|
|
134
206
|
|
|
135
207
|
Pure keyword matching misses semantic neighbors:
|
|
136
208
|
|
|
@@ -144,7 +216,8 @@ $ mcx pack "ranking and centrality algorithm" --repo . --embed --embed-weight 0.
|
|
|
144
216
|
→ src/seeds/keyword.ts 0.080 18 tok
|
|
145
217
|
```
|
|
146
218
|
|
|
147
|
-
"Centrality" never appears in any symbol name — only embeddings could find this.
|
|
219
|
+
"Centrality" never appears in any symbol name — only embeddings could find this.
|
|
220
|
+
Uses [`@xenova/transformers`](https://github.com/xenova/transformers.js) (Transformers.js + ONNX). Fully local, ~22 MB model download on first use.
|
|
148
221
|
|
|
149
222
|
---
|
|
150
223
|
|
|
@@ -178,7 +251,8 @@ Adding a language is one parser file implementing `LanguageParser` + one line in
|
|
|
178
251
|
|
|
179
252
|
---
|
|
180
253
|
|
|
181
|
-
|
|
254
|
+
<details>
|
|
255
|
+
<summary><b>CLI reference</b></summary>
|
|
182
256
|
|
|
183
257
|
```text
|
|
184
258
|
Usage: mcx pack [options] <task...>
|
|
@@ -198,8 +272,21 @@ Options:
|
|
|
198
272
|
--embed-weight <number> Blend 0..1 (0=keyword, 1=embedding only)
|
|
199
273
|
--embed-model <id> HF model id (default Xenova/all-MiniLM-L6-v2)
|
|
200
274
|
-i, --interactive Ink TUI for pin/exclude before output
|
|
275
|
+
--cache Use persistent parse cache (.mincut-cache/) — fast repeat runs
|
|
276
|
+
--cache-dir <path> Override cache directory (absolute path)
|
|
277
|
+
--community-boost <number> Louvain same-community boost (default 0.5, 0 = disabled)
|
|
201
278
|
```
|
|
202
279
|
|
|
280
|
+
Other commands:
|
|
281
|
+
|
|
282
|
+
```text
|
|
283
|
+
mcx index [path] warm the parse cache (no output beyond stats)
|
|
284
|
+
mcx mcp run as an MCP server over stdio
|
|
285
|
+
mcx --version print the installed version
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
</details>
|
|
289
|
+
|
|
203
290
|
---
|
|
204
291
|
|
|
205
292
|
## How it compares
|
|
@@ -210,28 +297,29 @@ Options:
|
|
|
210
297
|
| **Grep / ripgrep** | ❌ | ❌ | ❌ | yes |
|
|
211
298
|
| **Cursor/Continue RAG** | partial | ❌ | ✅ | hard |
|
|
212
299
|
| **AST/symbol graph alone** | ❌ | ✅ | ❌ | yes |
|
|
213
|
-
| **`mincut-context`** | ✅ (budget) | ✅ (graph) | ✅ (
|
|
300
|
+
| **`mincut-context`** | ✅ (budget) | ✅ (graph) | ✅ (`--embed`) | per-node `reason` |
|
|
214
301
|
|
|
215
302
|
---
|
|
216
303
|
|
|
217
304
|
## Roadmap
|
|
218
305
|
|
|
219
|
-
- [x] Core: graph + personalized PageRank + greedy min-cut
|
|
220
|
-
- [x] TS/JS parser
|
|
221
|
-
- [x] Python parser
|
|
222
|
-
- [x] CLI (plain / JSON / markdown)
|
|
223
|
-
- [x] MCP server
|
|
224
|
-
- [x] Local embeddings (`@xenova/transformers`)
|
|
225
|
-
- [x] Ink TUI
|
|
226
|
-
- [
|
|
227
|
-
- [
|
|
306
|
+
- [x] Core: graph + personalized PageRank + greedy min-cut **(v1.0)**
|
|
307
|
+
- [x] TS/JS parser **(v1.0)**
|
|
308
|
+
- [x] Python parser **(v1.0)**
|
|
309
|
+
- [x] CLI (plain / JSON / markdown) **(v1.0)**
|
|
310
|
+
- [x] MCP server **(v1.0)**
|
|
311
|
+
- [x] Local embeddings (`@xenova/transformers`) **(v1.0)**
|
|
312
|
+
- [x] Ink TUI **(v1.0)**
|
|
313
|
+
- [x] Persistent on-disk parse cache (incremental reindex) **(v1.1)** — 5.2× warm-run speedup
|
|
314
|
+
- [x] Louvain community boost **(v1.1)**
|
|
228
315
|
- [ ] Vue SFC / Svelte parsers
|
|
229
316
|
- [ ] Rust / Go parsers
|
|
230
|
-
- [ ] LSP-backed type-aware call resolution
|
|
317
|
+
- [ ] LSP-backed type-aware call resolution
|
|
231
318
|
|
|
232
319
|
---
|
|
233
320
|
|
|
234
|
-
|
|
321
|
+
<details>
|
|
322
|
+
<summary><b>Tradeoffs (honest)</b></summary>
|
|
235
323
|
|
|
236
324
|
| What's not optimal | What we do |
|
|
237
325
|
|---|---|
|
|
@@ -241,6 +329,8 @@ Options:
|
|
|
241
329
|
| Cold start parses whole repo | `.mincut-cache/` per-file cache planned for v1.1 |
|
|
242
330
|
| Python class-level constants aren't symbols yet | Only `def` and `class` for now |
|
|
243
331
|
|
|
332
|
+
</details>
|
|
333
|
+
|
|
244
334
|
---
|
|
245
335
|
|
|
246
336
|
## Contributing
|
|
@@ -255,14 +345,22 @@ node dist/adapters/cli/bin.js pack "..." --repo /path/to/some-repo
|
|
|
255
345
|
```
|
|
256
346
|
|
|
257
347
|
PRs especially welcome for:
|
|
348
|
+
|
|
258
349
|
- **New language parsers** — tree-sitter grammar + symbol queries
|
|
259
350
|
- **LSP integration** — type-aware call resolution
|
|
260
351
|
- **Cache layer** — persistent `.mincut-cache/`
|
|
261
352
|
|
|
262
353
|
Each PR must keep the test suite green (`npm test`). New behavior requires tests first (TDD).
|
|
263
354
|
|
|
264
|
-
|
|
355
|
+
## Built with
|
|
356
|
+
|
|
357
|
+
- [`tree-sitter`](https://tree-sitter.github.io/tree-sitter/) — incremental parsing
|
|
358
|
+
- [`graphology`](https://graphology.github.io/) — graph primitives
|
|
359
|
+
- [`@xenova/transformers`](https://github.com/xenova/transformers.js) — local ONNX embeddings
|
|
360
|
+
- [`@modelcontextprotocol/sdk`](https://github.com/modelcontextprotocol/typescript-sdk) — MCP server
|
|
361
|
+
- [`commander`](https://github.com/tj/commander.js) + [`ink`](https://github.com/vadimdemedes/ink) — CLI & TUI
|
|
362
|
+
- [`vitest`](https://vitest.dev/) — testing
|
|
265
363
|
|
|
266
364
|
## License
|
|
267
365
|
|
|
268
|
-
[MIT](./LICENSE)
|
|
366
|
+
[MIT](./LICENSE) © [Dhrupo Nil](https://github.com/dhrupo)
|
package/dist/adapters/cli/bin.js
CHANGED
|
@@ -30,7 +30,7 @@ const program = new Command();
|
|
|
30
30
|
program
|
|
31
31
|
.name('mcx')
|
|
32
32
|
.description('mincut-context — token-minimal context selection for AI coding agents')
|
|
33
|
-
.version('1.
|
|
33
|
+
.version('1.1.0');
|
|
34
34
|
program
|
|
35
35
|
.command('pack <task...>')
|
|
36
36
|
.description('Pack a token-minimal context window for the given task')
|
|
@@ -46,6 +46,9 @@ program
|
|
|
46
46
|
.option('--embed-weight <number>', 'Blend factor 0..1 (0=keyword, 1=embedding only)', (v) => Number(v), 0.5)
|
|
47
47
|
.option('--embed-model <id>', 'Hugging Face model id', 'Xenova/all-MiniLM-L6-v2')
|
|
48
48
|
.option('-i, --interactive', 'Interactive review — pin/exclude in a TUI before output', false)
|
|
49
|
+
.option('--cache', 'Use persistent parse cache at .mincut-cache/ (fast repeat runs)', false)
|
|
50
|
+
.option('--cache-dir <path>', 'Override cache directory (absolute path)')
|
|
51
|
+
.option('--community-boost <number>', 'Louvain same-community boost factor (0 = disabled)', (v) => Number(v), 0.5)
|
|
49
52
|
.action(async (taskWords, opts) => {
|
|
50
53
|
const task = taskWords.join(' ').trim();
|
|
51
54
|
if (!task) {
|
|
@@ -68,6 +71,9 @@ program
|
|
|
68
71
|
exclude: opts.exclude,
|
|
69
72
|
embedder,
|
|
70
73
|
embedWeight: opts.embedWeight,
|
|
74
|
+
cache: opts.cache,
|
|
75
|
+
cacheDir: opts.cacheDir,
|
|
76
|
+
communityBoost: opts.communityBoost,
|
|
71
77
|
});
|
|
72
78
|
const color = Boolean(opts.color) && process.stdout.isTTY;
|
|
73
79
|
const fmt = (opts.format ?? 'plain').toLowerCase();
|
|
@@ -93,17 +99,24 @@ program
|
|
|
93
99
|
});
|
|
94
100
|
program
|
|
95
101
|
.command('index')
|
|
96
|
-
.description('Index the repo and print stats (
|
|
102
|
+
.description('Index the repo and print stats (optionally warm the on-disk parse cache)')
|
|
97
103
|
.option('-r, --repo <path>', 'Repository root', process.cwd())
|
|
98
104
|
.option('--include <pattern...>', 'Restrict to glob patterns')
|
|
105
|
+
.option('--cache', 'Use persistent parse cache at .mincut-cache/', false)
|
|
106
|
+
.option('--cache-dir <path>', 'Override cache directory (absolute path)')
|
|
99
107
|
.action((opts) => {
|
|
100
108
|
const t0 = Date.now();
|
|
101
109
|
const { stats } = indexRepo(path.resolve(opts.repo), {
|
|
102
110
|
include: opts.include,
|
|
111
|
+
cache: opts.cache,
|
|
112
|
+
cacheDir: opts.cacheDir,
|
|
103
113
|
});
|
|
104
114
|
const elapsed = Date.now() - t0;
|
|
115
|
+
const cacheNote = opts.cache
|
|
116
|
+
? ` · cache: ${stats.cacheHits} hit / ${stats.cacheMisses} miss`
|
|
117
|
+
: '';
|
|
105
118
|
process.stdout.write(`indexed ${stats.files} files · ${stats.symbols} symbols · ${stats.edges} edges ` +
|
|
106
|
-
`(${stats.unresolvedCalls} unresolved calls) in ${elapsed} ms\n`);
|
|
119
|
+
`(${stats.unresolvedCalls} unresolved calls)${cacheNote} in ${elapsed} ms\n`);
|
|
107
120
|
});
|
|
108
121
|
program
|
|
109
122
|
.command('mcp')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../../src/adapters/cli/bin.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../../src/adapters/cli/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { handleMcpCall, TOOLS } from './handler.js';
|
|
|
7
7
|
* All business logic lives in the handler — this file only does transport.
|
|
8
8
|
*/
|
|
9
9
|
export async function runMcpServer() {
|
|
10
|
-
const server = new Server({ name: 'mincut-context', version: '1.
|
|
10
|
+
const server = new Server({ name: 'mincut-context', version: '1.1.0' }, { capabilities: { tools: {} } });
|
|
11
11
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
12
12
|
tools: TOOLS.map((t) => ({
|
|
13
13
|
name: t.name,
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SymbolGraph } from './graph.js';
|
|
2
|
+
export interface CommunityOptions {
|
|
3
|
+
/** Optional deterministic RNG seed for reproducible runs. */
|
|
4
|
+
seed?: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Louvain community detection on the symbol graph.
|
|
8
|
+
*
|
|
9
|
+
* Why undirected? Community detection asks "which nodes are densely
|
|
10
|
+
* interconnected" — a directed call edge a→b should still place a and b in
|
|
11
|
+
* the same module. We collapse to an undirected weight-summed multigraph.
|
|
12
|
+
*
|
|
13
|
+
* Returns a Map<nodeId, communityId>. Community IDs are arbitrary integers;
|
|
14
|
+
* only equality is meaningful (two nodes share a community iff equal).
|
|
15
|
+
*/
|
|
16
|
+
export declare function detectCommunities(symbols: SymbolGraph, options?: CommunityOptions): Map<string, number>;
|
|
17
|
+
//# sourceMappingURL=communities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communities.d.ts","sourceRoot":"","sources":["../../src/core/communities.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAqB9C,MAAM,WAAW,gBAAgB;IAC/B,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,gBAAqB,GAC7B,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAuBrB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
// graphology + graphology-communities-louvain are CommonJS — bridge via require.
|
|
3
|
+
const require_ = createRequire(import.meta.url);
|
|
4
|
+
const { UndirectedGraph } = require_('graphology');
|
|
5
|
+
const louvain = require_('graphology-communities-louvain');
|
|
6
|
+
/**
|
|
7
|
+
* Louvain community detection on the symbol graph.
|
|
8
|
+
*
|
|
9
|
+
* Why undirected? Community detection asks "which nodes are densely
|
|
10
|
+
* interconnected" — a directed call edge a→b should still place a and b in
|
|
11
|
+
* the same module. We collapse to an undirected weight-summed multigraph.
|
|
12
|
+
*
|
|
13
|
+
* Returns a Map<nodeId, communityId>. Community IDs are arbitrary integers;
|
|
14
|
+
* only equality is meaningful (two nodes share a community iff equal).
|
|
15
|
+
*/
|
|
16
|
+
export function detectCommunities(symbols, options = {}) {
|
|
17
|
+
const g = new UndirectedGraph();
|
|
18
|
+
for (const id of symbols.nodes())
|
|
19
|
+
g.addNode(id);
|
|
20
|
+
// Sum directed weights to a single undirected edge weight per pair.
|
|
21
|
+
for (const sourceId of symbols.nodes()) {
|
|
22
|
+
for (const e of symbols.outEdges(sourceId)) {
|
|
23
|
+
const a = sourceId;
|
|
24
|
+
const b = e.target;
|
|
25
|
+
if (a === b)
|
|
26
|
+
continue;
|
|
27
|
+
if (g.hasEdge(a, b)) {
|
|
28
|
+
g.updateEdgeAttribute(a, b, 'weight', (v) => Number(v ?? 0) + e.data.weight);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
g.addEdge(a, b, { weight: e.data.weight });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const rng = options.seed !== undefined ? mulberry32(options.seed) : Math.random;
|
|
36
|
+
// Louvain with no edges returns a single community for everything; for an
|
|
37
|
+
// isolated-node graph the library treats every node as its own community,
|
|
38
|
+
// which matches our test contract.
|
|
39
|
+
const raw = louvain(g, { rng });
|
|
40
|
+
return new Map(Object.entries(raw));
|
|
41
|
+
}
|
|
42
|
+
/** Tiny deterministic PRNG so tests can lock results across runs. */
|
|
43
|
+
function mulberry32(seed) {
|
|
44
|
+
let a = seed | 0;
|
|
45
|
+
return function rng() {
|
|
46
|
+
a |= 0;
|
|
47
|
+
a = (a + 0x6d2b79f5) | 0;
|
|
48
|
+
let t = a;
|
|
49
|
+
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
50
|
+
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
51
|
+
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=communities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communities.js","sourceRoot":"","sources":["../../src/core/communities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,iFAAiF;AACjF,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,EAAE,eAAe,EAAE,GAAG,QAAQ,CAAC,YAAY,CAEhD,CAAC;AACF,MAAM,OAAO,GAAG,QAAQ,CAAC,gCAAgC,CAG9B,CAAC;AAgB5B;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAoB,EACpB,UAA4B,EAAE;IAE9B,MAAM,CAAC,GAAG,IAAI,eAAe,EAAE,CAAC;IAChC,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,KAAK,EAAE;QAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChD,oEAAoE;IACpE,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,QAAQ,CAAC;YACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC;gBAAE,SAAS;YACtB,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;gBACpB,CAAC,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/E,CAAC;iBAAM,CAAC;gBACN,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC7C,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IAChF,0EAA0E;IAC1E,0EAA0E;IAC1E,mCAAmC;IACnC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAChC,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,qEAAqE;AACrE,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC;IACjB,OAAO,SAAS,GAAG;QACjB,CAAC,IAAI,CAAC,CAAC;QACP,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACrC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC;IAC/C,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -4,4 +4,6 @@ export { personalizedPageRank } from './pagerank.js';
|
|
|
4
4
|
export type { PageRankOptions } from './pagerank.js';
|
|
5
5
|
export { greedySelect } from './select.js';
|
|
6
6
|
export type { SelectOptions, SelectionEntry, SelectionResult } from './select.js';
|
|
7
|
+
export { detectCommunities } from './communities.js';
|
|
8
|
+
export type { CommunityOptions } from './communities.js';
|
|
7
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/core/index.js
CHANGED
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/core/select.d.ts
CHANGED
|
@@ -17,12 +17,23 @@ export interface SelectOptions {
|
|
|
17
17
|
* even at the cost of some rank.
|
|
18
18
|
*/
|
|
19
19
|
attachmentWeight?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Optional Louvain community labels per node. When provided AND
|
|
22
|
+
* `communityBoost > 0`, candidates sharing a community with any seed get
|
|
23
|
+
* a multiplicative boost in the greedy objective — surface results stay
|
|
24
|
+
* inside the task's natural module instead of drifting outside.
|
|
25
|
+
*/
|
|
26
|
+
communities?: ReadonlyMap<string, number>;
|
|
27
|
+
/** Multiplicative boost for same-community candidates. Default 0 (off). */
|
|
28
|
+
communityBoost?: number;
|
|
20
29
|
}
|
|
21
30
|
export interface SelectionEntry {
|
|
22
31
|
id: string;
|
|
23
32
|
tokens: number;
|
|
24
33
|
rank: number;
|
|
25
34
|
reason: string;
|
|
35
|
+
/** Louvain community label, present only when communities were supplied. */
|
|
36
|
+
community?: number;
|
|
26
37
|
}
|
|
27
38
|
export interface SelectionResult {
|
|
28
39
|
selected: Set<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/core/select.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,6EAA6E;IAC7E,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/core/select.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,qDAAqD;IACrD,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,6EAA6E;IAC7E,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,GAAG,eAAe,CA4GxF"}
|
package/dist/core/select.js
CHANGED
|
@@ -25,7 +25,17 @@
|
|
|
25
25
|
* the remaining budget.
|
|
26
26
|
*/
|
|
27
27
|
export function greedySelect(graph, options) {
|
|
28
|
-
const { seeds, ranks, budget, rankWeight = 1, attachmentWeight = 1, } = options;
|
|
28
|
+
const { seeds, ranks, budget, rankWeight = 1, attachmentWeight = 1, communities, communityBoost = 0, } = options;
|
|
29
|
+
// Pre-compute the set of community ids the seeds occupy — candidate gets
|
|
30
|
+
// the boost iff its community is in this set.
|
|
31
|
+
const seedCommunities = new Set();
|
|
32
|
+
if (communities && communityBoost > 0) {
|
|
33
|
+
for (const id of seeds) {
|
|
34
|
+
const c = communities.get(id);
|
|
35
|
+
if (c !== undefined)
|
|
36
|
+
seedCommunities.add(c);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
29
39
|
const selected = new Set();
|
|
30
40
|
const entries = [];
|
|
31
41
|
let usedTokens = 0;
|
|
@@ -44,6 +54,7 @@ export function greedySelect(graph, options) {
|
|
|
44
54
|
tokens: data.tokens,
|
|
45
55
|
rank: ranks.get(id) ?? 0,
|
|
46
56
|
reason: 'seed — matched directly by task',
|
|
57
|
+
community: communities?.get(id),
|
|
47
58
|
});
|
|
48
59
|
}
|
|
49
60
|
// 2. Greedy fill.
|
|
@@ -66,7 +77,16 @@ export function greedySelect(graph, options) {
|
|
|
66
77
|
if (attach === 0)
|
|
67
78
|
continue;
|
|
68
79
|
const rank = ranks.get(id) ?? 0;
|
|
69
|
-
|
|
80
|
+
let score = (rankWeight * rank * attach * attachmentWeight) / Math.max(data.tokens, 1);
|
|
81
|
+
// Multiplicative community boost: candidates inside any seed's community
|
|
82
|
+
// win ties. Caps at 2x by design so a wildly relevant outsider can
|
|
83
|
+
// still beat a same-community filler.
|
|
84
|
+
if (communities && communityBoost > 0) {
|
|
85
|
+
const c = communities.get(id);
|
|
86
|
+
if (c !== undefined && seedCommunities.has(c)) {
|
|
87
|
+
score *= 1 + communityBoost;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
70
90
|
if (!best || score > best.score) {
|
|
71
91
|
best = { id, score, tokens: data.tokens, rank, attach };
|
|
72
92
|
}
|
|
@@ -80,6 +100,7 @@ export function greedySelect(graph, options) {
|
|
|
80
100
|
tokens: best.tokens,
|
|
81
101
|
rank: best.rank,
|
|
82
102
|
reason: reasonFor(best.attach, best.rank),
|
|
103
|
+
community: communities?.get(best.id),
|
|
83
104
|
});
|
|
84
105
|
}
|
|
85
106
|
return {
|
package/dist/core/select.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/core/select.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/core/select.ts"],"names":[],"mappings":"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"}
|
package/dist/index/builder.d.ts
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { SymbolGraph } from '../core/graph.js';
|
|
2
2
|
import { type WalkOptions } from './walker.js';
|
|
3
|
+
export interface IndexOptions extends WalkOptions {
|
|
4
|
+
/** Enable persistent on-disk parse cache. Default false (in-memory only). */
|
|
5
|
+
cache?: boolean;
|
|
6
|
+
/** Override cache directory. Default `<repo>/.mincut-cache/`. */
|
|
7
|
+
cacheDir?: string;
|
|
8
|
+
}
|
|
3
9
|
export interface IndexResult {
|
|
4
10
|
graph: SymbolGraph;
|
|
5
11
|
stats: {
|
|
@@ -7,7 +13,9 @@ export interface IndexResult {
|
|
|
7
13
|
symbols: number;
|
|
8
14
|
edges: number;
|
|
9
15
|
unresolvedCalls: number;
|
|
16
|
+
cacheHits: number;
|
|
17
|
+
cacheMisses: number;
|
|
10
18
|
};
|
|
11
19
|
}
|
|
12
|
-
export declare function indexRepo(root: string, options?:
|
|
20
|
+
export declare function indexRepo(root: string, options?: IndexOptions): IndexResult;
|
|
13
21
|
//# sourceMappingURL=builder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/index/builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAI/C,OAAO,EAAQ,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/index/builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAI/C,OAAO,EAAQ,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAarD,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,8EAA8E;IAC9E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,eAAe,EAAE,MAAM,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,WAAW,CA6G/E"}
|
package/dist/index/builder.js
CHANGED
|
@@ -3,6 +3,7 @@ import { SymbolGraph } from '../core/graph.js';
|
|
|
3
3
|
import { parseTypeScript } from '../parsers/ts.js';
|
|
4
4
|
import { parsePython } from '../parsers/py.js';
|
|
5
5
|
import { walk } from './walker.js';
|
|
6
|
+
import { ParseCache, fileFingerprint } from './cache.js';
|
|
6
7
|
const TS_EXT = new Set(['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs']);
|
|
7
8
|
const PY_EXT = new Set(['.py', '.pyi']);
|
|
8
9
|
function parseForExt(file, source) {
|
|
@@ -15,6 +16,9 @@ function parseForExt(file, source) {
|
|
|
15
16
|
}
|
|
16
17
|
export function indexRepo(root, options = {}) {
|
|
17
18
|
const graph = new SymbolGraph();
|
|
19
|
+
const cache = options.cache
|
|
20
|
+
? new ParseCache(options.cacheDir ?? path.join(root, '.mincut-cache'))
|
|
21
|
+
: null;
|
|
18
22
|
// Per-file accumulators we need for cross-file resolution.
|
|
19
23
|
const fileImports = new Map();
|
|
20
24
|
const symbolsByFile = new Map();
|
|
@@ -23,7 +27,24 @@ export function indexRepo(root, options = {}) {
|
|
|
23
27
|
let fileCount = 0;
|
|
24
28
|
let unresolved = 0;
|
|
25
29
|
for (const file of walk(root, options)) {
|
|
26
|
-
|
|
30
|
+
let parsed = null;
|
|
31
|
+
if (cache) {
|
|
32
|
+
const fp = fileFingerprint(file.absPath);
|
|
33
|
+
if (fp) {
|
|
34
|
+
const hit = cache.get(file.relPath, fp.mtimeMs, fp.size);
|
|
35
|
+
if (hit) {
|
|
36
|
+
parsed = hit;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
parsed = parseForExt(file.relPath, file.source);
|
|
40
|
+
if (parsed)
|
|
41
|
+
cache.put(file.relPath, fp.mtimeMs, fp.size, parsed);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
parsed = parseForExt(file.relPath, file.source);
|
|
47
|
+
}
|
|
27
48
|
if (!parsed)
|
|
28
49
|
continue;
|
|
29
50
|
fileCount += 1;
|
|
@@ -91,6 +112,7 @@ export function indexRepo(root, options = {}) {
|
|
|
91
112
|
}
|
|
92
113
|
}
|
|
93
114
|
}
|
|
115
|
+
const cacheStats = cache?.getStats() ?? { hits: 0, misses: 0 };
|
|
94
116
|
return {
|
|
95
117
|
graph,
|
|
96
118
|
stats: {
|
|
@@ -98,6 +120,8 @@ export function indexRepo(root, options = {}) {
|
|
|
98
120
|
symbols: graph.order(),
|
|
99
121
|
edges: graph.size(),
|
|
100
122
|
unresolvedCalls: unresolved,
|
|
123
|
+
cacheHits: cacheStats.hits,
|
|
124
|
+
cacheMisses: cacheStats.misses,
|
|
101
125
|
},
|
|
102
126
|
};
|
|
103
127
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/index/builder.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,IAAI,EAAoB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/index/builder.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,IAAI,EAAoB,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEzD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AACvE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAExC,SAAS,WAAW,CAAC,IAAY,EAAE,MAAc;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC;AACd,CAAC;AAqBD,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,UAAwB,EAAE;IAChE,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK;QACzB,CAAC,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QACtE,CAAC,CAAC,IAAI,CAAC;IAET,2DAA2D;IAC3D,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;IACtD,MAAM,aAAa,GAAG,IAAI,GAAG,EAA0B,CAAC;IACxD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;IACjD,MAAM,YAAY,GAAqD,EAAE,CAAC;IAE1E,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;QACvC,IAAI,MAAM,GAAuB,IAAI,CAAC;QACtC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;gBACzD,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,GAAG,GAAG,CAAC;gBACf,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBAChD,IAAI,MAAM;wBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,SAAS,IAAI,CAAC,CAAC;QACf,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9C,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAEhD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,SAAS;YACpC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE;gBACpB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;aACrB,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjB,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAS,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IAEzD,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,IAAY,EAAiB,EAAE,CAC5D,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAE5C,kCAAkC;IAClC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QACjH,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,UAAU,IAAI,CAAC,CAAC;YAChB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,SAAS;QAClE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QACnC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,+DAA+D;IAC/D,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,WAAW,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,CAAC,YAAY;gBAAE,SAAS;YAC5B,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAChD,IAAI,CAAC,OAAO;gBAAE,SAAS;YACvB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;gBACvD,IAAI,CAAC,SAAS;oBAAE,SAAS;gBACzB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,IAAI,MAAM,KAAK,SAAS,CAAC,EAAE;wBAAE,SAAS;oBACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;wBAAE,SAAS;oBACrE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;wBAAE,SAAS;oBAClD,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACvE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAE/D,OAAO;QACL,KAAK;QACL,KAAK,EAAE;YACL,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE;YACtB,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;YACnB,eAAe,EAAE,UAAU;YAC3B,SAAS,EAAE,UAAU,CAAC,IAAI;YAC1B,WAAW,EAAE,UAAU,CAAC,MAAM;SAC/B;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAClB,MAAc,EACd,IAAY,EACZ,IAAY,EACZ,WAAwC,EACxC,aAA0C,EAC1C,YAAmC,EACnC,OAAsD;IAEtD,uCAAuC;IACvC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,QAAQ;YAAE,SAAS;QACxB,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC5E,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC,EAAE,CAAC;IACrC,CAAC;IACD,uBAAuB;IACvB,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IACpE,IAAI,QAAQ,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IACrD,sCAAsC;IACtC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM;QAAE,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CACxB,QAAgB,EAChB,IAAY,EACZ,UAA+B;IAE/B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvE,IAAI,QAAQ;QAAE,OAAO,mBAAmB,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACrE,OAAO,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,eAAe,CACtB,QAAgB,EAChB,IAAY,EACZ,UAA+B;IAE/B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG;QACjB,IAAI;QACJ,GAAG,IAAI,KAAK,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,KAAK,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM,EAAE,GAAG,IAAI,MAAM;QACtF,GAAG,IAAI,WAAW,EAAE,GAAG,IAAI,YAAY,EAAE,GAAG,IAAI,WAAW;KAC5D,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU;QAAE,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAC1B,QAAgB,EAChB,IAAY,EACZ,UAA+B;IAE/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,WAAW,GAAG,OAAO,CAAC;IAC1B,IAAI,SAAS,GAAG,IAAI,CAAC;IAErB,iCAAiC;IACjC,OAAO,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC9C,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,+BAA+B;IAC/B,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM;QAChC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,cAAc,CAAC,CAAC;QACvE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAEtC,MAAM,UAAU,GAAG;QACjB,GAAG,IAAI,KAAK;QACZ,GAAG,IAAI,MAAM;QACb,GAAG,IAAI,cAAc;QACrB,IAAI;KACL,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU;QAAE,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ParseResult } from '../parsers/parser.js';
|
|
2
|
+
export interface CacheEntry {
|
|
3
|
+
version: string;
|
|
4
|
+
path: string;
|
|
5
|
+
mtimeMs: number;
|
|
6
|
+
size: number;
|
|
7
|
+
result: ParseResult;
|
|
8
|
+
}
|
|
9
|
+
export interface CacheStats {
|
|
10
|
+
hits: number;
|
|
11
|
+
misses: number;
|
|
12
|
+
}
|
|
13
|
+
export declare class ParseCache {
|
|
14
|
+
private readonly dir;
|
|
15
|
+
private stats;
|
|
16
|
+
constructor(cacheRoot: string);
|
|
17
|
+
getStats(): CacheStats;
|
|
18
|
+
/**
|
|
19
|
+
* Look up a cached parse result. Returns undefined on cache miss, OR if
|
|
20
|
+
* the cached entry's mtime/size do not match the current file on disk, OR
|
|
21
|
+
* if the schema version has drifted.
|
|
22
|
+
*/
|
|
23
|
+
get(relPath: string, mtimeMs: number, size: number): ParseResult | undefined;
|
|
24
|
+
put(relPath: string, mtimeMs: number, size: number, result: ParseResult): void;
|
|
25
|
+
private entryPath;
|
|
26
|
+
}
|
|
27
|
+
export declare function fileFingerprint(absPath: string): {
|
|
28
|
+
mtimeMs: number;
|
|
29
|
+
size: number;
|
|
30
|
+
} | null;
|
|
31
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/index/cache.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,KAAK,CAAsC;gBAEvC,SAAS,EAAE,MAAM;IAK7B,QAAQ,IAAI,UAAU;IAItB;;;;OAIG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IA0B5E,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAW9E,OAAO,CAAC,SAAS;CAQlB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOzF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, statSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
const CACHE_SCHEMA_VERSION = 'v1';
|
|
5
|
+
export class ParseCache {
|
|
6
|
+
dir;
|
|
7
|
+
stats = { hits: 0, misses: 0 };
|
|
8
|
+
constructor(cacheRoot) {
|
|
9
|
+
this.dir = path.join(cacheRoot, CACHE_SCHEMA_VERSION);
|
|
10
|
+
mkdirSync(this.dir, { recursive: true });
|
|
11
|
+
}
|
|
12
|
+
getStats() {
|
|
13
|
+
return { ...this.stats };
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Look up a cached parse result. Returns undefined on cache miss, OR if
|
|
17
|
+
* the cached entry's mtime/size do not match the current file on disk, OR
|
|
18
|
+
* if the schema version has drifted.
|
|
19
|
+
*/
|
|
20
|
+
get(relPath, mtimeMs, size) {
|
|
21
|
+
const file = this.entryPath(relPath);
|
|
22
|
+
if (!existsSync(file)) {
|
|
23
|
+
this.stats.misses += 1;
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
let raw;
|
|
27
|
+
try {
|
|
28
|
+
raw = JSON.parse(readFileSync(file, 'utf8'));
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
this.stats.misses += 1;
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
if (raw.version !== CACHE_SCHEMA_VERSION ||
|
|
35
|
+
raw.path !== relPath ||
|
|
36
|
+
raw.mtimeMs !== mtimeMs ||
|
|
37
|
+
raw.size !== size) {
|
|
38
|
+
this.stats.misses += 1;
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
this.stats.hits += 1;
|
|
42
|
+
return raw.result;
|
|
43
|
+
}
|
|
44
|
+
put(relPath, mtimeMs, size, result) {
|
|
45
|
+
const entry = {
|
|
46
|
+
version: CACHE_SCHEMA_VERSION,
|
|
47
|
+
path: relPath,
|
|
48
|
+
mtimeMs,
|
|
49
|
+
size,
|
|
50
|
+
result,
|
|
51
|
+
};
|
|
52
|
+
writeFileSync(this.entryPath(relPath), JSON.stringify(entry));
|
|
53
|
+
}
|
|
54
|
+
entryPath(relPath) {
|
|
55
|
+
// Stable, filesystem-safe filename from the source path. We hash so deeply
|
|
56
|
+
// nested paths don't blow the OS filename limit, and we prefix with a short
|
|
57
|
+
// human-readable hint so cache dirs are debuggable.
|
|
58
|
+
const hash = createHash('sha1').update(relPath).digest('hex').slice(0, 16);
|
|
59
|
+
const hint = relPath.replace(/[^a-zA-Z0-9_.-]+/g, '_').slice(0, 40);
|
|
60
|
+
return path.join(this.dir, `${hint}-${hash}.json`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export function fileFingerprint(absPath) {
|
|
64
|
+
try {
|
|
65
|
+
const s = statSync(absPath);
|
|
66
|
+
return { mtimeMs: s.mtimeMs, size: s.size };
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/index/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACvF,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAelC,MAAM,OAAO,UAAU;IACJ,GAAG,CAAS;IACrB,KAAK,GAAe,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAEnD,YAAY,SAAiB;QAC3B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;QACtD,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,GAAG,CAAC,OAAe,EAAE,OAAe,EAAE,IAAY;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,GAAe,CAAC;QACpB,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAe,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IACE,GAAG,CAAC,OAAO,KAAK,oBAAoB;YACpC,GAAG,CAAC,IAAI,KAAK,OAAO;YACpB,GAAG,CAAC,OAAO,KAAK,OAAO;YACvB,GAAG,CAAC,IAAI,KAAK,IAAI,EACjB,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;YACvB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;QACrB,OAAO,GAAG,CAAC,MAAM,CAAC;IACpB,CAAC;IAED,GAAG,CAAC,OAAe,EAAE,OAAe,EAAE,IAAY,EAAE,MAAmB;QACrE,MAAM,KAAK,GAAe;YACxB,OAAO,EAAE,oBAAoB;YAC7B,IAAI,EAAE,OAAO;YACb,OAAO;YACP,IAAI;YACJ,MAAM;SACP,CAAC;QACF,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,CAAC;IAEO,SAAS,CAAC,OAAe;QAC/B,4EAA4E;QAC5E,4EAA4E;QAC5E,oDAAoD;QACpD,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC;IACrD,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/select/pack.d.ts
CHANGED
|
@@ -21,6 +21,15 @@ export interface PackOptions {
|
|
|
21
21
|
* Honored only when `embedder` is provided. Default 0.5.
|
|
22
22
|
*/
|
|
23
23
|
embedWeight?: number;
|
|
24
|
+
/** Enable persistent on-disk parse cache. Default false. */
|
|
25
|
+
cache?: boolean;
|
|
26
|
+
/** Override cache directory. */
|
|
27
|
+
cacheDir?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Multiplicative boost for selecting nodes that share a Louvain community
|
|
30
|
+
* with any seed. Default 0.5. Set to 0 to disable the boost entirely.
|
|
31
|
+
*/
|
|
32
|
+
communityBoost?: number;
|
|
24
33
|
}
|
|
25
34
|
export interface FileRange {
|
|
26
35
|
start: number;
|
|
@@ -32,6 +41,8 @@ export interface PackedFile {
|
|
|
32
41
|
score: number;
|
|
33
42
|
tokens: number;
|
|
34
43
|
reasons: string[];
|
|
44
|
+
/** Louvain community labels touched by nodes selected from this file. */
|
|
45
|
+
communities?: number[];
|
|
35
46
|
}
|
|
36
47
|
export interface PackResult {
|
|
37
48
|
files: PackedFile[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/select/pack.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/select/pack.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAsHpE"}
|
package/dist/select/pack.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { greedySelect, personalizedPageRank } from '../core/index.js';
|
|
1
|
+
import { detectCommunities, greedySelect, personalizedPageRank } from '../core/index.js';
|
|
2
2
|
import { indexRepo } from '../index/builder.js';
|
|
3
3
|
import { scoreSeeds } from '../seeds/keyword.js';
|
|
4
4
|
import { scoreSeedsHybrid } from '../seeds/embedding.js';
|
|
5
5
|
export async function pack(options) {
|
|
6
|
-
const { task, repo, budget, seeds = 8, alpha = 0.85, include, exclude, embedder, embedWeight = 0.5, } = options;
|
|
6
|
+
const { task, repo, budget, seeds = 8, alpha = 0.85, include, exclude, embedder, embedWeight = 0.5, cache, cacheDir, communityBoost = 0.5, } = options;
|
|
7
7
|
if (budget <= 0)
|
|
8
8
|
throw new Error('budget must be positive');
|
|
9
9
|
const walkOpts = { include, exclude };
|
|
10
|
-
const { graph, stats } = indexRepo(repo, walkOpts);
|
|
10
|
+
const { graph, stats } = indexRepo(repo, { ...walkOpts, cache, cacheDir });
|
|
11
11
|
if (graph.order() === 0) {
|
|
12
12
|
return emptyResult('No supported source files found.', stats.symbols);
|
|
13
13
|
}
|
|
@@ -35,10 +35,15 @@ export async function pack(options) {
|
|
|
35
35
|
return emptyResult(`All matching symbols exceed the budget of ${budget} tokens. Try increasing --budget.`, stats.symbols);
|
|
36
36
|
}
|
|
37
37
|
const ranks = personalizedPageRank(graph, { seeds: fittedSeeds, alpha });
|
|
38
|
+
// Detect Louvain communities once and pass to greedySelect. Deterministic
|
|
39
|
+
// RNG so results are reproducible across runs (matters for caching tests).
|
|
40
|
+
const communities = communityBoost > 0 ? detectCommunities(graph, { seed: 1 }) : undefined;
|
|
38
41
|
const selection = greedySelect(graph, {
|
|
39
42
|
seeds: new Set(fittedSeeds.keys()),
|
|
40
43
|
ranks,
|
|
41
44
|
budget,
|
|
45
|
+
communities,
|
|
46
|
+
communityBoost,
|
|
42
47
|
});
|
|
43
48
|
const byFile = new Map();
|
|
44
49
|
for (const entry of selection.entries) {
|
|
@@ -46,13 +51,21 @@ export async function pack(options) {
|
|
|
46
51
|
if (!data)
|
|
47
52
|
continue;
|
|
48
53
|
const file = data.file;
|
|
49
|
-
const acc = byFile.get(file) ?? {
|
|
54
|
+
const acc = byFile.get(file) ?? {
|
|
55
|
+
ranges: [],
|
|
56
|
+
score: 0,
|
|
57
|
+
tokens: 0,
|
|
58
|
+
reasons: [],
|
|
59
|
+
communities: new Set(),
|
|
60
|
+
};
|
|
50
61
|
if (data.startLine && data.endLine) {
|
|
51
62
|
acc.ranges.push({ start: data.startLine, end: data.endLine });
|
|
52
63
|
}
|
|
53
64
|
acc.score += entry.rank;
|
|
54
65
|
acc.tokens += entry.tokens;
|
|
55
66
|
acc.reasons.push(entry.reason);
|
|
67
|
+
if (entry.community !== undefined)
|
|
68
|
+
acc.communities.add(entry.community);
|
|
56
69
|
byFile.set(file, acc);
|
|
57
70
|
}
|
|
58
71
|
const files = [];
|
|
@@ -63,6 +76,7 @@ export async function pack(options) {
|
|
|
63
76
|
score: acc.score,
|
|
64
77
|
tokens: acc.tokens,
|
|
65
78
|
reasons: dedupe(acc.reasons),
|
|
79
|
+
communities: acc.communities.size > 0 ? [...acc.communities].sort((a, b) => a - b) : undefined,
|
|
66
80
|
});
|
|
67
81
|
}
|
|
68
82
|
files.sort((a, b) => b.score - a.score);
|
|
@@ -128,6 +142,17 @@ function buildExplain(task, seeds, selection, files, budget, fileCount) {
|
|
|
128
142
|
for (const [id, score] of [...seeds].slice(0, 5)) {
|
|
129
143
|
lines.push(` · ${id} (seed-score ${score.toFixed(3)})`);
|
|
130
144
|
}
|
|
145
|
+
// Show distinct community labels touched by the selection (if any).
|
|
146
|
+
const communitySet = new Set();
|
|
147
|
+
for (const f of files) {
|
|
148
|
+
for (const c of f.communities ?? [])
|
|
149
|
+
communitySet.add(c);
|
|
150
|
+
}
|
|
151
|
+
if (communitySet.size > 0) {
|
|
152
|
+
lines.push(`touched ${communitySet.size} community${communitySet.size === 1 ? '' : 'ies'}: ${[...communitySet]
|
|
153
|
+
.sort((a, b) => a - b)
|
|
154
|
+
.join(', ')}`);
|
|
155
|
+
}
|
|
131
156
|
lines.push(`selected ${selection.selected.size} symbols across ${files.length} files` +
|
|
132
157
|
` (${selection.tokens} / ${budget} tokens, cut cost ${selection.cutCost.toFixed(1)})`);
|
|
133
158
|
return lines.join('\n');
|
package/dist/select/pack.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/select/pack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/select/pack.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mincut-context",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Token-minimal context selection for AI coding agents. Builds a symbol graph of your repo and uses personalized PageRank + budget-constrained min-cut to pick the smallest provably-relevant context for any task.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/adapters/lib/index.js",
|