``` ┌───────────────────────────────┐ │ Source Code Directory │ │ (.py .js .ts .kt .rb .go │ │ .rs .java .c .cpp .h) │ └──────────┬────────────────────┘ │ scan_directory() ▼ ┌───────────────────────────────┐ │ Files grouped by extension │ │ .kt → [a.kt, b.kt, ...] │ │ .py → [x.py, y.py, ...] │ └──────────┬────────────────────┘ │ for each extension ▼ ┌───────────────────────────────────────────┐ │ preprocess_by_method(file_path, code) │ │ │ │ tree-sitter parser ◄── _load_grammar() │ │ + │ │ highlights.scm query ◄── _load_query() │ │ │ │ │ ▼ │ │ BEHAVIORAL_PREFIXES filter │ │ (definition./reference./keyword./ │ │ function/attribute/constructor/ │ │ label/type.definition/module) │ │ │ │ │ ▼ │ │ _find_method_bodies() │ │ grouped by body boundaries │ │ │ │ │ ▼ │ │ [(cap, text, line), ...] per method │ └──────────┬────────────────────────────────┘ │ list of sequences ▼ ┌───────────────────────────────────────────┐ │ frequency_filter(sequences, 0.2) │ │ removes symbols in <20% of methods │ └──────────┬────────────────────────────────┘ │ filtered sequences ▼ ┌────────────────────────────────────────────────────────┐ │ │ │ ┌─────────────────────┐ ┌────────────────────────┐ │ │ │ _extract_imports() │ │ _build_arg_patterns() │ │ │ │ scan 200 lines │ │ extract_arg_info() │ │ │ │ for import/from/ │ │ + _classify_arg_node │ │ │ │ require/#include/ │ │ + _find_arglist_node │ │ │ │ use/include │ │ + _iterate_arg_nodes │ │ │ └─────────┬──────────┘ │ + _summarize_arg_info│ │ │ │ └───────────┬────────────┘ │ │ ▼ ▼ │ │ ┌──────────────────────────────────────────────────┐ │ │ │ infer_ensemble(symbol_seqs, min_coverage=0.8) │ │ │ │ ├── CRX (fast, unordered) │ │ │ │ ├── iDRegEx (ordered regex) │ │ │ │ └── kOREInference (noisy, probabilistic) │ │ │ │ └── pick best by MDL score │ │ │ │ └── core/outlier split via _find_core(0.8) │ │ │ └──────────────────────┬───────────────────────────┘ │ │ ▼ │ │ (result, meta) │ │ meta = {files, imports, arg_patterns, │ │ packages: _file_to_package(relpath)} │ └─────────────────────────┬──────────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────┐ │ Output │ │ │ │ --format text (default) --format json │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ .kt: │ │ [{ │ │ │ │ Grammar: │ │ "language": │ │ │ │ assertEquals+ │ │ ".kt", │ │ │ │ Imports: ... │ │ "conventions": │ │ │ │ Args(assertEquals): │ [{...}, ...] │ │ │ │ n=2 [lit,var] │ │ }] │ │ │ └──────────────────┘ │ │ │ │ │ → inject into │ │ │ │ LLM prompt │ │ │ └──────────────────┘ │ └─────────────────────────────────────────────────────┘ ```