knot 1.6.2

Codebase Graph + Vector RAG Indexer for Java, TypeScript, JavaScript, Kotlin, Rust, Python, Groovy, C/C++, Build Systems, and HTML/CSS codebases
Documentation
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
# Multi-Language Roadmap for Knot

This document outlines the planned expansion of `knot` to support Python, C/C++, and Markdown documentation, building on the existing foundation for Java, TypeScript, JavaScript, Kotlin, Rust, HTML, CSS, and SCSS.

---

## Overview

**Current State (v1.4.9):**
- Java (v1.3.6), Kotlin, TypeScript/TSX, JavaScript/Node.js, Rust, Python, Groovy, HTML, CSS, SCSS support
- Markdown (v1.4.9): `MarkdownDocument` (one per `.md`/`.markdown` file) and `MarkdownSection` (one per ATX heading H1–H6) with section bodies embedded for full semantic search over docs
- Typed relationships (CALLS, EXTENDS, IMPLEMENTS, REFERENCES, ValueReference)
- Build Systems: Maven (pom.xml), Gradle (build.gradle), Jenkinsfile, Cargo.toml extraction
- Configuration Files: YAML (.yml/.yaml), JSON (.json), Java Properties (.properties) with leaf-key granularity and package.json special handling
- Kubernetes + Helm: K8s manifest parsing (Deployment, Service, ConfigMap, Secret, Ingress, Namespace) and Helm chart indexing (Chart.yaml, values.yaml, templates)
- Dual-database architecture (Qdrant + Neo4j)
- Three MCP tools (search_hybrid_context, find_callers, explore_file) + list_repo_dependencies
- Cross-Repo Dependency Linking (v1.2.5) with auto-discovered DEPENDS_ON edges and retroactive linking
- Entity Subgraph Traversal (v1.3.2) + Kind-Aware Filtering (v1.3.7) + Connectivity Fix (v1.3.8)
- Standalone CLI Tool (`knot`) with full MCP parity
- Colorized table output, interactive pager, configurable output formats (table/json/markdown)
- Custom CA certificates support for corporate network downloads
- O(N) nested macro traversal optimization for large Rust codebases
- Consolidated `.knot/` directory: fastembed model cache now stored in `.knot/fastembed_cache/` (configurable via `KNOT_FASTEMBED_CACHE_DIR`)
- 565+ unit tests | 100+ E2E tests across all languages
- Fix Indexer Ambiguity & Context Deduplication (v1.3.4)
- Kind-Aware Subgraph Traversal (v1.3.8): `get_entity_subgraph` now maintains connectivity when filtering by kind via synthetic roll-up edges and fixed edge extraction bug.
- Markdown Documentation Indexing (v1.4.9): hierarchical FQNs (`README.md::Setup > Installation > Linux`), body searchability, special-character heading handling.

---

## Phase 8: Python Support (v0.9.x)


### Objective
Enable `knot` to index Python codebases with full semantic understanding of AST, classes, decorators, and module dependencies.

#### Planned → ✅ Implemented
- ✅ tree-sitter-python integration
- ✅ Class, function, method, constant, and module extraction
- ✅ Import resolution and cross-module dependency graph (`TypeReference`, `REFERENCES` edges)
-`ValueReference` tracking for keyword argument patterns (`action=ClassName`)
- ✅ Class inheritance (`EXTENDS` relationships via `argument_list` traversal)
- ✅ Decorator extraction (`@staticmethod`, `@property`, `@dataclass`, `@route(...)`) with `CALLS` relationships
- ✅ Generic type hints (`List[str]`, `Optional[Dict]`), `*args`/`**kwargs` parameter extraction
- ✅ Py2/Py3 exception syntax compatibility testing
- ✅ 5 Phase 6 unit tests, 4 Phase 6 E2E tests (23 total Python E2E tests)

---

## Phase 9: Build Systems & CI/CD Support (v0.10.0)

### Objective
Enable `knot` to index project infrastructure and build configurations. By understanding `build.gradle`, `pom.xml`, and `Jenkinsfile`, the MCP server will be able to answer semantic questions about project dependencies, custom build tasks, and deployment pipeline stages.

#### Planned → ✅ Completed
- ✅ Maven pom.xml extraction via roxmltree (dependencies + plugins)
- ✅ Gradle build.gradle extraction via custom Groovy parser (deps + plugins + tasks)
- ✅ Jenkinsfile pipeline extraction via custom Groovy parser (stages + steps)
- ✅ BuildDependency, BuildPlugin, BuildTask, PipelineStage, PipelineStep entity kinds
- ✅ 22 unit tests (6 XML + 12 Gradle + 4 Jenkins)
- ✅ 8 E2E tests (Maven search, pom.xml explore, Gradle dep/task search, Jenkins stage/step search)
- ✅ Explore_file output formatting for all 5 new entity kinds

