sift-core 0.2.0

Indexed regex search over codebases (library + grep-like CLI)
Documentation
# AGENTS.md -- search/

Regex execution: pattern compilation, file scanning, output formatting, and parallelism.

## Key Types

- `SearchQuery`: compiled regex + options + cached matcher/searcher. Reuse across queries.
- `SearchOptions`: flags, case mode, max results, context lines.
- `SearchMode`: output mode enum (standard, count, files-with-matches, etc.).
- `Match`: single search hit (file, line number, matched text).

## Conventions

- Filtering is done by `CandidateFilter`, applied in the `grep` orchestration layer.
- Parallel scanning uses Rayon with `par_iter`/`map_init`.
- Results are always sorted by `(file, line, text)` for determinism.
- `grep_regex`/`grep_searcher` are the underlying line-scanning engines.
- `search/` receives already-prepared `Vec<Candidate>`: no candidate resolution logic.

## Search Flow (orchestrated by `grep::run`)

```text
grep::run(query, GrepRequest{ indexes, filter, output, separators, collect_stats })
  -> QuerySpec from query.spec()
  -> candidates from Indexes::candidates(spec, coverage) or walk::collect_candidates
  -> candidate.matches(filter) via par_iter
  -> SearchExecution { candidates, output, separators, collect_stats }
  -> query.search(SearchExecution)
  -> scan with regex engine
  -> emit output
```

## Do NOT

- Be aware of index internals. Callers provide candidates.
- Break deterministic output ordering.
- Bypass the matcher/searcher cache in `SearchQuery`.
- Import from `crate::index::trigram`. Use `Index` trait only.