mincut-context 1.2.0 → 1.4.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.
Files changed (76) hide show
  1. package/README.md +107 -41
  2. package/dist/adapters/cli/bin.js +68 -5
  3. package/dist/adapters/cli/bin.js.map +1 -1
  4. package/dist/adapters/cli/render.d.ts +2 -0
  5. package/dist/adapters/cli/render.d.ts.map +1 -1
  6. package/dist/adapters/cli/render.js +95 -0
  7. package/dist/adapters/cli/render.js.map +1 -1
  8. package/dist/adapters/cli/tui.d.ts +3 -1
  9. package/dist/adapters/cli/tui.d.ts.map +1 -1
  10. package/dist/adapters/cli/tui.js +118 -17
  11. package/dist/adapters/cli/tui.js.map +1 -1
  12. package/dist/adapters/cli/watch.d.ts +32 -0
  13. package/dist/adapters/cli/watch.d.ts.map +1 -0
  14. package/dist/adapters/cli/watch.js +84 -0
  15. package/dist/adapters/cli/watch.js.map +1 -0
  16. package/dist/adapters/mcp/handler.d.ts +20 -0
  17. package/dist/adapters/mcp/handler.d.ts.map +1 -1
  18. package/dist/adapters/mcp/handler.js +30 -3
  19. package/dist/adapters/mcp/handler.js.map +1 -1
  20. package/dist/adapters/mcp/index.js +1 -1
  21. package/dist/index/builder.d.ts +29 -0
  22. package/dist/index/builder.d.ts.map +1 -1
  23. package/dist/index/builder.js +184 -8
  24. package/dist/index/builder.js.map +1 -1
  25. package/dist/index/parse-worker.d.ts +2 -0
  26. package/dist/index/parse-worker.d.ts.map +1 -0
  27. package/dist/index/parse-worker.js +36 -0
  28. package/dist/index/parse-worker.js.map +1 -0
  29. package/dist/index/worker-pool.d.ts +22 -0
  30. package/dist/index/worker-pool.d.ts.map +1 -0
  31. package/dist/index/worker-pool.js +82 -0
  32. package/dist/index/worker-pool.js.map +1 -0
  33. package/dist/lsp/resolver.d.ts +24 -0
  34. package/dist/lsp/resolver.d.ts.map +1 -0
  35. package/dist/lsp/resolver.js +78 -0
  36. package/dist/lsp/resolver.js.map +1 -0
  37. package/dist/lsp/stdio-client.d.ts +31 -0
  38. package/dist/lsp/stdio-client.d.ts.map +1 -0
  39. package/dist/lsp/stdio-client.js +140 -0
  40. package/dist/lsp/stdio-client.js.map +1 -0
  41. package/dist/lsp/types.d.ts +35 -0
  42. package/dist/lsp/types.d.ts.map +1 -0
  43. package/dist/lsp/types.js +7 -0
  44. package/dist/lsp/types.js.map +1 -0
  45. package/dist/lsp/typescript.d.ts +16 -0
  46. package/dist/lsp/typescript.d.ts.map +1 -0
  47. package/dist/lsp/typescript.js +29 -0
  48. package/dist/lsp/typescript.js.map +1 -0
  49. package/dist/parsers/chunking.d.ts +34 -0
  50. package/dist/parsers/chunking.d.ts.map +1 -0
  51. package/dist/parsers/chunking.js +74 -0
  52. package/dist/parsers/chunking.js.map +1 -0
  53. package/dist/parsers/parser.d.ts +14 -0
  54. package/dist/parsers/parser.d.ts.map +1 -1
  55. package/dist/parsers/parser.js.map +1 -1
  56. package/dist/parsers/php.d.ts +2 -2
  57. package/dist/parsers/php.d.ts.map +1 -1
  58. package/dist/parsers/php.js +35 -3
  59. package/dist/parsers/php.js.map +1 -1
  60. package/dist/parsers/py.d.ts +2 -2
  61. package/dist/parsers/py.d.ts.map +1 -1
  62. package/dist/parsers/py.js +21 -4
  63. package/dist/parsers/py.js.map +1 -1
  64. package/dist/parsers/ts.d.ts +2 -2
  65. package/dist/parsers/ts.d.ts.map +1 -1
  66. package/dist/parsers/ts.js +48 -2
  67. package/dist/parsers/ts.js.map +1 -1
  68. package/dist/parsers/vue.d.ts +2 -2
  69. package/dist/parsers/vue.d.ts.map +1 -1
  70. package/dist/parsers/vue.js +2 -2
  71. package/dist/parsers/vue.js.map +1 -1
  72. package/dist/select/pack.d.ts +52 -0
  73. package/dist/select/pack.d.ts.map +1 -1
  74. package/dist/select/pack.js +78 -3
  75. package/dist/select/pack.js.map +1 -1
  76. package/package.json +2 -1