---

## Phase 10: Full Groovy Language Support (v0.10.1 — ✅ Completed)

### Objective
Enable `knot` to parse and semantically understand standard Groovy source files beyond build scripts, integrating `tree-sitter-groovy` into the Rust pipeline.

#### Planned → ✅ Completed
- ✅ tree-sitter-groovy v0.1.2 integration
- ✅ 7 new EntityKind variants: GroovyClass, GroovyInterface, GroovyTrait, GroovyMethod, GroovyFunction, GroovyEnum, GroovyProperty
- ✅ groovy.scm tree-sitter queries for class/interface/enum/method/field/constructor extraction
- ✅ Standard .groovy file parser (extract_entities_groovy_standard) sharing JVM reference extraction with Java
- ✅ Hybrid tree-sitter + ad-hoc lexical parser for `def`-keyword, `trait`, and Spock-quoted method names
- ✅ Ad-hoc reference extraction: `extract_method_calls()` populates `reference_intents` from Groovy method bodies via line-span filtering
- ✅ Cross-language references: Java→Groovy and Groovy→Groovy `find_callers` (via Neo4j CALLS edges)
- ✅ Explore_file Markdown sections (Classes/Interfaces/Traits/Enums/Methods/Functions/Properties Groovy)
- ✅ 10 new unit tests + 5 embedding tests + 8 FQN/scope/resilience tests + 8 E2E tests (cross-lang + groovy-only)
- ✅ E2E suites: `run_groovy_e2e.sh` (5/5), `run_cross_lang_ref_e2e.sh` (6/6), `run_groovy_cross_ref_e2e.sh` (4/4)

---

## Phase 11: C/C++ Support (v1.0.0 — ✅ Completed)

### Objective
Enable `knot` to index C and C++ codebases with full support for namespaces, classes, methods, pointers, and macros.

#### Planned → ✅ Completed
- ✅ tree-sitter-c v0.23 and tree-sitter-cpp v0.23 integration
- ✅ 6 new EntityKind variants: CppClass, CStruct, CppMethod, CFunction, CppNamespace, MacroDefinition
- ✅ Namespace-aware FQN resolution (`Engine::MyClass::start`)
- ✅ cpp.scm and c.scm tree-sitter queries for entity extraction
-`build_cpp_fqn()` for dynamic FQN construction via AST parent traversal
-`extract_reference_intents_cpp()` and `extract_call_intents_cpp()` for call graph analysis
- ✅ Call expression handling: direct calls, object/pointer access, scope resolution (`std::vector::size()`)
- ✅ Type reference tracking: declarations, `new` expressions, qualified types
- ✅ Macro usage detection via uppercase identifier heuristic
- ✅ C/C++ reference integration in `orphans.rs` for `collect_all_reference_intents_with_byte_pos`
- ✅ 3 new C++ unit tests (307 lines in cpp.rs)
- ✅ 4 E2E tests in `run_cpp_e2e.sh`: FQN extraction, call graphs, macro usage, type references
- ✅ CI updated with C/C++ and Cross-Language Ref E2E tests
- ✅ Master E2E script (`run_all_e2e.sh`) to run all 10 test suites locally

#### Implementation Files
- `src/pipeline/parser/languages/cpp.rs` — main C++ parser module
- `queries/c.scm` — C tree-sitter queries
- `queries/cpp.scm` — C++ tree-sitter queries
- `tests/run_cpp_e2e.sh` — C++ E2E test suite
- `tests/run_all_e2e.sh` — master E2E runner

---

---

## Phase 12: Build Systems, Config Files & Kubernetes/Helm (v1.2.0 — ✅ Completed)

### 12A — Cargo.toml Parser
- `toml = "0.8"` integration with package metadata, multi-format dependency parsing, features, workspace members
- ✅ 4 new EntityKind variants: CargoPackage, CargoFeature, WorkspaceMember, ProjectIdentity
- ✅ 8 unit tests + 6 E2E tests (extended `run_build_systems_e2e.sh`)

### 12B — Configuration Files (YAML, JSON, .properties)
- `serde_yaml = "0.9"` integration. Recursive walk with depth limit 10, multi-document YAML
- ✅ package.json special handling: deps → BuildDependency, scripts → ConfigProperty, ProjectIdentity
- ✅ .properties: line-by-line parser with `=`/`:`/space delimiters, comments, line continuation
- ✅ ConfigProperty EntityKind. 500KB file size limit + lock file exclusions
- ✅ 18 unit tests (6/6/6) + 6 E2E tests (`run_config_e2e.sh`)

### 12C — Kubernetes + Helm
- ✅ 10 new EntityKind variants (7 K8s + 3 Helm)
- ✅ Multi-resource K8s YAML with label/annotation/spec extraction and cross-resource references
- ✅ Helm: Chart.yaml, values.yaml, template {{ .Values.X }} extraction with `{{-` whitespace trim
-`dispatch_yaml()` cascade: Chart.yaml → Helm directory → K8s (apiVersion+kind) → generic YAML
- ✅ 15 unit tests (7+5+3) + 9 E2E tests (`run_k8s_helm_e2e.sh`)

**Total Phase 12: 6 new parsers, 16 EntityKind variants, 41 unit tests, 29 E2E tests**

---

## Phase 13: Markdown Documentation Indexing (v1.4.9 — ✅ Completed)

### Objective
Enable `knot` to index Markdown (`.md`/`.markdown`) documentation files so that documentation content — not just heading titles — is searchable semantically, with hierarchical FQN resolution that disambiguates same-named sections across files and nesting levels.

### Planned → ✅ Completed
- `tree-sitter-md = "0.5.3"` integration via the unified tree-sitter parser dispatcher (`md`/`markdown` extension)
- ✅ 2 new EntityKind variants: `MarkdownDocument` (one per file) and `MarkdownSection` (one per ATX heading H1–H6)
-`queries/markdown.scm` tree-sitter query with two captures: `@markdown.document.name` (document root) and `@markdown.section` (each section spans its heading + body)
-`src/pipeline/parser/languages/markdown.rs` (524 lines) — `handle_markdown_capture`, `build_markdown_fqn` (ancestor-section chain), `clean_heading_name` (strip inline syntax), `extract_document_intro`, `extract_section_body`
- ✅ Hierarchical, file-scoped FQNs (`README.md::Setup > Installation > Linux`) so same-named headings in different files or under different parents disambiguate cleanly
- ✅ Section bodies — paragraphs, fenced code blocks, lists, and tables — captured into `embed_text` so semantic search returns documentation prose, not only heading text
- ✅ Section boundaries respect heading depth: a section extends until the next same-or-higher-level heading (prevents `### Linux` under `## Installation` from bleeding into a sibling `## Configuration`)
- ✅ Headings with inline markdown (backticks, em-dash, links, emoji, escaped chars) parse without losing their bodies or breaking FQN construction
- ✅ Real `start_line` / `end_line` positions computed via tree-sitter for each section (no heuristic line counting)
- ✅ Wired into the parser dispatcher (`src/pipeline/parser/mod.rs`), capture router (`extractor/captures.rs`), enricher (`extractor/enrich.rs`), and graph utils (`db/graph/utils.rs`)
- ✅ 13+ inline unit tests in `markdown.rs` covering AST shape, FQN construction across nesting depths, section body extraction, and special-character headings
- ✅ E2E suite `tests/run_markdown_e2e.sh` (366 lines): body searchability, cross-file disambiguation, deep nesting, special-character headings, document-level intro capture
- ✅ Wired into `tests/run_all_e2e_fast.sh` (line 58) so Markdown runs in the master suite
-`MarkdownDocument` / `MarkdownSection` handled in `prepare.rs` skip-list and `context.rs` for clean FQN derivation

#### Implementation Files
- `src/pipeline/parser/languages/markdown.rs` — main Markdown parser module (524 lines)
- `src/pipeline/parser/languages/mod.rs` — registers the module (`pub mod markdown;`)
- `src/pipeline/parser/mod.rs``md`/`markdown` extension dispatch with `DEFAULT_MD_QUERY` include
- `src/pipeline/parser/extractor/captures.rs` — routes `markdown.*` capture names
- `src/pipeline/parser/extractor/enrich.rs` — FQN + body text enrichment for Markdown
- `src/pipeline/parser/extractor/tests.rs` — unit tests covering MarkdownDocument / MarkdownSection
- `src/pipeline/parser/test_utils.rs``parse_markdown_snippet` helper
- `src/pipeline/parser/languages/markdown.rs` (tests module) — inline unit tests for FQN, body extraction, AST walking
- `src/pipeline/prepare.rs` — Markdown entity skip handling
- `src/pipeline/parser/context.rs` — file-scoped FQN derivation
- `src/db/graph/utils.rs` — display labels for `MarkdownDocument` / `MarkdownSection`
- `src/models/entity.rs``EntityKind::MarkdownDocument`, `EntityKind::MarkdownSection` enum variants and string mappings
- `queries/markdown.scm` — tree-sitter query file (26 lines, two captures)
- `tests/run_markdown_e2e.sh` — Markdown E2E suite (366 lines)
- `tests/run_all_e2e_fast.sh` — registers the Markdown suite
- `tests/testing_files/markdown/` — fixtures: `README.md`, `GUIDE.md`, `complex.md`, `nested.md`
- `README.md` — documents Markdown language support (line 71)