package/README.md CHANGED
@@ -12,7 +12,7 @@ A symbol graph of your repo + personalized PageRank + budget-constrained min-cut
12
12
  [![bundle size](https://img.shields.io/bundlephobia/minzip/mincut-context?label=size)](https://bundlephobia.com/package/mincut-context)
13
13
  [![types](https://img.shields.io/badge/types-TypeScript-3178c6?logo=typescript&logoColor=white)](./src)
14
14
  [![node](https://img.shields.io/badge/node-%E2%89%A518.17-43853d?logo=nodedotjs&logoColor=white)](./package.json)
15
- [![tests](https://img.shields.io/badge/tests-116%20passing-brightgreen)](./tests)
15
+ [![tests](https://img.shields.io/badge/tests-217%20passing-brightgreen)](./tests)
16
16
  [![license](https://img.shields.io/badge/license-MIT-green)](./LICENSE)
17
17
 
18
18
  </div>
@@ -94,18 +94,28 @@ npx mincut-context pack "your task" --budget 4000
94
94
 
95
95
  Requires **Node ≥ 18.17**. TypeScript types ship with the package.
96
96
 
97
+ Optional peer dependencies:
98
+
99
+ | When you want | Install |
100
+ |---|---|
101
+ | `--lsp` type-aware call resolution | `npm i -g typescript-language-server` |
102
+ | `--embed` semantic seeding | (auto — `@xenova/transformers` ships in the package) |
103
+
97
104
  ## Quick start
98
105
 
99
106
  ```bash
100
107
  # 1. Index any repo once (warms the cache)
101
- mcx index .
108
+ mcx index . --cache
102
109
 
103
110
  # 2. Ask for context for a task
104
- mcx pack "fix the login validation bug" --budget 4000
111
+ mcx pack "fix the login validation bug" --budget 4000 --cache
105
112
 
106
113
  # 3. Pipe straight into your agent
107
114
  mcx pack "..." --format markdown > context.md
108
115
  mcx pack "..." --format json | jq '.files[].path'
116
+
117
+ # 4. Stay-running mode during dev
118
+ mcx watch "fix the login bug" --budget 4000 --cache
109
119
  ```
110
120
 
111
121
  ---
@@ -131,7 +141,7 @@ Your agent now has three tools:
131
141
 
132
142
  | Tool | Description |
133
143
  |---|---|
134
- | `pack_context(task, repo, budget?)` | Get a token-minimal, structurally-relevant context window |
144
+ | `pack_context(task, repo, budget?, cache?, cacheDir?, communityBoost?)` | Get a token-minimal, structurally-relevant context window |
135
145
  | `expand_node(node, depth?)` | Pull more around a specific symbol |
136
146
  | `explain_selection()` | The rationale for the last selection |
137
147
 
@@ -139,11 +149,18 @@ Your agent now has three tools:
139
149
 
140
150
  ```bash
141
151
  mcx pack "your task description" --budget 4000 # plain output
152
+ mcx pack "..." --format tree # directory-grouped tree
142
153
  mcx pack "..." --format json | jq # pipe-friendly
143
154
  mcx pack "..." --format markdown > context.md # ready-to-paste
144
- mcx pack "..." --interactive # Ink TUI to pin / exclude
155
+ mcx pack "..." --interactive # Ink TUI (vim keys + preview)
145
156
  mcx pack "..." --embed # semantic seeding
146
- mcx index . # warm the parse
157
+ mcx pack "..." --cache # persistent parse cache (5× speedup)
158
+ mcx pack "..." --parallel 4 # worker-thread parser pool
159
+ mcx pack "..." --chunk # split huge functions into sub-symbols
160
+ mcx pack "..." --lsp # type-aware call resolution (TS)
161
+ mcx pack "..." --verbose # algorithm trace
162
+ mcx watch "..." --debounce 300 # re-pack on file change
163
+ mcx index . --cache # warm the parse cache
147
164
  mcx mcp # run as MCP server
148
165
  ```
149
166
 
@@ -156,6 +173,10 @@ const result = await pack({
156
173
  task: 'fix the login validation bug',
157
174
  repo: process.cwd(),
158
175
  budget: 4000,
176
+ cache: true, // persistent parse cache
177
+ communityBoost: 0.5, // Louvain intra-cluster bias
178
+ parallel: 4, // worker-thread parsing
179
+ chunk: { enabled: true, maxTokens: 400 }, // sub-symbol chunking
159
180
  });
160
181
 
161
182
  for (const f of result.files) {
@@ -165,7 +186,7 @@ for (const f of result.files) {
165
186
  // → src/auth/session.ts 0.408 483 · attached (60%)
166
187
  ```
167
188
 
168
- Full TypeScript types — `pack`, `indexRepo`, `SymbolGraph`, `personalizedPageRank`, `greedySelect` are all exported.
189
+ Full TypeScript types — `pack`, `indexRepo`, `indexRepoAsync`, `SymbolGraph`, `personalizedPageRank`, `greedySelect`, `detectCommunities` are all exported.
169
190
 
170
191
  ---
171
192
 
@@ -173,12 +194,14 @@ Full TypeScript types — `pack`, `indexRepo`, `SymbolGraph`, `personalizedPageR
173
194
 
174
195
  ```mermaid
175
196
  flowchart LR
176
- A[Repo files] -->|tree-sitter| B[Symbol graph<br/>V: functions/classes<br/>E: imports/calls]
197
+ A[Repo files] -->|tree-sitter| B[Symbol graph<br/>V: functions/classes/chunks<br/>E: imports/calls]
177
198
  T[Task string] -->|keyword IDF| S[Seeds S ⊆ V]
178
199
  T -->|optional: --embed| S
179
200
  B --> R[Personalized<br/>PageRank<br/>α=0.85]
180
201
  S --> R
202
+ B --> L[Louvain<br/>communities]
181
203
  R --> C[Greedy<br/>budget min-cut<br/>1−1/e bound]
204
+ L --> C
182
205
  B --> C
183
206
  C --> P[Packed context<br/>files + ranges<br/>+ per-node reason]
184
207
  ```
@@ -188,16 +211,19 @@ The five steps in pseudocode:
188
211
  ```text
189
212
  pack(task, repo, budget):
190
213
  1. graph = index(repo) # tree-sitter → symbol+edge graph
214
+ # optionally chunked into sub-symbols
215
+ # optionally refined by LSP
191
216
  2. seeds = scoreSeeds(task, graph) # keyword IDF (+ embeddings if --embed)
192
217
  3. ranks = personalizedPageRank(graph, seeds, α=0.85)
193
- 4. T = greedyMinCut(graph, ranks, seeds, budget):
218
+ 4. comm = louvainCommunities(graph) # for intra-cluster boost
219
+ 5. T = greedyMinCut(graph, ranks, seeds, budget, comm):
194
220
  T ← seeds
195
221
  while Σ tokens(T) < B:
196
222
  v* ← argmax_{v ∉ T, attach(v,T) > 0}
197
- rank(v) · attach(v,T) / tokens(v)
223
+ rank(v) · attach(v,T) · communityBonus(v) / tokens(v)
198
224
  T ← T ∪ {v*}
199
- 5. ranges = collapseToFileRanges(T)
200
- 6. return { files: ranges, tokens, graph: {...}, explain }
225
+ 6. ranges = collapseToFileRanges(T)
226
+ 7. return { files: ranges, tokens, graph: {...}, explain, trace? }
201
227
  ```
202
228
 
203
229
  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.
@@ -219,6 +245,17 @@ $ mcx pack "ranking and centrality algorithm" --repo . --embed --embed-weight 0.
219
245
  "Centrality" never appears in any symbol name — only embeddings could find this.
220
246
  Uses [`@xenova/transformers`](https://github.com/xenova/transformers.js) (Transformers.js + ONNX). Fully local, ~22 MB model download on first use.
221
247
 
248
+ ### LSP-backed call resolution (optional)
249
+
250
+ Syntactic name matching can be ambiguous when two files export functions with the same name. `--lsp` asks `typescript-language-server` for the authoritative answer and adds higher-weight edges where it disagrees:
251
+
252
+ ```bash
253
+ npm i -g typescript-language-server # one-time
254
+ mcx pack "your task" --repo . --lsp
255
+ ```
256
+
257
+ If the LSP fails or the binary is missing, mincut falls back silently to syntactic edges.
258
+
222
259
  ---
223
260
 
224
261
  ## Real-world examples
@@ -235,7 +272,19 @@ $ mcx pack "analytics visit tracking" --budget 3000 --exclude tests/**
235
272
  selected 20 / 845 symbols (2.4% of codebase)
236
273
  ```
237
274
 
238
- That's exactly the analytics slice — no UI noise, no test fixtures, no unrelated modules. An agent given this context can reason about analytics changes without the rest of the repo.
275
+ **On the [Fluent Forms](https://fluentforms.com) plugin** (809 files of mixed PHP + Vue + JS, 4,333 symbols, 3,776 edges):
276
+
277
+ ```bash
278
+ $ mcx pack "payment stripe processor" --budget 3000 --cache --community-boost 0.8
279
+ → app/Modules/Payments/PaymentMethods/Stripe/StripeProcessor.php 1955 tok ← seed
280
+ → app/Modules/Payments/PaymentMethods/Stripe/StripeHandler.php 246 tok
281
+ → app/Modules/Payments/AjaxEndpoints.php 152 tok
282
+ → app/Modules/Payments/PaymentMethods/Stripe/API/RequestProcessor.php 159 tok
283
+ → app/Modules/Payments/PaymentMethods/Stripe/API/Plan.php 331 tok
284
+ → app/Modules/Payments/PaymentMethods/Stripe/API/ApiRequest.php 26 tok
285
+ ```
286
+
287
+ That's exactly the Stripe cluster — no UI noise, no test fixtures, no unrelated modules.
239
288
 
240
289
  ---
241
290
 
@@ -245,10 +294,14 @@ That's exactly the analytics slice — no UI noise, no test fixtures, no unrelat
245
294
  |---|---|---|
246
295
  | TypeScript / JavaScript | ✅ v1.0 | `.ts .tsx .js .jsx .mjs .cjs` |
247
296
  | Python | ✅ v1.0 | `.py .pyi`, relative imports, decorators, methods |
248
- | **PHP** | ✅ **v1.2** | `.php`, namespaces, traits, `use` (incl. grouped + aliased), `$this->`, `Foo::bar()` |
249
- | **Vue SFC** | ✅ **v1.2** | `.vue`, `<script>` Options API + `<script setup>` Composition API, `lang="ts"` honored |
297
+ | PHP | ✅ v1.2 | `.php`, namespaces, traits, `use` (incl. grouped + aliased), `$this->`, `Foo::bar()` |
298
+ | Vue SFC | ✅ v1.2 | `.vue`, `<script>` Options API + `<script setup>` Composition API, `lang="ts"` honored |
250
299
  | Rust, Go, Svelte, … | community welcome | tree-sitter grammar + symbol queries |
251
300
 
301
+ **Sub-symbol chunking** is supported on all 4 languages above as of v1.4 (was TS/JS/Vue only in v1.3).
302
+
303
+ **LSP-backed call resolution** currently covers TypeScript / JavaScript / Vue via `typescript-language-server`. Adding Python (pyright) or PHP (intelephense) is a small adapter.
304
+
252
305
  Adding a language is one parser file implementing `LanguageParser` + one line in `parseForExt`. See [`src/parsers/py.ts`](./src/parsers/py.ts) as a template.
253
306
 
254
307
  ---
@@ -268,23 +321,28 @@ Options:
268
321
  --alpha <number> PageRank damping (default: 0.85)
269
322
  --include <pattern...> Restrict to glob patterns (e.g. src/auth/**)
270
323
  --exclude <pattern...> Extra ignore patterns appended to .gitignore
271
- -f, --format <fmt> plain | json | markdown
324
+ -f, --format <fmt> plain | tree | json | markdown
272
325
  --no-color Disable colored output
273
326
  --embed Use semantic embeddings (~22 MB model first run)
274
327
  --embed-weight <number> Blend 0..1 (0=keyword, 1=embedding only)
275
328
  --embed-model <id> HF model id (default Xenova/all-MiniLM-L6-v2)
276
- -i, --interactive Ink TUI for pin/exclude before output
329
+ -i, --interactive Ink TUI for pin/exclude with preview pane + vim keys
277
330
  --cache Use persistent parse cache (.mincut-cache/) — fast repeat runs
278
331
  --cache-dir <path> Override cache directory (absolute path)
279
332
  --community-boost <number> Louvain same-community boost (default 0.5, 0 = disabled)
333
+ -v, --verbose Print algorithm trace (seeds, ranks, selection, timings)
334
+ -j, --parallel <n> Use n worker threads to parse in parallel (default 0)
335
+ --chunk Split large functions into sub-symbol chunks (TS/JS/Vue/Py/PHP)
336
+ --chunk-tokens <n> Token threshold for chunking (default 400)
337
+ --lsp Refine call edges via typescript-language-server
280
338
  ```
281
339
 
282
340
  Other commands:
283
341
 
284
342
  ```text
285
- mcx index [path] warm the parse cache (no output beyond stats)
286
- mcx mcp run as an MCP server over stdio
287
- mcx --version print the installed version
343
+ mcx watch '<task>' --repo . --budget 4000 [--debounce 300] [--cache] [--parallel n]
344
+ mcx index [path] [--cache] [--include glob]
345
+ mcx mcp # run as MCP server over stdio
288
346
  ```
289
347
 
290
348
  </details>
@@ -293,13 +351,13 @@ mcx --version print the installed version
293
351
 
294
352
  ## How it compares
295
353
 
296
- | Approach | Token-aware | Structural | Semantic | Explainable |
297
- |---|---|---|---|---|
298
- | **Whole file dump** (`cat`, `Read`) | ❌ | ❌ | ❌ | trivially |
299
- | **Grep / ripgrep** | ❌ | ❌ | ❌ | yes |
300
- | **Cursor/Continue RAG** | partial | ❌ | ✅ | hard |
301
- | **AST/symbol graph alone** | ❌ | ✅ | ❌ | yes |
302
- | **`mincut-context`** | ✅ (budget) | ✅ (graph) | ✅ (`--embed`) | per-node `reason` |
354
+ | Approach | Token-aware | Structural | Semantic | Type-aware | Explainable |
355
+ |---|---|---|---|---|---|
356
+ | **Whole file dump** (`cat`, `Read`) | ❌ | ❌ | ❌ | ❌ | trivially |
357
+ | **Grep / ripgrep** | ❌ | ❌ | ❌ | ❌ | yes |
358
+ | **Cursor/Continue RAG** | partial | ❌ | ✅ | ❌ | hard |
359
+ | **AST/symbol graph alone** | ❌ | ✅ | ❌ | ❌ | yes |
360
+ | **`mincut-context`** | ✅ (budget) | ✅ (graph) | ✅ (`--embed`) | ✅ (`--lsp`) | per-node `reason` |
303
361
 
304
362
  ---
305
363
 
@@ -312,14 +370,20 @@ mcx --version print the installed version
312
370
  - [x] MCP server **(v1.0)**
313
371
  - [x] Local embeddings (`@xenova/transformers`) **(v1.0)**
314
372
  - [x] Ink TUI **(v1.0)**
315
- - [x] Persistent on-disk parse cache (incremental reindex) **(v1.1)** — 5.2× warm-run speedup
373
+ - [x] Persistent on-disk parse cache **(v1.1)** — 5.2× warm-run speedup
316
374
  - [x] Louvain community boost **(v1.1)**
317
- - [x] **PHP parser** **(v1.2)**
318
- - [x] **Vue SFC parser** **(v1.2)**
375
+ - [x] PHP parser **(v1.2)**
376
+ - [x] Vue SFC parser **(v1.2)**
377
+ - [x] Parallel parsing (worker pool) **(v1.3)** — 2.7× cold-index speedup
378
+ - [x] Sub-symbol AST-block chunking (TS/JS/Vue) **(v1.3)**
379
+ - [x] `mcx watch` long-running mode **(v1.3)**
380
+ - [x] TUI v2: preview pane + vim keys + fuzzy filter **(v1.3)**
381
+ - [x] `--verbose` algorithm trace **(v1.3)**
382
+ - [x] `--format tree` directory-grouped output **(v1.3)**
383
+ - [x] Sub-symbol chunking for Python + PHP **(v1.4)**
384
+ - [x] LSP-backed type-aware call resolution **(v1.4)** — typescript-language-server
385
+ - [ ] Pyright / Intelephense LSP adapters
319
386
  - [ ] Svelte / Rust / Go parsers
320
- - [ ] Sub-symbol AST-block chunking
321
- - [ ] Parallel parsing (worker pool)
322
- - [ ] LSP-backed type-aware call resolution
323
387
 
324
388
  ---
325
389
 
@@ -329,10 +393,11 @@ mcx --version print the installed version
329
393
  | What's not optimal | What we do |
330
394
  |---|---|
331
395
  | True optimal min-cut is NP-hard | Greedy submodular — `(1−1/e)` bound |
332
- | Tree-sitter symbols are syntactic, not type-aware | Don't follow generics or dynamic dispatch — good for context, not refactoring |
396
+ | Tree-sitter symbols are syntactic, not type-aware | `--lsp` refines TS/JS via typescript-language-server |
333
397
  | Embedding model adds ~22 MB on first run | Opt-in behind `--embed` flag |
334
- | Cold start parses whole repo | `.mincut-cache/` per-file cache planned for v1.1 |
335
- | Python class-level constants aren't symbols yet | Only `def` and `class` for now |
398
+ | LSP startup is slow (~1-5s) | Opt-in behind `--lsp` flag; cached after init |
399
+ | Cold start parses whole repo | `--cache` (5× speedup) + `--parallel n` (2.7× speedup) |
400
+ | Cross-file call resolution is heuristic | LSP-refined where the binary is available |
336
401
 
337
402
  </details>
338
403
 
@@ -343,8 +408,8 @@ mcx --version print the installed version
343
408
  ```bash
344
409
  git clone https://github.com/dhrupo/mincut-context.git
345
410
  cd mincut-context
346
- npm install
347
- npm test # 116 tests across unit + integration + MCP + CLI + TUI
411
+ npm install --legacy-peer-deps
412
+ npm test # 217 tests across unit + integration + MCP + CLI + TUI + LSP
348
413
  npm run build
349
414
  node dist/adapters/cli/bin.js pack "..." --repo /path/to/some-repo
350
415
  ```
@@ -352,18 +417,19 @@ node dist/adapters/cli/bin.js pack "..." --repo /path/to/some-repo
352
417
  PRs especially welcome for:
353
418
 
354
419
  - **New language parsers** — tree-sitter grammar + symbol queries
355
- - **LSP integration** — type-aware call resolution
356
- - **Cache layer** — persistent `.mincut-cache/`
420
+ - **New LSP adapters** — pyright (Python), intelephense (PHP), gopls (Go), rust-analyzer (Rust)
421
+ - **Sub-symbol chunking for new languages** — straightforward extension since the helper is language-agnostic
357
422
 
358
423
  Each PR must keep the test suite green (`npm test`). New behavior requires tests first (TDD).
359
424
 
360
425
  ## Built with
361
426
 
362
427
  - [`tree-sitter`](https://tree-sitter.github.io/tree-sitter/) — incremental parsing
363
- - [`graphology`](https://graphology.github.io/) — graph primitives
428
+ - [`graphology`](https://graphology.github.io/) + [`graphology-communities-louvain`](https://github.com/graphology/graphology-communities-louvain) — graph primitives + community detection
364
429
  - [`@xenova/transformers`](https://github.com/xenova/transformers.js) — local ONNX embeddings
365
430
  - [`@modelcontextprotocol/sdk`](https://github.com/modelcontextprotocol/typescript-sdk) — MCP server
366
431
  - [`commander`](https://github.com/tj/commander.js) + [`ink`](https://github.com/vadimdemedes/ink) — CLI & TUI
432
+ - [`chokidar`](https://github.com/paulmillr/chokidar) — file watching
367
433
  - [`vitest`](https://vitest.dev/) — testing
368
434
 
369
435
  ## License
@@ -3,8 +3,8 @@ import { Command } from 'commander';
3
3
  import path from 'node:path';
4
4
  import { pack } from '../../select/pack.js';
5
5
  import { indexRepo } from '../../index/builder.js';
6
- import { renderJson, renderMarkdown, renderPlain } from './render.js';
7
- async function runInteractive(result, budget) {
6
+ import { renderJson, renderMarkdown, renderPlain, renderTree, renderVerboseTrace } from './render.js';
7
+ async function runInteractive(result, budget, repo) {
8
8
  const React = (await import('react')).default;
9
9
  const { render } = await import('ink');
10
10
  const { ReviewApp } = await import('./tui.js');
@@ -12,6 +12,7 @@ async function runInteractive(result, budget) {
12
12
  const app = render(React.createElement(ReviewApp, {
13
13
  initial: result,
14
14
  budget,
15
+ repo,
15
16
  onSubmit: (paths) => {
16
17
  const keep = new Set(paths);
17
18
  resolve({
@@ -30,7 +31,7 @@ const program = new Command();
30
31
  program
31
32
  .name('mcx')
32
33
  .description('mincut-context — token-minimal context selection for AI coding agents')
33
- .version('1.2.0');
34
+ .version('1.4.0');
34
35
  program
35
36
  .command('pack <task...>')
36
37
  .description('Pack a token-minimal context window for the given task')
@@ -40,7 +41,7 @@ program
40
41
  .option('--alpha <number>', 'PageRank damping factor', (v) => Number(v), 0.85)
41
42
  .option('--include <pattern...>', 'Restrict to glob patterns (e.g. src/auth/**)')
42
43
  .option('--exclude <pattern...>', 'Extra ignore patterns appended to .gitignore')
43
- .option('-f, --format <fmt>', 'Output format: plain | json | markdown', 'plain')
44
+ .option('-f, --format <fmt>', 'Output format: plain | tree | json | markdown', 'plain')
44
45
  .option('--no-color', 'Disable colored output')
45
46
  .option('--embed', 'Use semantic embeddings (downloads ~22 MB model on first run)', false)
46
47
  .option('--embed-weight <number>', 'Blend factor 0..1 (0=keyword, 1=embedding only)', (v) => Number(v), 0.5)
@@ -49,6 +50,11 @@ program
49
50
  .option('--cache', 'Use persistent parse cache at .mincut-cache/ (fast repeat runs)', false)
50
51
  .option('--cache-dir <path>', 'Override cache directory (absolute path)')
51
52
  .option('--community-boost <number>', 'Louvain same-community boost factor (0 = disabled)', (v) => Number(v), 0.5)
53
+ .option('-v, --verbose', 'Print algorithm trace (seeds, ranks, selection order, timings)', false)
54
+ .option('-j, --parallel <n>', 'Use n parallel parser workers (0 = sequential, default 0)', (v) => Number(v), 0)
55
+ .option('--chunk', 'Split large functions into sub-symbol chunks (TS/JS/Vue)', false)
56
+ .option('--chunk-tokens <n>', 'Token threshold for chunking', (v) => Number(v), 400)
57
+ .option('--lsp', 'Refine call edges via typescript-language-server (requires the binary on PATH)', false)
52
58
  .action(async (taskWords, opts) => {
53
59
  const task = taskWords.join(' ').trim();
54
60
  if (!task) {
@@ -74,22 +80,39 @@ program
74
80
  cache: opts.cache,
75
81
  cacheDir: opts.cacheDir,
76
82
  communityBoost: opts.communityBoost,
83
+ verbose: opts.verbose,
84
+ parallel: opts.parallel,
85
+ chunk: opts.chunk ? { enabled: true, maxTokens: opts.chunkTokens } : undefined,
86
+ lspClient: opts.lsp
87
+ ? (await import('../../lsp/typescript.js')).createTypeScriptLsp()
88
+ : undefined,
77
89
  });
78
90
  const color = Boolean(opts.color) && process.stdout.isTTY;
79
91
  const fmt = (opts.format ?? 'plain').toLowerCase();
80
92
  let finalResult = result;
81
93
  if (opts.interactive && process.stdout.isTTY) {
82
- finalResult = await runInteractive(result, opts.budget);
94
+ finalResult = await runInteractive(result, opts.budget, path.resolve(opts.repo));
83
95
  }
84
96
  if (fmt === 'json') {
85
97
  process.stdout.write(renderJson(finalResult));
86
98
  process.stdout.write('\n');
87
99
  }
100
+ else if (fmt === 'tree') {
101
+ process.stdout.write(renderTree(finalResult, { color, budget: opts.budget }));
102
+ if (opts.verbose && finalResult.trace) {
103
+ process.stdout.write('\n');
104
+ process.stdout.write(renderVerboseTrace(finalResult, { color, budget: opts.budget }));
105
+ }
106
+ }
88
107
  else if (fmt === 'markdown' || fmt === 'md') {
89
108
  process.stdout.write(renderMarkdown(finalResult, { color, budget: opts.budget, task }));
90
109
  }
91
110
  else {
92
111
  process.stdout.write(renderPlain(finalResult, { color, budget: opts.budget }));
112
+ if (opts.verbose && finalResult.trace) {
113
+ process.stdout.write('\n');
114
+ process.stdout.write(renderVerboseTrace(finalResult, { color, budget: opts.budget }));
115
+ }
93
116
  }
94
117
  }
95
118
  catch (err) {
@@ -118,6 +141,46 @@ program
118
141
  process.stdout.write(`indexed ${stats.files} files · ${stats.symbols} symbols · ${stats.edges} edges ` +
119
142
  `(${stats.unresolvedCalls} unresolved calls)${cacheNote} in ${elapsed} ms\n`);
120
143
  });
144
+ program
145
+ .command('watch <task...>')
146
+ .description('Long-running mode: re-pack the context whenever any source file changes')
147
+ .option('-r, --repo <path>', 'Repository root', process.cwd())
148
+ .option('-b, --budget <tokens>', 'Token budget', (v) => Number(v), 4000)
149
+ .option('-k, --seeds <count>', 'Top-k seeds', (v) => Number(v), 8)
150
+ .option('--include <pattern...>', 'Restrict to glob patterns')
151
+ .option('--exclude <pattern...>', 'Extra ignore patterns')
152
+ .option('--debounce <ms>', 'Debounce window in ms before re-packing', (v) => Number(v), 300)
153
+ .option('--cache', 'Use persistent parse cache', false)
154
+ .option('--community-boost <number>', 'Louvain community boost', (v) => Number(v), 0.5)
155
+ .option('-j, --parallel <n>', 'Parallel parser workers', (v) => Number(v), 0)
156
+ .option('--no-color', 'Disable colored output')
157
+ .action(async (taskWords, opts) => {
158
+ const task = taskWords.join(' ').trim();
159
+ if (!task) {
160
+ process.stderr.write('error: task is required\n');
161
+ process.exit(1);
162
+ }
163
+ const { runWatchCli } = await import('./watch.js');
164
+ const w = runWatchCli({
165
+ task,
166
+ repo: path.resolve(opts.repo),
167
+ budget: opts.budget,
168
+ seeds: opts.seeds,
169
+ include: opts.include,
170
+ exclude: opts.exclude,
171
+ debounceMs: opts.debounce,
172
+ cache: opts.cache,
173
+ communityBoost: opts.communityBoost,
174
+ parallel: opts.parallel,
175
+ color: Boolean(opts.color),
176
+ });
177
+ const shutdown = async () => {
178
+ await w.stop();
179
+ process.exit(0);
180
+ };
181
+ process.on('SIGINT', () => void shutdown());
182
+ process.on('SIGTERM', () => void shutdown());
183
+ });
121
184
  program
122
185
  .command('mcp')
123
186
  .description('Run as an MCP server over stdio (slice 8 — placeholder)')
@@ -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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"}
@@ -6,5 +6,7 @@ export interface RenderOptions {
6
6
  }
7
7
  export declare function renderPlain(result: PackResult, options: RenderOptions): string;
8
8
  export declare function renderJson(result: PackResult): string;
9
+ export declare function renderVerboseTrace(result: PackResult, options: RenderOptions): string;
10
+ export declare function renderTree(result: PackResult, options: RenderOptions): string;
9
11
  export declare function renderMarkdown(result: PackResult, options: RenderOptions): string;
10
12
  //# sourceMappingURL=render.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAgBvD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CA6B9E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAErD;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAgBjF"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/adapters/cli/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAgBvD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CA6B9E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAErD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAkCrF;AAWD,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CA4C7E;AAyBD,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAgBjF"}
@@ -40,6 +40,101 @@ export function renderPlain(result, options) {
40
40
  export function renderJson(result) {
41
41
  return JSON.stringify(result, null, 2);
42
42
  }
43
+ export function renderVerboseTrace(result, options) {
44
+ if (!result.trace)
45
+ return '';
46
+ const t = result.trace;
47
+ const c = options.color ? COLOR : Object.fromEntries(Object.keys(COLOR).map((k) => [k, '']));
48
+ const lines = [];
49
+ lines.push(`${c.bold}── trace ───────────────────────────────────────${c.reset}`);
50
+ lines.push(`${c.dim}timings:${c.reset} index ${t.timings.indexMs}ms · rank ${t.timings.rankMs}ms ` +
51
+ `· select ${t.timings.selectMs}ms · ${c.bold}total ${t.timings.totalMs}ms${c.reset}`);
52
+ if (t.cache && (t.cache.hits + t.cache.misses) > 0) {
53
+ lines.push(`${c.dim}cache: ${t.cache.hits} hit / ${t.cache.misses} miss${c.reset}`);
54
+ }
55
+ lines.push('');
56
+ lines.push(`${c.bold}seeds (${t.seeds.length}):${c.reset}`);
57
+ for (const s of t.seeds.slice(0, 10)) {
58
+ lines.push(` ${c.cyan}${s.score.toFixed(3).padStart(7)}${c.reset} ${s.id}`);
59
+ }
60
+ lines.push('');
61
+ lines.push(`${c.bold}top-ranked nodes:${c.reset}`);
62
+ for (const r of t.topRanked.slice(0, 10)) {
63
+ lines.push(` ${c.cyan}${r.rank.toFixed(4).padStart(7)}${c.reset} ${r.id}`);
64
+ }
65
+ lines.push('');
66
+ lines.push(`${c.bold}selection order:${c.reset}`);
67
+ for (let i = 0; i < t.selectionOrder.length && i < 20; i++) {
68
+ const e = t.selectionOrder[i];
69
+ const prefix = (i + 1).toString().padStart(2);
70
+ lines.push(` ${c.dim}${prefix}${c.reset} ${c.cyan}${e.rank.toFixed(4).padStart(7)}${c.reset} ` +
71
+ `${c.dim}${(e.tokens + ' tok').padEnd(8)}${c.reset} ${e.id} ${c.dim}${e.reason}${c.reset}`);
72
+ }
73
+ return lines.join('\n') + '\n';
74
+ }
75
+ export function renderTree(result, options) {
76
+ const c = options.color ? COLOR : Object.fromEntries(Object.keys(COLOR).map((k) => [k, '']));
77
+ if (result.files.length === 0) {
78
+ return `${c.yellow}no context selected${c.reset}\n${c.dim}${result.explain}${c.reset}\n`;
79
+ }
80
+ const root = { name: '', children: new Map(), isFile: false, tokens: 0, score: 0 };
81
+ for (const file of result.files) {
82
+ const segments = file.path.split('/').filter(Boolean);
83
+ let node = root;
84
+ for (let i = 0; i < segments.length; i++) {
85
+ const isLast = i === segments.length - 1;
86
+ const seg = segments[i];
87
+ let child = node.children.get(seg);
88
+ if (!child) {
89
+ child = {
90
+ name: seg,
91
+ children: new Map(),
92
+ isFile: isLast,
93
+ tokens: 0,
94
+ score: 0,
95
+ };
96
+ node.children.set(seg, child);
97
+ }
98
+ child.tokens += file.tokens;
99
+ child.score += file.score;
100
+ if (isLast) {
101
+ child.ranges = file.ranges;
102
+ }
103
+ node = child;
104
+ }
105
+ }
106
+ const lines = [];
107
+ walkTree(root, '', lines, c);
108
+ lines.push('');
109
+ const pct = options.budget > 0 ? Math.round((result.tokens / options.budget) * 100) : 0;
110
+ lines.push(`${c.bold}selected${c.reset} ${result.graph.selected} symbols · ` +
111
+ `${c.bold}cut${c.reset} ${result.graph.cutCost.toFixed(1)} · ` +
112
+ `${c.bold}${result.tokens}${c.reset} / ${options.budget} tokens (${pct}%)`);
113
+ return lines.join('\n') + '\n';
114
+ }
115
+ function walkTree(node, indent, lines, c) {
116
+ const childArr = [...node.children.values()].sort((a, b) => {
117
+ if (a.isFile !== b.isFile)
118
+ return a.isFile ? 1 : -1; // directories first
119
+ return b.score - a.score;
120
+ });
121
+ for (let i = 0; i < childArr.length; i++) {
122
+ const child = childArr[i];
123
+ const last = i === childArr.length - 1;
124
+ const branch = last ? '└── ' : '├── ';
125
+ const cont = last ? ' ' : '│ ';
126
+ const ranges = child.ranges?.map((r) => `${r.start}-${r.end}`).join(',');
127
+ const right = child.isFile
128
+ ? ` ${c.cyan}${child.score.toFixed(3)}${c.reset} ${c.dim}${child.tokens} tok${ranges ? ` lines ${ranges}` : ''}${c.reset}`
129
+ : ` ${c.dim}(${child.tokens} tok, ${child.children.size} ${child.children.size === 1 ? 'item' : 'items'})${c.reset}`;
130
+ const labelColor = child.isFile ? c.green : c.bold;
131
+ const slash = child.isFile ? '' : '/';
132
+ lines.push(`${indent}${branch}${labelColor}${child.name}${slash}${c.reset}${right}`);
133
+ if (!child.isFile && child.children.size > 0) {
134
+ walkTree(child, indent + cont, lines, c);
135
+ }
136
+ }
137
+ }
43
138
  export function renderMarkdown(result, options) {
44
139
  const lines = [];
45
140
  lines.push(`# Context for: ${escape(options.task ?? '')}`);
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/adapters/cli/render.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/adapters/cli/render.ts"],"names":[],"mappings":"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"}