#### Design Notes
- The `section` node emitted by `tree-sitter-md` already spans from an ATX heading down to the next same-or-higher-level heading, so capturing `section` directly gives both the right `end_line` and the embedded body text without parent-walking or level-tracking in the handler.
- FQNs normalize the same heading text used for the entity `name` field (via `clean_heading_name`) so `## [foo](bar.md)` yields `name = "foo bar.md"` and `fqn = "...::foo bar.md"` consistently — otherwise queries that match by name would miss by FQN.
- `extract_document_intro` returns only the text before the first heading for `MarkdownDocument`, so the document-level embed text captures the file's preamble (frontmatter-style intro) rather than duplicating the first section's body.

#### Limitations (intentional, documented in code)
- Inline link text vs. URL distinction is not preserved in `name` (`## [foo](bar.md)``foo bar.md`).
- Reference-style links (`[text][ref]`) are not specially resolved.
- HTML tags inside headings are not stripped.
- Escaped characters (`\*`, `\_`) are not decoded.

---

## Implementation Priority & Timeline

| Phase | Complexity | Status |
|-------|-----------|--------|
| Phase 1-6: JS/HTML/CSS/Kotlin/CLI | - | ✅ Completed |
| Phase 7: Rust | High | ✅ Completed (v0.8.11) |
| Phase 8: Python | High | ✅ Completed (v0.9.3) |
| Phase 9: Build Systems (Maven/Gradle/Jenkins) | Medium | ✅ Completed (v0.10.0) |
| Phase 10: Groovy Language Support | Medium | ✅ Completed (v0.10.3) |
| Phase 11: C/C++ | High | ✅ Completed (v1.0.0) |
| Phase 12: Performance Optimization | High | ✅ Completed (v1.1.0) |
| Phase 12A-C: Cargo.toml, Config, K8s/Helm | Medium | ✅ Completed (v1.2.0) |
| Phase 13: Markdown Documentation Indexing | Low | ✅ Completed (v1.4.9) |

---

## Backward Compatibility

- All new language phases are backward compatible
- No database migration needed: new entity types added dynamically
- MCP tools and CLI work seamlessly with existing indexed data

---

## Changelog

### v1.4.9 - Markdown Documentation Indexing
- **Feat(parser)**: Added Markdown support (`.md`/`.markdown`) with `MarkdownDocument` (one per file) and `MarkdownSection` (one per ATX heading H1–H6).
-**Feat(parser)**: Section bodies — paragraphs, fenced code blocks, lists, tables — captured into `embed_text` for full semantic search over documentation content, not just heading titles.
-**Feat(parser)**: Hierarchical, file-scoped FQNs (e.g. `README.md::Setup > Installation > Linux`) prevent cross-file and within-file heading collisions.
-**Feat(parser)**: Section boundaries respect heading depth (`section` spans until the next same-or-higher-level heading).
-**Feat(parser)**: Headings with inline markdown (backticks, em-dash, links, emoji) parse without losing their bodies.
-**Test(unit)**: 13+ inline tests in `src/pipeline/parser/languages/markdown.rs` covering AST shape, FQN construction across nesting depths, body extraction, and special-character headings.
-**Test(e2e)**: New `tests/run_markdown_e2e.sh` (366 lines) — body searchability, cross-file disambiguation, deep nesting, special-character headings, document-level intro capture.
-**Test(e2e)**: Wired into `tests/run_all_e2e_fast.sh` so Markdown runs in the master suite.
-**Docs(readme)**: Documented Markdown language support.
-**cargo fmt** clean | **cargo clippy** clean.
- ✅ Credit: @sdi2200246 (PR #17, closes #8).

### v1.3.8 - Subgraph Connectivity & Edge Extraction Fix
- **Fixed Subgraph Disconnection**: Injected `CONTAINS` into traversal relationships to discovery class-to-class paths.
-**UUID List Binding Fix**: Replaced `$uuids` parameter with string literal interpolation to fix missing edges.
-**Constrained Relationship Result**: Constrained direct edges to requested types.
-**565 unit tests** passing | 12/12 E2E suites passing.

### v1.3.7 - Kind-Aware Subgraph Traversal
- **Kind-Aware Traversal**: `get_entity_subgraph` now accepts a `visible_kinds` parameter.
-**Synthetic Edge Roll-up**: Implemented Cypher logic to automatically create synthetic edges between visible nodes connected through hidden intermediaries (e.g., methods/functions).
-**Connectivity Preservation**: Focusing on classes or interfaces no longer results in disconnected subgraphs when they are linked via method calls.
-**Integration Testing**: Added `test_get_entity_subgraph_with_visible_kinds` to verify kind-based filtering.
-**565 unit tests** passing | 12/12 E2E suites passing.

### v1.3.6 - Java Indexing Enhancement (Package & Inheritance)
- **Package-aware FQN Resolution**: Java entities now include the full package prefix (e.g., `com.example.app.UserService`).
-**Inheritance Extraction**: Added support for `EXTENDS` (classes/interfaces) and `IMPLEMENTS` (classes) relationships.
-**Generic Stripping**: Strips generic parameters from base types for cleaner relationship linking (e.g., `Repository<User>``Repository`).
-**Anonymous Class Support**: Tracks method invocations within anonymous inner classes.
-**565 unit tests** passing | 12/12 E2E suites passing.

### v1.3.5 - E2E Test Stabilization & Async Resilience
- **Stabilized Groovy E2E Tests**: Introduced `retry_match` helper to handle Qdrant's eventual consistency without performance-killing `.wait(true)` calls.
-**Fixed C/C++ E2E Test Flakiness**: Fixed non-deterministic relationship resolution in Test 14 by relaxing file path constraints and using FQN matching.
-**Improved Docker Resilience**: Switched to static container names (`knot_neo4j_cpp_e2e`) to prevent naming conflicts and syntax errors in `run_all_e2e.sh`.
-**Deterministic CI**: Added stabilization delays and retry loops for all semantic and graph queries in E2E suites.
-**12/12 E2E test suites pass** consistently in full suite runs.

### v1.3.4 - Fix Indexer Ambiguity & Context Deduplication

**Relationship Resolution Accuracy:**
- **Fix Indexer Ambiguity**: Implemented strict uniqueness guards in relationship resolution. Global fallbacks now only create links if exactly one unambiguous candidate exists.
-**Context Deduplication**: Added sorting and deduplication for UUID mappings in `name_to_uuids`, preventing redundant entries from interfering with uniqueness checks.
-**Improved Resolution Priority**: Reordered fallback logic to prioritize local same-file matches before global filters.
-**Enhanced Test Coverage**: Added comprehensive unit tests in `resolve.rs` for uniqueness guards and deduplication.
- ✅ 12/12 E2E test suites pass (C++, Groovy, and Cross-Language suites fixed).

### v1.3.3 - Fix Custom CA Certs behind Proxy

**TLS & Proxy Support:**
- ✅ Switched `fastembed` feature to `hf-hub-native-tls` to support corporate proxies via OpenSSL/native-tls.
- ✅ Fixed `inject_custom_ca_certs` to only set `SSL_CERT_FILE`, avoiding incorrect `SSL_CERT_DIR` file-path assignments.
- ✅ 548 unit tests passing | cargo fmt + clippy clean
- ✅ 12/12 E2E test suites pass

### v1.3.2 - Entity Subgraph Traversal

**Entity Subgraph Retrieval (`get_entity_subgraph`):**
- ✅ New `get_entity_subgraph` query method in `QueryExt` trait + full `GraphDb` implementation
- ✅ Traverses the entity graph from a root entity, returning reachable nodes and edges
- ✅ Configurable depth (1–5), relationship type filtering (any combination of CALLS, EXTENDS, IMPLEMENTS, REFERENCES, etc.), and direction (Outgoing/Incoming/Both)
- ✅ Cypher validation: rejects invalid relationship types with a clear error message
- ✅ Deduplication via UUID-based `HashMap`, truncation at configurable `max_nodes` with `truncated` flag
- ✅ Edge extraction between collected nodes for graph visualization
- ✅ New data models: `SubgraphNode`, `SubgraphEdge`, `SubgraphResult`, `SubgraphDirection` (with `#[derive(Default)]`)
- ✅ CLI/MCP wrapper: `cli_tools::run_get_subgraph` with `DEFAULT_MAX_NODES = 500`
- ✅ 6 new Neo4j integration tests: not_found, valid_entity, invalid_relationship, outgoing_only, multiple_relationships, truncation
- ✅ 548 unit tests | cargo fmt + clippy clean

### v1.3.0 - Consolidated `.knot/` Directory & Test Resilience

**Fastembed Cache Consolidation:**
- ✅ The `fastembed` model cache (previously `.fastembed_cache/` in CWD) now stores inside `.knot/fastembed_cache/` by default
- ✅ Configurable via `KNOT_FASTEMBED_CACHE_DIR` env var for shared caching across multiple repos
- ✅ All three binaries (knot-indexer, knot, knot-mcp) pass the cache dir to `Embedder::init(cache_dir: PathBuf)`
- ✅ New `fastembed_cache_dir()` helper in `src/pipeline/state.rs` with env var override support

**Test Resilience:**
- ✅ Fixed 3 unit tests that failed when `KNOT_INGEST_CONCURRENCY` / `KNOT_RAYON_THREADS` env vars were set in the parent shell
- ✅ Introduced serialized env-access pattern via `Mutex` with save/restore semantics for process-wide env var modifications
- ✅ 548 unit tests passing | cargo fmt + clippy clean
- ✅ 12/12 E2E test suites pass

### v1.2.0 - Cargo.toml, Configuration Files, Kubernetes + Helm

**Phase 12A — Cargo.toml Parser:**
- `toml = "0.8"` integration with package metadata, multi-format deps (simple/table/git/path), features, workspace members
- ✅ 4 new EntityKind variants: CargoPackage, CargoFeature, WorkspaceMember, ProjectIdentity
- ✅ 8 unit tests + 6 E2E tests (extended `run_build_systems_e2e.sh`)

**Phase 12B — Configuration Files:**
- `serde_yaml = "0.9"` integration. YAML/JSON recursive walk with depth limit 10, multi-document support
- ✅ package.json special handling: npm deps → BuildDependency, scripts → ConfigProperty, ProjectIdentity
- ✅ .properties: line-by-line parser with comment-as-docstring heuristic, line continuation
- ✅ ConfigProperty EntityKind. 500KB file size limit + lock file exclusions
- ✅ 18 unit tests + 6 E2E tests (`run_config_e2e.sh`)

**Phase 12C — Kubernetes + Helm:**
- ✅ 10 new EntityKind variants (K8sDeployment, K8sService, K8sConfigMap, K8sSecret, K8sIngress, K8sNamespace, K8sResource, HelmChart, HelmValue, HelmTemplateVar)
- ✅ Multi-resource K8s YAML with label/annotation/spec extraction and cross-resource references
- ✅ Helm: Chart.yaml, values.yaml, template {{ .Values.X }} extraction with `{{-` whitespace trim
-`dispatch_yaml()` cascade: Chart.yaml → Helm directory → K8s (apiVersion+kind) → generic YAML
- ✅ 15 unit tests + 9 E2E tests (`run_k8s_helm_e2e.sh`)
- ✅ All 10 E2E test suites pass (Config Files + K8s/Helm added to CI and `run_all_e2e.sh`)
- ✅ 520 unit tests passing | cargo fmt + clippy clean

### v1.1.0 - Performance Optimization (Phase 12)

**Bottleneck Resolution:**
- ✅ Replaced N individual Neo4j `MERGE` queries with batched `UNWIND` — 10-50x entity write speedup, 50,560 queries → <100
- ✅ Replaced O(N) relationship inserts with `UNWIND`-batched queries per type — O(N) → O(8) queries
- ✅ Bounded all pipeline channels — peak memory ~300-400MB (vs 500MB unbounded potential)
- ✅ Concurrent ingestion via JoinSet + Semaphore — 2-3x ingestion throughput improvement
- ✅ Rayon thread pool configurable via `KNOT_RAYON_THREADS` (default N-1 cores)
- ✅ Parallel relationship resolution via `par_iter_mut()` — linear speedup with core count

**Benchmarking Framework:**
- ✅ Three-level performance validation: Criterion unit benchmarks + E2E metrics + CI baseline tracking
-`benches/pipeline_bench.rs` — parse/prepare throughput per language
-`benches/graph_upsert_bench.rs` — Neo4j UNWIND batching validation
-`benches/channel_backpressure_bench.rs` — bounded channel overhead
-`tests/benchmark_e2e.sh` — full pipeline metrics with `/usr/bin/time` RSS capture
-`scripts/compare_perf_metrics.sh` — baseline comparison with tolerance gates (±5% time, ±10% memory)
-`test-performance` job in CI — runs after E2E, fails on regression, updates baseline on main/master merges
-`.perf_metrics/baseline.json` — committed baseline (updated on main/master only)
-`.perf_metrics/threshold_tolerances.json` — configurable tolerance thresholds
- ✅ 521 unit tests passing | clippy clean | fmt applied

### v1.0.0 - C/C++ Language Support
- ✅ Phase 11 complete: tree-sitter-c v0.23 and tree-sitter-cpp v0.23 integration
- ✅ 6 new EntityKind variants: CppClass, CStruct, CppMethod, CFunction, CppNamespace, MacroDefinition
- ✅ Namespace-aware FQN resolution: `Engine::MyClass::start` format via AST parent traversal
- ✅ Call graph analysis: direct calls, method calls (`obj.bar()`, `ptr->baz()`), scope resolution (`std::vector::size()`)
- ✅ Type reference tracking: declarations, `new` expressions, qualified types
- ✅ Macro usage detection via uppercase identifier heuristic (e.g., `MAX_BUF`)
- ✅ 3 new C++ unit tests (307 lines in cpp.rs) | 443 total unit tests
- ✅ 4 E2E tests in `run_cpp_e2e.sh`: FQN extraction, call graphs, macro usage, type references
- ✅ 10/10 E2E test suites pass (C/C++ E2E included, Build Systems E2E fixed)
- ✅ Master E2E script (`run_all_e2e.sh`) for local validation of all test suites
- ✅ CI updated with C/C++ and Cross-Language Ref E2E tests
- ✅ Groovy Cross-Ref E2E fixed: pass neo4j env vars to knot-indexer
-`cargo fmt` clean | `cargo clippy --all-targets -- -D warnings` clean
- ✅ Published to crates.io as v1.0.0

### v0.10.3 - Groovy Nested Methods, Innermost Assignment & UUID Collision Fix
- ✅ Fixed UUID collision: `ParsedEntity` identity now includes `start_line` to prevent entities with identical name/FQN in same file from colliding (e.g., multiple `actionPerformed` in `new AnAction` closures)
- ✅ Innermost assignment: method calls in nested closures go to the innermost method, not the outer container (fixes `showGrabbingFinishedMessage`/`hyperlinkUpdate` and `createActionsOnHistoryFile`/`actionPerformed` patterns)
- ✅ Multi-line method signatures: `try_extract_typed_method_multiline` handles closure default params spanning multiple lines
- ✅ Assignment-vs-declaration disambiguation: `=` check and `new Type(...)` constructor rejection
- ✅ Brace-scope `end_line` fix: `find_method_body_end` with string-aware brace matching
- ✅ Removed Java tree-sitter ref extraction for Groovy (`method_invocation` nodes unreliable for closures)
-`tests/run_groovy_private_method_e2e.sh`: 10 tests (typed/`def`/no-paren callers, multi-line closures, innermost assignment, UIPattern duplicate-name)
- ✅ CI updated: all 3 Groovy E2E suites run on every push/PR
- ✅ 441 unit tests (3 new Groovy tests) | clippy clean

### v0.10.2 - Groovy No-Paren Calls & Private Method Tracking
- ✅ Fixed no-paren Groovy call detection: `extract_method_calls()` recognizes `runAnalyzer "abc", 123` style calls with string literal skipping
- ✅ Fixed entity deduplication: `known_lines` from tree-sitter now gates ad-hoc extraction, preventing duplicate entities
- ✅ Fixed reference intent overwrite: ad-hoc intents use `extend()` instead of `= collect()`, preserving tree-sitter intents
- ✅ Private methods now correctly tracked: `find_callers` finds callers of private typed/`def` Groovy methods
- ✅ 438 unit tests (3 new) + new `run_groovy_private_method_e2e.sh` (5/5)

### v0.10.1 - Groovy Reference Extraction Fix & E2E Test Suite
- ✅ Fixed ad-hoc Groovy parser: `extract_method_calls()` now populates `reference_intents` from method bodies via line-span filtering, enabling CALLS relationships for `def`-based Groovy methods in Neo4j
- ✅ Cross-language `find_callers`: Java→Groovy (Helper.greet, Helper.add, Parser.parse) fully functional
- ✅ Groovy→Groovy cross-class `find_callers`: ClientA.groovy and ClientB.groovy both found as callers of Calculator.add/multiply
- ✅ Added `run_cross_lang_ref_e2e.sh`: 6/6 tests (Java→Groovy)
- ✅ Added `run_groovy_cross_ref_e2e.sh`: 4/4 tests (Groovy→Groovy cross-class refs)
- ✅ E2E suites: all 15 Groovy E2E tests pass across 3 test scripts
- ✅ 435 unit tests passing, clippy clean, fmt applied

### v0.10.0 - Build Systems & CI/CD Support
- ✅ Phase 9 complete: Maven pom.xml, Gradle build.gradle, Jenkinsfile extraction
- ✅ 22 unit tests + 8 E2E tests

### v0.9.3 - Python Search Stability & CI Enhancements
- ✅ Fixed Rust/Kotlin CLI `explore` & `search` queries that queried the default collection instead of test collection by appending `-r "$REPO_NAME"`
- ✅ Python CLI search bug handled; resolved `knot search` queries failing in specific collection bounds
- ✅ Replaced unreliable `nc -z` network checks with Neo4j-specific Docker health checks (`docker inspect`) in CI scripts, eliminating `Connection reset by peer` errors
- ✅ Enforced strict separation and 5s sleep between consecutive container suites in CI

### v0.9.2 - Python self.method() Resolution & CI Fixes
- `class_definition` recognized by `extract_class_contexts``enclosing_class` now set for Python methods
-`"self"` receiver handled in Strategy 1 (local call resolution) alongside `"this"`
- ✅ EXTENDS walking: inherited `self.method()` calls resolve through parent class chain
- ✅ Unit test: `test_resolve_self_method_inherited_from_parent_class`
- ✅ CI: Python E2E added to GitHub Actions workflow
- ✅ CI: Docker cleanup + sleep 5s between E2E test suites to prevent `Connection reset by peer`
- ✅ 376 unit tests | 23 Python E2E | 22 Rust E2E | 10 Kotlin E2E

### v0.9.1 - Python Phase 6: Advanced Testing & Type Hints
- ✅ Phase 6: Generic type hints (`List[str]`, `Optional[Dict]`), `*args`/`**kwargs` parameter extraction
- ✅ Phase 6: Py2/Py3 exception syntax compatibility verification (`except ValueError, e:` / `except ValueError as e:`)
- ✅ 5 new unit tests for type hints, var args, exception syntax
- ✅ 4 new E2E tests (tests 20-23): process_items, find_user, log_message, handle_exception_py2_style
- ✅ Python support complete: 375 unit tests, 23 E2E tests

### v0.9.0 - Python Support (Phases 1-5)
- ✅ Phase 1: Base configuration, tree-sitter-python integration, `PythonClass`/`PythonFunction`/`PythonMethod` EntityKinds
- ✅ Phase 2: Structural extraction, docstrings, signatures, lambda support
- ✅ Phase 3: Call graph — direct and method calls, `print_statement` (Py2), `CALLS` edges
- ✅ Phase 4: Imports — `import`/`from` detection, `PythonConstant`, `PythonModule`, `REFERENCES` edges
- ✅ Phase 4.5: ValueReferences — `action=ClassName` pattern via `keyword_argument` detection
- ✅ Phase 5: Inheritance (`EXTENDS` edges) and decorator extraction (`CALLS` edges for `@staticmethod`, `@property`, `@dataclass`, `@route(...)`)
- ✅ 19 Python E2E tests, 9 Phase 5 unit tests, 370 total tests passing

### Roadmap Reorganization
- ➕ Added Phase 9: Groovy Support (v0.10.x) — Gradle, Jenkinsfile indexing
- 🔀 Shifted C/C++ to Phase 10 (v0.11.x)
- ✅ O(N) nested macro traversal: Substring skipping eliminates redundant string operations for deeply nested `token_tree` nodes in Rust macros

### v0.8.10 - CLI UX Enhancements & Custom CA Certificates
- ✅ Colorized table output as default format with per-entity-kind ANSI colors
- ✅ Interactive pager support via `less -R -e` with auto-exit at end of content
- ✅ Configurable output formats via `--output` flag (`table` default, `json`, `markdown`)
- ✅ Custom CA certificates support for corporate SSL-inspecting proxies

### v0.8.8 - Corporate Network Support
- ✅ Custom CA certificates support for corporate SSL-inspecting proxies
-`KNOT_CUSTOM_CA_CERTS` environment variable and `--custom-ca-certs` CLI flag

### v0.8.7 - Enhanced Rust Type Reference Detection
- ✅ token_tree extraction for macro invocations (`vec!`, `println!`, `assert!`, etc.)
- ✅ String literal filtering to avoid false positives in macro bodies
- ✅ Improved accuracy for EntityKind detection (+95.7%)

### v0.8.6 - Rust Initial Support
- ✅ tree-sitter-rust integration
- ✅ Basic entity extraction for Rust codebases

### v0.8.3 - Dry-Run Mode for Deployment Platform Quality Checks
- ✅ Offline/dry-run mode for MCP server without database dependencies

### v0.8.0 - CLI Interface
- ✅ Standalone CLI binary with `search`, `callers`, and `explore` commands
- ✅ Unified core shared between CLI and MCP